在默认(emacs)模式下使用 bash,当我点击 , 时,我会得到以下行为Esc。 .
$ echo hello
hello
$ hello # I hit `<ESC>.` to insert this
请注意,当我点击, hello
时插入的单词之前没有空格。Esc.
如果我切换到 vi 模式并配置,.
我确实会得到一个前导空格:
$ set -o vi
$ bind -m vi-command ".":yank-last-arg
$ echo hello
hello
$ hello # I hit `<ESC>.` to insert this. Note the leading space.
有什么方法可以配置 bash/readline 来避免这种前导空格吗?
答案1
这看起来确实像一个 bug,但实际上 Bash 只是试图遵循POSIX 指定的行为_
,
[count]_
在当前字符位置之后附加一个 <space>,然后在 <space> 之后附加上一个输入行中的最后一个 bigword。然后在刚刚附加的最后一个字符后进入插入模式。有号码数数,附加数数上一行中的第一个大字。
作为解决方法,请将其添加到您的~/.inputrc
.如果需要,您可以将 更改\M-h
为其他未绑定的密钥。
set editing-mode vi
set keymap vi-command
"\M-h":history-expand-line
".":"a!$\e\M-hA"
现在,打开一个新终端。.在正常模式下敲击时,
!$
被插入到命令行中。\e
(表示Esc)返回正常模式。\M-h
触发history-expand-line
操作,该操作扩展$!
到最后一个参数的值。A
移动到行尾并进入插入模式。
$ echo "X Y Z"
X Y Z
$ "X Y Z" #<ESC>. inserts this
$ echo "X Y Z"
X Y Z
$ cat "X Y Z" #cat <ESC>. inserts this
答案2
当我插入内容,然后进入命令模式时,光标向左移动仿佛它删除了输入的最后一个单词后的空格,但是当我重新进入编辑模式并插入其他内容时,前一个插入的最后一个单词的最后一个字符后面的空格将被恢复。
手动添加空格会生成双倍空格。