在使用命令行的时候,个人经常用到Ctrl-W组合键,其作用为删除当前光标位置到前的一个单词(Word)。
对于个人常用的另一个shell——zsh而言,可以轻松地定义Ctrl-W删除单词的分隔符1,一些常见的zsh配置框架如oh-my-zsh
等都有对WORDCHARS
变量的定义以方便Ctrl-W的使用。对于例如下面这种有长路径的命令
cd /very/long/path/to/a/file
oh-my-zsh中就可以使用Ctrl-W删除到光标前第一个斜杠处。而bash就只能删到前一个空格。
以下为了方便叙述,暂且称zsh的行为是删除一个语义上的单词,而bash是删除一个语法上的单词。
对于使用更广泛的bash而言,实际上也存在这种可以删除一个语义上的单词的按键组合Meta(Alt)+Backspace。但是对于个人而言,Ctrl-W只用左手就能按到,而Meta(Alt)+Backspace就很难只用左手了(当然如果用右手还是很方便的)。于是便开始思考,bash中有没有解决的方法。
经过一番查找,发现对于bash,其Ctrl-W则默认绑定到了unix-word-rubout
,而Meta(Alt)+Backspace则默认绑定到了backward-kill-word
2,那么能不能把Ctrl-W绑定到backward-kill-word
呢?
首先尝试直接在~/.bashrc
里面增加一行按键绑定设置
bind '\C-w:backward-kill-word'
然后发现并不起作用。又经过一番资料的查找,发现这和readline的配置有关系3。Readline是一个应用十分广泛的基础命令行编辑的库。
所以只要在上面设置的基础上,在~/.inputrc
中加入下面的命令即可
set bind-tty-special-chars Off
这样就可以在bash中通过Ctrl-W实现语义上的单词回退删除了。不过目前来看暂时还不知道这样设置之后会不会有什么副作用。
1 https://unix.stackexchange.com/questions/250690/how-to-configure-ctrlw-as-delete-word-in-zsh ↩
2 https://www.gnu.org/software/bash/manual/html_node/Commands-For-Killing.html ↩