据我所知,set -o emacs
和bindkey -e
都用于修改终端行编辑器的行为以模拟emacs
,而set -o vi
和 则bindkey -v
用于模拟vi
键绑定。由于两者set -o
似乎bindkey
都做同样的事情,我想知道两者之间有什么区别以及是否有任何区别。
它似乎set -o
适用于大多数 shell,而bindkey
是一个zle
特定的命令。这是唯一的区别吗?另外,它们是否绑定相同的键,或者是否有一些键set -o
绑定bindkey
到不同的操作?
答案1
bindkey -v/-e
是tcsh
语法(bindkey
1990 年 5.19PL2 中的 tcsh 中添加了内置函数),而set -o vi/emacs
是 ksh 语法(ksh85 中已经存在,可能更早,因为 ksh 至少早在 1983 年就有 emacs/vi 模式)。
在1991zsh
年bindkey
2.0 中添加了 zle 的第一个版本(1.0 之前的版本借用了readline
)bash
。
zsh
,因为第一个 1.0 版本必须setopt
设置选项(除了在csh
/Bourne 中通过命令行传递的选项之外),而(t)csh
和 则bash
使用特殊变量。在 2.0 中,添加了一个-o
选项(解释器和内置选项)以与(本身将其特殊变量转换为1996 年 2.0 中新内置选项设置的选项;这是一组与那里设置的选项分开的选项;大约在 1990 年添加了支持)。set
ksh
bash
shopt
set -o
set -o
和“选项vi
”emacs
不是2003 年之前添加到 zsh不过在 4.1.1 版本中。 “选项”范例不太适合这种情况,因为当您设置选项时emacs
,它会禁用该vi
模式。
您会注意到,zsh -o emacs
目前在zsh -o vi
zsh 启动时报告中无法正常工作zsh: invalid module name `zsh/zle'
(a漏洞)。
大多数 shell 还根据和环境变量zsh
的值选择默认编辑模式,以尝试将行编辑模式与用户的编辑器首选项相匹配。$EDITOR
$VISUAL