8.3 Readline 初始化文件

评论 0 浏览 0 2023-01-26

尽管Readline库默认安装了一套类似Emacs的键盘绑定,但也可以使用一套不同的键盘绑定。 任何用户都可以通过把命令放在inputrc文件中来定制使用Readline的程序,这个文件的名称来自shell变量INPUTRC的值。如果这个变量没有设置,默认的是~/.inputrc。如果该文件不存在或者不能被读取,最终的默认值是/etc/inputrcbind内置命令也可以用来设置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等价物绑定在一起。

如果设置为‘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-mode

editing-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-historynext-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

终止增量搜索的字符串,随后不会将该字符作为命令执行(见在历史中搜索命令)。 如果这个变量没有被赋予一个值,字符ESCC-J将终止增量搜索。

keymap

设置Readline’对当前键绑定命令的键图的想法。 内置的keymap名称是emacsemacs-standardemacs-metaemacs-ctlxvivi-movevi-commandvi-insertvi相当于vi-commandvi-move也是一个同义词);emacs相当于emacs-standard。 应用程序可以添加其他名称。 默认值是emacsediting-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’。

match-hidden-files

这个变量,当设置为‘on’时,会使Readline在执行文件名完成时匹配文件名以‘.’(隐藏文件)。如果设置为‘off’,前面的‘.’必须由用户在要完成的文件名中提供。 这个变量默认为‘on&rsquo。

menu-complete-display-prefix

如果设置为‘on’,菜单补全在循环浏览列表之前显示可能补全的共同前缀(可能为空)。默认是‘off’。

output-meta

如果设置为‘on’,Readline将直接显示设置了第八位的字符,而不是作为元前缀的转义序列。 默认是‘off’,但如果locale包含八位字符,Readline将把它设置为‘on’。 这个变量取决于LC_CTYPE locale类别,如果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的内置命令

keynamefunction-name or macro

keyname是用英文拼出的键的名称。比如说。

Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: "> output"

在上面的例子中,C-u被绑定到函数universal-argumentM-DEL被绑定到函数backward-kill-word,而C-o被绑定到运行右侧表达的宏(也就是将文本‘> output’插入行中)。

在处理这种键绑定语法时,可以识别一些符号字符名称:DELESCESCAPELFDNEWLINERETRETURNRUBOUTSPACESPC,和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是否处于emacsvi模式。 这可以与‘set keymap’命令一起使用,例如,只有当Readline以emacs模式开始时,才能在emacs-standardemacs-ctlx键图中设置绑定。

term

term=形式可用于包括终端特定的键绑定,也许是绑定终端’功能键 "输出的键序列。在‘=’右侧的单词会与终端的全名和终端名称中第一个‘-’之前的部分进行测试。例如,这使得sun可以同时匹配sunsun-cmd

version

version测试可用于对特定的Readline版本进行比较。 version扩展到当前的Readline版本。 比较运算符集包括‘=’(和‘==’),‘!=在操作符右侧提供的版本号包括一个主要版本号、一个可选的小数点和一个可选的次要版本(例如。‘7.1’)。如果省略了次要版本,它将被假定为‘0’。 操作符可以用空格与字符串version和版本号参数分开。 下面的例子中,如果正在使用的Readline版本是7.0或更新版本,则设置一个变量。

$if version >= 7.0
set show-mode-in-prompt on
$endif
application

application构造用于包括特定的应用程序设置。每个使用Readline库的程序都会设置application name,你可以测试一个特定的值。这可以用来将按键序列与对特定程序有用的函数绑定。例如,下面的命令添加了一个按键序列,在Bash中引出当前或前一个单词。

$if Bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
variable

variable结构为Readline变量和值提供了简单的平等测试。 允许的比较运算符是‘=’、‘==’和‘!=’。 变量名称必须与比较运算符用空格分开;运算符可以与右边的值用空格分开。 可以测试字符串和布尔型变量。布尔变量必须与onoff的值进行测试。 下面的例子等同于上述的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
最后更新2023-03-10
0 个评论