[comp.unix.questions] vi tips- summary number one

bs@augusta.UUCP (Burch Seymour) (09/08/87)

This is the first summary in response to my recent request for vi
tips.  The response was really amazing.  These are the short items.
Longer items will follow shortly in other articles

Thanks to the following people for submitting tips.
Arden White, Mike Marshall, Ernie Englehart, Marty Brilliant, Don Law, Jeff Lee,
Bob Weissman, Steve Losen, Ed Blackmond, Mike Stroyhan, lcuxlm!wgs, Seth,
David Klann, Joe Boykin, Joe Kalash, Jack Bonn, Bob Devine, Tim O'Reilly,
Dan Messinger, Shannon Nelson, John McLaughlin, Ray Lampman, David Elliot,
Bryan Ewbank, Brandon Allbery, Jeff Bowles, Bart Schaefer, Paul Sutcliff, 
Roger Murray, Amos Shapir, and Patrick Wolfe.

I think I named everybody whom I have received mail from up to this point
in time. If your name isn't here, I either didn't get your mail or managed
to miss typing your name above. If the latter is the case, sorry.

================================================================================
A note on this text. Control characters will be typed as
<ctrl>c for control c or similarly <esc> for escape. All
commands or characters which are imbedded in text will be
in single quotes, for example 'H' means to type capitol h,
not quote H quote. I'll probably mess this up at least once,
but you should be able to work out what I meant :-)
-----------
Here's the "best" tip of all, it involves work, but still.......

> My advice is for people to take a copy of the reference card, and
> try every single command on it. I was a pretty mediocre vi user
> until I had to evaluate vi, and now there's very little I don't
> understand.
------------
Use the tilde ~  to change case (upper/lower) of letters. It will ignore
punctuation.
------------
Reverse 2 characters in a word with 'xp'. I remember this as an abbreviation
of the word transpose.
------------
When editing 2 file, switch between them with ':e#' or '<ctrl>^' . The latter
does not always work due to differences in terminals.
------------
Use the caret '^' and dollar '$' to match beginning of line and end of line in
ed style substitutions. For example:
  :%s/^/>  /
places a '>  ' at the front of every line in the buffer.
------------
Move to the bottom of the file with 'G'.
Move to the top of the file with '1G'
Move to the top of the screen with 'H' or <home>
Move to the middle of the screen with 'M'
Move to the end of the screen with 'L'
------------
Re-format text using the '!}fmt' command. This one will re-format a paragraph.
'!]]fmt' does the rest of the buffer. '!)fmt' does a sentence.
------------
Much mail concerned the use of ranges in vi commands. For example consider
the 'd', delete, command.

'dw' deletes a word
'dG' deletes to bottom of file
'd)' deletes a sentence.  Sentences are delimited by TWO spaces.
'd%' deletes to the matching bracket, brace, or paren. Works
     forwards or backwards.
'd''' (that's d with 2 single quotes) Deletes to the last place we
      jumped from. For example, find the first line to delete, place
      the curser on that line. Jump using a '/pattern' search. Type
      'd''', the lines between those points will be deleted.
'd]]' deletes the rest of the buffer
'dtp' deletes through the letter p, but leaves the p
'dfp' deletes to and including the letter p

The search operation may be used also:

'd/pattern<esc>' deletes up to the patern, but leaves the pattern.

The neat thing about this principle is it works with most other vi commands
such as 'y' yank, and 'c' change.
--------------------------------------------------------------------------------
    #####              Gould Computer Systems Division
      ###                  in Sunny South Florida
#####   #####                   Burch Seymour
#####    ####     =>  ...!{sun,pur-ee,brl-bmd}!gould!bseymour
#####   #####     =>  ...!{ihnp4!codas,allegra}!novavax!gould!bseymour
      ##          => NOTE: Disregard header info. Email to above paths only.
    ####          => The opinions expressed are probably not worth disclaiming
================================================================================

schaefer@ogcvax.UUCP (Barton E. Schaefer) (09/09/87)

In article <augusta.601> bs@augusta.UUCP (Burch Seymour) writes:
>This is the first summary in response to my recent request for vi
>tips.  The response was really amazing.  These are the short items.
>Longer items will follow shortly in other articles
>
>'d]]' deletes the rest of the buffer

Actually, this deletes to the next section header in troff text or to the
opening '{' of the next function in C code.  Exactly WHAT it deletes to is
controlled by the setting of the vi "sections" variable.  Similarly,

	d[[	Deletes to the previous section or function opener
	d}	Deletes to the next paragraph or blank line
	d{	Deletes to the previous paragraph or blank line

where the "paragraphs" variable controls what is a paragraph.

-- 
Bart Schaefer			CSNET:	schaefer@Oregon-Grad
				UUCP:	...{tektronix,verdix}!ogcvax!schaefer
"Face it ... computers have revolutionized the workplace."
"Right.  The Ayatollah did the same thing to Iran."		-- J. MacNelly

gregg@okstate.UUCP (09/11/87)

in article <601@augusta.UUCP>, bs@augusta.UUCP (Burch Seymour) says:
> 
> This is the first summary in response to my recent request for vi
> tips.  The response was really amazing.  These are the short items.
> Longer items will follow shortly in other articles
> 
> ==============================================================================
> Re-format text using the '!}fmt' command. This one will re-format a paragraph.
> '!]]fmt' does the rest of the buffer. '!)fmt' does a sentence.
> ------------

The ]] and [[ movements are actually 'end of section, and beginning of section
respectively.  If you are editing a C source file, [[ take you to the previous
'{', at the beginning of the line, from your current location.  If you write
C normally, i.e.

main (argc, argv)
	int argc;
	char **argv;
{
	... function body ...
}

then this is a great way to move to the top of a function as you are writing
it to put in another declaration, as then '' gets you back to where you were
working.  ]] takes you to the NEXT function in a file containing C code.

Also, fmt(1) is not available everywhere.  nroff(1) is a good way to filter
text in a file and reformat it.

> 'd]]' deletes the rest of the buffer

Again, depends on what type of text you are editing. dG is a better way to
delete to the end of the file.

> 
> The search operation may be used also:
> 
> 'd/pattern<esc>' deletes up to the patern, but leaves the pattern.
> 
> The neat thing about this principle is it works with most other vi commands
> such as 'y' yank, and 'c' change.
> -----------------------------------------------------------------------------

What most VI users fail to discover is that you can use the 'd', 'y', and 'c'
commands to effect their purpose on any region that is delimited by moving
the cursor with the following keystrokes.  'x' is just 'dl', 'X' is just 'dh',
's' is 'cl', 'C' is 'c$', 'D' is 'd$' and 'S' is 'cc' (which makes absolutly no
sense).  All you have to do is learn the movements, and then you know how to
yank/delete/change whatever region of text you desire.

-----
Gregg Wonderly
Department of Computing and Information Sciences
Oklahoma State University

UUCP:  {cbosgd, ihnp4, rutgers, seismo, uiucdcs}!okstate!gregg
ARPA:  gregg@A.CS.OKSTATE.EDU

chris@mimsy.UUCP (Chris Torek) (09/11/87)

[Our sys file was broken for a while, and I think this did not go out
to the net in general.  Apologies if this is a repeat.]

Something that is, I believe, undocumented about `range' commands
(dw, dd, dG; cw, cc, cfl; etc.) is that they have two `modes',
namely line-oriented and character-oriented.  For instance, dd is
line-oriented: it deletes the entire current line, no matter where
the cursor is within that line, while d$ deletes from the cursor
to the end of the line.  The mode is determined by the addressing
construct: _ or stuttering (d_ and c_ are aliases for dd and cc
respectively) produces a line address: `this line'.  <number>G (go
to line <number>, default end of file) produces a line address:
`this line through that other line'.  w, e, W, E, ^ or | (beginning
of text), 0 (beginning of line), and $ (end of line) all produce
a character address: `the cursor position to the end of the line'.
The searching operators /, ?, n, and N all produce character
addresses.

Try, for instance, editing a file with the words

	foo
	bar
	out

Type the following keys:

	1  G  /  a  r  RETURN  1  G  l  d  n

The mark-referencing commands ' and ` produce line and character
oriented addresses respectively.  Some commands (notably `!', pipe
region through command) will not accept character oriented addresses:
`!w' simply beeps, while `!/pattern' produces odd results, and `!n'
produces even odder results.
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7690)
Domain:	chris@mimsy.umd.edu	Path:	uunet!mimsy!chris

jai@im4u.UUCP (Jai Srinivasan) (09/13/87)

In article <2551@okstate.UUCP> gregg@a.cs.okstate.edu (Gregg Wonderly) writes:

>What most VI users fail to discover is that you can use the 'd', 'y', and 'c'
>commands to effect their purpose on any region that is delimited by moving
>the cursor with the following keystrokes.  

Add to that list >, < and ! which left shift, right shift and filter text
through commands respectively.

>'s' is 'cl', 'C' is 'c$', 'D' is 'd$' and 'S' is 'cc' (which makes absolutly no
>sense).  All you have to do is learn the movements, and then you know how to
>yank/delete/change whatever region of text you desire.

Similarly 'Y' is 'yy'.  I prefer to map 'Y' to 'y$' for consistency.
The "operators" >, < and ! don't have a shifted analogue, naturally.

Other mappings convenient for typing are 'g' to 'G' and 'v' to 'J' (join 
lines).  'g' and 'v' have no assigned function in the regular command set.

--------
Jai Srinivasan, UUCP: {gatech,harvard,ihnp4,pyramid,seismo}!ut-sally!im4u!jai
ARPA:  		      jai@im4u.UTEXAS.EDU, jai@sally.UTEXAS.EDU

-----------------------------

ndd@duke.cs.duke.edu (Ned Danieley) (09/14/87)

In article <2137@im4u.UUCP> jai@im4u.UUCP (Jai Srinivasan) writes:
>
>Other mappings convenient for typing are 'g' to 'G' and 'v' to 'J' (join 
>lines).  'g' and 'v' have no assigned function in the regular command set.
>


I prefer to map 'g' to '1G', so that the unshifted version is (sort of)
the opposite of the shifted version. I use 'v' ('V') to add a blank
line below (above) the current line ('oESC' or 'OESC').


Ned Danieley (ndd@sunbar.mc.duke.edu)
Basic Arrhythmia Laboratory
Duke University Medical Center
Durham, NC  27710
(919) 684-6807 or 684-6942

d757@sphinx.uchicago.edu (Lawrence Lerner) (09/14/87)

Here is a quickie vi ref card for those that don't have acces to one.

============================Cut Here===========================================
                        Unix vi Reference Card

	  arrow keys move cursor      ^n,^p,<SP>,<BS> same as arrows
<ESC>     escape from text entry      ^g     tell what is going on
: 	  give ex command	      ZZ     write and quit 
<CR>	  start of next line	      -      start of previous line

^b        go back one page	      ^u     scroll back 1/2 page
^f	  go forward one page  	      ^d     scroll forward 1/2 page
					       or end indent
^e	  scroll down one line        ^y     scroll up one line
H	  home screen line	      L      last screen line

x	  delete character	      r      replace char with next 
					       typed 
a	  append after cursor         A      append after line
i	  insert before cursor        I      insert before line
p	  put before cursor	      P      put before line
u	  undo changes  	      U      undo changes in this 
					       line only
c obj	  change object to following text


                      Object defining characters

w	  forward one word	      W      forward, ignore punctuation
b         backward one word	      B	     backward, ignore punc.
e         end of current word         <CR>,- as above


                       Characters using buffers

d obj	  delete object	      dd     delete line
y obj      yanks object	      yy     yank line
p	  place what is in buffer
"         select buffer

NOTE:  There are 26 buffers, each corresponding to a letter of the
       alphabet. To refer to a specific buffer type "<letter> e.g. "a
       refers to buffer a.  Therefore "add would delete the line that
       cursor is on and place it into buffer a.  To place the deleted
       line elsewhere, position cursor and type "ap.

       In order to delete or yank a section of text, you must place a
       mark to where the deletion/yank is to stop.  This is done by
       typing: m<letter> (do not use the same buffer to place a mark
       and store text). To return to that location, type `<letter>.
       When deleting or yanking to a mark, say b, position the
       cursor at the beginning of the desired text, and type "ad`b.
       This deletes the text from cursor until mark b, and places it
       in buffer a.  "ad'b will delete until the end of the line in
       which mark b is (note difference in ` and ').



                            Search

/text<CR> search forward for text     ?text<CR> search backward
n	  next occurance	      N         next occurance in 
						  opposite direction

                        Miscellaneous

J     adjoin current line to line above
!!    place results of command into file i.e. !!cat it.p will place
           the list of it.p in your file.





                        Unix ex Reference Card


  n      set pointer to line n
  n,n    specify a range of lines for next command
  $      used to indicate last line in file
  .      print current line or end insertion

  p      print specified lines
  p#     print specified lines with line numbers
  a      append lines after this line; end insertion with "."
  i      insert lines after this line; end insertion with "."
  d      delete specified lines
  u      undo last deletion or substitution
  c      change (i.e. replace) specified lines to new text
  ya     yank specified lines into buffer
  pu     lines from buffer before this one
  w      write current text to file
  q      quit edit
  q!     forces quit without write
  wq     write and quit
  vi     enter vi editor
  se     display settings; refer to manual for details


  /text/		search for text
  //			search for next occurrence
  s/oldtext/newtext/	substitute newtext for oldtext in 
			    specified lines
  n1,n2copy3		copy lines n1-n2 to after n3
  global/pattern/cmds	search file for pattern and do cmds on those 
			    lines.

  set nu			insert line numbers
  set nonu		remove line numbers


-- 
           "...nothing kills that does not know ye."
                  -Meg Davis, `The Elf Glade' 
UUCP: ihnp4!gargoyle!sphinx!d757       d757@sphinx.uchicago.edu    
      Lawrence Lerner    University of Chicago Computation Center   

jerryp@tekgen.TEK.COM (Jerry Peek) (09/15/87)

[I've taken comp.unix.wizards off the list, and restricted followups to
comp.unix.questions.]

In article <2280@sphinx.uchicago.edu> d757@sphinx.UUCP (Lawrence Lerner) writes:
> Here is a quickie vi ref card for those that don't have acces to one.
> 
> ============================Cut Here===========================================
>                         Unix vi Reference Card
> 

With, I think, some errors.  Let's see if I can help here.
[Oh no -- vi command wars! :-)]


> p	  put before cursor	      P      put before line

Instead, I'd say:

  p	  put after cursor	      P	     put before cursor
	    or after line			    or before line


>        In order to delete or yank a section of text, you must place a
>        mark to where the deletion/yank is to stop.

Not true.  You don't have to delete or yank to a mark.  You can delete
or yank to 'most any location command.  For example:
	
	y/Fred <ESC>	yank until the word Fred
	"ty/Fred <ESC>	yank until the word Fred, store in buffer "t
	d23G		delete from here to (and including) line 23
	y2t-		yank from here to the second-following hyphen in line

etc. etc.  Marks are handy for this, but not required.


> J     adjoin current line to line above

No.  This joins the current line to the line *below*.


> !!    place results of command into file i.e. !!cat it.p will place
>            the list of it.p in your file.

Oops.  This *replaces the current line* with the contents of the it.p file.
What you want, I think, is:

	:r it.p <ESC>

This will read the contents of it.p into the buffer beneath the current line.


>                         Unix ex Reference Card
>...
>   a      append lines after this line; end insertion with "."
>   i      insert lines after this line; end insertion with "."

The i command inserts lines *before* the current line.

---------------------------------------------------------------------------
--Jerry Peek
uucp-style:   {allegra,decvax,hplabs,ihnp4,ucbvax}!tektronix!tekgen!jerryp
Domain-style: jerryp@tekgen.TEK.COM
Phone:        +1 315 445-9379

dce@mips.UUCP (David Elliott) (09/15/87)

In article <1741@tekgen.TEK.COM> jerryp@tekgen.TEK.COM (Jerry Peek) writes:
>In article <2280@sphinx.uchicago.edu> d757@sphinx.UUCP (Lawrence Lerner) writes:
>> !!    place results of command into file i.e. !!cat it.p will place
>>            the list of it.p in your file.
>
>Oops.  This *replaces the current line* with the contents of the it.p file.

Still not quite correct. !! replaces the current line with the result
of sending the line through a pipe to the given command. Also, ! is
orthogonal like 'd' and 'y'.

Examples:

1. We have a command called "uupath" that will take a "To:" or "Cc:"
line on the standard input, extract the mail address, change it
using the pathalias database, and print out the new line. Thus, I
can place my cursor on a "To:" line, type "!!uupath", and the mail
address gets fixed.

2. I can run a whole block of text through the tr command. Take the
following lines:

	a
	b
	c
	d

Place the cursor on the 'a' and type

	!3jtr 'a-z' 'A-Z'

and note that the 4 letters get changed to upper case.

-- 
David Elliott		{decvax,ucbvax,ihnp4}!decwrl!mips!dce