Readline (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Tango-preferences-desktop-locale.png本文或本节需要翻译。要贡献翻译,请访问简体中文翻译团队Tango-preferences-desktop-locale.png

附注: 请使用模板的第一个参数进行更详细的指示。(在 Talk:Readline (简体中文)# 中讨论)

Readline is a library by the GNU Project, used by Bash and other CLI-interface programs to edit and interact with the command line. Before reading this page please refer to the library home page as only subtle configuration will be introduced here.

Command-line editing

By default Readline uses Emacs style shortcuts for interacting with command line. However, vi style editing interface is also supported. If you are a vi or vim user, you may want to put the following line to your ~/.inputrc to enable vi-like keybindings:

set -o vi

You may find either vi or emacs cheat sheets useful.

历史

通常,无论你输入了什么,按向上箭头就会出现上一次输入的命令。然而,许多用户觉得只显示以刚刚输入的内容为开头的命令更为实际。

例如,假设输入了以下命令:

  • 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 模式,添加下面几行到 ~/.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
set keymap vi-insert
# these are for vi-insert mode
"\e[A": history-search-backward
"\e[B": history-search-forward
$endif

If you chose to add these lines to ~/.inputrc, it is recommended that you also add the following line at the beginning of this file to avoid strange things like this:

$include /etc/inputrc

Alternatively, one can use reverse-search-history (incremental search) by pressing Ctrl+R, which does not search based on previous input but instead jumps backwards in the history buffer as commands are typed in a search term. Pressing Ctrl+R again during this mode will display the previous line in the buffer that matches the current search term, while pressing Ctrl+G (abort) will cancel the search and restore the current input line. So in order to search through all previous mount commands, press Ctrl+R, type 'mount' and keep pressing Ctrl+R until the desired line is found.

The forward equivalent to this mode is called forward-search-history and is bound to Ctrl+S by default. Beware that most terminals override Ctrl+S to suspend execution until Ctrl+Q is entered. (This is called XON/XOFF flow control). For activating forward-search-history, either disable flow control by issuing:

$ stty -ixon

or use a different key in inputrc. For example, to use Alt+S which is not bound by default:

"\es":forward-search-history

History search

Avoid duplicates

If you repeat the same command several times, they will all be appended in your history. To prevent this, add to your ~/.bashrc:

export HISTCONTROL=ignoredups

Avoid whitespaces

To disable logging blank commands add this to your ~/.bashrc:

export HISTCONTROL=ignorespace

If your ~/.bashrc already contains

export HISTCONTROL=ignoredups

replace it with

export HISTCONTROL=ignoreboth

Macros

Readline also supports binding keys to keyboard macros. For simple example, run this command in Bash:

bind '"\ew":"\C-e # macro"'

or add the part within single quotes to inputrc:

"\ew":"\C-e # macro"

Now type a line and press Alt+W. Readline will act as though Ctrl+E (end-of-line) had been pressed, appended with ' # macro'.

Use any of the existing keybindings within a readline macro, which can be quite useful to automate frequently used idioms. For example, this one makes Ctrl+Alt+L append "| less" to the line and run it (Ctrl+M is equivalent to Enter:

"\e\C-l":"\C-e | less\C-m"

The next one prefixes the line with 'yes |' when pressing Ctrl+Alt+Y, confirming any yes/no question the command might ask:

"\e\C-y":"\C-ayes | \C-m"

This example wraps the line in su -c '', if Alt+S is pressed:

"\es":"\C-a su -c '\C-e'\C-m"

As a last example, quickly send a command in the background with Ctrl+Alt+B, discarding all of its output:

"\e\C-b":"\C-e > /dev/null 2>&1 &\C-m"

Tips and tricks

Disabling control echo

Due to an update to readline, the terminal now echoes ^C after Ctrl+C is pressed. For users who wish to disable this, simply add the following to ~/.inputrc:

set echo-control-characters off