I've heard a lot about Vim, both pros and cons. It really seems you should be (as a developer) faster with Vim than with any other editor. I'm using Vim to do some basic stuff and I'm at best 10 times less productive with Vim.
The only two things you should care about when you talk about speed (you may not care enough about them, but you should) are:
- Using alternatively left and right hands is the fastest way to use the keyboard.
- Never touching the mouse is the second way to be as fast as possible. It takes ages for you to move your hand, grab the mouse, move it, and bring it back to the keyboard (and you often have to look at the keyboard to be sure you returned your hand properly to the right place)
Here are two examples demonstrating why I'm far less productive with Vim.
Copy/Cut & paste. I do it all the time. With all the contemporary editors you press Shift with the left hand, and you move the cursor with your right hand to select text. Then Ctrl+C copies, you move the cursor and Ctrl+V pastes.
With Vim it's horrible:
yy
to copy one line (you almost never want the whole line!)[number xx]yy
to copyxx
lines into the buffer. But you never know exactly if you've selected what you wanted. I often have to do[number xx]dd
thenu
to undo!
Another example? Search & replace.
- In PSPad: Ctrl+f then type what you want you search for, then press Enter.
- In Vim:
/
, then type what you want to search for, then if there are some special characters put\
before each special character, then press Enter.
And everything with Vim is like that: it seems I don't know how to handle it the right way.
NB : I've already read the Vim cheat sheet :)
My question is:
What is the way you use Vim that makes you more productive than with a contemporary editor?
Visual Mode
As several other people have said, visual mode is the answer to your copy/cut & paste problem. Vim gives you 'v', 'V', and C-v. Lower case 'v' in vim is essentially the same as the shift key in notepad. The nice thing is that you don't have to hold it down. You can use any movement technique to navigate efficiently to the starting (or ending) point of your selection. Then hit 'v', and use efficient movement techniques again to navigate to the other end of your selection. Then 'd' or 'y' allows you to cut or copy that selection.
The advantage vim's visual mode has over Jim Dennis's description of cut/copy/paste in vi is that you don't have to get the location exactly right. Sometimes it's more efficient to use a quick movement to get to the general vicinity of where you want to go and then refine that with other movements than to think up a more complex single movement command that gets you exactly where you want to go.
The downside to using visual mode extensively in this manner is that it can become a crutch that you use all the time which prevents you from learning new vi(m) commands that might allow you to do things more efficiently. However, if you are very proactive about learning new aspects of vi(m), then this probably won't affect you much.
I'll also re-emphasize that the visual line and visual block modes give you variations on this same theme that can be very powerful...especially the visual block mode.
On Efficient Use of the Keyboard
I also disagree with your assertion that alternating hands is the fastest way to use the keyboard. It has an element of truth in it. Speaking very generally, repeated use of the same thing is slow. This most significant example of this principle is that consecutive keystrokes typed with the same finger are very slow. Your assertion probably stems from the natural tendency to use the s/finger/hand/ transformation on this pattern. To some extent it's correct, but at the extremely high end of the efficiency spectrum it's incorrect.
Just ask any pianist. Ask them whether it's faster to play a succession of a few notes alternating hands or using consecutive fingers of a single hand in sequence. The fastest way to type 4 keystrokes is not to alternate hands, but to type them with 4 fingers of the same hand in either ascending or descending order (call this a "run"). This should be self-evident once you've considered this possibility.
The more difficult problem is optimizing for this. It's pretty easy to optimize for absolute distance on the keyboard. Vim does that. It's much harder to optimize at the "run" level, but vi(m) with it's modal editing gives you a better chance at being able to do it than any non-modal approach (ahem, emacs) ever could.
On Emacs
Lest the emacs zealots completely disregard my whole post on account of that last parenthetical comment, I feel I must describe the root of the difference between the emacs and vim religions. I've never spoken up in the editor wars and I probably won't do it again, but I've never heard anyone describe the differences this way, so here it goes. The difference is the following tradeoff:
Vim gives you unmatched raw text editing efficiency Emacs gives you unmatched ability to customize and program the editor
The blind vim zealots will claim that vim has a scripting language. But it's an obscure, ad-hoc language that was designed to serve the editor. Emacs has Lisp! Enough said. If you don't appreciate the significance of those last two sentences or have a desire to learn enough about functional programming and Lisp to develop that appreciation, then you should use vim.
The emacs zealots will claim that emacs has viper mode, and so it is a superset of vim. But viper mode isn't standard. My understanding is that viper mode is not used by the majority of emacs users. Since it's not the default, most emacs users probably don't develop a true appreciation for the benefits of the modal paradigm.
In my opinion these differences are orthogonal. I believe the benefits of vim and emacs as I have stated them are both valid. This means that the ultimate editor doesn't exist yet. It's probably true that emacs would be the easiest platform on which to base the ultimate editor. But modal editing is not entrenched in the emacs mindset. The emacs community could move that way in the future, but that doesn't seem very likely.
So if you want raw editing efficiency, use vim. If you want the ultimate environment for scripting and programming your editor use emacs. If you want some of both with an emphasis on programmability, use emacs with viper mode (or program your own mode). If you want the best of both worlds, you're out of luck for now.
You asked about productive shortcuts, but I think your real question is: Is vim worth it? The answer to this stackoverflow question is -> "Yes"
You must have noticed two things. Vim is powerful, and vim is hard to learn. Much of it's power lies in it's expandability and endless combination of commands. Don't feel overwhelmed. Go slow. One command, one plugin at a time. Don't overdo it.
All that investment you put into vim will pay back a thousand fold. You're going to be inside a text editor for many, many hours before you die. Vim will be your companion.
Some productivity tips:
Smart movements
*
and#
search for the word under the cursor forward/backward.w
to the next wordW
to the next space-separated wordb
/e
to the begin/end of the current word. (B
/E
for space separated only)gg
/G
jump to the begin/end of the file.%
jump to the matching { .. } or ( .. ), etc..{
/}
jump to next paragraph.'.
jump back to last edited line.g;
jump back to last edited position.Quick editing commands
I
insert at the begin.A
append to end.o
/O
open a new line after/before the current.v
/V
/Ctrl+V
visual mode (to select text!)Shift+R
replace textC
change remaining part of line.Combining commands
Most commands accept a amount and direction, for example:
cW
= change till end of word3cW
= change 3 wordsBcW
= to begin of full word, change full wordciW
= change inner word.ci"
= change inner between ".."ci(
= change text between ( .. )ci<
= change text between < .. > (needsset matchpairs+=<:>
in vimrc)4dd
= delete 4 lines3x
= delete 3 characters.3s
= substitute 3 characters.Useful programmer commands
r
replace one character (e.g.rd
replaces the current char withd
).~
changes case.J
joins two lines.
repeat last command (a simple macro)==
fix line indent>
indent block (in visual mode)<
unindent block (in visual mode)Macro recording
q[ key ]
to start recording.q
to stop recording.@[ key ]
.By using very specific commands and movements, VIM can replay those exact actions for the next lines. (e.g. A for append-to-end,
b
/e
to move the cursor to the begin or end of a word respectively)Example of well built settings
The settings can be stored in
~/.vimrc
, or system-wide in/etc/vimrc.local
and then by read from the/etc/vimrc
file using:(you'll have to replace the
#
comment character with"
to make it work in VIM, I wanted to give proper syntax highlighting here).The commands I've listed here are pretty basic, and the main ones I use so far. They already make me quite more productive, without having to know all the fancy stuff.
gi
Go to last edited location (very useful if you performed some searching and than want go back to edit)
^P and ^N
Complete previous (^P) or next (^N) text.
^O and ^I
Go to previous (
^O
-"O"
for old) location or to the next (^I
-"I"
just near to"O"
). When you perform searches, edit files etc., you can navigate through these "jumps" forward and back.Spend 30 mins doing the vim tutorial (run vimtutor instead of vim in terminal). You will learn the basic movements, and some keystrokes, this will make you at least as productive with vim as with the text editor you used before. After that, well, read Jim Dennis' answer again :)
Automatic indentation:
gg
(go to start of document)=
(indent time!)shift-g
(go to end of document)You'll need 'filetype plugin indent on' in your
.vimrc
file, and probably appropriate 'shiftwidth' and 'expandtab' settings.