私たちに言わせてください:
% ls ./ _
foo
が呼び出されたとき。ここで、_
はカーソル位置です。
foo(){
echo $COMMAND
}
zle -N foo
COMMAND
が 'コマンド'を書き出すようにfoo
を設定するにはどうすればよいですか(行の最初の単語のように、&&
の場所をリストする必要はありません。等が使用されます)発行されましたか?
では、現在の行の先頭からls
ビットが必要ですか? zsh
…によって何が設定されているか見てみましょう
_% foo(){ set > whatallisset }
% zle -N foo
% bindkey "^W" foo
% ls ./ # here I mash control+w, etc
% fgrep 'ls ./' whatallisset
BUFFER='ls ./ '
LBUFFER='ls ./ '
_
したがって、おそらく「最初の単語」の変数の1つを解析することを検討しているので、BUFFER
が最も適切であると想定し、zshexpn(1)
ドキュメントを調べて「split」を探した後「関連するもの:
_foo(){ echo -n ${${(z)BUFFER}[1]} }
_
ユーザー定義ウィジェット のいくつかの変数にアクセスできます。特に、行の内容を含むBUFFER
(または、より広義には、複数行になる可能性のあるバッファー全体)にアクセスできます。 。
BUFFER
から最初の単語を抽出する方法は、単語の定義によって異なります。このコンテキストでは、最も有用な定義はおそらくシェル構文に基づいています。これはz
パラメーター拡張フラグ から使用できます。
first_Word=${${(z)BUFFER}[1]}
他の賢明な定義は、空白で区切られた単語、または $WORDCHARS
で構成される単語を使用することです。 移動コマンド がありますが、zle
ビルトインを介して呼び出し、CURSOR
の移動を監視できますが、文字列$BUFFER
を手動で分割する方が簡単です。
完了ウィジェットでは、完了が行われているコマンドの単語はwords
parameter にあります。