次のように言いましょう。
% 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]} }