8.3 Readline 初始化文件
尽管Readline库默认安装了一套类似Emacs的键盘绑定,但也可以使用一套不同的键盘绑定。 任何用户都可以通过把命令放在inputrc文件中来定制使用Readline的程序,这个文件的名称来自shell变量INPUTRC的值。如果这个变量没有设置,默认的是~/.inputrc。如果该文件不存在或者不能被读取,最终的默认值是/etc/inputrc。 bind内置命令也可以用来设置Readline键盘绑定和变量。 参见4.2 Bash的内置命令。
当一个使用Readline库的程序启动时,init文件被读取,并设置了键的绑定。
此外,C-x C-r命令会重新读取这个init文件,从而纳入你可能对它所做的任何修改。
1 Readline 初始化文件语法
在Readline init文件中只允许有一些基本的结构。以‘#’开头的行是注释。 以‘$’开头的行表示条件结构(见条件启动结构)。其他行表示变量设置和键的绑定。
- Variable Settings
你可以通过使用init文件中的
set命令改变Readline中的变量值来修改Readline的运行时行为。 语法很简单。set variable value例如,这里是如何从默认的类似Emacs的键绑定改变为使用
vi行的编辑命令。set editing-mode vi变量的名称和值,在适当的情况下,不考虑大小写而被识别。未被识别的变量名将被忽略。
布尔变量(那些可以设置为开或关的变量)如果值为空或空,on(不区分大小写),或1,则被设置为开。任何其他的值都会导致该变量被设置为关闭。
bind -V命令列出了当前Readline变量的名称和值。参见4.2 Bash的内置命令。大量的运行时行为是可以通过以下变量来改变的。
active-region-start-color一个字符串变量,用于控制在活动区域显示文本时的文本颜色和背景(见下面对
enable-active-region的描述)。 这个字符串不能占用显示器上的任何物理字符位置,所以它应该只由终端转义序列组成。在显示活动区域的文本之前,它会被输出到终端。 每当终端类型发生变化时,这个变量就会被重置为默认值。 默认值是将终端置于突出模式的字符串,这是从终端的 terminfo 描述中获得的。 一个示例值可能是 ‘\e[01;33m’ 。active-region-end-color一个字符串变量,用于撤销
active-region-start-color的影响,并在活动区域显示文本后恢复正常的终端显示外观。 这个字符串不能占用显示器上的任何物理字符位置,所以它应该只包括终端转义序列。在活动区域显示文本后,它将被输出到终端。 每当终端类型发生变化时,该变量将被重置为默认值。 默认值是将终端从突出模式中恢复的字符串,这是从终端’terminfo描述中获得的。 一个示例值可能是‘\e[0m’。bell-style控制当Readline想要响起终端铃声时的情况。 如果设置为‘none’,Readline从不响铃。如果设置为‘visible’,Readline会使用一个可见的铃声(如果有的话)。 如果设置为‘audible’(默认),Readline会尝试响起终端的铃声。
bind-tty-special-chars如果设置为‘on’(默认),Readline会尝试将内核’终端驱动特别处理的控制字符与它们的Readline等价物绑定在一起。
blink-matching-paren如果设置为‘on’,Readline会在插入闭合小括号时尝试将光标短暂地移动到开括号。默认值是‘off’。
colored-completion-prefix如果设置为 ‘on’,当列出补语时,Readline 会使用不同的颜色显示可能补语集合的公共前缀。 颜色的定义来自于
LS_COLORS环境变量的值。如果在LS_COLORS中有一个自定义后缀 ‘readline-colored-completion-prefix’的颜色定义,Readline 就会使用这个颜色来显示公共前缀,而不是默认的。 默认的是 ‘off’ 。colored-stats如果设置为‘on’,Readline会用不同的颜色来显示可能的完成度,以表示它们的文件类型。 颜色的定义取自
LS_COLORS环境变量的值。 默认值是‘off’ 。comment-begin当执行
insert-comment命令时,要在行首插入的字符串。默认值是"#"。completion-display-width执行完成时用于显示可能的匹配的屏幕列数。 如果该值小于0或大于终端屏幕宽度,则会被忽略。 值为0将导致每行显示一个匹配。 默认值为-1。
completion-ignore-case如果设置为‘on’,Readline会以不区分大小写的方式执行文件名匹配和补全。 默认值为‘off’。
completion-map-case如果设置为‘on’,并且completion-ignore-case被启用,Readline在执行不区分大小写的文件名匹配和完成时将连字符(‘-’)和下划线(‘_’)视为等同。 默认值为‘off’。
completion-prefix-display-length可能完成的列表的共同前缀的长度(以字符为单位),不加修改地显示。当设置为大于0的值时,在显示可能的补语时,长于此值的普通前缀将被替换为省略号。
completion-query-items可能完成的数量,决定了当用户被问及是否应该显示可能性列表时。 如果可能完成的数量大于或等于这个值,Readline将询问用户是否希望查看它们;否则,它们将被简单列出。 这个变量必须被设置为大于或等于零的整数。 零值意味着Readline不应该询问;负值被视为零。 默认的限制是
100。convert-meta如果设置为‘on’,Readline将通过剥离第八位并为ESC字符加前缀,将设置有第八位的字符转换为ASCII的键序,将它们转换为元前缀的键序。默认值是‘on’,但如果locale是包含8位字符的,则会被设置为‘off’。 这个变量取决于
LC_CTYPElocale类别,如果locale被改变,则可能会改变。disable-completion如果设置为‘On’,Readline将抑制单词完成。 完成字符将被插入行中,就像它们被映射到
self-insert一样。默认值是‘off’。echo-control-characters当设置为‘on’时,在表明支持它的操作系统上,Readline会呼应一个与从键盘产生的信号相对应的字符。默认是‘on’。
editing-modeediting-mode变量控制使用哪一组默认的键位绑定。默认情况下,Readline 在 Emacs 编辑模式下启动,那里的按键与 Emacs 最相似。这个变量可以设置为‘emacs’或‘vi’。emacs-mode-string如果启用了 show-mode-in-prompt 变量, 该字符串紧接在主要的最后一行之前显示 当 emacs 编辑模式处于活动状态时提示。该值扩展为 键绑定,所以标准的元和控制前缀集和 反斜杠转义序列可用。 使用‘\1’和‘\2’转义开始和结束序列 非打印字符,可用于嵌入终端控件 序列进入模式字符串。 默认值为“@”。
enable-active-region点是当前光标位置,标记是指 到保存的光标位置(参见移动命令)。 点和标记之间的文本称为区域。 当此变量设置为“On”时,Readline 允许某些命令 将该区域指定为活动。 当该区域处于活动状态时,Readline 使用以下命令突出显示该区域中的文本
active-region-start-color的值,默认为 启用的字符串 终端的突出模式。 活动区域显示括号粘贴插入的文本和任何 通过增量和非增量历史搜索找到的匹配文本。 默认值为“开启”。enable-bracketed-paste当设置为‘On’时,Readline将终端配置为将每个粘贴内容作为一串字符插入编辑缓冲区,而不是将每个字符当作从键盘上读取的字符。 这被称为将终端放入括号粘贴模式;它防止Readline执行任何与出现在粘贴文本中的按键序列绑定的编辑命令。 默认为‘On’。
enable-keypad当设置为‘on’时,Readline在被调用时将尝试启用应用程序键盘。有些系统需要这样做来启用箭头键。默认值是‘off’。
enable-meta-key当设置为‘on’时,Readline在被调用时将尝试启用终端声称支持的任何元修改键。在许多终端上,元键被用来发送八位字符。 默认是‘on’。
expand-tilde如果设置为‘on’,当Readline试图完成单词时,就会进行tilde扩展。默认值是‘off’。
history-preserve-point如果设置为‘on’,历史代码会尝试将点(当前光标位置)放置在用
previous-history或next-history检索的每条历史线的相同位置。默认是‘off’。history-size设置历史列表中保存的最大历史条目数。 如果设置为零,任何现有的历史条目都会被删除,不会保存新的条目。 如果设置为小于零的值,历史条目的数量不受限制。 默认情况下,历史条目的数量不受限制。 如果试图将history-size设置为非数字值,最大的历史条目数将被设置为500。
horizontal-scroll-mode这个变量可以被设置为‘on’或‘off’。将其设置为‘on’意味着当被编辑的行长于屏幕宽度时,将在单个屏幕行上水平滚动,而不是包裹到新的屏幕行上。 对于高度为1的终端,该变量自动设置为‘on’。 默认情况下,该变量被设置为‘off’。
input-meta-
如果设置为‘on’,Readline将启用八位输入(它不会清除它所读取的字符中的第八位),不管终端声称它能支持什么。默认值是‘off’,但如果locale包含八位字符,Readline将把它设置为‘on’。 名字
meta-flag是这个变量的同义词。 这个变量依赖于LC_CTYPE的locale类别,如果locale被改变,可能会改变。 isearch-terminators终止增量搜索的字符串,随后不会将该字符作为命令执行(见在历史中搜索命令)。 如果这个变量没有被赋予一个值,字符ESC和C-J将终止增量搜索。
keymap设置Readline’对当前键绑定命令的键图的想法。 内置的
keymap名称是emacs、emacs-standard、emacs-meta、emacs-ctlx、vi、vi-move、vi-command和vi-insert。vi相当于vi-command(vi-move也是一个同义词);emacs相当于emacs-standard。 应用程序可以添加其他名称。 默认值是emacs。editing-mode变量的值也会影响默认的键图。keyseq-timeout指定 Readline 在读取一个模棱两可的键序(一个可以用目前读到的输入形成一个完整的键序,或者可以用额外的输入来完成一个较长的键序)时等待一个字符的时间。 如果在超时内没有收到输入,Readline 将使用较短但完整的键序。Readline使用这个值来确定当前输入源(默认为
rl_instream)上是否有输入。 这个值以毫秒为单位,所以1000的值意味着Readline将等待一秒钟的额外输入。 如果这个变量被设置为小于或等于0的值,或者是一个非数字值,Readline将等待,直到另一个键被按下,以决定完成哪个键序。 默认值是500。mark-directories如果设置为‘on’,则完成的目录名会附加一个斜线。默认是‘on’。
mark-modified-lines这个变量,当设置为‘on’时,会使Readline在被修改的历史行的开头显示一个星号(‘*’)。 这个变量默认为‘off’。
mark-symlinked-directories如果设置为‘on’,作为目录的符号链接的完成名称会附加一个斜线(以
mark-directories的值为准)。 默认值为‘off’。这个变量,当设置为‘on’时,会使Readline在执行文件名完成时匹配文件名以‘.’(隐藏文件)。如果设置为‘off’,前面的‘.’必须由用户在要完成的文件名中提供。 这个变量默认为‘on&rsquo。
如果设置为‘on’,菜单补全在循环浏览列表之前显示可能补全的共同前缀(可能为空)。默认是‘off’。
output-meta如果设置为‘on’,Readline将直接显示设置了第八位的字符,而不是作为元前缀的转义序列。 默认是‘off’,但如果locale包含八位字符,Readline将把它设置为‘on’。 这个变量取决于
LC_CTYPElocale类别,如果locale改变,可能会发生变化。page-completions如果设置为‘on’,Readline会使用一个类似于
more的内部寻呼机来一次显示一屏的可能完成的内容。 这个变量默认为‘on’。print-completions-horizontally如果设置为‘on’,Readline将显示按字母顺序水平排序的匹配内容,而不是在屏幕下方显示。 默认为‘off’。
revert-all-at-newline如果设置为‘on’,Readline将在执行
accept-line时返回之前撤销对历史行的所有修改。默认情况下,历史行可以被修改,并在调用readline()时保留单独的撤销列表。默认是‘off’。show-all-if-ambiguous这改变了完形函数的默认行为。如果设置为‘on’,那么有多个可能完成的单词就会立即被列出,而不是敲钟。 默认值是‘off’。
show-all-if-unmodified这改变了完成函数的默认行为 类似于 show-all-if-ambiguous 的方式。 如果设置为‘on’, 有不止一种可能的完成而没有任何的词 可能的部分完成(可能的完成不共享 一个公共前缀)导致立即列出匹配项 敲响钟声。 默认值为“关闭”。
show-mode-in-prompt如果设置为‘on’,则在提示的开头添加一个字符串,表示编辑模式:emacs、vi命令或vi插入。 模式字符串是用户可设置的(例如,emacs-mode-string)。 默认值为‘off’。
skip-completed-text如果设置为‘on’,这将改变在行中插入单个匹配时的默认完成行为。它只在一个词的中间执行完成时有效。如果启用,Readline不会从补全中插入与被补全的单词后的字符相匹配的字符,因此光标后的单词部分不会被重复。例如,如果启用了这个功能,当光标在‘e’中的‘Makefile’之后尝试完成时,将产生‘Makefile’而不是‘Makefilefile’,假设有一个可能的完成。默认值是‘off’。
vi-cmd-mode-string如果启用了 show-mode-in-prompt 变量, 该字符串紧接在主要的最后一行之前显示 当 vi 编辑模式处于活动状态且处于命令模式时提示。 该值扩展为 键绑定,所以标准的元和控制前缀集和 反斜杠转义序列可用。 使用‘\1’和‘\2’转义开始和结束序列 非打印字符,可用于嵌入终端控件 序列进入模式字符串。 默认值为“(cmd)”。
vi-ins-mode-string如果启用了 show-mode-in-prompt 变量, 该字符串紧接在主要的最后一行之前显示 当 vi 编辑模式处于活动状态且处于插入模式时提示。 该值扩展为 键绑定,所以标准的元和控制前缀集和 反斜杠转义序列可用。 使用‘\1’和‘\2’转义开始和结束序列 非打印字符,可用于嵌入终端控件 序列进入模式字符串。 默认值为“(ins)”。
visible-stats如果设置为‘on’,在列出可能的完成情况时,表示文件’类型的字符将被附加到文件名上。默认是‘off’。
- Key Bindings
在init文件中控制键绑定的语法很简单。首先,你需要找到你想改变的命令的名称。下面几节包含了命令名称、默认键绑定(如果有的话)以及该命令作用的简短描述的表格。
一旦你知道了命令的名称,只需在init文件中的一行中放入你想绑定命令的键的名称,一个冒号,然后是命令的名称。 在键的名称和冒号之间不能有空格–那将被解释为键的名称的一部分。 键的名称可以用不同的方式表达,取决于你认为最舒服的方式。
除了命令名称之外,Readline还允许将按键绑定到一个字符串上,这个字符串在按键时被插入(一个macro)。
bind -p命令以一种可以直接放入初始化文件的格式显示Readline函数的名称和绑定。 参见4.2 Bash的内置命令。- keyname: function-name or macro
keyname是用英文拼出的键的名称。比如说。
Control-u: universal-argument Meta-Rubout: backward-kill-word Control-o: "> output"在上面的例子中,C-u被绑定到函数
universal-argument,M-DEL被绑定到函数backward-kill-word,而C-o被绑定到运行右侧表达的宏(也就是将文本‘> output’插入行中)。在处理这种键绑定语法时,可以识别一些符号字符名称:DEL,ESC,ESCAPE,LFD,NEWLINE,RET,RETURN,RUBOUT,SPACE,SPC,和TAB。
- "keyseq": function-name or macro
keyseq与上面的keyname不同的是,表示整个键序的字符串可以被指定,方法是将键序放在双引号中。一些GNUEmacs风格的键转义可以被使用,如下面的例子,但特殊字符的名称不被识别。
"\C-u": universal-argument "\C-x\C-r": re-read-init-file "\e[11~": "Function Key 1"在上面的示例中,C-u 再次绑定到函数
universal-argument(就像第一个例子一样), ‘C-xC-r’绑定到函数re-read-init-file, 和 'ESC [ 1 1 ~' 绑定插入 文本“功能键 1”。
下列GNUEmacs风格的转义序列在指定按键序列时是可用的。
\C-控制字头
\M-meta前缀
\e一个转义字符。
\\反斜杠
\"",一个双引号。
\'',一个单引号或撇号。
除了GNUEmacs风格的转义序列外,还有第二套反斜杠转义可用。
\a警报(吠叫)。
\b退格键
\d删去
\f形式上的馈赠
\n换行线
\r回车键
\t水平线标签
\v竖向标签
\nnn八位字符,其值为八进制值nnn(一至三位数)。
\xHH八位字符,其值为十六进制值HH(一个或两个十六进制数字)。
在输入宏的文本时,必须使用单引号或双引号来表示宏的定义。 未加引号的文本被认为是函数名称。 在宏的正文中,上述反斜杠转义被展开。反斜线将引用宏文本中的任何其他字符,包括‘"’和‘'’。 例如,下面的绑定将使‘C-x \’插入单个‘\’ 到该行。
"\C-x\\": "\\"
2 条件初始化构造
Readline实现了一个类似于C预处理器的条件编译功能的设施,它允许在测试结果中进行键绑定和变量设置。有四个解析器指令被使用。
$if$if结构允许根据编辑模式、正在使用的终端或使用Readline的应用程序来进行绑定。测试的文本,在任何比较运算符之后,延伸到行的末端;除非另有说明,否则不需要任何字符来隔离它。mode$if指令的mode=形式用于测试Readline是否处于emacs或vi模式。 这可以与‘set keymap’命令一起使用,例如,只有当Readline以emacs模式开始时,才能在emacs-standard和emacs-ctlx键图中设置绑定。termterm=形式可用于包括终端特定的键绑定,也许是绑定终端’功能键 "输出的键序列。在‘=’右侧的单词会与终端的全名和终端名称中第一个‘-’之前的部分进行测试。例如,这使得sun可以同时匹配sun和sun-cmd。versionversion测试可用于对特定的Readline版本进行比较。version扩展到当前的Readline版本。 比较运算符集包括‘=’(和‘==’),‘!=在操作符右侧提供的版本号包括一个主要版本号、一个可选的小数点和一个可选的次要版本(例如。‘7.1’)。如果省略了次要版本,它将被假定为‘0’。 操作符可以用空格与字符串version和版本号参数分开。 下面的例子中,如果正在使用的Readline版本是7.0或更新版本,则设置一个变量。$if version >= 7.0 set show-mode-in-prompt on $endifapplicationapplication构造用于包括特定的应用程序设置。每个使用Readline库的程序都会设置application name,你可以测试一个特定的值。这可以用来将按键序列与对特定程序有用的函数绑定。例如,下面的命令添加了一个按键序列,在Bash中引出当前或前一个单词。
$if Bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" $endifvariablevariable结构为Readline变量和值提供了简单的平等测试。 允许的比较运算符是‘=’、‘==’和‘!=’。 变量名称必须与比较运算符用空格分开;运算符可以与右边的值用空格分开。 可以测试字符串和布尔型变量。布尔变量必须与on和off的值进行测试。 下面的例子等同于上述的
mode=emacs测试。$if editing-mode == emacs set show-mode-in-prompt on $endif
$endif从前面的例子中可以看出,这条命令终止了一条
$if的命令。$else如果测试失败,
$if指令的这一分支中的命令将被执行。$include该指令以一个文件名为参数,从该文件中读取命令和绑定。 例如,下面的指令从/etc/inputrc中读取。
$include /etc/inputrc
3 示例初始文件
下面是一个inputrc文件的例子。这说明了键绑定、变量分配和条件语法。
# This file controls the behaviour of line input editing for
# programs that use the GNU Readline library. Existing
# programs include FTP, Bash, and GDB.
#
# You can re-read the inputrc file with C-x C-r.
# Lines beginning with '#' are comments.
#
# First, include any system-wide bindings and variable
# assignments from /etc/Inputrc
$include /etc/Inputrc
#
# Set various bindings for emacs mode.
set editing-mode emacs
$if mode=emacs
Meta-Control-h: backward-kill-word Text after the function name is ignored
#
# Arrow keys in keypad mode
#
#"\M-OD": backward-char
#"\M-OC": forward-char
#"\M-OA": previous-history
#"\M-OB": next-history
#
# Arrow keys in ANSI mode
#
"\M-[D": backward-char
"\M-[C": forward-char
"\M-[A": previous-history
"\M-[B": next-history
#
# Arrow keys in 8 bit keypad mode
#
#"\M-\C-OD": backward-char
#"\M-\C-OC": forward-char
#"\M-\C-OA": previous-history
#"\M-\C-OB": next-history
#
# Arrow keys in 8 bit ANSI mode
#
#"\M-\C-[D": backward-char
#"\M-\C-[C": forward-char
#"\M-\C-[A": previous-history
#"\M-\C-[B": next-history
C-q: quoted-insert
$endif
# An old-style binding. This happens to be the default.
TAB: complete
# Macros that are convenient for shell interaction
$if Bash
# edit the path
"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
# prepare to type a quoted word --
# insert open and close double quotes
# and move to just after the open quote
"\C-x\"": "\"\"\C-b"
# insert a backslash (testing backslash escapes
# in sequences and macros)
"\C-x\\": "\\"
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
# Add a binding to refresh the line, which is unbound
"\C-xr": redraw-current-line
# Edit variable on current line.
"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
$endif
# use a visible bell if one is available
set bell-style visible
# don't strip characters to 7 bits when reading
set input-meta on
# allow iso-latin1 characters to be inserted rather
# than converted to prefix-meta sequences
set convert-meta off
# display characters with the eighth bit set directly
# rather than as meta-prefixed characters
set output-meta on
# if there are 150 or more possible completions for a word,
# ask whether or not the user wants to see all of them
set completion-query-items 150
# For FTP
$if Ftp
"\C-xg": "get \M-?"
"\C-xt": "put \M-?"
"\M-.": yank-last-arg
$endif