[comp.editors] another collection of macros

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)