tags:

views:

214

answers:

3

I've used VIM for 10+ years, but never really into VIM scripting (always subjectively beliving that this was one area where VIM was weaker than Emacs).

Recently, the realization "in a VIM script, I can execute normal mode commands" made my mind og "a-ha" and suddenly start realizing why parts of VIM script is the way it is.

normal ma10jd'a20kp

is much more elegant than

Marker m = currentLocation();
advanceLines(10);
Buffer b = delete(currentLocation(), m);
advanceLines(-20);
insertBuffer(b);

Now question is -- what's a good resource to learn vim scripting from?

Thanks!

+3  A: 

I'm in a similar situation. It's still on my "to read" list, but I just found Scripting the Vim editor today. The articles from IBM's DeveloperWorks are usually very good, so probably worth checking out.

Walter
+6  A: 

The best advice I can give is that you read:

:help usr_41.txt

which will give you a good overview of the basics. Then find some things that you want to do and create functions for them. While you're doing this, make heavy use of:

:help function-list

to get an idea of what all the built in functions are. Most of it is fairly similar to other scripting languages (albeit a harsher syntax), so any experience you have of text manipulation in python or whatever will be useful.

Also, look on the vim scripts page and Google to get examples of existing scripts to help expand your knowledge.

Finally (and probably most importantly), don't be afraid to ask on stackoverflow or the Vim mailing list and there'll be plenty of support for any problems you may have.

Al
+3  A: 

Al gave you a good answer. I'd also add vim.wikia that has a few tips related to your question.

On a side note.

I wouldn't say that ma10jd'a20kp is more elegant. I see the following problems:

  • it's quite difficult to maintain (what if the number of lines shall become a parameter?),
  • people like to override keys they never learned to use (this could be fixed with a banged :normal!),
  • some normal-mode commands have strange behaviour on side-case (like <esc> when the cursor is on the first column),
  • it messes the mark a, and the unnamed register -- other scripts, or even the user may expect their values to not be altered by your script.
Luc Hermitte
+1: I misread the original post as "is less elegant than" as I thought it clearly was! Otherwise I would have commented on the unmaintainable `:normal` line. I tend to use `:normal` only when I can't find a good way to do it with scripting constructs. Either enter the keys one at a time manually or write a proper function that can be maintained.
Al