Readline
Readline 是 GNU 项目 的一个库,被 Bash 和其他 CLI 程序用于编辑和交互命令行。 更多信息请参阅 readline(3)。
安装
readline 软件包很可能已经作为 Bash 的依赖项安装。
编辑模式
默认情况下,Readline 使用 Emacs 风格的快捷键与命令行交互。 但是,通过在 ~/.inputrc
中添加以下内容,也支持 vi 风格的编辑界面
~/.inputrc
set editing-mode vi
或者,仅为 Bash 设置,请将以下行添加到 ~/.bashrc
~/.bashrc
set -o vi
提示符中的模式指示器
Vi 风格的编辑有两种模式:命令模式和插入模式。 您可以通过添加以下选项来显示当前活动的模式
~/.inputrc
set show-mode-in-prompt on
这将在您的提示符中打印一个字符串(默认为 (cmd)
/(ins)
),可以使用 vi-ins-mode-string
和 vi-cmd-mode-string
变量自定义。
每种模式下不同的光标形状
您可以使用 "\1 .. \2" 转义序列 为每种模式设置不同的光标形状
~/.inputrc
set vi-ins-mode-string \1\e[6 q\2 set vi-cmd-mode-string \1\e[2 q\2
这将在命令模式下设置块状光标,在插入模式下设置管道光标。 请注意,您必须启用模式指示器才能使其工作(请参阅 #提示符中的模式指示器)。
虚拟控制台使用不同的转义码,因此您应该首先检查正在使用哪个终端
~/.inputrc
$if term=linux set vi-ins-mode-string \1\e[?0c\2 set vi-cmd-mode-string \1\e[?8c\2 $else set vi-ins-mode-string \1\e[6 q\2 set vi-cmd-mode-string \1\e[2 q\2 $endif
有关更多详细信息,请参阅 VGA 的软件光标。
快速单词移动
Xterm 默认情况下支持使用 Ctrl+Left
和 Ctrl+Right
在单词之间移动。 要在其他终端模拟器中实现此效果,请找到正确的终端代码,并将它们绑定到 ~/.inputrc
中的 backward-word
和 forward-word
。
例如,对于 urxvt
~/.inputrc
"\e[1;5D": backward-word "\e[1;5C": forward-word
另一个示例,用于 macOS 风格(Alt+Left
和 Alt+Right
)的单词移动
~/.inputrc or /etc/inputrc
"\e[1;9D": backward-word "\e[1;9C": forward-word
历史记录
历史记录 配置分为
- 控制其操作,这是 shell 特定的配置,例如,请参阅 Bash#历史记录自定义 和
- 影响交互,可以通过 shell 特定的配置或其原生的
inputrc
配置来配置,后者适用于所有 shell,如下面的示例中所述。
通常,按向上箭头键将显示最后一条命令,而不管目前已键入的命令是什么。 但是,用户可能会发现仅列出与当前输入匹配的过去命令更为实用。
例如,如果用户已键入以下命令
ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig
who
mount
man mount
在这种情况下,当键入 ls
并按下向上箭头键时,当前输入将被替换为最后执行的命令 man mount
。 如果启用了历史记录搜索,则只会显示以前以 ls
(当前输入)开头的命令,在本例中为 ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig
。
您可以通过将以下行添加到 /etc/inputrc
或 ~/.inputrc
来启用历史记录搜索模式
"\e[A": history-search-backward "\e[B": history-search-forward
如果您使用 vi 模式,则可以将以下行添加到 readline 配置文件中(来自 BBS#54972)
~/.inputrc
set editing-mode vi $if mode=vi set keymap vi-command # these are for vi-command mode "\e[A": history-search-backward "\e[B": history-search-forward j: history-search-forward k: history-search-backward set keymap vi-insert # these are for vi-insert mode "\e[A": history-search-backward "\e[B": history-search-forward $endif
如果您选择将这些行添加到 ~/.inputrc
,建议您也在文件开头添加以下行,以避免类似 BBS#112537 的奇怪问题
$include /etc/inputrc
或者,可以使用反向搜索历史记录(增量搜索),方法是按 Ctrl+r
,它不是基于先前的输入进行搜索,而是在历史记录缓冲区中向后跳转,因为命令是在搜索词中键入的。 在此模式下再次按 Ctrl+r
将显示缓冲区中与当前搜索词匹配的上一行,而按 Ctrl+g
(中止)将取消搜索并恢复当前输入行。 因此,为了搜索所有以前的 mount
命令,请按 Ctrl+r
,键入“mount”,然后一直按 Ctrl+r
直到找到所需的行。
此模式的向前等效模式称为 forward-search-history,默认情况下绑定到 Ctrl+s
。 请注意,大多数终端会覆盖 Ctrl+s
以暂停执行,直到输入 Ctrl+q
为止。(这称为 XON/XOFF 流控制)。 为了激活 forward-search-history,请通过发出以下命令来禁用流控制
$ stty -ixon
或在 inputrc
中使用不同的键。 例如,要使用默认情况下未绑定的 Alt+s
"\es": forward-search-history
更快的补全
执行 Tab 补全时,按一次 Tab 键会尝试部分补全当前单词。 如果无法进行部分补全,则按两次 Tab 键会显示所有可能的补全。
双击 Tab 可以更改为单次 Tab,方法是设置
~/.inputrc
set show-all-if-unmodified on
或者您可以将其设置为单次 Tab 将执行两个步骤:部分补全单词,并且如果仍然不明确,则显示所有可能的补全
~/.inputrc
set show-all-if-ambiguous on
彩色补全
您可以使用 colored-stats
选项启用文件名补全的着色。 您还可以使用 colored-completion-prefix
为补全列表的相同前缀着色。 例如
~/.inputrc
# Color files by types # Note that this may cause completion text blink in some terminals (e.g. xterm). set colored-stats On # Append char to indicate type set visible-stats On # Mark symlinked directories set mark-symlinked-directories On # Color the common prefix set colored-completion-prefix On # Color the common prefix in menu-complete set menu-complete-display-prefix On
宏
Readline 还支持将键绑定到键盘宏,例如
$ bind '"\ew": "\C-e # macro"'
要永久保留它,请将单引号内的部分添加到 readline 的配置文件中
~/.inputrc
"\ew": "\C-e # macro"
现在输入一行并按 Alt+w
。 Readline 的行为就像按下了 Ctrl+e
(行尾),并附加了“ # macro
”。
在 readline 宏中使用任何现有的键绑定,这对于自动化常用的习惯用法非常有用。 例如,以下宏使 Ctrl+Alt+l
将 | less
附加到行尾并运行它(Ctrl+m
等效于 Enter
)
"\e\C-l": "\C-e | less\C-m"
下一个宏在按下 Ctrl+Alt+y
时,在行首添加 yes |
,确认命令可能提出的任何是/否问题
"\e\C-y": "\C-ayes | \C-m"
如果按下 Alt+s
,此示例将行包装在 su -c ''
中并运行它
"\es": "\C-a su -c '\C-e'\C-m"
如果按下 Alt+s
,此示例会在行首添加 sudo
。 它允许您查看结果,并且不会输入 Enter
键。
"\es": "\C-asudo \C-e"
作为最后一个示例,使用 Ctrl+Alt+b
快速在后台发送命令,丢弃其所有输出
"\e\C-b": "\C-e > /dev/null 2>&1 &\C-m"
禁用控制回显
Readline 会导致终端在按下 Ctrl+c
后回显 ^C
。 对于希望禁用此功能的用户,只需将以下内容添加到 ~/.inputrc
set echo-control-characters off
带括号的粘贴
默认情况下,带括号的粘贴模式处于开启状态。 可以在 ~/.inputrc
中手动设置
set enable-bracketed-paste on
这确保了粘贴到 Readline 中的内容会将剪贴板作为单个字符串插入,而不是像从键盘输入字符一样插入字符。 这是一种安全措施,可防止 Readline 自动修改和运行粘贴的命令。