Great post. I like the way author splits the big problem into smaller ones and reduce the learning curve by different stages. When I recommend vim to my friends, they are usually frightened by the OReilly's thick vi/vim book and most people cannot "survive" in vim before they give up.
Indeed, the article is certainly too short to be slow or boring. It reads in 2 minutes, and you learn near to nothing about Vim, not even search and replace or <c-y>.
It takes less than 30 minutes, and teaches you a lot of useful things, with practice, that actually makes you memorize the things. If spending 30 minutes learning vim is "slow and boring" to you, then I sincerely doubt vim is for you.
"Fortunately vim comes with some very good tools and an excellent documentation. Run vimtutor until you are familiar with most basic commands. Also, you should read carefully this page: :help usr_02.txt."
Don't do what this guy says! Or at least don't stay in phase 1 for longer than a day. I've had used vim for a few years as a pico replacement, whenever I was on a remote computer on ssh. I picked up some really bad habit, like staying in insert mode all the time and using the arrow, home and end keys. I actually had to deactivate the arrow keys in my vimrc.
I would recommend going thought the tutorial, that comes with vim (vimtutor command) and after that reading those articles:
I'm in the minority camp that doesn't think arrow keys are a big deal, but I suppose I need to qualify that and say "not a big deal if you are on a Thinkpad" and you have an solid reach of curled fingers in your right hand. There's are efficiency gaps in between
1) keeping fingers on jkl;
2) manipulating the arrow keys with fingertips,
primarily using the pinky for quick movements
3) lifting the hand to use the arrow keys
and they do add up over time, but I'm not sure how detrimental they are.
Sometimes, the arrow keys provide a nice mental break, where you can step back from the doc and examine what's happened so far with the arrow keys or page up/down.
When you use the arrow keys to move the cursor around: a nice mental break.
When you use the mouse to move the cursor around: an utterly evil, productivity-destroying action, because you take your hands off the home row (oh wait...)
Yes, I don't see these often and it seems that they are powerful learning aids. Full-fledged videos/screencasts are hard to search and index while screenshots are bad to show actions.
When I learned to use vim years ago, one interesting observation was that the biggest thing to learn in vim is efficient navigation.
i.e. if you know how to get to a particular logically defined place in the file, you will always be able to carry out copy-paste-delete to and from that place to where to cursor is.
One would be surprised how easy thing become once you know the basic navigation rules due to marvelous mix-n-match nature of vim operations.
Damn, I've been using vim for almost a decade and didn't realize that /<term> worked as a movement so you can do things like y2/foo and yank to the second occurrence of “foo” (to use the example from the tutorial).
That's why I scan every beginner vim tutorial that comes across hn. I always learn something
Took me years to learn that one, too. It may be favorite Vim trick now.
Basically everything that can make your cursor jump can be used as a motion with a command - moving to a mark, undoing/redoing jumps with Ctrl+o and Ctrl+i, and hopping to a matching brace with % are more examples.
I gave up pretending that I'm a Vim beginner a year or two ago, but I also continue to skim through and learn from "beginner" tutorials that show up in my stream. People always pick a different set of "basic" commands, and from this one, I learned about "t<letter>", which I hadn't known before.
Funny. I found out about that early, merely experimenting.
I rarely use it nowadays tough. I used to use it for stuff like "delete up to the next dot" and the like. But that was until I learned about f and t. :)
Except, let's be honest, Emacs' way makes a lot more sense. Someone who has used Emacs for ten minutes can easily figure this out because Emacs tries to help the user. The naive way of copying to the end of a search term is C-SPC C-s term ENT C-w. But, after you've hit ENT to end the search, Emacs does something amazing. It prints "Mark saved where search started." So now the next time you run this command, you know you won't need to set the mark. Because it told you!
(Eventually, you'll learn to expect this behavior because pretty much every interactive motion command does this and prints "Mark set.")
One thing to note though: Y and yy are not shortcuts to 0y$ -- the latter does not yank the line ending. I use it to insert one line into another, but find splitting and joining lines to be cumbersome.
Actually "cw" doesn't change the current word.. it changes where the cursor is to the end of the word. Something I tend to use a lot is: (| is the cursor)
ciw (Really change the current word. "Fo|o Bar" -> "| Bar"
ci" (Change in between ": "Test 12|34" -> "|"
da" (Delete in between " AND the "": a"Test 12|34"b -> ab
Also, plugins are extremely important. For instance, one of my favorite makes the "w" smarter for day to day programming word. (I mapped it to ,w) For example:
Oh, and the surround plugin is so useful.. something I tend to do a lot is:
viws' : viw "highlight the current word"
and s' surrounds it with ''. *Soooooo* useful.
You can also do yiws' but I like to see what
will be surrounded as something there're spaces
or other characters which doesn't *count* in
"w".
Thanks for the guide. If I might suggest another small gem that beginners would appreciate, is a way to copy text with a mark. I.e. ma go to the end y`. It may be easier than vwwwwwwww y or something similar.
I use that da" very often, but for some strange reason it stuck in my brain as abbreviation from 'delete around "', which is inaccurate. Thanks for making me realize this.
I have jj mapped to exit from insert mode and save the file. This trick was found in a long SO thread, plus I never had the need to type something with a double j ;)
Control-[ is the best way to move into command mode. It fits the vi philosophy better than ESC. When hitting ESC you have to lift your hand off the home row. After years of using vim, using ESC feels as inefficient as using arrow keys instead of hjkl.
I don't even think about it, but apparent pivot on my wrist to hit the 'Esc' key (top left of my keyboard) with my middle finger, rather than my pinkie as would be prescribed by a strict "home row" typing style.
I find emacs's ctrl-meta-foo-bang key combinations to be far more stressful (you have to hit multiple keys in one swell foop) than vi/vim's modal just-one-key-at-a-time standard keystrokes.
Does anyone know why the decision was made to make hjkl the vi navigation buttons? I've always felt like jkl; would be faster since your fingers are already there
Everyone uses vim in their own way, you should learn how to use vim for the style that suits how you work. Only learn what you need to learn, you can't learn everything. No one knows all of vim; if you say that you do, you are a liar.
I'm not sure where those terms come from. "insertion mode" is described by the Vim documentation as "insert mode", because what you type on the keyboard is inserted into the document. "edition mode" might be a typo or English-as-a-second-language mistake for "editing mode" because that's what you do in that mode; Vim's documentation just calls it "normal mode".
Here's a Vim trick I only figured out fairly recently. Everybody knows that % jumps between a bracket, brace or parenthesis and its matched pair, but what happens if you hit % while the cursor isn't on such a character? Turns out, it searches forward until it finds such a character, then jumps to its matched pair.
So for example, let's say you had a nested function invocation that was getting long and unwieldy and you wanted to break it out onto its own line:
If you put the cursor on the 'g' at the beginning of 'globalConfig' and press "d%", it will cut the function name and all the parameters in one action.
That would delete just the function name (`globalConfig.getParam`), not the argument list as well. `d%` would grab the function name _and_ its argument list.
ci( is another nifty trick that will do the same but will work anywhere between the two ('s not just at the beginning of globalConfig. See ":help text-objects" for more details on one of the more powerful feature of vim.
I've been using Vim for about three years but I've never been very handy at it. I'm now wondering that that might be because I touch type with only four fingers and whether it's possible to relearn my typing methods.
One thing I would love to see—and which I can only assume exists—is a guide like this, tailored to writing prose rather than code. This article maintains certain assumptions that are held by nearly every other guide, like 'You are always in normal mode, and only enter insert mode for short bursts of typing text, after which you press <Esc> to go to normal mode.' Which is true and useful for coding, but slightly less so for prose—not entirely less so, and it's still a good idea to get in the habit of busting out of insert mode when you've finished whatever thought you're writing down, but the lines between thinking, composing and editing are blurrier than in prose.
Nevertheless vi controls can be pretty semantic, and lend themselves pretty effectively to working with words, clauses, sentences, and paragraphs. On the other hand, using search for mid-paragraph navigation is an order of magnitude less efficient in prose, when you're so much more likely to have symbols and words doing totally different things in many places in your text.
Here is a 13 page guide specifically aimed at writers using Vim or Gvim. Explains how the movement commands change with soft wrapping of lines and so on.
Thank you keithpeter and keithpeter for those two links.
A minor thing that's useful if you stay in insert mode for long periods: You can click the mouse anywhere while in Insert mode, and your cursor/insertion point will move to where you click. This works in Gvim, and also in vim, but I suppose vim depends on how your terminal is set up. I've done nothing special to my terminal or my vim.
Use Ctrl-o in insert mode to dip into normal mode for just 1 command. Also, use Ctrl-r in insert mode to paste the contents of an arbitrary clipboard (Ctrl-r, a to paste register "a, Ctrl-r " to paste register "" and so on).
Agreed. I'm fairly proficient in VIM, and I'd love to extend my knowledge of emacs as well - but there's few tutorials that don't start with "change these 15 settings and install these 5 plugins, then use it like this..."
I've tried the evil mode : emacs now behave like vim in text edit mode, with nearly less complication than installing a plugin for vim. Can be found here : http://gitorious.org/evil/pages/Home
That's not true. You get all the keybindings of Emacs in insert mode, and you get all the keybindings of vi in command mode. vi and vim are different enough that experienced vim users cannot use vi at all. I know, because I've invited them to try.
(Incidentally, mg is pretty easy to use as an Emacs users. The only odd thing is that ENT does not end an isearch, because mg thinks C-m and C-j are the same thing. What?)
Because vim's paste command, p, will paste what was last removed with a command (such as d or c).
Although you're not explicitly told that d and y are analogous to cut and copy, after learning the mechanics of p, each command you learn adds a new (and powerful!) mechanic which doesn't have a parallel in the normal cut/copy/paste model.
116 comments
[ 3.1 ms ] story [ 236 ms ] threadHowever, these kind of tutorials always fail to mention the number one way to learn Vim:
and Those two (and successive pages in the user manual) will teach you practically everything about Vim—and they're included right in Vim.This guide is much more interesting: http://www.viemu.com/a-why-vi-vim.html
"Fortunately vim comes with some very good tools and an excellent documentation. Run vimtutor until you are familiar with most basic commands. Also, you should read carefully this page: :help usr_02.txt."
I would recommend going thought the tutorial, that comes with vim (vimtutor command) and after that reading those articles:
http://www.moolenaar.net/habits.html
http://www.viemu.com/a-why-vi-vim.html
http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial...
Sometimes, the arrow keys provide a nice mental break, where you can step back from the doc and examine what's happened so far with the arrow keys or page up/down.
When you use the mouse to move the cursor around: an utterly evil, productivity-destroying action, because you take your hands off the home row (oh wait...)
Hacker News, don't ever change ;-)
i.e. if you know how to get to a particular logically defined place in the file, you will always be able to carry out copy-paste-delete to and from that place to where to cursor is.
One would be surprised how easy thing become once you know the basic navigation rules due to marvelous mix-n-match nature of vim operations.
And what specifically is strange about this web site, or about this thread?
That's why I scan every beginner vim tutorial that comes across hn. I always learn something
Basically everything that can make your cursor jump can be used as a motion with a command - moving to a mark, undoing/redoing jumps with Ctrl+o and Ctrl+i, and hopping to a matching brace with % are more examples.
Wrote a short intro myself about such revelations: http://nathanmlong.com/vanquish/
I rarely use it nowadays tough. I used to use it for stuff like "delete up to the next dot" and the like. But that was until I learned about f and t. :)
(Eventually, you'll learn to expect this behavior because pretty much every interactive motion command does this and prints "Mark set.")
One thing to note though: Y and yy are not shortcuts to 0y$ -- the latter does not yank the line ending. I use it to insert one line into another, but find splitting and joining lines to be cumbersome.
Paste with "ap
- type j - wait 1 second - type k.
For those wondering how to do this, you can try it out with
:imap jk <esc>
(imap means "use this mapping when I'm in insert mode".)
If you like it, add everything but the : to your .vimrc
Warning: If you do this you will wind up typing those characters by memory nearly everywhere.kj
However, I also recommend mapping ESC to Caps Lock. Once you have vimified your whole computing experience, it starts paying back big time.. ;-)
I find emacs's ctrl-meta-foo-bang key combinations to be far more stressful (you have to hit multiple keys in one swell foop) than vi/vim's modal just-one-key-at-a-time standard keystrokes.
http://pqrs.org/macosx/keyremap4macbook/
One now about using Ctrl-c: that bypasses InsertLeave autocmd's.
Wikipedia backs up this story: http://en.wikipedia.org/wiki/HJKL_keys#HJKL_keys
"imap jj <esc>" being my favourite.
So for example, let's say you had a nested function invocation that was getting long and unwieldy and you wanted to break it out onto its own line:
If you put the cursor on the 'g' at the beginning of 'globalConfig' and press "d%", it will cut the function name and all the parameters in one action.http://www.rayninfo.co.uk/vimtips.html
For some great plugins, check http://stevelosh.com/blog/2010/09/coming-home-to-vim/
Does anybody else's keyboard have a λ key?
<C-k>l*
You can have the complete list with :dig
Nevertheless vi controls can be pretty semantic, and lend themselves pretty effectively to working with words, clauses, sentences, and paragraphs. On the other hand, using search for mid-paragraph navigation is an order of magnitude less efficient in prose, when you're so much more likely to have symbols and words doing totally different things in many places in your text.
Some suggestions for .vimrc to change movement behaviour and line wrapping. I'm not a vimer by the way, still using Gedit.
http://therandymon.com/woodnotes/vim-for-writers/vimforwrite...
A minor thing that's useful if you stay in insert mode for long periods: You can click the mouse anywhere while in Insert mode, and your cursor/insertion point will move to where you click. This works in Gvim, and also in vim, but I suppose vim depends on how your terminal is set up. I've done nothing special to my terminal or my vim.
I don't edit while I'm writing the first draft. But when I do edit, I'm always pressing <Esc>. That's why changed the keymap.
/<text> is an editor's best friend.
(Incidentally, mg is pretty easy to use as an Emacs users. The only odd thing is that ENT does not end an isearch, because mg thinks C-m and C-j are the same thing. What?)