Linux中的Readline

什么是Readline

今天在弄MATLAB命令行的过程中,了解到了有这么个东西的存在。那什么是Readline呢?

准确的说应该是GNU Readline。在Linux的世界中,命令行界面是无处不在。很多应用程序都提供了自己的交互式命令行界面,也就是说需要用户敲入命令/数据,然后应用程序给出结果。我们需要手动敲入命令,输入即编辑。说到编辑,最简单的方式就是手动输入,如果有错误,就用退格键删除,重新输入。那么问题来了,我想自动补全怎么整?我想快速输入以前输入过的命令怎么整?我想搜索输入历史怎么整?…。GNU Readline就是干这个的。

GNU Readline是一个库,其通过命令行界面(如Bash)为交互式程序提供行编辑和历史功能。其实GNU Readline就相当于一个变相的、迷你的编辑器。

Readline使用

GNU Readline有两种编辑模式,即Emacs和vi编辑模式。默认的应该是Emacs编辑模式,但在vi的插入模式下Emacs的一些快捷键也是可以使用的,比如Ctrl+H删除一个字符。

GNU Readline的配置文件为/etc/inputrc(系统)和~/.inputrc(用户)。通过修改配置来更改GNU Readline的行为,比如编辑模式等。通过统一的配置文件,可以控制所有使用了 GNU Readline库的命令行应用的编辑方式。比如,作为一个VIM党,我想在所有的命令行中使用VIM。我只需要配置GNU Readline的编辑模式为vi,我就可以在所有使用了GNU Readline库的命令行应用中使用VIM来输入命令。使用了GNU Readline库的应用有比如BashMysql的命令行界面等。

GNU Readline的配置可以参考 Archlinux Wiki

rlwrap

如前面所说,有了GNU Readline库,就可以在使用了GNU Readline库的命令行应用中使用VIM。那么,问题来了。 面对没有使用GNU Readline库的命令行应用,我们应该怎么整?答案就是使用rlwrap

rlwrapReadline wrapper。它可以让任何一个命令行应用支持GNU Readline。其大致原理为,封装命令行应用的输入和输出,然后控制用户的输入使用GNU Readline,然后再把用户输入的命令传给应用程序。相当于为命令行应用提供了一个可以使用GNU Readline库的前台。

安装(Archlinux):

sudo pacman -S rlwrap

使用例子(MATLAB):

rlwrap -a -c -m' \ ' -H ~/.matlab/R2017b/history.m matlab -nodesktop -nosplash -nodisplay

通过上面的命令就可以在MATLAB命令行中使用GNU Readline了。

comments powered by Disqus