ZSH:如何直接呼叫ZLE小工具?

ZSH:如何直接呼叫ZLE小工具?

該文檔在部分中說18.4 小部件,「小部件的工作只是執行一些小動作」。但我找不到如何呼叫這些操作的一般描述,即如何呼叫小部件。

我在範例中看到過(例如參見本次問答)小部件可以使用 bin 綁定到鍵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怎麼可能呼叫widget呢?如何列印當前狀態? (set-local-history切換狀態)

答案1

您可以透過 widget 執行 widget execute-named-cmd,該 widget 綁定到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 狀態。

目前,顯示的狀態是由覆蓋模式或 vi-replace 小工具設定的插入模式,以及歷史命令是否將存取由 set-local-history 小工具控制的匯入條目。該字串包含 insert 要在命令列上插入的字元是否將現有字元移到右側,或者overwrite要插入的字元是否覆蓋現有字元。它包含localhistory是否僅存取本機歷史命令或 globalhistory是否也將存取匯入的歷史命令。

子字串按字母順序排序,因此如果您想以面向未來的方式測試兩個特定的子字串,您可以透過執行以下操作來進行匹配:

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

相關內容