web-dev-qa-db-ja.com

zleは最初の単語を一列に読んだ?

私たちに言わせてください:

% ls ./ _

fooが呼び出されたとき。ここで、_はカーソル位置です。

foo(){
    echo $COMMAND
}
zle -N foo

COMMANDが 'コマンド'を書き出すようにfooを設定するにはどうすればよいですか(行の最初の単語のように、&&の場所をリストする必要はありません。等が使用されます)発行されましたか?

1
OJFord

では、現在の行の先頭から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]} }
_
2
thrig

ユーザー定義ウィジェット のいくつかの変数にアクセスできます。特に、行の内容を含むBUFFER(または、より広義には、複数行になる可能性のあるバッファー全体)にアクセスできます。 。

BUFFERから最初の単語を抽出する方法は、単語の定義によって異なります。このコンテキストでは、最も有用な定義はおそらくシェル構文に基づいています。これはzパラメーター拡張フラグ から使用できます。

first_Word=${${(z)BUFFER}[1]}

他の賢明な定義は、空白で区切られた単語、または $WORDCHARS で構成される単語を使用することです。 移動コマンド がありますが、zleビルトインを介して呼び出し、CURSORの移動を監視できますが、文字列$BUFFERを手動で分割する方が簡単です。

完了ウィジェットでは、完了が行われているコマンドの単語はwordsparameter にあります。