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).
Also see my other articles about working fast in bash:
- Definitive Guide to Bash Command Line History
- Working Productively in Bash's Vi Command Line Editing Mode (comes with a cheat sheet)
Parts of this post are based on my earlier post Working Productively in Bash's Emacs Command Line Editing Mode. Check it out, too!
And grab the emacs keyboard shortcut cheat sheet!
Let's start.
Part V: Navigating around in emacs mode
0. Introduction to input editing modes
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
![Press Ctrl+a](https://catonmat.net/images/bash-emacs-mode/ctrl-a.png)
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:
![Before pressing Ctrl+a](https://catonmat.net/images/bash-emacs-mode/ctrl-a-before.gif)
Pressing Ctrl+a moves the cursor to the beginning of the line:
![After pressing Ctrl+a](https://catonmat.net/images/bash-emacs-mode/ctrl-a-after.gif)
2. Move to the end of the line
![Press Ctrl+e](https://catonmat.net/images/bash-emacs-mode/ctrl-e.png)
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:
![Before pressing Ctrl+e](https://catonmat.net/images/bash-emacs-mode/ctrl-e-before.gif)
Pressing Ctrl+e moves the cursor to the end of the line:
![After pressing Ctrl+e](https://catonmat.net/images/bash-emacs-mode/ctrl-e-after.gif)
3. Move one word backward
![Press Esc+b or Alt+b](https://catonmat.net/images/bash-emacs-mode/meta-b.png)
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
:
![Before pressing Meta+b](https://catonmat.net/images/bash-emacs-mode/meta-b-before.gif)
Pressing Esc+b or Alt+b moves the cursor one word backward:
![After pressing Meta+b](https://catonmat.net/images/bash-emacs-mode/meta-b-after.gif)
4. Move one word forward
![Press Esc+f or Alt+f](https://catonmat.net/images/bash-emacs-mode/meta-f.png)
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
:
![Before pressing Meta+f](https://catonmat.net/images/bash-emacs-mode/meta-f-before.gif)
Pressing Esc+b or Alt+b moves the cursor one word forward:
![After pressing Meta+f](https://catonmat.net/images/bash-emacs-mode/meta-f-after.gif)
5. Delete the last word
![Press Ctrl+w](https://catonmat.net/images/bash-emacs-mode/ctrl-w.png)
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
:
![Before pressing Ctrl+w](https://catonmat.net/images/bash-emacs-mode/ctrl-w-before.gif)
Pressing Ctrl+w deletes /foo
:
![After pressing Ctrl+w](https://catonmat.net/images/bash-emacs-mode/ctrl-w-after.gif)
6. Paste the deleted word(s) back
![Press Ctrl+y](https://catonmat.net/images/bash-emacs-mode/ctrl-y.png)
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:
![Before pressing Ctrl+y](https://catonmat.net/images/bash-emacs-mode/ctrl-y-before.gif)
Pressing Ctrl+y brings /foo
back:
![After pressing Ctrl+y](https://catonmat.net/images/bash-emacs-mode/ctrl-y-after.gif)
7. Move one character backward
![Press Ctrl+b](https://catonmat.net/images/bash-emacs-mode/ctrl-b.png)
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:
![Before pressing Ctrl+b](https://catonmat.net/images/bash-emacs-mode/ctrl-b-before.gif)
Pressing Ctrl+b moves the cursor one character backward:
![After pressing Ctrl+b](https://catonmat.net/images/bash-emacs-mode/ctrl-b-after.gif)
8. Move one character forward
![Press Ctrl+f](https://catonmat.net/images/bash-emacs-mode/ctrl-f.png)
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):
![Before pressing Ctrl+f](https://catonmat.net/images/bash-emacs-mode/ctrl-f-before.gif)
Pressing Ctrl+f moves the cursor one character forward:
![After pressing Ctrl+f](https://catonmat.net/images/bash-emacs-mode/ctrl-f-after.gif)
9. Delete the whole line
![Press Ctrl+u](https://catonmat.net/images/bash-emacs-mode/ctrl-u.png)
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
.
Here's an illustration. Let's say you've typed echo moo
in your command line:
![Before pressing Ctrl+u](https://catonmat.net/images/bash-emacs-mode/ctrl-u-before.gif)
Pressing Ctrl+u deletes the whole line:
![After pressing Ctrl+u](https://catonmat.net/images/bash-emacs-mode/ctrl-u-after.gif)
10. Search the history backward
![Press Ctrl+r](https://catonmat.net/images/bash-emacs-mode/ctrl-r.png)
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 want 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
:
![After pressing Ctrl+r](https://catonmat.net/images/bash-emacs-mode/ctrl-r-after.gif)
11. Search the history forward
![Press Ctrl+s](https://catonmat.net/images/bash-emacs-mode/ctrl-s.png)
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:
![Before pressing Ctrl+s](https://catonmat.net/images/bash-emacs-mode/ctrl-s-before.gif)
Pressing Ctrl+s
reverses the history search direction:
![After pressing Ctrl+s](https://catonmat.net/images/bash-emacs-mode/ctrl-s-after.gif)
12. Exchange two adjacent characters quickly
![Press Ctrl+t](https://catonmat.net/images/bash-emacs-mode/ctrl-t.png)
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
:
![Before pressing Ctrl+t](https://catonmat.net/images/bash-emacs-mode/ctrl-t-before.gif)
Pressing Ctrl+t
exchanges c
with h
and moves the cursor one char forward:
![After pressing Ctrl+t](https://catonmat.net/images/bash-emacs-mode/ctrl-t-after.gif)
13. Exchange two adjacent words quickly
![Press Esc+t or Alt+t](https://catonmat.net/images/bash-emacs-mode/meta-t.png)
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
:
![Before pressing Meta+t](https://catonmat.net/images/bash-emacs-mode/meta-t-before.gif)
Pressing Esc+t
or Alt+t
exchanges foo
with bar
and moves the cursor one word forward:
![After pressing Meta+t](https://catonmat.net/images/bash-emacs-mode/meta-t-after.gif)
14. Uppercase the rest of the word
![Press Esc+u or Alt+u](https://catonmat.net/images/bash-emacs-mode/meta-u.png)
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
:
![Before pressing Meta+u](https://catonmat.net/images/bash-emacs-mode/meta-u-before.gif)
Pressing Esc+u
or Alt+u
uppercases the whole word and bar
becomes BAR
:
![After pressing Meta+u](https://catonmat.net/images/bash-emacs-mode/meta-u-after.gif)
15. Lowercase the rest of the word
![Press Esc+l or Alt+l](https://catonmat.net/images/bash-emacs-mode/meta-l.png)
Esc+t or Alt+t 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
:
![Before pressing Meta+l](https://catonmat.net/images/bash-emacs-mode/meta-l-before.gif)
Pressing Esc+l
or Alt+l
lowercases the whole word and BAR
becomes bar
:
![After pressing Meta+l](https://catonmat.net/images/bash-emacs-mode/meta-l-after.gif)
16. Capitalize a word
![Press Esc+c or Alt+c](https://catonmat.net/images/bash-emacs-mode/meta-c.png)
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
:
![Before pressing Meta+c](https://catonmat.net/images/bash-emacs-mode/meta-c-before.gif)
Pressing Esc+c
or Alt+c
capitalizes the first letter of the word and bar
becomes Bar
:
![After pressing Meta+c](https://catonmat.net/images/bash-emacs-mode/meta-c-after.gif)
17. Insert a raw character (such as TAB or Ctrl+c)
![Press Ctrl+v](https://catonmat.net/images/bash-emacs-mode/ctrl-v.png)
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).
Here's an illustration. Let's say you've typed echo foo
:
![Before pressing Ctrl+v](https://catonmat.net/images/bash-emacs-mode/ctrl-v-before.gif)
Pressing Ctrl+v
followed by Ctrl+m
inserts a literal Ctrl+m
:
![After pressing Ctrl+v Ctrl+m](https://catonmat.net/images/bash-emacs-mode/ctrl-v-after.gif)
18. Comment the current line (append # at the beginning quickly)
![Press Esc+# or Alt+#](https://catonmat.net/images/bash-emacs-mode/meta-hash.png)
Esc+# or Alt+# quickly comments the line. Here's an illustration. Let's say you typed echo foo bar baz
:
![Before pressing Meta+#](https://catonmat.net/images/bash-emacs-mode/meta-hash-before.gif)
Pressing Ctrl+#
inserts the comment symbol #
at the beginning of the line:
![After pressing Meta+#](https://catonmat.net/images/bash-emacs-mode/meta-hash-after.gif)
19. Open the current command in a text editor quickly
![Press Ctrl+x, Ctrl+e](https://catonmat.net/images/bash-emacs-mode/ctrl-x-ctrl-e.png)
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
![Press Ctrl+h](https://catonmat.net/images/bash-emacs-mode/ctrl-h.png)
Ctrl+h deletes the character to the left of the cursor. Here's an illustration. Let's say you've typed echo qwerty
:
![Before pressing Ctrl+h](https://catonmat.net/images/bash-emacs-mode/ctrl-h-before.gif)
Pressing Ctrl+h
deletes the character to the left:
![After pressing Ctrl+h](https://catonmat.net/images/bash-emacs-mode/ctrl-h-after.gif)
21. Delete a character to the right
![Press Ctrl+d](https://catonmat.net/images/bash-emacs-mode/ctrl-d.png)
Ctrl+d deletes the character to the right of the cursor. Here's an illustration. Let's say you've typed echo qwerty
:
![Before pressing Ctrl+d](https://catonmat.net/images/bash-emacs-mode/ctrl-d-before.gif)
Pressing Ctrl+d
deletes the character to the right:
![After pressing Ctrl+d](https://catonmat.net/images/bash-emacs-mode/ctrl-d-after.gif)
22. Incremental undo
![Press Ctrl+x, Ctrl+u](https://catonmat.net/images/bash-emacs-mode/ctrl-x-ctrl-u.png)
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
:
![Before pressing Ctrl+x Ctrl+u](https://catonmat.net/images/bash-emacs-mode/ctrl-x-ctrl-u-before.gif)
Pressing Ctrl+x, Ctrl+u
a few times undoes the last changes and you end up with foo bar baz
again:
![After pressing Ctrl+x Ctrl+u](https://catonmat.net/images/bash-emacs-mode/ctrl-x-ctrl-u-after.gif)
23. Insert the last argument from the previous command
![Press Esc+. or Alt+.](https://catonmat.net/images/bash-emacs-mode/meta-dot.png)
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
:
![Before pressing Meta+.](https://catonmat.net/images/bash-emacs-mode/meta-dot-before.gif)
And now you want to extract the archive. So all you've to do is type tar -xzf
and press Esc+. or Alt+.:
![Before pressing Meta+.](https://catonmat.net/images/bash-emacs-mode/meta-dot-after.gif)
24. Undo all changes to the line
![Press Esc+r or Alt+r](https://catonmat.net/images/bash-emacs-mode/meta-r.png)
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:
![Before pressing Meta+r](https://catonmat.net/images/bash-emacs-mode/meta-r-before.gif)
And let's say you wanted to make some changes to the command but messed up:
![Before pressing Meta+r](https://catonmat.net/images/bash-emacs-mode/meta-r-before-2.gif)
Pressing Esc+r
or Alt+r
undoes all the changes and you end up with the original grep
command that was in the history:
![After pressing Meta+r](https://catonmat.net/images/bash-emacs-mode/meta-r-after.gif)
25. Clear the screen
![Press Ctrl+l](https://catonmat.net/images/bash-emacs-mode/ctrl-l.png)
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.
Cheat Sheet
I made a cheat sheet that lists all the default emacs mode keyboard shortcuts. Download the emacs keyboard shortcut cheat sheet.
Enjoy!
Enjoy the article and let me know in the comments what you think about it!