This is the fifth part of the Bash One-Liners Explained article series. In this part I'll teach you how to quickly navigate around the command line in bash using emacs-style keyboard shortcuts. That's right, emacs-style keyboard shortcuts. It might surprise you but by default bash uses emacs-style keyboard shortcuts for navigating around the command line. Keep reading to learn more!

See the first part of the series for introduction. After I'm done with the series I'll release an ebook (similar to my ebooks on awk, sed, and perl), and also bash1line.txt (similar to my perl1line.txt).

Part V: Navigating around in emacs mode

Bash uses the readline library for input editing. The readline library supports emacs style key bindings, vi style key bindings as well as custom key bindings. By default readline will use the emacs style key bindings but you can easily switch to vi editing mode or customize them.

You can switch between the emacs and vi editing modes through set -o emacs and set -o vi commands.

The key bindings can be customized through the ~/.inputrc file or the bind command. For example, bind '"\C-f": "ls\n"' binds CTRL+f to execute ls command. You can learn more about readline's key binding syntax by consulting the readline section of the bash man page.

I'll cover the emacs editing mode in this article. In the next two articles I'll cover the vi editing mode and customizing readline.

1. Move to the beginning of the line

Ctrl+a moves the cursor to the beginning of the line. Here's an illustration. Let's say you've typed cd info in the terminal:

Pressing Ctrl+a moves the cursor to the beginning of the line:

2. Move to the end of the line

Ctrl+e moves the cursor to the end of the line. Here's an illustration. Let's say you've typed mkdir foo bar baz in the terminal and your cursor is somewhere in the middle:

Pressing Ctrl+e moves the cursor to the end of the line:

3. Move one word backward

Esc+b or Alt+b moves the cursor one word backward. You'll often see Meta+b but there is no such key on the keyboards anymore. Therefore either Esc+b or Alt+b will work, depending on how your terminal is configured.

Here's an illustration. Let's say you've typed echo 'hello world' in the terminal and your cursor is after hello:

Pressing Esc+b or Alt+b moves the cursor one word backward:

4. Move one word forward

Esc+f or Alt+f moves the cursor one word forward. Here's an illustration. Let's say you've typed echo 'hello world' in the terminal and your cursor is before hello:

Pressing Esc+b or Alt+b moves the cursor one word forward:

5. Delete the last word

Ctrl+w deletes the last word. Deleting a word is also known as killing a word. Each killed word gets stored in the kill ring buffer. If you accidentally killed a word press Ctrl+y to paste it back. Pasting from the kill ring buffer is also known as yanking.

Here's an illustration. Let's say you've typed cd /foo:

Pressing Ctrl+w deletes /foo:

6. Paste the deleted word(s) back

Ctrl+y pastes whatever is in the kill buffer back to the terminal. Here's an illustration. Let's say you had typed cd /foo (see the previous example), and you killed the last word, which is /foo so your command line looks like:

Pressing Ctrl+y brings /foo back:

7. Move one character backward

Ctrl+b moves the cursor one char backward. Here's an illustration. Let's say you had typed echo foo bar baz on the command line:

Pressing Ctrl+b moves the cursor one character backward:

8. Move one character forward

Ctrl+f moves the cursor one char forward. Here's an illustration. Let's say you moved one character backward (as in the previous example):

Pressing Ctrl+f moves the cursor one character forward:

9. Delete the whole line

Ctrl+u kills the whole line and puts it in the kill buffer. Same as with killed words, you can paste the whole line back by pressing Ctrl+y.

This is probably one of the most used keyboard shortcuts in bash. Pressing Ctrl+r searches the command history backwards. For example, you can press Ctrl+r and then type the first few characters of some command that you executed earlier to quickly find it.

Here's an illustration. Let's say you had executed a complicated command such as this one:

joinlines () { sed ':a; N; s/\n/'"$1"'/; ba'; }

And now you wish to modify it but you don't want to keep going through the history to find it. Press Ctrl+r and type something you remember from the command like joi:

11. Search the history forward

If you press Ctrl+s, most likely your terminal will freeze because by default your terminal interprets Ctrl+s as the stop-flow signal. When I was less experienced this was driving me crazy. I'd accidentally press Ctrl+s and my terminal would freeze. And I had no idea what was happening. Later I learned that I can press CTRL+q to unfreeze the terminal (Ctrl+q starts the flow again.)

The right way to go is to change the terminal behavior for Ctrl+s via the stty command:

$ stty stop 'undef'

This will undefine the key binding for the stop-flow signal and you'll be able to use bash's Ctrl+s.

Ctrl+s comes handy when you've searched too far with Ctrl+r. Then you can just simply reverse the search direction by pressing Ctrl+r.

Here's an illustration. Let's say you typed awk and pressed Ctrl+r a few times and you skipped past the awk command that you wanted to find:

Pressing Ctrl+s reverses the history search direction:

12. Exchange two adjacent characters quickly

Ctrl+t transposes two characters (exchanges them) and moves the cursor one character forward. Here's an illustration. Let's say you've mistyped echo in ehco bar baz and your cursor is at the letter c:

Pressing Ctrl+t exchanges c with h and moves the cursor one char forward:

13. Exchange two adjacent words quickly

Esc+t or Alt+t transposes two words (exchanges them) and moves the cursor one word forward. Here's an illustration. Let's say you've typed foo bar baz and your cursor is at the word bar:

Pressing Esc+t or Alt+t exchanges foo with bar and moves the cursor one word forward:

14. Uppercase the rest of the word

Esc+u or Alt+u uppercases the rest of the word. Here's an illustration. Let's say you've typed foo bar baz and your cursor is at the beginning of bar:

Esc+c or Alt+c properly capitalizes a word. Here's an illustration. Let's say you've typed foo bar baz and your cursor is at the beginning of bar:

Pressing Esc+c or Alt+c capitalizes the first letter of the word and bar becomes Bar:

17. Insert a raw character (such as TAB or Ctrl+c)

Ctrl+v inserts the next character typed verbatim. For example, Ctrl+v followed by <TAB> would insert a literal tab in the command line, or Ctrl+v followed by Ctrl+m would insert a Windows newline (aka carriage return CR).

Pressing Ctrl+# inserts the comment symbol # at the beginning of the line:

19. Open the current command in a text editor quickly

Pressing CTRL+x followed by CTRL+e opens the current command in your favorite text editor. Exiting the editor will execute the command.

20. Delete a character to the left

Ctrl+h deletes the character to the left of the cursor. Here's an illustration. Let's say you've typed echo qwerty:

Pressing Ctrl+h deletes the character to the left:

21. Delete a character to the right

Ctrl+d deletes the character to the right of the cursor. Here's an illustration. Let's say you've typed echo qwerty:

Pressing Ctrl+d deletes the character to the right:

22. Incremental undo

Pressing Ctrl+x followed by Ctrl+u undoes a change. Here's an illustration. Let's say you typed foo bar baz and then deleted baz and typed moo:

Pressing Ctrl+x, Ctrl+u a few times undoes the last changes and you end up with foo bar baz again:

23. Insert the last argument from the previous command

Esc+. or Alt+. inserts the last argument from the previous command at the current cursor position. Here's an illustration. Let's say you had run ls archive.tgz:

And now you want to extract the archive. So all you've to do is type tar -xzf and press Esc+. or Alt+.:

24. Undo all changes to the line

Esc+r or Alt+r undoes all changes to the line. It's useful when you're going through the command history with Ctrl+r and make changes. If you mess up, you can quickly revert back to the original command by pressing Esc+r or Alt+r.

Here's an illustration. Let's say you searched for grep in history:

And let's say you wanted to make some changes to the command but messed up:

Pressing Esc+r or Alt+r undoes all the changes and you end up with the original grep command that was in the history:

25. Clear the screen

Ctrl+l clears the screen. Alternatively you can type reset.

26. Change input mode to vi

$ set -o vi

This command changes the key bindings to vi's. If vi's your favorite editor, you'll love this. I'll cover the vi mode in more details in the next part of the article.

There is a difference between C-l and reset. C-l clears the actual screen. reset kills also the history-log which C-l does not.
If you use reset you don't get previous outputs by pressing shift-page up/down.

One shortcut that used often is Ctrl-o. When you have a few commands in your history that you want to repeat in that seqeunce, search for the first command in the group, optionally edit it if you want, and press Ctrl-o instead of the ENTER key.

After this command is executed, the next command in the history is presented to you. Press Ctrl-o again to continue the sequence, or press ENTER once you reached the last command in the sequence.

If you want skip a command in the sequence, instead of Ctrl-o just press Ctrl-n (or down-arrow) to get the next one in sequence.