# Readline (简体中文)

本页面需要更新翻译，内容可能已经与英文脱节。要贡献翻译，请访问简体中文翻译组。

附注: please use the first argument of the template to provide more detailed indications.

相关文章

- Bash (简体中文)

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

Categories:

- Command shells (简体中文)
- 简体中文