GNU readline library

readline library

今天研究了一下bash,终于搞明白了这个readline库的作用,解决了一直想解决
的一个小问题:怎么实现类似于tcsh里头的M-p history-completion,还有如何
把Meta arrow-right/left设定成forward/backward-word。

Bash所有的行编辑命令都是通过调用readline library来实现的。这个readline
库受~/.inputrc的控制。而且不止是Bash,别的不少开源程序比如说R也通过
readline来接受命令行,所以学会调整~/.inputrc还是有一定的好处的。

首先,我们来看看系统默认都设了一些什么热键:

bind -p > temp.txt

然后启动一个编辑器(自然是emacs了)来编辑这个temp.txt文件。

我发现,类似于tcsh的历史扩展函数叫做history-search-backward,系统默认没
有绑定在任何键上。Meta-p被设置成non-incremental-reverse-search-history。

所以下一步就是把Meta-p设成history-search-backward,我先用bind来做个实验:

bind ‘"M-p": history-search-backward’

然后再做实验:

bin加上Meta-p Bash果然就调出了bind ‘"M-p": history-search-backward’!

之后就是把这个新的热键还有相对应的向前搜索写进~/.inputrc:

"M-p": history-search-backward "M-n": history-search-forward

再通过C-x C-r读进新的设置,我的Bash就实现了tcsh的那种历史展开了。

之后我还加上了:

"\M-\M-[C": forward-word "\M-\M-[D": backward-word "\M-k":
kill-whole-line

这样同时按下Meta和arrow right/left,在我的键盘上就可以实现
forward/backward word。

我是怎么知道同时按Meta和arrow right/left到底是什么控制符的?很简单,
Bash里头有一个功能可以让你输入raw control sequence:C-v。你在Bash里头先
按一下Control v,然后再按一下arrow right,在我的terminal里头就出现了:
^[[C,这就是Meta [C了,因为control [等于Meta。而我想要的组合是meta 加
arrow right,所以就应该写成\M-\M\[C,这是emacs lisp里头的标准写法。

查看readline的手册(man readline,或者bind -l)给出了很多函数,我还没有
来得及仔细研究。不过大部分估计都没什么太大的用处。

,

  1. 发表评论

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: