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
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
.
Here's an illustration. Let's say you've typed echo moo
in your command line:
Pressing Ctrl+u deletes the whole line:
10. Search the history backward
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
:
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
:
Pressing Esc+u
or Alt+u
uppercases the whole word and bar
becomes BAR
:
15. Lowercase the rest of the word
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
:
Pressing Esc+l
or Alt+l
lowercases the whole word and BAR
becomes bar
:
16. Capitalize a word
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).
Here's an illustration. Let's say you've typed echo foo
:
Pressing Ctrl+v
followed by Ctrl+m
inserts a literal Ctrl+m
:
18. Comment the current line (append # at the beginning quickly)
Esc+# or Alt+# quickly comments the line. Here's an illustration. Let's say you typed echo foo bar baz
:
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.
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!