8.2 Readline互动
在一个交互式会话中,你经常输入一长行文本,但却发现这行的第一个字拼错了。Readline库为你提供了一组命令,用于在你输入文本时对其进行操作,允许你只需修改你的错别字,而不强迫你重新输入该行的大部分内容。使用这些编辑命令,你把光标移到需要更正的地方,然后删除或插入更正的文字。然后,当你对这一行感到满意时,你只需按下RET。你不必在行末按下RET;不管光标在行内的位置如何,整个行都可以接受。
1 Readline 基本要点
为了在行中输入字符,只需键入它们。输入的字符会出现在光标所在的位置,然后光标会向右移动一个空格。如果你打错了一个字符,你可以用擦除字符来备份并删除打错的字符。
有时你可能会打错一个字符,直到你打完其他几个字符后才注意到这个错误。在这种情况下,你可以输入C-b将光标向左移动,然后纠正你的错误。之后,你可以用C-f把光标移到右边。
当你在一行中间添加文本时,你会注意到光标右侧的字符被‘推倒’,为你插入的文本腾出空间。同样,当你删除光标后面的文本时,光标右边的字符会被‘拉回来’,以填补删除文本后产生的空白。下面列出了编辑输入行文本的基本要素。
- C-b
向后移动一个字符。
- C-f
向前移动一个字符。
- DEL or Backspace
删除光标左边的字符。
- C-d
删除光标下方的字符。
- Printing characters
将字符插入光标处的行中。
- C-_ or C-x C-u
撤销最后的编辑命令。你可以一直撤消到一个空行。
(根据你的配置,Backspace键可能被设置为删除光标左边的字符,而DEL键被设置为删除光标下面的字符,如C-d,而不是光标左边的字符)。
2 Readline移动命令
上表描述了你在对输入行进行编辑时需要的最基本的按键。为了方便你,除了C-b、C-f、C-d和DEL之外,还增加了许多其他命令。下面是一些在行中更快速移动的命令。
- C-a
移动到行首。
- C-e
移动到行尾。
- M-f
向前移动一个单词,其中一个单词由字母和数字组成。
- M-b
向后移动一个词。
- C-l
清除屏幕,在顶部重新打印当前行。
请注意C-f是如何向前移动一个字符,而M-f则向前移动一个词。控制击键作用于字符而元击键作用于单词是一种松散的约定。
3 Readline 删除命令
Killing文本的意思是将文本从行中删除,但将其保存起来供以后使用,通常是通过yanking (重新插入)到行中。(‘Cut’和‘Paste’是‘kill’和‘yank’的较新行话)。
如果命令的描述说它“kill”文本,那么您可以确定稍后可以在不同(或相同)的位置取回文本。
当你使用kill命令时,文本被保存在一个kill-ring中。 任何数量的连续kill都会把所有被kill的文本保存在一起,这样当你把它拉回来时,你就能得到全部的文本。kill环并不是针对某一行的;你在之前输入的一行中kill的文本,在以后你输入另一行时,可以被拉回来。
这是用于删除文本的命令列表。
- C-k
删除从当前光标位置到行尾的文本。
- M-d
从光标处删除到当前单词的结尾,或者,如果在单词之间,则删除到下一个单词的结尾。 字的边界与M-f使用的边界相同。
- M-DEL
从光标处删除到当前单词的开头,或者,如果在单词之间,则删除到前一个单词的开头。字的边界与M-b使用的边界相同。
- C-w
从光标处删除到前一个空白处。这与M-DEL不同,因为单词的边界不同。
下面是如何将拉回文本返回行中。Yanking意味着从删除缓冲区复制最近被删除的文本。
- C-y
将最近被删除的文本拉回到光标处的缓冲区中。
- M-y
旋转kill-ring,并拉出新的顶部。只有当前面的命令是C-y或M-y时,你才能这样做。
4 Readline参数
您可以将数字参数传递给 Readline 命令。有时参数作为一个重复计数,其他时候参数的sign才是重要的。如果你给一个通常以前进方向行事的命令传递一个负参数,该命令将以后退方向行事。例如,如果要将文本删除到行首,你可以输入‘M--C-k’。
向命令传递数字参数的一般方法是在命令前输入元数字。如果输入的第一个‘数字’是一个减号(‘-’),那么参数的符号将是负数。一旦你输入了一个元数,让参数开始,你可以输入其余的数字,然后再输入命令。例如,要给C-d命令一个10的参数,你可以输入‘M-1 0 C-d’,这将删除输入行上接下来的十个字符。
5 在历史中搜索命令。
Readline提供了在命令历史(见9.1 Bash 历史工具)中搜索包含指定字符串的行的命令。 有两种搜索模式:增量和非增量。
增量搜索在用户完成输入搜索字符串之前开始。当输入搜索字符串的每个字符时,Readline 会显示历史记录中与目前输入的字符串匹配的下一个条目。增量搜索只需要找到所需的历史条目所需的字符数。 要在历史上向后搜索一个特定的字符串,输入C-r。键入C-s在历史中向前搜索。 存在于isearch-terminators
变量值中的字符用于终止增量搜索。 如果该变量没有被赋值,ESC和C-J字符将终止增量搜索。 C-g将终止增量搜索并恢复原行。 当搜索终止时,包含搜索字符串的历史条目成为当前行。
要在历史列表中找到其他匹配的条目,可根据情况输入C-r或C-s。 这将在历史中向后或向前搜索与迄今输入的搜索字符串相匹配的下一个条目。 任何与Readline命令绑定的其他键序将终止搜索并执行该命令。 例如,RET将终止搜索并接受该行,从而执行历史列表中的命令。 movement命令将终止搜索,使找到的最后一行成为当前行,并开始进行编辑。
Readline会记住最后一个增量的搜索字符串。如果输入了两个C-r,而中间没有任何定义新搜索字符串的字符,则使用任何记住的搜索字符串。
非增量搜索在开始搜索匹配的历史行之前,会读取整个搜索字符串。搜索字符串可以由用户输入,也可以是当前行内容的一部分。