Skip to main content

Another VI tip - using macros, an example

God I love VI. Well, actually, vim but whatever.

Here's another reason why. Suppose you need to perform some repetitive task over and over, such as updating the copyright date in the footer of a static website. (Yes, yes I know you could do a javascript thing or whatever, just bear with me.)

Of course you could just search and replace in some text editor, changing "2007" to "2008" (if you're stupid) - and you'll end up with a bunch of incorrect dates being changed, most likely. What you need to do is only change that date at the bottom. And suppose that because of the formatting, you can't use the "Copy" part of the string in a search replace - perhaps some of the pages use "©", some spell out "Copyright" etc.

This is where vi macros come in handy. A macro in vi is exactly what you expect, it records your actions and allows you to play them back.

To start recording, press q followed by a character to use to "store" the macro. Let's say since it's the copyright date you're updating, you enter qd to start recording into the "d" buffer.

Then perform your actions. Since you want to get the last "2007" in the document, do GG to jump to the bottom of the document, then "?2007" to search backwards for the first 2007. Move your cursor and make the change. Then save the file with :w, and end the macro recording by hitting q again - you now have a macro, and can trigger those commands by hitting @d !

You could even change that last step to the :wn to have vi move to the next file in the queue - but I like to give myself a chance to see what changed before going to the next file - this way you can hit u if you need to undo what you just did.

You can use macros to automate just about anything, and when combined with regular expressions for changes or getting around the file, you have one heck of a powerful tool for editing!

Comments

Unknown said…
Then save the file with :w - you now have a macro, and can trigger those commands by hitting @d.

You have to stop macro recording by hitting q after :w<Enter>. Otherwise, the @d and every command after that has the usual behavior and gets added to the macro ad infinitum...
Unknown said…
Adding to my previous comment...

If you forget to stop macro recording with q, and then hit @d...can you say infinitely recursive macro execution?

To illustrate: Start with an empty buffer, then type the following in sequence:

qd - Start recording to macro buffer d

aThis is a test.<Enter><Esc> - Insert a single test line.

@d - Execute macro in buffer d. But wait, you're still recording the macro...

<Ctrl-C> - Stop the madness. 8-)
The Author said…
Oops you're totally right, you have to hit 'q' to stop the macro recording.
The Author said…
Hehe yeah, you can have a macro recursively trigger itself - I can't think of anything useful you can use that for. Presumable you can also trigger other macros - or copy/paste from buffers, etc.
Unknown said…
>> I can't think of anything useful you can use that for

check out recursive macros :
http://vim.wikia.com/wiki/Record_a_recursive_macro
Kiwi Nick said…
Not all versions of vi accept q to start recording macros, particularly ancient versions (like on SCO & Tru64).

For these, you have to type the characters into a line and yank these characters into a named buffer.

Tricky: you insert control characters (like esc and return) into the line by preceding that keystroke with ^V (Control-V).

The good oil is here: Web Archive copy

Popular posts from this blog

Using FIle FIlters in FileZilla

Here's a handy tip for situations when you want to download a large number of files - but only of a certain type. For example, perhaps you want to download all the PHP files from a largish website, scattered through many subdirectories. Perhaps you're making a backup and don't want any image files, etc. FileZilla (still the best FTP in my opinion) has a handy feature called filename filters - located under the Edit menu. Here you can set various filters that filter out files based on their filename. Took me a minute to figure that out - you're saying show only PHP files, rather you're saying filter out files that do not have ".php" as their suffix. For some reason, that seems a little backwards to me, but whatever. It works quite well. You can also check whether the filter applies only to files, only to directories - or both. In this example, you'd want to check only files, as otherwise you won't see any directories unless they happen to end in

Great google article

Over on Maximum PC - there were a few things I didn't know you could do with the various Google apps. One is uploading files to google docs - any file. Which ties in well with my previous post about storing passwords - I uploaded a copy of my password safe file to google docs as a backup. Can't hurt, right? Also, I wasn't aware that you could set up forms in google docs that act as surveys, and then store the results in a google docs spreadsheet. This is a little alarming, as a decent amount of my work involves coding up custom surveys similar to this...