
Bash One-Liners Explained, Part V: Navigating around - Anon84
http://www.catonmat.net/blog/bash-one-liners-explained-part-five/
======
JakeSc
This is a great guide. Especially awesome for me was: 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.

I'd love to find a cheat sheet for vi bash usage (and also an indicator for
which editing mode I'm in).

~~~
tsm
I'm a huge vi(m) fan, but still use Emacs-style readline. When editing code in
vim, I tend to make several edits each time I'm in edit mode. When at the
terminal, all I'll need is "go to front" or "search backwards". And which is
easier: Esc+Shift-6+i or C-a? Esc+Shift-/ or C-r? I'm in no way an Emacs
ninja, but it's not too hard to memorize the ten or so most common commands.
Added bonus: they work in OS X and Qt textfields. Other added bonus: they work
out of the box in terminals you haven't configured yourself.

~~~
jlgreco
I like vi-mode in my shell primarily for j/k to navigate through history
(arrow keys just _always_ suck imho, and C-r to search backwards in history is
just overkill most of the time) and 'c[motion]', which is what I almost
exclusively find myself using to correct things I messed up ('d[motion]' pops
up less frequently). 99% of the time those are 99% of the things I use; for
that set of features I think the vi sequences are definitely have the
advantage.

~~~
pmr_
The Emacs next-line and previous-line bindings C-n and C-p also work well for
history navigation.

------
tambourine_man
Instead of searching through history, you can add this to your .inputrc

    
    
      "\e[B": history-search-forward
      "\e[A": history-search-backward
    

And this to your .bash_proflie

    
    
      export HISTCONTROL=erasedups
      export HISTSIZE=100000
      shopt -s histappend
    

Now the up/down arrow keys auto search and complete backwards/forwards based
on what's written. If the line is empty, it behaves as normal.

This is also pretty neat, in your .bash_proflie:

    
    
      bind '"\t":menu-complete'
    

Enables cyclic tab completion

These are the first things I do when I'm on another terminal.

~~~
guiambros
Cool, thanks for the cyclic tab. That was a new one for me.

I've been using the remap of the up/down arrow for a while too, and it is
crazily useful indeed. It's the first thing I do on a new terminal. That,
together with adjusting PS1 and setting up my common aliases.

------
skylan_q
"Bash uses the readline library for input editing. The readline library
supports emacs style key bindings[...]"

Been using Emacs for a year and I didn't know this. O_o

~~~
jballanc
Are you using a Mac? Because if you are, those Emacs motion key bindings work
in almost all text input fields in all apps.

~~~
skylan_q
I'm on a Mac about once or twice a week at work. Thanks for the heads-up!

------
andrewla
My biggest complaint is that the semantics of CTRL-w and ALT-b are different.
CTRL-w goes to the last space, and ALT-b goes to the nearest non-letter. Why
did they define word in two different ways for the two different commands? I
would kill for a non-deleting version of CTRL-w; if I have a long path in a
command-line I want to be able to move to the previous parameter, not just the
previous path element.

~~~
michaelhoffman
Alt+Backspace deletes to the last non-letter.

To go to the previous space, Ctrl+R SPACE works for me.

~~~
andrewla
Ctrl+R SPACE seems like it's a bit iffy for some cases, especially since I use
Ctrl+R so frequently for history searches. Using it instinctively (like I use
Ctrl+W) wreaks all kinds of havoc; if I do something like Ctrl+R python to get
a previously run command, then hit Ctrl+R SPACE, then it moves to the previous
commandline that contains python instead of staying where I am and moving back
a word. Still, something to explore -- I can probably find a way to use this.

------
bittersweet
The author notes that there is no meta key anymore [1], however you can often
setup your terminal emulator to use another key as the meta key.

In iTerm [2] I have the left alt/option key setup as meta, so things like
meta-b are much easier to type then Esc-b.

[1] "You'll often see Meta+b but there is no such key on the keyboards
anymore." [2] Profiles -> Keys "Left option acts as meta"

------
minimax
If you find yourself using these keyboard shortcuts frequently, you can save
yourself some pinky fatigue by remapping caps lock to ctrl.

~~~
acabal
Doing this was a big part in saving my left hand from RSI. I can't emphasize
enough how awesome it is to have ctrl bound to caps lock.

~~~
lunchladydoris
Yes! It's the first thing I do when I get a new system these days.

In OSX you can set it up in keyboard preferences and in Windows I use
Autohotkey.

Working on a keyboard with a regular Caps Lock key feels very strange after
all this time.

------
prakashk
I knew most of these, but I learned 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.

------
crazydiamond
Some awesome ones he did not mention:

Control-q: push-line-or-edit -- this saves the current command without
executing it, allows you to run another command, then puts back the saved
command for you to edit/run.

Esc-A: accept-and-hold -- execute command and maintain cursor position, so you
can edit command and re-run.

Esc-' : quote-line -- escapes the single quotes in a line.

Old Vim user here, who has used emacs mode since moving from ksh to bash for
about 8-10 years. Recently, switched back to vi mode, however, I have mapped
Ctrl-A, Ctrl-E and a few more so i can use them in vi mode too. e.g.

    
    
        bindkey "^A" beginning-of-line

------
olaf
This seems to be written by someone who has no deep experience. For example,
Ctrl-u does only delete the whole line, if the cursor stands at the end of
that line, on my system (Ubuntu) this command generally deletes the characters
left from the cursor. What's missing, is the complement to this command, which
deletes the characters under and right from the cursor, namely Ctrl-k.
Everybody who regularly uses Ctrl-u should know that.

------
JoelMcCracken
The manual:

[http://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#...](http://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC2)

edit:

oh, this is the first time I've seen this: there is a vi mode for bash
[http://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#...](http://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC22)

------
jlkinsel
Mostly common (to me), but there's a few good ones in there! ^x^e could be my
new favorite!

