Readline
Readline 是 GNU Project 的一个库,由 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
这将设置命令模式下的块状光标和插入模式下的竖线光标。请注意,这需要启用模式指示器才能工作(参见 #提示符中的模式指示器)。
虚拟控制台使用不同的转义码,因此您应该首先检查正在使用哪个 term。
~/.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 在单词之间移动 。为了在其他终端模拟器中实现此效果,请找到正确的 终端代码[死链 2025-08-16—未解析域名],并在 ~/.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/Kconfigwhomountman 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"
此示例将行包装在 su -c '' 中并执行它,如果按下 Alt+s:
"\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 自动修改和运行粘贴的命令。