ドキュメントのセクションには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