Apostasy, Step 1: Surviving Vim
My colleagues objected to installing emacs on our robot and I find nano woefully insufficient, so I finally admitted that I have to learn vim. Until recently, all I knew was :q!
, and I used it with extreme prejudice.
It took me a while to not hate vim, and I still prefer emacs despite not being a power-user in the least. My problem with vim is that I really struggle with remembering which mode I am in. I think the key here is to always leave it in command mode unless you're actively inserting text. I should have taken the hint from how command mode is also called normal mode, but it took a while for this to click.
The other main thing to realize is that compands are composable, such that :w
is save and :q
is quit, so :wq
is save and quit. I suspect that this becomes even more powerful once you're more fluent.
There have been silver linings for me:
- I can use the default GNU screen configuration on the robot without the usual
Ctrl-a
headache in emacs. - I've fallen in love with the "delete to" command. It is exactly how I frame the operation in my head, and I've yet to find an emacs alternative that doesn't require lots of repetitive keystrokes.
Links/References/Configuration
-
Why the heck would you use the least-accessible key on the keyboard for the most-critical key in vim? I assume that everybody remaps it: I chose CapsLock, which was a win all around.
-
This post about how vim's big idea is composability did a great job putting editor history into perspective for me.
-
There's a game for learning vim shortcuts!
Cheatsheet
For my own reference, I'm documenting the equivalent commands as my fingers reach for the emacs shortcuts:
emacs | vim | description |
---|---|---|
(none) | Esc | enter normal/command mode |
(none) | i | before current character, drop into insert mode |
Ctrl‑x Ctrl‑c | :q | quit |
:qa | quit all (appending 'a' applies to all buffers) | |
:q! | quit w/o saving (appending '!' forces the command) | |
Ctrl‑x Ctrl‑s | :w | save |
Ctrl‑x Ctrl‑f | :e | open file; use tab to cycle through existing files |
Ctrl-a | ^ | go to start of line |
I | go to start of line, drop into insert mode | |
Ctrl-e | $ | go to end of line |
a | after current character, drop into insert mode | |
A | end of line, drop into insert mode | |
o | insert line below, drop into insert mode | |
O | insert line above, drop into insert mode | |
Ctrl-n | j | next line |
Ctrl-p | k | prev line |
h | prev character | |
l | next character | |
Alt-< | gg | start of file |
Alt-> | G | end of file |
Meta-x 2 | :sp | horizontally splits the pane |
Meta-x 3 | :vs | vertically splits the pane |
Ctrl-x o | Ctrl-w-w | cycle through pane |
Ctrl-x 0 | :q | kill current pane |
Ctrl-x k | kill current buffer in pane | |
Ctrl-k | D | cut from current position to end of line |
dd | cut entire current line | |
dt. | deletes from current position to just before '.' | |
df. | deletes from current position, including '.' | |
dT. | (make the prev comman, but backwards) | |
d2t. | deletes from current position until the second occurrence of '.' (In general, can add numbers | |
yy | yank line | |
Ctrl-Space | select region | |
Ctrl-w | yank selected region | |
Alt -w | copy selected region | |
Ctrl-y | p | paste what you just cut/copied |
Ctrl-_ | u | Undo |
Alt-% | :%s/<s1>/<s2>/gc |
find-and-replace globally with confirmation |
(My learning curve was made much less frustrating thanks to a generously helpful colleague. Thanks Mark!)