readline
的模式和键盘映射之间有什么区别?
如何找到每种模式的默认按键绑定?
答案1
长话短说
emacs
要查看(示例) (默认)的默认键绑定,请使用:
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$'
、和是vi
vi-command
vi-move
一且相同键映射。
和emacs-meta
都是键盘emacs-ctlx
映射的子集视图emacs
。
如果您想了解有关vi
模式和地图的更多信息,请跳至标题editing-mode vi
(最后一个)。
可是等等!不过,可能需要相当多的背景信息:例如, anediting-mode
和 a之间的区别keymap
。
特别有用的是混合键盘映射的概念,emacs
用于插入文本,同时仍然可以轻松vi-command
进行更改。
editing-mode
an和 a 和有什么不一样keymap
?
有仅有的两个editing-mode
s:(emacs
默认值)和vi
.
editing-mode The editing-mode variable controls which default set of key bindings is used. By default, Readline starts up in Emacs editing mode, where the keystrokes are most similar to Emacs. This variable can be set to either `emacs' or `vi'.
editing-mode
请注意和之间的区别keymap
:在editing-mode vi
这两个(是的,只有两个,请继续阅读)中,键盘映射被换入和换出以vi
模拟编辑器的不同模式。全部这些emacs
同时运行editing-mode emacs
(稍后解释)。
那么editing-mode
实际上是做什么的呢?它只是在 shell 启动时将活动键盘映射设置为emacs
或vi-insert
。
有哪些独特的键盘映射?
Acceptable keymap names are emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command, and vi-insert. vi is equivalent to vi-command; emacs is equivalent to emacs-standard.
虽然没有记录,但vi
/vi-command
和vi-move
键盘映射也是等效的:
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
这给我们留下了:emacs
、emacs-meta
、emacs-ctlx
、vi
和vi-insert
作为独特的键盘映射来解释。区分键盘映射可能最好通过检查它们来完成......
键映射默认绑定是什么?
要查看(例如)emacs(默认)的默认键绑定,请使用:
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -v '^#
您可以替换emacs
为上例中的任何其他键盘映射名称。
有很多行说self-insert
ordo-lowercase-version
不是很有用,所以要删除它们:
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$' | sort
各种键盘映射之间有什么区别emacs
?
TL;DR:它们是对应用于 的一组映射的不同看法editing-mode emacs
。
emacs-standard
如果将第二个命令的输出放入名为、emacs-meta
、emacs-ctlx
、 、的文件中,vi-command
并vi-insert
为其对应的keymap
s,您可以发现:
没有映射的命令emacs-meta
和emacs-ctlx
中也没有出现emacs-standard
:
$ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-ctlx|sort)
$ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-meta|sort)
$
所以emacs
/emacs-standard
是两者的行为功能超集这emacs-ctlx
意味着emacs-meta
:
keymap emacs
"\eg": glob-expand-word
"\C-x\C-r": re-read-init-file
功能上等同于:
keymap emacs-meta
"g": glob-expand-word
keymap emacs-ctlx
"\C-r": re-read-init-file
您可能会说第二种形式更容易阅读。
插入文本:emacs
vsvi-insert
emacs-standard
not in中有 28 个命令vi-insert
+ravi@boxy:~/lib/readline$ comm -12 vi-insert emacs-standard |wc -l
28
+ravi@boxy:~/lib/readline$
emacs
/emacs-standard
基本上是 . 的超集vi-insert
。因此,对于输入文本,最好尽可能长时间emacs-standard
地使用键盘映射vi-insert
轻松切换emacs
和vi-command
。
vi-insert
not in中唯一的附加绑定emacs-standard
是:
+ravi@boxy:~/lib/readline$ comm -23 vi-insert emacs-standard
"\C-d": vi-eof-maybe
"\C-n": menu-complete
"\C-p": menu-complete-backward
"\e": vi-movement-mode
这四个中的前三个与emacs
绑定冲突:
"\C-d": delete-char
"\C-n": next-history
"\C-p": previous-history
我解决如下:
set keymap emacs
"\e": "kj" # see https://unix.stackexchange.com/questions/303631/how-can-i-setup-a-hybrid-readline-with-emacs-insert-mode-and-vi-command-mode
"\C-d": delete-char # eof-maybe: ^D does nothing if there is text on the line
"\C-n": menu-complete
"\C-p": menu-complete-backward
"\C-y": previous-history # historY
"\e\C-y": previous-history
editing-mode vi
正如我们上面看到的,vi
、vi-command
和vi-move
是一且相同键位图:
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
请注意,总共只是二默认情况下与 关联的不同地图editing-mode vi
。
当 in 时editing-mode vi
,keymap
使用的 s 是vi
//vi-command
和(起始键盘映射)vi-move
。vi-insert
这两张地图同时只有一张处于活动状态。
editing-mode vi
只不过是在 shell 启动时设置一个默认的键盘映射,标记为vi-insert
。同样,一次只有一个键盘映射处于活动状态。此vi-insert
键盘映射将大多数键映射到,self-insert
因此当您按下键盘上的塑料按钮时,其上打印的符号会出现在屏幕上。
键映射允许通过使用命令vi-insert
将自身交换到名为 // 的文本操作键映射vi-command
,vi
默认情况下绑定到键映射中的键。vi-move
vi-movement-mode
ESCvi-insert
实际上,即使是emacs
键盘映射也可以vi
通过使用命令将类似文本操作的键盘映射设置为活动状态vi-movement-mode
,如上面提到的混合解决方案。
或者用更简单的语言...
默认情况下,当键盘映射处于活动状态时,按下ESC可更改为键盘映射。vi-command
vi-insert
键盘vi-command
映射使用标准的单按键(如a、和b)来c移动文本并与文本交互,就像vi
编辑器的默认模式或命令模式一样。一般没有Ctrl+key组合。您无法在此模式下插入文本;字母键映射到编辑/移动命令。要输入文本,您可以切换到vi-insert
键盘映射(例如:按i“插入”)。
输入文本是使用键盘映射完成的,如果文件中vi-insert
有的话,键盘映射在 shell 启动时处于活动状态。在 中时按“插入”键即可切换到键盘映射(对于那些启动进入的人,则可以通过多种其他方式)。editing-mode vi
.inputrc
vi-insert
ivi-command
vi
除非您熟悉vi
编辑器,否则一开始您可能会发现vi-command
按键很难使用,但如果您擅长使用它,您就可以像长胡子巫师一样编辑文本。