在 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
我知道有两个选项,但都不能直接实现你所要求的功能。
- 将 bash 设置为使用 vi 模式,其中提示符的行为类似于 vi 中的一行。命令是
set -o vi
。参考:BASH 帮助 - Bash 教程 - 将 vi 键映射添加到您当前的 shell 提示符。参考:StackOverflow:set 键映射 vi 有什么作用?