在某些 Unix 系统上,我可以键入 Ctrl-A 或 Ctrl-E 移动到行首或行尾。在某些 Unix 系统上我不能,它只打印 ^A 或 ^E 等。是什么控制这个按键是否按我的预期工作(在命令行中移动),或打印 ^A、^E 等字符?
答案1
这一切都取决于特定的 shell 实现(您可能在不同的系统上甚至对于单个系统中的不同用户有不同的默认 shell,例如 bash、ksh、tcsh 等)。
这也取决于 shell 本身。
例如bash支持两种模式:emacs和vi。每种模式都有自己的快捷键(emacs 或 vi 等)。要更改它,您必须执行set -o emacs
(通常是默认的)或set -o vi
您可以在特定的 shell 文档中找到更多信息。
答案2
太长了;博士
set -o emacs
将在您可能使用的大多数 shell 中启用 Ctrl-A、Ctrl-E、Ctrl-B 等 emacs 键绑定。
shell 可能没有任何行编辑功能,或者可能处于vi
编辑模式(由标准)。
当不在emacs
编辑模式下时,Ctrl-A 和 Ctrl-E 没有特殊意义。如果echo
和stty/termios 设置打开,所有未特殊处理的控制键都将以、等“插入符号”符号echoctl
显示。^A
^X
许多 shell(如ksh
或zsh
)将根据VISUAL
和EDITOR
环境变量的值确定默认编辑模式(vi 或 emacs)(按此优先顺序,并且还处理诸如vim
、elvis
、xemacs
等变体)。
这在 中被破坏了(非常烦人!) ,但在其他派生的 shellmksh
中仍然是这种情况。pdksh
其他 shell 喜欢bash
或tcsh
默认为emacs
编辑模式,但也可以从行编辑库的配置文件中覆盖。
为了readline
和许多其他程序使用的库bash
,配置文件~/.inputrc
(或环境变量中指定的文件INPUTRC
)具有后备/etc/inputrc
,设置为:
set editing-mode vi
set editing-mode emacs
对于很多BSD程序使用的editline
/ libedit
[1]库来说,配置文件通常是~/.editrc
设置为:
bind -v # for vi
bind -e # for emacs
[1] 不要与libeditline
readline “work-alike” 只提供 emacs 编辑模式。