maart@cs.vu.nl (Maarten Litmaath) (08/09/90)
-------------------------------------------------------------------------- A vi Macro Summary -- compiled by Michael Lamoureux (lamour@mitre.org) with special thanks to: munnari!cjbj@uunet.uu.net lavi!wyle rock@sun.com hitz@auspex.com and also: chen-dahe@yale.arpa hamlin@afit-ab.arpa hossein@unocss.unl.edu jdpeek@radan.acs.syr.edu scs@itivax.iti.org maart@cs.vu.nl bchivers@chance.mitre.org **This file contains control chars...use cat -v to print it** [ I ran it through cat -v to mail it. Use "ctrl" from comp. unix.sources volume 18 to switch them back...or do it by hand. -- mjl ] In regards to my earlier request for vi macros, here is a summary of some of the features, and groupings of the major classes of macros I received. Of course, I took the liberty of mercilessly disecting & modifying these macros to my personal tastes. If you would like the actual text that I received, just drop me a line. A couple of these things were culled out of a discussion on comp.editors, and those people have been credited above. If there are any useful additions, I will accept them and update this list periodically. The first thing that I thought was odd was the fact that several people had some macros mapped to several different keys. I imagine this might have something to do with faulty memory or some such, but that's a personal preference I guess ;-) The most important thing that came out of this is that it broke through some of the walls I had constructed, and really shed some light on the power of these macro functions. For instance, macro mappings can be more than one keystroke. I had only been thinking about mapping functions to keys. Mapping to strings hadn't occured to me. The most useful method of this is to select a macro prefix (a key you don't use for anything...some used ^A, @, ;, etc), and then follow it with a semi-meaningful string of two or three characters. i.e. map ^Afm {!} fmt -c ^M (use ^V to quote the control chars) map @cc :cc %^M (% is replaced by current filename) map ;unshar /^# /^Mkd1G/^exit 0/^MjdG Of course, you would most likely use the same prefix for all of your macros. The four PF keys may be mapped using #1, #2, #3, and #4. To save space, you can group all the set commands into one line: set ai nu ic magic sw=4 ... This allows you to use macros to define modes (text, programming, etc). Another interesting thing is that a map! expands immediately while an ab requires some delimitter (such as a space, tab, etc) before it will expand. Thus I can really see little reason to use an ab for anything. The other implication of this is that no map or map! can be a subset of another. Another shortcut is that ex commands at the : can be delimitted by a pipe (|). In this case, shell escapes must be last on the logical line. Oh, and remember to use a ^V to escape the pipe so it doesn't get interpretted when the macro is being set. Here's a trick that Dave Hitz contributed. Set a second tags file in your .exrc and use it to access files which you edit a lot. set tags=tags\ /your/home/directory/.tags.file then the tags file is sorted with a format like this: errno /usr/include/sys/errno.h /^/ exrc /home/directory/.exrc /^/ phone /home/directory/sub/phones /^/ todo /home/directory/sub/to.do /^/ Then use :ta exrc from within vi to edit your .exrc file. What follows is a commented (a comment is denoted by a ") .exrc file split into groups according to functionality. You may choose to group them differently. One thing which needs to be said is that there is a limit to the number (bytes?) of macros which can be set in your .exrc file. This file will easily be too large. It will also be neccessary to change <key> to the key or string you wish to bind the macro to. " " *****General Use***** " " ^L from within insert mode map! ^L ^[^La " write and background map <key> ;w^M^Z " find next occurance of current word map <key> yeo^[pI/^["kdd@k " execute command on current line map <key> mx"xy$@x^M`x " look through .exrc (or .exrc.help.kind.of.file) map <key> :!less ~/.exrc^M " popular timesaver (can map either 1G or `` to g) map g 1G " surround word with "s (or *s, or 's, or ...) map <key> bi"^[ea"^[ " surround line with /* */ (or anything else) map <key> I/*^[A*/^[ " " *****Text***** " " format paragraph using fmt map <key> {!} fmt -c^M " format rest of document map <key> !G fmt -c^M " sort paragraph map <key> {!} sort^M " insert a ruler map <key> 0O....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8^[ " down case line map <key> :s/.*/\L&/^[ " down case of rest of line map <key> DO^[p:s/.*/\L&/^M0Dj$pkdd " up case line map <key> :s/.*/\U&/^[ " swap case of line map <key> :s/\([a-z]*\)\([A-Z]*\)/\U\1\L\2/g^M " " *****Mail***** (most of this is from lavi!wyle) " " send through your favorite mailer (CUNY, mitvma, uunet, ucbvax, etc) map <key> 0f@r%Ea@mitvma.mit.edu " quote to end of message with >s map <key> :.,$s/^/> /^M " strip everything but the sharfile map <key> /^# /^Mkd1G/^exit 0/^MjdG " insert mail header file (with Reply-To, To, and Subject lines, etc) map <key> 1G0^[:r ~/.mailheader^M1Gdd3GA " add .sig map <key> :r ~/.signature^M " pipe through sendmail map <key> :w >> ~/your/outbox/file^M:%!/usr/lib/sendmail -t^Mu " " *****C Programming***** (most from cjbj; Dave Hitz also sent a " similar set) " " block comments map! <key> ^[o/*^M * ^M*/^[kA " line comments map! <key> ^[A/**/^[hi " surround line with /* */ map <key> I/*^[A*/^[ " unsurround line map <key> 03x$xxx " box comment line map <key> I/^[76i*^[a/^[ " if statement and {}s map! <key> if ()^M{^M}^[kk$i " else if ... map! <key> else if ()^M{^M}^[kk$i " else ... map! <key> else^M{^M}^[O " for ... map! <key> for ()^M{^M}^[kk$i " for with x's inserted for quick loop construction map! <key> for (x = 0; x < x; x++)^M{^M}^[O " while ... map! <key> while ()^M{^M}^[kk$i " ; with null body comment map! <key> ; /* null body */ " switch with all the fixins map! <key> switch ()^M{^M} /* switch */^[O^Mdefault:^M ^Mbreak;^M^[6k$i " case section of a switch map! <key> case :^M break;^M^M^[3k$i " printf map! <key> printf();^[hi " often used includes can be done like this map! <key> #include <ctype.h> map! <key> #include <curses.h> map! <key> #include <string.h> " def & include map! <key> #define map! <key> #include " " could use this to start off main map <key> i#include <stdio.h>^M^Mmain() {^M^M}^[ki " compile from within vi map <key> :!cc %^M " C beautify the file... map <key> :!cb -s -l78 %^M " ...or indent it map <key> :!indent %^M " " *****Modula 2***** (verbatim from lavi!wyle) " (the <cntrl>s in this set need to change) " " Finally, here is a set of macros I call "Electric Modula-2." It " is long, involved, and has a weird syntax because it is copied " directly from Dr. Gutknecht's Sara macro set: " " In order to keep EXACTLY the same command structure between Lilith, " Ceres, macMeth, and Unix, the original (Gutknecht) macro set is: " map ;ce iCARDINAL var ^V^[bcw map ;C iLONGCARD var ^V^[bcw map ;in iINTEGER var ^V^[bcw map ;re iREAL var ^V^[bcw map ;R iLONGREAL var ^V^[bcw map ;bi iBITSET var ^V^[bcw map ;bo iBOOLEAN var ^V^[bcw map ;se iSET OF var ^V^[bcw map ;ar iARRAY OF var ^V^[bcw map ;pr iPROCEDURE proc(vars) : BOOLEAN;^V^M(* PreConditions: *)^V^M(* PostConditions: *)^V^MEND proc;^V^M^V^[kkkkwcw map ;pt iPOINTER TO var ^V^[bcw map ;ex iEXPORT var^V^[bcw map ;im iIMPLEMENTATION MODULE mod; ^V^[bbcw map ;fr iFROM mod IMPORT vars; ^V^[bbbbcw map ;im iIMPORT module; ^V^[bbcw map ;if iIF ( cond ) THEN^V^M statement ^V^MEND;^V^M^V^[kkkwwcw map ;ie iIF ( cond ) THEN^V^M statement ^V^MELSE^V^M statement2^V^MEND;V^M^^V ^[5kwwcw map ;ii iELSEIF ( cond2 ) THEN^V^M stmnt2^V^MELSEIF ( cond3 ) THEN^V^M stmnt3 ^V^M^V^[ map ;wh iWHILE ( cond ) DO^V^M statement^V^MEND;^V^M^V^[kkkwwcw map ;wi iWITH var DO^V^M statement^V^MEND;^V^M^V^[kkkwcw map ;fo iFOR var := low TO high DO^V^M statement^V^MEND;^V^M^V^[kkkwcw map ;rp iREPEAT^V^M statement^V^MUNTIL ( condition );^V^M^V^[kkwcw map ;lo iLOOP^V^M statement^V^M IF ( cond ) THEN EXIT END;V^MEND;V^[kkkwc^^w map ;rc ivar = RECORD^V^M var1 : t1^V^M var2 : t2^V^MEND;^V^M^V^[kkkkcw -- "UNIX was never designed to keep people from doing stupid things, because that policy would also keep them from doing clever things." (Doug Gwyn)