zle この行の最初の単語を読みますか?

zle この行の最初の単語を読みますか?

次のように言いましょう。

% ls ./ _

foo呼び出し時のカーソル_位置はどこですか?

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

実行される「コマンド」を書くことができるようにどのように設定しますCOMMANDか?foo&&

答え1

さまざまな変数にアクセスできます。カスタムウィジェット特に、BUFFERその行を含むコンテンツ(またはより広範囲には複数行にすることができる完全なバッファ)。

最初の単語を抽出する方法は、BUFFER単語の定義によって異なります。この場合、おそらく最も有用な定義は、次の方法で実行できるシェル構文に基づいていることです。z パラメータ拡張フラグ

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

他の合理的な定義は、スペースで区切られた単語、または次の単語で構成されます。$WORDCHARS。持つ移動コマンドこれを行うには、文字列を手動で分割する方が簡単です。ただし、zle組み込み機能を使用して文字列を呼び出して移動を観察することもできます。CURSOR$BUFFER

完了ウィジェットには、完了するコマンドの単語が配置されます。words 範囲

答え2

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)調査し、「分割」に関連する内容を見つけた後、次のように考えることができます。

foo(){ echo -n ${${(z)BUFFER}[1]} }

関連情報