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/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 模式,添加下面几行到 ~/.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