![在 vi 模式下的 bash 中插入最后一个参数,不插入前导空格](https://linux22.com/image/178051/%E5%9C%A8%20vi%20%E6%A8%A1%E5%BC%8F%E4%B8%8B%E7%9A%84%20bash%20%E4%B8%AD%E6%8F%92%E5%85%A5%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%EF%BC%8C%E4%B8%8D%E6%8F%92%E5%85%A5%E5%89%8D%E5%AF%BC%E7%A9%BA%E6%A0%BC.png)
在默认(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
当我插入内容,然后进入命令模式时,光标向左移动仿佛它删除了输入的最后一个单词后的空格,但是当我重新进入编辑模式并插入其他内容时,前一个插入的最后一个单词的最后一个字符后面的空格将被恢复。
手动添加空格会生成双倍空格。