什么设置控制在命令行上移动光标?

Cla*_*ied 4 linux command-line

在某些 Unix 系统上,我可以键入 Ctrl-A 或 Ctrl-E 以移动到行的开头或结尾。在某些 Unix 系统上,我不能,它只打印 ^A 或 ^E 等。是什么控制此按键是否按我的预期工作(在命令行中移动),还是打印 ^A、^E 等字符?

rus*_*ush 7

这完全取决于特定的 shell 实现(您可能在不同的系统上有不同的默认 shell,甚至对于单个系统中的不同用户,例如 bash、ksh、tcsh 等)。

这也取决于外壳本身。

例如 bash 支持两种模式:emacs 和 vi。每种模式都有自己的快捷方式(emacs 或 vi 之类的)。要更改它,您必须执行set -o emacs(通常它是默认的)或set -o vi

您可以在特定的 shell 文档中找到更多信息。


mos*_*svy 7

tl;博士

set -o emacs
Run Code Online (Sandbox Code Playgroud)

将在您可能使用的大多数 shell 中启用 Ctrl-A、Ctrl-E、Ctrl-B 等 emacs 键绑定。


shell 可能没有任何行编辑功能,或者可能处于vi编辑模式(标准指定的唯一一种)。

当不在emacs编辑模式时,Ctrl-A 和 Ctrl-E 没有特殊意义。如果echoechoctl的stty / termios的设置上,未特别处理的所有控制键将被显示在^A^X等等,“插入符号”符号。

许多shell(如kshzsh)将决定默认的编辑模式(vi或emacs的)的基础上的价值观VISUALEDITOR环境变量(以优先顺序,并处理变种一样vimelvisxemacs,等)。

这在 中被破坏了(非常烦人!)mksh,但在其他pdksh派生的 shell 中也是如此。

其他 shell 喜欢bashtcsh默认为emacs编辑模式,但也可以从行编辑库的配置文件中覆盖。

对于和许多其他程序readline使用的库bash,配置文件~/.inputrc(或INPUTRC环境变量中指定的文件)具有回退到,/etc/inputrc设置为:

set editing-mode vi
set editing-mode emacs
Run Code Online (Sandbox Code Playgroud)

对于很多BSD程序使用的editline/ libedit[1]库,配置文件通常是~/.editrc,设置如下:

bind -v  # for vi
bind -e  # for emacs
Run Code Online (Sandbox Code Playgroud)

[1] 不要与libeditline仅提供 emacs 编辑模式的readline "work-alike"混淆。