ZSH:ウィジェットを直接ZLEする方法?


12

ドキュメントでは、セクション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状態を切り替えます)

回答:


9

あなたは、ウィジェットがウィジェット実行することができますexecute-named-cmdにバインドされている、ESC-x(Emacsのバインディング)または:(VIバインディング):

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


ええ、私はすでに両方の引用符を見たと思いますが、3つの中かっこの値がわかりませんでした。「これらの特別なパラメータは常にウィジェット関数で使用できますが、ZLEの外では特別なものではありません。」つまり、ZLE_STATEを取得するには、関数とカスタムウィジェットを定義する必要があります。
lumbric 2013

@lumbric:そうです、ZLE_STATEウィジェット関数内でのみ定義されます。私は私の答えを洗練させました。あなたの目標は何ですか?[野生の推測:プロンプトでローカル/グローバルの履歴を示すには、ウィジェットを使用して(i。)シェル変数を設定し(これはウィジェット内で可能です)、(ii。)を実行しzle set-local-historyます。]
mpy

私の主な目標は、zleウィジェットの概念を理解することでした。set-local-historyをいじって、現在グローバルまたはローカルに設定されているかどうかを知りたいと思いました。現在のステータスを取得するために私たちがいる必要があると思いました(現在有効なオプションを取得するために "setopt"を呼び出すのと同様)。私の最初の目標はこのQ&Aですでに解決されています。
ランブリック2013

1
例の前の文を読むことに基づいて、ifテストの文字列を「*globalhistory*insert*」ではなく「」にする必要があり*insert*globalhistory*ますか?
Volker Siegel 14

@VolkerSiegel:非常に良い点、ありがとう!私はソースコードを確認し、指定された例を自分で試してみました。manページの例はステートメントではなく、間違っていると結論付けました(「アルファベット順」)。回答を編集し、zsh-workersメーリングリストへのパスを送信します。
mpy 14

1

使用している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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.