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. See readline(3) for more information.

Installation

The readline package is most likely already installed as a dependency of Bash.

Editing mode

By default Readline uses Emacs style shortcuts for interacting with command line. However, vi style editing interface is also supported by adding the following to ~/.inputrc:

~/.inputrc
set editing-mode vi

Alternatively, to set it only for Bash by adding the following line to ~/.bashrc:

~/.bashrc
set -o vi

Mode indicator in prompt

Vi-style editing has two modes: command and insert. You can display which one is currently active by adding the following option:

~/.inputrc
set show-mode-in-prompt on

This will print a string in your prompt ((cmd)/(ins) by default) that can be customized with the vi-ins-mode-string and variables.

Different cursor shapes for each mode

You can set a different cursor shape for each mode by using "\1 .. \2" escapes:

This will set a block shaped cursor when in command mode and a pipe cursor when in insert mode. Note that you must have the mode indicator enabled for this to work (see #Mode indicator in prompt.

The Virtual Console uses different escape codes, so you should check first which term is being used:

See software cursor for VGA for further details.

Fast word movement

Xterm supports moving between words with and Ctrl+Right by default. To achieve this effect with other terminal emulators, find the correct terminal codes, and bind them to and in ~/.inputrc.

For example, for urxvt:

History

Usually, pressing the up arrow key will cause the last command to be shown regardless of the command that has been typed so far. However, users may find it more practical to list only past commands that match the current input.

For example, if the user has typed the following commands:

  • ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig

In this situation, when typing and pressing the up arrow key, current input will be replaced with , the last performed command. If the history search has been enabled, only past commands beginning with (the current input) will be shown, in this case ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig.

You can enable the history search mode by adding the following lines to or :

"\e[A": history-search-backward
"\e[B": history-search-forward

If you are using vi mode, you can add the following lines to (from this post):

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
j: history-search-forward
k: history-search-backward
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 , 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 (abort) will cancel the search and restore the current input line. So in order to search through all previous 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 by default. Beware that most terminals override to suspend execution until 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 . For example, to use Alt+S which is not bound by default:

"\es": forward-search-history

Faster completion

When performing tab completion, a single tab attempts to partially complete the current word. If no partial completions are possible, a double tab shows all possible completions.

The double tab can be changed to a single tab by setting:

Or you can set it such that a single tab will perform both steps: partially complete the word and show all possible completions if it is still ambiguous:

Colorized completion

You can enable coloring of completion of filenames with the option. You can also color the identical prefix of completion-lists with . For example:

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+. Readline will act as though (end-of-line) had been pressed, appended with ''.

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 append "| less" to the line and run it ( is equivalent to ):

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

The next one prefixes the line with 'yes |' when pressing , 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"

This example prefixes the line with , if Alt+S is pressed. It is safer because it will not input the key.

"\es": "\C-asudo \C-e"

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

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

Disabling control echo

Readline causes the terminal to echo ^C after is pressed. For users who wish to disable this, simply add the following to :

set echo-control-characters off
gollark: It was Rph, they're not on here.
gollark: https://media.discordapp.net/attachments/277889706178641931/767039003379367946/20201017_165709.jpg?width=562&height=422
gollark: Correction, *Minecraft* as init.
gollark: I saw someone somehow use java as their init, but I think that was some kind of convoluted joke.
gollark: > play of the game 2020`punch tree`?

See also

This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.