This article is part of the article series "Bash One-Liners Explained."
<- previous article next article ->

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:

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

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

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

After pressing Ctrl+a

2. Move to the end of the line

Press Ctrl+e

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

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

After pressing Ctrl+e

3. Move one word backward

Press Esc+b or Alt+b

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

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

After pressing Meta+b

4. Move one word forward

Press Esc+f or Alt+f

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

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

After pressing Meta+f

5. Delete the last word

Press Ctrl+w

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

Pressing Ctrl+w deletes /foo:

After pressing Ctrl+w

6. Paste the deleted word(s) back

Press Ctrl+y

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

Pressing Ctrl+y brings /foo back:

After pressing Ctrl+y

7. Move one character backward

Press Ctrl+b

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

Pressing Ctrl+b moves the cursor one character backward:

After pressing Ctrl+b

8. Move one character forward

Press Ctrl+f

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

Pressing Ctrl+f moves the cursor one character forward:

After pressing Ctrl+f

9. Delete the whole line

Press Ctrl+u

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

Pressing Ctrl+u deletes the whole line:

After pressing Ctrl+u

10. Search the history backward

Press Ctrl+r

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:

After pressing Ctrl+r

11. Search the history forward

Press Ctrl+s

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

Pressing Ctrl+s reverses the history search direction:

After pressing Ctrl+s

12. Exchange two adjacent characters quickly

Press Ctrl+t

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

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

After pressing Ctrl+t

13. Exchange two adjacent words quickly

Press Esc+t or Alt+t

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

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

After pressing Meta+t

14. Uppercase the rest of the word

Press Esc+u or Alt+u

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

Pressing Esc+u or Alt+u uppercases the whole word and bar becomes BAR:

After pressing Meta+u

15. Lowercase the rest of the word

Press Esc+l or Alt+l

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

Pressing Esc+l or Alt+l lowercases the whole word and BAR becomes bar:

After pressing Meta+l

16. Capitalize a word

Press Esc+c or Alt+c

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

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

After pressing Meta+c

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

Press Ctrl+v

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

Pressing Ctrl+v followed by Ctrl+m inserts a literal Ctrl+m:

After pressing Ctrl+v Ctrl+m

18. Comment the current line (append # at the beginning quickly)

Press Esc+# or Alt+#

Esc+# or Alt+# quickly comments the line. Here's an illustration. Let's say you typed echo foo bar baz:

Before pressing Meta+#

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

After pressing Meta+#

19. Open the current command in a text editor quickly

Press Ctrl+x, Ctrl+e

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

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

Pressing Ctrl+h deletes the character to the left:

After pressing Ctrl+h

21. Delete a character to the right

Press Ctrl+d

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

Pressing Ctrl+d deletes the character to the right:

After pressing Ctrl+d

22. Incremental undo

Press Ctrl+x, Ctrl+u

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

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

23. Insert the last argument from the previous command

Press Esc+. or Alt+.

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+.

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+.

24. Undo all changes to the line

Press Esc+r or Alt+r

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

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

Before pressing Meta+r

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

25. Clear the screen

Press Ctrl+l

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!

This article is part of the article series "Bash One-Liners Explained."
<- previous article next article ->

Comments

Gints Permalink
November 27, 2012, 17:39

Super!

Alan Permalink
November 27, 2012, 18:28

Bookmarked.

rem Permalink
November 27, 2012, 19:09

Hello Great article Again Thanks
Btw There os a typo in 15 lowercase Only in explanation statement

Joseph Permalink
November 27, 2012, 22:21

You know……I've been wondering if there was a vi-mode for zsh for a while. This made me google it.

Thank you.

stephane Permalink
November 27, 2012, 22:37

There is a copy/paste error in section 4 (Move one word forward), 2nd paragraph:

Pressing Esc+b or Alt+b moves the... -> Pressing Esc+f or Alt+f moves the

November 28, 2012, 00:32

Ctrl+u is not delete line, it's delete from SOL (start of line) to cursor, where ctrl+k deletes from cursor to EOL.

November 28, 2012, 00:51

i got freeze when i press Ctrl+s, and i think this is a bug.
and thanks for advice.

For undoing usually i use Ctrl+/

November 28, 2012, 03:01

These are OS X users. We've secretly replaced their GNU ReadLine with BSD EditLine. Let's watch!

Oh, they're putting readline commands in their inputrc files, but it's having no effect! They need to put editline commands in their editrc files!

That vi user isn't having any luck putting 'set -o vi' in his ~/.inputrc file. He should put 'bind -v' in his ~/.editrc file instead!

November 28, 2012, 11:11

Hey kit.

You can also use alt+backspace to delete a small word.

Where ^W will delete all the way back to some whitespace, alt+backspace will delete to punctuation. This is super handy for chopping bits of path off if you typo a directory name in a longer path.

jim Permalink
November 28, 2012, 13:05

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.

jim Permalink
November 28, 2012, 13:41

just found the correct command: clear
does the same a C-l

general_exception Permalink
November 28, 2012, 14:22

Can't wait for the e-book.

November 28, 2012, 15:37

TIL about Ctrl-# (for commenting a command), and Ctrl-x+Ctrl-u (or Ctrl-/) for undoing changes.

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.

Linulin Permalink
December 23, 2012, 11:48

s/by pressing Ctrl+r/by pressing Ctrl+s/

September 04, 2013, 07:54

Thanks for Sharing

March 20, 2014, 13:57

i got freeze when i press Ctrl+s, and i think this is a bug.
and thanks for advice.

October 16, 2014, 15:19

Great post.
showsjunction.

Leave a new comment

(why do I need your e-mail?)

(Your twitter name, if you have one. (I'm @pkrumins, btw.))

Type the word "lcd": (just to make sure you're a human)

Please preview the comment before submitting to make sure it's OK.

Advertisements