删除最后一个单词(Ctrl-W):让 bash shell 的行为像 vim 命令行

删除最后一个单词(Ctrl-W):让 bash shell 的行为像 vim 命令行

在 bash shell 中,有许多有用的键盘快捷键,其中有一个Ctrl-W删除光标左侧的单词。假设我的命令行如下所示:

cp some-file /foo/bar/baz/copy

现在我希望能够按下Ctrl-W并得到以下内容:

cp some-file /foo/bar/baz/

在 Vim 的命令行中,它实际上是这样工作的:只有字母数字字符被视为“单词”,而特殊字符(如/)用作标记新“单词”开始的分隔符。

但不幸的是,到目前为止,在我使用的所有 shell 中,它都不是这样的。只有空格才能分隔“单词”,因此按下上面显示的命令行的快捷键将得到:

cp some-file

有没有办法让 Bash 像 Vim 一样运行?我可以把一些配置放入我的.bashrc?

答案1

这与 Vim 无关,所有编辑器都是这样(包括 emacs),它们将非单词字符视为分隔符。无论如何,你所说的行为是由控制的,readline并且它的手册列出了相当多的可以分配快捷键的命令。我在这里粘贴了一些相关的命令,但我建议你阅读man readline更多信息:

   backward-word (M-b)
          Move  back  to  the  start  of the current or previous word.  Words 
          are composed of alphanumeric characters (letters and digits).

   kill-line (C-k)
          Kill the text from point to the end of the line.
   kill-word (M-d)
          Kill from point the end of  the  current  word,  or  if  between
          words,  to  the  end  of the next word.  Word boundaries are the
          same as those used by forward-word.
   backward-kill-word (M-Rubout)
          Kill the word behind point.  Word boundaries  are  the  same  as
          those used by backward-word.
   unix-word-rubout (C-w)
          Kill  the  word behind point, using white space as a word bound‐
          ary.  The killed text is saved on the kill-ring.
   unix-filename-rubout
          Kill the word behind point, using  white  space  and  the  slash
          character  as  the word boundaries.  The killed text is saved on
          the kill-ring.

因此,您需要的是backward-kill-word,它使用非字母数字字符作为单词边界。默认情况下,它被分配给Alt+ Backspace,但您可以使用全局(/etc/inputrc如果您希望它们应用于所有用户)或(更好)您自己的本地 来更改它$HOME/.inputrc

据我所知,Ctrl+W似乎已被保留,您无法使用它,但您可以选择另一个快捷方式,例如Ctrl+ 。如果文件不存在,请创建一个文件并向其中添加以下行:J$HOME/.inputrc

Control-J: backward-kill-word 

对于大多数现代终端仿真器来说,这应该足够了。但是,一些较旧的终端使用不同的代码。xterm例如,如果您使用的是,则上面的行应写为:

C-J: backward-kill-word 

答案2

~/.inputrc您可以通过输入以下几行并启动新的 shell 来启用 readline(以及 bash)所谓的“vi 模式” :

set editing-mode vi
set keymap vi-command

但您会注意到,它的<C-w>工作方式与默认的 Emacs 模式相同:单词以空格分隔。dT/不过,您可以执行或类似命令。它仍然是一种模拟,而不是真正的模拟。readline 手册中列出了可用的映射:

$ man readline
/VI

也可以看看Vim wiki 上的这个页面

但我不认为 readline 的 vi 模式那么有用,如果你经常需要认真编辑命令行……为什么不使用 Vim真正的

<C-x><C-e>

答案3

我知道有两个选项,但都不能直接实现你所要求的功能。

  1. 将 bash 设置为使用 vi 模式,其中提示符的行为类似于 vi 中的一行。命令是set -o vi。参考:BASH 帮助 - Bash 教程
  2. 将 vi 键映射添加到您当前的 shell 提示符。参考:StackOverflow:set 键映射 vi 有什么作用?

相关内容