8.2 Readline 交互(Readline Interaction)
在交互会话中,你经常会输入一长串文本时,发现在文本开始的第一个单词拼错了。Realine 库会提供一组用于在你输入的文本中进行操作的命令,允许你来修复输入错误,并且不会强制使你重新输入整行。使用这些编辑命令,你可以移动你的光标到需要修改的位置,并且删除错误和插入正确的文本。之后,当你觉得没有问题了,就可以按 RET 键输入。你没必要非得在一行的结尾处按下 RET 键;光标处于这一行的任意位置时按下该键都是可行的。
8.2.1 Readline 基础(Readline Bare Essentials)
只要简单地敲击字符,就可以把它们输入到行中。敲击的字符会出现在光标处,之后光标向右移动一格。如果你错按了一个字符,可使用擦除字符向后删除已输错的字符。
译者注:在本参考手册的行编辑中,向后即是向左,向前即是向右。
有时你可能敲错了一个字符,但你在敲入了其它的几个字符之后才发现。在这种情况下,你可以按“C-b”将光标向左移动到错误的位置,然后修改。之后,你可以按“C-f”将光标向右移动。
当你在一行的中部添加文本时,你会注意到在光标右边的字符会向右移动为你插入的新字符腾出空间。同样地,在你删除光标后面的文本时,在光标右边的字符会向左移动来填补移除文本所产生的空白空间。下面列出了输入行文本编辑的基础操作。
| 按键 | 说明 |
|---|---|
| C-b | 光标向左移动一个字符。 |
| C-f | 光标向右移动一个字符。 |
| C-d | 删除光标位置的一个字符。 |
| DEL 或 Backspace | 删除光标左边的一个字符。 |
| 敲击字符 | 在行的光标处插入字符。 |
| C-_或 C-x C-u | 撤消最后一次编辑命令。你可以撤消所有输入变为空行。 |
依赖于你的配置,Backspace 键可以设置为删除光标左边的字符,和 DEL 键设置为像“C-d”一样的,删除光标当前位置的字符,而不是删除光标左边的字符。
8.2.2 Readline 移动命令(Readline Movement Commands)
上面的表所描述的是最基本的在输入行进行编辑的击键。为了使用便利,除了“C-b”、“C-f”、“C-d”和 DEL,还添加了许多其它命令。下面是一些在行中移动更加快速的命令。
| 按键 | 说明 |
|---|---|
| C-a | 移动到行开始位置。 |
| C-e | 移动到行末尾位置。 |
| M-f | 前进(即向右)移动一个单词,该单词是由字母和数字组成的。 |
| M-b | 后退(即向左)移动一个单词。 |
| C-l | 清屏,在屏幕顶部重新打印当前行。 |
注意,“C-f”移动的是一个字符位置,而“M-f”移动的是一个单词位置。这里有一个不成文的约定,即 Control 键是基于字符的操作,而 Meta 键是基于单词的操作。
8.2.3 Readline 终止命令(Readline Killing Commands)
终止(Killing)文本意味着将文本从行中删除,但会保留其以备以后拉回(yanking)到行中使用,即重新插入到行中使用。(在现在行业术语中更多的是使用剪切和粘贴来代替 killing 和 yanking)。
如果一个命令的描述中说其终止(kill)了文本,则你可以非常肯定的是你之后可以将这个文本再放到别的位置。
当你使用了终止(kill)命令,文本被保存到了一个叫终止回环(kill-ring)中。任意多次的连续终止操作会将所有终止的文本保存到一起。因此当你将其拉回(yank)来时,将会获取所有的文本。终止回环(kill-ring)不是用于指定行的;在上一输入行中终止的文本,之后当你在另一行中输入时可将其拉回到该行中。
下面列出了终止文本的命令。
| 按键 | 说明 |
|---|---|
| C-k | 终止从当前光标位置到该行末尾位置的文本。 |
| M-d | 终止从当前光标位置到当前单词末尾位置的文本,或如果光标位于两个单词之间,则终止到下一个单词的末尾。该操作的单词边界是与“M-f”的边界一样的。 |
| M-DEL | 终止从当前光标位置到当前单词开始位置的文本,或如果光标位于两个单词之间,则终止到上一个单词的开始。该操作的单词边界是与“M-b”的边界一样的。 |
| C-w | 终止当前光标位置到上一个空格位置的文本。该操作不同于“M-DEL”,因为单词边界不同。 |
下面是如何将文本拉回行中的操作。拉回意味着从终止缓冲中将最近终止的文本拷贝出来。
| 按键 | 说明 |
|---|---|
| C-y | 将最近终止的文本拉回到光标位置。 |
| M-y | 循环终止回环,并将新顶部拉回。如果前一命令是“C-y”或“M-y”,你才可以进行这个操作。 |
8.2.4 Readline 的参数(Readline Arguments)
你可以给 Readline 命令传递数字参数。有时参数会作为重复次数,有时作为重要的参数符号。如果你在向一个前进方向上的命令传递一个负数参数,该命令会向后进行动作。例如,要将从光标位置到一行的开头进行终止文本操作,你可以键入“M— C-k”。
向一个命令传递数字参数,通常的方式是在键入命令前键入 Meta 加数字。如果第一位数字键入的是负号“-”,之后的参数符号将是负数。一旦你键入一个 Meta 数字来开始获取参数,你就可以键入剩余的数字,最后键入命令。例如,要给“C-d”命令传入参数 10,你应该键入“M-1 0 C-d”。其会删除光标位置的 10 个字符。
8.2.5 在历史中搜索命令(Searching for Commands in the History)
Readline 提供用于在命令历史列表(参见 9.1《Bash 历史工具》)中搜索包含指定字符串行的命令。其中包含两种搜索模式:增量模式和非增量模式。
增量搜索会在用户键入完整搜索字符串之前就开始搜索。当键入每一个搜索字符串中的字符时,Readline 会显示命令历史中匹配到键入了的字符串的条目。一个增量搜索只会显示尽量多字符匹配的历史条目。在历史中倒退搜索特定字符串,可键入“C-r”。键入“C-s”会向前搜索历史列表。在变量“isearch-terminators”中出现的字符用于结束增量搜索。如果该变量没有赋值,ESC 和“C-J”可用于结束增量搜索。“C-g”可中断增量搜索并且还原为原始行。当搜索结束时,包含搜索字符串的历史条目会变为当前行。
在历史列表中要找出另外匹配的条目,需要继续键入“C-r”或“C-s”。这样会在历史列表中继续倒退或前进匹配已键入的搜索字符串的条目。任意其它绑定到 Readline 命令的键序列会结束搜索并且执行该 Readline 命令。例如,回车键 RET 会结束搜索并且接受该行,从而执行历史列表中那一行的命令。移动命令也会结束搜索,使找到的那行变为当前行,并且开始编辑。
Readline 会记住最后一次增量搜索的字符串。如果在键入两次“C-r”之间没有输入新的搜索字符串,会使用已记住的搜索字符串。
非增量搜索会在开始搜索匹配的历史之前先读取整个搜索字符串。搜索字符串可以由用户键入或是当前行内容的一部分。