ZSH: ZLE ウィジェットを直接呼び出す方法は?

ZSH: ZLE ウィジェットを直接呼び出す方法は?

ドキュメントのセクションには18.4 ウィジェット「ウィジェットの仕事は、単に小さなアクションを実行することです」。しかし、これらのアクションを呼び出す方法、つまりウィジェットを呼び出す方法についての一般的な説明を見つけることができません。

私は例を見てきました(例えばこのQ&A) を使用すると、ウィジェットはキーにバインドできますbindkey KEY WIDGET。その後、 を使用してウィジェットを呼び出すことができますKEY

切り替えたいのでset-local-history、次のことを試しました:

$ zle set-local-history 1
zle: widgets can only be called when ZLE is active

zle -hうまくいかないけど、私は見つけたここでの議論の説明。しかし、 のようなものはないようです--call

何が間違っているのでしょうか? どうすれば bindkey なしでウィジェットを呼び出すことができますか? 現在のステータスを印刷するにはどうすればよいですか? (set-local-history状態を切り替えます)

答え1

(emacs バインディング) または(vi バインディング)execute-named-cmdにバインドされているwidget によって widget を実行できます。ESC-x:

execute-named-cmd (ESC-x) (:) (unbound)

エディターコマンドの名前を読み取って実行します。

これにより、ミニバッファコマンドラインの下に、zle ウィジェットを起動できる場所があります。(自動補完が利用可能です!):

$ [ESC-x]
execute: set-[TAB]
set-local-history  set-mark-command

状態zle(ローカル履歴を含む) を照会するには、変数を使用します$ZLE_STATE(ウィジェット関数内でのみアクセス可能)。

ZLE_STATE (scalar)

現在の zle 状態を説明する、スペースで区切られた単語のセットが含まれます。

現在、表示される状態は、overwrite-mode または vi-replace ウィジェットによって設定された挿入モードと、set-local-history ウィジェットによって制御される、履歴コマンドがインポートされたエントリを訪問するかどうかです。文字列には、 insert コマンド ラインに挿入される文字が既存の文字を右に移動するか否か、またはoverwrite挿入される文字が既存の文字を上書きするか否かが含まれます。localhistoryローカル履歴コマンドのみがアクセスされるか、 globalhistoryインポートされた履歴コマンドもアクセスされるかが含まれます。

部分文字列はアルファベット順に並べられているため、将来を見据えて 2 つの特定の部分文字列をテストしたい場合は、次のようにして一致させることができます。

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi

すべての引用元はman zshzle

答え2

を使用している場合は、tmuxバインドされたキーを で呼び出すことができますsend-keys

例:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z

関連情報