Bash中的单词删除

在使用命令行的时候,个人经常用到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-word2,那么能不能把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

3 http://shallowsky.com/blog/linux/bash-word-erase.html

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注