該文檔在部分中說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