跳转至内容

Readline

来自 ArchWiki

ReadlineGNU Project 提供的一个库,由 Bash 和其他 CLI 程序用于编辑和交互命令行。有关更多信息,请参阅 readline(3)

安装

readline 包很可能已经作为 Bash 的依赖项安装好了。

编辑模式

默认情况下,Readline 使用 Emacs 风格的快捷键与命令行交互。但是,通过将以下内容添加到 ~/.inputrc,也支持 vi 风格的编辑界面。

~/.inputrc
set editing-mode vi

或者,通过将以下行添加到 ~/.bashrc 来仅为 Bash 设置。

~/.bashrc
set -o vi

提示符中的模式指示器

Vi 风格的编辑有两种模式:命令模式和插入模式。通过添加以下选项,可以显示当前活动的模式。

~/.inputrc
set show-mode-in-prompt on

这将在你的提示符中打印一个字符串(默认情况下是 (cmd)/(ins)),可以通过 vi-ins-mode-stringvi-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+LeftCtrl+Right 在单词之间移动。要在其他终端模拟器中实现此效果,请查找正确的 终端代码[已损坏的链接 2025-08-16—域名未解析],并在 ~/.inputrc 中将它们绑定到 backward-wordforward-word

例如,对于 urxvt

~/.inputrc
"\e[1;5D": backward-word
"\e[1;5C": forward-word

另一个 macOS 风格(Alt+LeftAlt+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 自动修改和运行粘贴的命令。

参见