All text cut and copy operations are saved into registers. If you have cut text and then cut something else, you haven’t lost the first cut – just type :reg (short for :registers) to see all of the registers. You can then type the name of the register and then p, such as "3p, to paste whatever you cut three or four operations prior.
It’s a good habit to use registers for longer-term copies and pastes. If there’s anything you want to save “in the clipboard” for a while, you cut or copy it to register a , such as with "ay (copy) or "ad (cut). That way, no matter how many operations later, you’re still able to paste what you wanted with "ap.
Hit qa to record keystrokes to register a, hit q when you’re finished, hit @a to play the macro in register a and @@ to repeat the last macro.
If you already use Vim, but don’t use the following commands to their fullest, you’re not living right.
CTRL-] jumps to the location of the definition of the function under the cursor, and CTRL-t gets you back. Go as deep as you want — hitting CTRL-t until it doesn’t work anymore will get you back where you started. (You’ll need a tags file to make this work.) This is fully 1/2 of the value of an IDE like Eclipse for me, built in, with less screen clutter.
The other half of an IDE is tab-completion of long variable or function names. This is done in Vim with CTRL-n and CTRL-p to scroll up and down the possible list. If you are using a tags file, or if you have the file with the other definitions open in Vim, it will complete the name for you.
gg=G jumps to the top of the document (gg) and auto-indents it (=) until the end of the document (G). This makes all your open and close braces line up, and makes it very easy to spot the one that you forgot.
u undoes the last command. CTRL-r redoes. :earlier 2m reverts to the state that it was two minutes ago. If you end up undoing, editing, and then want to undo some previous changes, you can. g+ and g- will step up and down the undo tree. It gets complicated.
/ and f, the search commands, are vital as a motion in a compound command. df, deletes everything up to the first comma. d/foo lets you delete until the first (interactive) match on “foo”. This can replace many other movements if you’re so inclined.
:r reads in a file. :! runs a command in the shell. :r! pastes the output of a command into your document. :r!ls whatever* is often faster than typing in a filename. I’m not going to get started on how UNIXy the ability to run your text through arbitrary shell scripts is.