在 vi 模式下的 bash 中插入最后一个参数,不插入前导空格

在 vi 模式下的 bash 中插入最后一个参数,不插入前导空格

在默认(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

当我插入内容,然后进入命令模式时,光标向左移动仿佛它删除了输入的最后一个单词后的空格,但是当我重新进入编辑模式并插入其他内容时,前一个插入的最后一个单词的最后一个字符后面的空格将被恢复。

手动添加空格会生成双倍空格。

相关内容