I used vi (vim) for about five years, before switching to emacs (gnu emacs), which I've used for about two. They're both excellent text editors, but are clearly optimized for different things, and have tremendous differences in interface, extensibility, and culture.

The big advantage for Emacs lies in being a sort of Lisp virtual machine. It's extensible enough to be nearly an OS in its own right (certainly a "desktop environment" or whatever), and has decades of extensions already available for it. Where vi(m) has two fundamental modes (with replace being a submode of insert, I suppose), emacs has modes specific to most tasks -- if you want a mode that integrates with an external Common Lisp (slime), OCaml (tuareg), or Ruby (ruby-mode), it's there. This doesn't just mean syntax highlighting and indenting, it means more abstract things like being able to insert the type signature for a Haskell function under the cursor, jump to the definition of an object's superclass, or check/edit/archive your email. (For a really good example, check out this screencast of Marco Baringer using Slime: http://common-lisp.net/~mbaringer/slime.torrent ) Emacs Lisp is not the greatest as Lisp implementations / dialects go, but it has a lot of advantages for extending an editor compared to something like Python or Perl. (I have a suspicion Smalltalk or Forth would work well, though.)

I know that vim is extensible, but typically you process a region by typing :%!some_cmd to pipe it back and forth; most integration between vim and external programs that I've observed has been at the level of piping text (in the quintessentially Unixy way). This loses a lot of deeper context that could better tie things together.

The main strength of vi, I think, is in its ubiquity. While I use emacs to do most things, I also have a heavily customized environment that I carry around with me. (It's under version control, etc.) I can be extremely productive with it, once I've moved in, but vi is available everywhere. I'm talking about a basic vi (nvi?) with one level of undo and no syntax highlighting, perhaps, but it's still pretty good for editing text, particularly if you're a touch-typist and the interface has become second nature. It edits text. It doesn't tie things together into one harmonious environment, but it edits text, and it's really efficient once you know it.

For what its worth, there's an editor called "mg" which has the default emacs keyboard config out of the box, but is not really very programmable. While I'm very familiar with the basic keyboard controls, it feels crippled to me. I use it while doing computer setup stuff, because it's in the default OpenBSD install, and it's a decent pager, but it's really not the same.

Anyway, that's my experience with each. Emacs seems far more powerful in the long run, but it takes quite a bit more time to learn to use it to anywhere near its full capacity, and doing so will rely on carrying around your configuration. (It also has a relatively alien culture and vocabulary, which takes some getting used to.) Vi does what it does everywhere, but cannot grow indefinitely to fit your needs. It's focused on just being a good text editor, rather than a full environment. If you're talking years, though, I would definitely give emacs a shot.

(Incidentally, I think emacs is quite reasonable under the Dvorak keyboard layout (better than qwerty, I think), while vi feels far more awkward. The hjkl keys get scattered badly, for one thing. That, a growing fascination with Lisp, and being utterly blown away by the Slime screencast were why I ultimately switched.)