Zsh

在 ZSH 中創建全域鍵綁定

  • March 10, 2022

我創建了一個像這樣的簡單小元件:

function my_widget() { ... }

zle -N my_widget

bindkey '^P' my_widget

問題是這個鍵綁定並不總是有效。例如,當腳本等待通過read或輸入時vared,無法呼叫小元件。我希望能夠隨時呼叫它(例如^U^W)。

我嘗試將鍵綁定添加到每個鍵映射(除了.safe,因為它是防寫的)。

我希望能夠在任何地方使用我的快捷方式,它不必是 ZLE 小元件。

甚至有可能做我想要實現的目標嗎?

zle/bindkey是配置目前shell 的shine 編輯器zl``e

vared呼叫 zle以在互動式 shell 中或ed通過variables編輯命令行。在這兩種情況下,zle 都可以編輯任何文本,它不僅限於單行。

read不使用行編輯器,它是從標準輸入(或其他帶有 的行描述符)讀取單行(或帶有 的其他類型的記錄),不必是終端設備,並將該記錄中的單詞儲存到提供的變數。-d``-u

如果你想讓使用者在腳本中輸入一些文本並使用 zle 來編輯它,你必須使用vared. 例如:

var=; vared var

而不是IFS= read -r var,請記住輸入將始終從終端上的使用者讀取,即使 stdin 不是那個終端。

如果您希望 zsh 實例的行編輯器開始將該腳本解釋為具有與預設值不同的鍵綁定,則需要該 zsh 實例執行這些zlebindkey命令來定義和綁定這些小元件。

您可以將這些添加到~/.zshenv每個zsh實例(即使是那些從未與使用者互動的實例)以定義和綁定這些小元件,但請注意,由於最終定義了一個新函式,您需要仔細選擇其名稱以刪除它與您將使用的任何腳本使用的函式命令衝突的風險。

至於^Wand ^U,請注意,雖然zsh它們具有 zle 小元件,但它們模仿(並增強)終端設備行規程(在核心中的 tty 設備驅動程序中)行編輯器的相應小元件erase和)。kill該行編輯器(當應用程序從終端讀取而不實現自己的行編輯器時使用)非常基本,只有少數小元件(kill, erase, eol, eof…),您可以使用stty命令綁定它們並且不多除此之外更可配置。

引用自:https://unix.stackexchange.com/questions/693888