在Linux的.inputrc文件中创建宏快捷键和函数快捷键
Readline还提供了自定义快捷的方式,你可以在home下的.inputrc文件中创建自定义快捷键。
自定义的快捷键有两种类型:
- 宏
- 函数
宏
你可以创建一个快捷键,它执行的时候会在光标的当前位置插入一串字符。在.inputrc文件(如果文件不存在则创建一个)中以以下格式输入一行字符。
<key combination>: "<string of characters>"
例如,如果我经常需要重定向输出到~/debug_output.txt。我可以在.inputrc中定义一个宏:
Control-g: " > ~/debug_output.txt"
现在只要我输入组合键Control-g,这个重定向语句就会被添加到我的光标后面。
当你创建宏的时候记住下面几点:
- 你可以用英语拼出(对于这一点,你可以查看bash的man页面的“Readline Key Bindings”一节)
- 由宏插入的字符序列必须使用双引号(")引用起来
- 上面示例中的Control-g很模糊,最好找一个跟创建的宏的意思有点关联的快捷键
- 有可能会覆盖默认快捷键(这点需要切记)
- 为了让快捷键生效,你必须创建一个新的shell实例(.inputrc是在shell启动的时候执行的)
函数
你还可以创建一个快捷键调用一个函数。Readline提供了很多提前定义好可供选择的函数。将一个快捷键映射到函数的格式为:
<key combination>: <function-name>
GNU的Readline手册中有一个可用的预定义函数的列表。
你也可以自定义函数,不过这需要用C语言来写,这不是本教程所要介绍的东西,也许以后会写一篇专门介绍这方面内容的教程。
有一个非常有用的预定义函数——菜单补全(menu-complete),它提供了另外一种自动补全方式。
默认的自动补全方式(使用TAB键)是:
- 在唯一匹配的情况下补全命令/路径/文件名
- 如果有多个匹配则显示一个列表列出所有的匹配
菜单补全会循环输出匹配的结果,每次函数调用的时候会输出下一个匹配项。这种补全方式有时候会很有用,特别是在自动补全长文件名的时候。在下面的语句添加到.inputrc中可以将TAB键映射到这种补全方式。
TAB: menu-complete
注意当你在.inputrc文件中添加了这条语句后,并不会在当前shell中马上生效,你需要重新创建一个shell实例来加载新的.inputrc。
在这篇文章中我们了解到Linux命令行的快捷键都是Readline定义的。快捷键有两种类型:
- 宏:展开一串字符
- 函数:执行一个动作
Readline提供了一系列的默认快捷键,同时也提供了在.inputrc自定义快捷键的方法。最后我们可以使用下面的命令查看所有的快捷键:
bind -p