set -o
與 bindkey
有什麼區別?
從我所見,兩者
set -o emacs
和bindkey -e
都用於修改終端行編輯器的行為以進行模擬emacs
,而set -o vi
和bindkey -v
用於模擬vi
鍵綁定。由於兩者set -o
似乎bindkey
都做同樣的事情,我想知道兩者之間的區別是什麼,以及是否有任何區別。它似乎
set -o
適用於大多數 shell,而bindkey
它是一個zle
特定的命令。這是唯一的區別嗎?此外,它們是否綁定相同的鍵,或者是否有一些鍵在哪裡set -o
並bindkey
綁定到不同的操作?
bindkey -v/-e
是tcsh
語法(bindkey
在 1990 年的 5.19PL2 中添加了一個內置函式到 tcsh),set -o vi/emacs
而是 ksh 語法(在 ksh85 中已經存在,可能更早,因為 ksh 至少早在 1983 年就有 emacs/vi 模式)。在
zsh
,bindkey
在 1991 年的 2.0 中添加了 zle 的第一個版本(1.0 以前的版本使用readline
從 借來的bash
)。
zsh
,因為第一個 1.0 版本必須setopt
設置選項(除了在csh
/Bourne 中通過命令行傳遞的選項),而(t)csh
使用bash
特殊變數代替。在 2.0 中,添加了一個-o
選項(解釋器和set
內置選項)以兼容ksh
(bash
本身將其特殊變數轉換為 1996 年在 2.0 中使用新shopt
內置函式設置的選項;這是與set -o
那裡設置的選項不同的一組選項;set -o
大約在 1990 年增加了支持)。不過,直到 2003 年的 4.1.1 版中,
vi
和emacs
“選項”才被添加到 zsh中。“選項”範式不太適合,因為當您設置emacs
選項時,它會禁用該vi
模式。您會注意到,
zsh -o emacs
並且目前在啟動zsh -o vi
時的 zsh 報告中無法正常工作(一個錯誤)。zsh: invalid module name
zsh/zle'`大多數 shell 包括還根據和環境變數
zsh
的值選擇預設編輯模式,以嘗試將行編輯模式與使用者的編輯器偏好相匹配。$EDITOR``$VISUAL