How to Create Linux Macro and Function Keybindings in .intputrc File

by Aaron Tabor on June 2, 2014

Readline also provides you with the ability to map your own custom keybindings by editing the .inputrc configuration file in your home directory.

The following are two types of custom keybindings you can define:

  1. Macros
  2. Functions

Macros

You can define a keybinding that will, when executed, fill in a string of characters at the cursor’s current position. To do this add a line with the following format to your .inputrc config file (or create the file if it doesn’t exist yet):

<key combination>: "<string of characters>"

For example, say I find myself repeatedly redirecting output to the file “~/debug_output.txt”. I could define a macro in my .inputrc by adding the following line:

Control-g: " > ~/debug_output.txt"

Now, whenever I type the key combination Control-g, the redirect statement will be added after my cursor, allowing me to easily append it to the end of other commands.

Keep the following in mind when you are creating macros:

  • I can spell out the key combinations in english (For more information on this, see the man page for bash. Search for the “Readline Key Bindings” section)
  • The sequence of characters to be inserted by the macro must be wrapped in double quotes (“)
  • The choice of Control-g was arbitrary, you could choose a combination that is more meaningful to you.
  • It is possible to override the default keybindings (keep this in mind when you define your own)
  • For the keybinding to take effect, you must start a new shell instance (.inputrc config file is read on shell startup)

Functions

You can also create a keybinding that will, when executed, call a function. Readline provides a large number of pre-defined functions to choose from. To map a key combination to a pre-defined function:

<key combination>: <function-name>

For a list of available pre-defined functions, see the GNU Readline manual.

It is also possible to define you own custom functions, but this requires writing them in C and is outside of the scope of this tutorial. We might cover that as a separate tutorial later.

One useful pre-defined function is menu-complete. It provides an alternate auto-completion behaviour.

The default behaviour for auto-completion (mapped to the TAB key) is to either:

  • fill in the partial command/directory/filename if a single match exists
  • display a list of possible matches when more than 1 exist

menu-complete will instead cycle through the list of possible matches, filling the next possible match in each time the function is called. This behaviour can be nice, especially when auto-completing longer filenames. To remap the TAB key to use this behaviour, add the following line to your .inputrc file.

TAB: menu-complete

Note that this new keybinding will not take effect in the current shell, you must start a new instance to reload the .inputrc configuration file

In this tutorial we’ve learned that the Linux command line keybindings are powered by a tool called Readline. A keybinding can be 1 of 2 types:

  • Macro: expands a sequence of characters
  • Function: performs an action

Readline provides us a set of default keybindings, but also provides us with the flexibility to create our own in the .inputrc configuration file. Finally, to see all of the current keybindings, we can use the ‘bind’ command.

bind -p

Linux Sysadmin Course Linux provides several powerful administrative tools and utilities which will help you to manage your systems effectively. If you don’t know what these tools are and how to use them, you could be spending lot of time trying to perform even the basic administrative tasks. The focus of this course is to help you understand system administration tools, which will help you to become an effective Linux system administrator.
Get the Linux Sysadmin Course Now!

If you enjoyed this article, you might also like..

  1. 50 Linux Sysadmin Tutorials
  2. 50 Most Frequently Used Linux Commands (With Examples)
  3. Top 25 Best Linux Performance Monitoring and Debugging Tools
  4. Mommy, I found it! – 15 Practical Linux Find Command Examples
  5. Linux 101 Hacks 2nd Edition eBook Linux 101 Hacks Book

Bash 101 Hacks Book Sed and Awk 101 Hacks Book Nagios Core 3 Book Vim 101 Hacks Book

{ 5 comments… read them below or add one }

1 Jalal Hajigholamali June 3, 2014 at 12:58 am

Hi,

Tiny and useful article

Thank a lot

2 Walter June 3, 2014 at 1:11 am

Always interesting, forgot about .inputrc Will be using it more in the future.

3 Chris F.A. Johnson June 3, 2014 at 7:13 pm

You do not need to start a new shell to re-read .inputrc; use ^X^R

4 zhwsh June 5, 2014 at 1:59 am

my inputrc
“\e[1~”: beginning-of-line # home
“\e[2~”: yank-last-arg # insert
“\e[3~”: delete-char # delete
“\e[4~”: end-of-line # end
“\e[5~”: backward-kill-word # page up
“\e[6~”: kill-word # page down

#set bell-style visible
set bell-style none
set meta-flag On
set convert-meta Off
set input-meta on
set output-meta On
set horizontal-scroll-mode On
set show-all-if-ambiguous On

“\e[[A”: backward-word # F1
“\e[[B”: forward-word # F2

“\e[[C”: backward-kill-line # F3
“\e[[D”: kill-line # F4

“\e[[E”: yank # F5
“\e[17~”: undo # F6

“\e[18~”: history-search-forward # F7
“\e[19~”: history-search-backward # F8

“\e[20~”: character-search # F9
“\e[21~”: character-search-backward # F10

“\e[23~”: “\eb’\ef’” # F11
“\e[24~”: kill-whole-line # F12

5 Phil June 28, 2014 at 9:28 am

Thank you so much! I’ve seen the menu-complete functionality in zsh and have always wanted a similar capability in bash. Never thought of using readline.

Leave a Comment

Previous post:

Next post: