diff man/viper-cmd.texi @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children ac2d302a0011
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/man/viper-cmd.texi	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,1288 @@
+@node Commands,,Customization,Top,Top
+@chapter Commands
+
+This section is a semi-automatically bowdlerized version of the Vi 
+reference created by @* @samp{maart@@cs.vu.nl} and others. It can be 
+found on the Vi archives. Very little has been changed for Viper.@refill
+
+@menu
+* Groundwork::			Textual Conventions and Viper basics
+* Text Handling::		Moving, Editing, Undoing.
+* Display::			Scrolling.
+* File and Buffer Handling::	Editing, Writing and Quitting.
+* Mapping::			Mapping Keys, Keyboard Macros
+* Shell Commands::		Accessing Shell Commands, Processing Text
+* Options::			Ex options, the @kbd{:set} commands
+* Emacs Related Commands::	Meta Keys, Windows
+* Mouse-bound Commands::        Search and insertion of text
+@end menu
+
+@node Groundwork, Text Handling, Commands, Commands
+@comment  node-name,  next,  previous,  up
+@section Groundwork
+
+The VI command set is based on the idea of combining motion commands
+with other commands. The motion command is used as a text region
+specifier for other commands.
+We classify motion commands into @dfn{point commands} and
+@dfn{line commands}.@refill
+
+@cindex point commands
+
+The point commands are:
+
+@quotation
+@kbd{h}, @kbd{l}, @kbd{0},  @kbd{$}, @kbd{w}, @kbd{W}, @kbd{b}, @kbd{B},
+@kbd{e}, @kbd{E}, @kbd{(}, @kbd{)}, @kbd{/}, @kbd{?}, @kbd{`}, @kbd{f},
+@kbd{F}, @kbd{t}, @kbd{T}, @kbd{%}, @kbd{;}, @kbd{,}, @kbd{^}
+@end quotation
+
+@cindex line commands
+
+The line commands are:
+
+@quotation
+@kbd{j}, @kbd{k}, @kbd{+}, @kbd{-}, @kbd{H}, @kbd{M}, @kbd{L}, @kbd{@{},
+@kbd{@}}, @kbd{G}, @kbd{'},  @kbd{[[}, @kbd{]]}, @kbd{[]}
+@end quotation
+@noindent
+
+Text Deletion Commands (@xref{Deleting Text}), Change commands
+(@xref{Changing Text}), even Shell Commands (@xref{Shell Commands})
+use these commands to describe a region of text to operate on.
+
+@cindex r and R region specifiers
+
+Viper adds two region descriptors, @kbd{r} and @kbd{R}. These describe
+the Emacs regions (@xref{Basics}), but they are not movement commands.
+
+The command description uses angle brackets @samp{<>} to indicate
+metasyntactic variables, since the normal conventions of using simple
+text can be confusing with Viper where the commands themselves are
+characters. Watch out where @kbd{<} shift commands and @kbd{<count>} are
+mentioned together!!!
+
+@kindex <move>
+@kindex <a-z>
+@kindex <address>
+@cindex <move>
+@cindex <a-z>
+@cindex <address>
+@cindex movements
+
+@samp{<move>} refers to the above movement commands, and @samp{<a-z>}
+refers to registers or textmarkers from @samp{a} to @samp{z}. Note
+that the @samp{<move>}  is described by full move commands, that is to
+say they will take counts, and otherwise behave like normal move commands.
+@cindex Ex addresses
+@samp{<address>} refers to Ex line addresses, which include
+
+@table @kbd
+@item . <No address>
+Current line
+@item .+n .-n
+Add or subtract for current line
+@item number
+Actual line number, use @kbd{.=} to get the line number
+@item '<a-z>
+Textmarker
+@item $
+Last line
+@item x,y
+Where x and y are one of the above
+@item %
+@cindex % (Ex address)
+For the whole file, same as (1,$).
+@item /pat/
+@item ?pat?
+Next or previous line with pattern pat
+@end table
+
+@cindex % (Current file)
+Note that @samp{%} is used in Ex commands to mean current file. If you
+want a @samp{%} in your command, it must be escaped as @samp{\%}.
+@cindex # (Previous file)
+Similarly, @samp{#} expands to the previous file. The previous file is
+the first file in @kbd{:args} listing. This defaults to previous window
+in the VI sense if you have one window only.
+
+@kindex <args>
+@kindex <cmd>
+@cindex <args>
+@cindex <cmd>
+@noindent
+Others like @samp{<args> -- arguments}, @samp{<cmd> -- command} etc.
+should be fairly obvious.
+
+@noindent
+Common characters referred to include:
+
+@table @kbd
+@item <sp>
+Space 
+@item <ht>
+Tab 
+@item <lf>
+Linefeed 
+@item <esc>
+Escape
+@item <cr>
+Return, Enter
+@end table
+@cindex <cr>
+@cindex <esc>
+@cindex <lf>
+@cindex <ht>
+@cindex <sp>
+
+@cindex words
+@cindex WORDS
+@cindex char
+@cindex CHAR
+
+We also use @samp{word} for alphanumeric/non-alphanumeric words, and 
+@samp{WORD} for whitespace delimited words. @samp{char} refers to any
+ASCII character, @samp{CHAR} to non-whitespace character. 
+Brackets @samp{[]} indicate optional parameters; @samp{<count>} also 
+optional, usually defaulting to 1. Brackets are elided for
+@samp{<count>} to eschew obfuscation.
+
+Viper's idea of Vi's words is slightly different from Vi. First, Viper
+words understand Emacs symbol tables. Therefore, all symbols declared to be
+alphanumeric in a symbol table can automatically be made part of the Viper
+word.  This is useful when, for instance, editing text containing European,
+Cyrillic, etc., letters.
+
+Second, Viper lets you depart from Vi's idea of a word by changing the
+value of @code{vip-syntax-preference}. By default, this variable is set to
+@code{'strict-vi}, which means that alphanumeric symbols are exactly as
+in Vi.
+However, if the value is @code{'reformed-vi} then alphanumeric
+symbols will be those specified by the current Emacs syntax table (which
+may be different for different major modes) plus the underscore symbol
+@code{_}. The user can also specify the value @code{'emacs}, which would
+make Viper use exactly the Emacs notion of word. In particular, the
+underscore may not be part of a word. Finally, if
+@code{vip-syntax-preference} is set to @code{'extended}, Viper words would
+consist of characters that are classified as alphanumeric @emph{or} as
+parts of symbols. This is convenient for writing programs and in many other
+situations.
+
+@vindex @code{vip-syntax-preference}
+@cindex syntax table
+
+@code{vip-syntax-preference} is a local variable, so it can have different
+values for different major modes. For instance, in programming modes it can
+have the value @code{'extended}. In text modes where words contain special
+characters, such as European (non-English) letters, Cyrillic letters, etc.,
+the value can be @code{'reformed-vi} or @code{'emacs}.
+
+Changes to @code{vip-syntax-preference} should be done in the hooks to
+various major modes. Furthermore, for these changes to take effect, you
+should execute @code{(vip-update-alphanumeric-class)} right after changing
+the value of @code{vip-syntax-preference}.
+
+The above discussion concerns only the movement commands. In regular
+expressions, words remain the same as in Emacs.  That is, the expressions
+@code{\w}, @code{\>}, @code{\<}, etc., use Emacs' idea of what is a word,
+and they don't look into the value of variable
+@code{vip-syntax-preference}. This is because Viper doesn't change syntax
+tables in order to not thwart the various major modes that set these
+tables.
+
+The usual Emacs convention is used to indicate Control Characters, i.e
+C-h for Control-h. @emph{Do not confuse this to mean the separate
+characters C - h!!!} The @kbd{^} is itself, never used to indicate a
+Control character.
+
+@node Text Handling, Display, Groundwork, Commands
+@section Text Handling
+
+@menu
+* Move Commands::		Moving, Searching
+* Marking::		        Textmarkers in Viper and the Emacs Mark.
+* Appending Text::		Text insertion, Shifting, Putting
+* Editing in Insert State::	Autoindent, Quoting etc.
+* Deleting Text::		Deleting
+* Changing Text::		Changing, Replacement, Joining
+* Search and Replace::		Searches, Query Replace, Pattern Commands
+* Yanking::			Yanking, Viewing Registers
+* Undoing::			Multiple Undo, Backups
+@end menu
+
+@node Move Commands,Marking,,Text Handling
+@subsection Move Commands
+
+@cindex movement commands
+@cindex searching
+@cindex textmarkers
+@cindex markers
+@cindex column movement
+@cindex paragraphs
+@cindex headings
+@cindex sections
+@cindex sentences
+@cindex matching parens
+@cindex paren matching
+
+@table @kbd
+@item <count>  h  C-h
+<count> chars to the left.
+@item <count>  j  <lf> C-n
+<count> lines downward.
+@item <count>  l  <sp>
+<count> chars to the right.
+@item <count>  k  C-p
+<count> lines upward.
+@item <count>  $
+To the end of line <count> from the cursor.
+@item <count>  ^
+To the first CHAR <count> - 1 lines lower.
+@item <count>  -
+To the first CHAR <count> lines higher.
+@item <count>  +  <cr>
+To the first CHAR <count> lines lower.
+@item  0
+To the first char of the line.
+@item <count> |
+To column <count>
+@item <count>  f<char>
+<count> <char>s to the right (find).
+@item <count>  t<char>
+Till before <count> <char>s to the right.
+@item <count>  F<char>
+<count> <char>s to the left.
+@item <count>  T<char>
+Till after <count> <char>s to the left.
+@item <count>  ;
+Repeat latest @kbd{f t F T} <count> times.
+@item <count>  ,
+Repeat latest @kbd{f t F T}
+<count> times in opposite direction.
+@item <count>  w
+<count> words forward.
+@item <count>  W
+<count> WORDS forward.
+@item <count>  b
+<count> words backward.
+@item <count>  B
+<count> WORDS backward.
+@item <count>  e
+To the end of word <count> forward.
+@item <count>  E
+To the end of WORD <count> forward.
+@item <count>  G
+Go to line <count> (default end-of-file).
+@item <count>  H
+To line <count> from top of the screen (home).
+@item <count>  L
+To line <count> from bottom of the screen (last).
+@item  M
+To the middle line of the screen.
+@item <count>  )
+<count> sentences forward.
+@item <count>  (
+<count> sentences backward.
+@item <count>  @}
+<count> paragraphs forward.
+@item <count>  @{
+<count> paragraphs backward.
+@item <count>  ]]
+To the <count>th heading.
+@item <count>  [[
+To the <count>th previous heading.
+@item <count>  []
+To the end of <count>th heading.
+@item  m<a-z>
+Mark the cursor position with a letter.
+@item  `<a-z>
+To the mark.
+@item  '<a-z>
+To the first CHAR of the line with the mark.
+@item [<a-z>
+Show contents of textmarker.
+@item ]<a-z>
+Show contents of register.
+@item  ``
+To the cursor position before the latest absolute
+jump (of which are examples @kbd{/} and @kbd{G}).
+@item  ''
+To the first CHAR of the line on which the cursor
+was placed before the latest absolute jump.
+@item <count>  /<string>
+To the <count>th occurrence of <string>.
+@item <count>  /<cr>
+To the <count>th occurrence of <string> from previous @kbd{/ or ?}.
+@item <count>  ?<string>
+To the <count>th previous occurrence of <string>.
+@item <count>  ?<cr>
+To the <count>th previous occurrence of <string> from previous @kbd{? or /}.
+@item  n
+Repeat latest @kbd{/} @kbd{?} (next).
+@item  N
+Repeat latest search in opposite direction.
+@item C-c /
+Without a prefix argument, this command toggles
+case-sensitive/case-insensitive search modes and plain vanilla/regular
+expression search. With the prefix argument 1, i.e.,
+@kbd{1 C-c /}, this toggles case-sensitivity; with the prefix argument 2,
+toggles plain vanilla search and search using
+regular expressions. @xref{Viper Specials}, for alternative ways to invoke
+this function.
+@cindex vanilla search
+@cindex case-sensitive search
+@cindex case-insensitive search
+@item  %
+Find the next bracket and go to its match.
+@end table
+@kindex @kbd{%}
+@kindex @kbd{C-c /}
+@kindex @kbd{N}
+@kindex @kbd{n}
+@kindex @kbd{?<cr>}
+@kindex @kbd{/<cr>}
+@kindex @kbd{?<string>}
+@kindex @kbd{/<string>}
+@kindex @kbd{''}
+@kindex @kbd{``}
+@kindex @kbd{]<a-z>}
+@kindex @kbd{[<a-z>}
+@kindex @kbd{'<a-z>}
+@kindex @kbd{`<a-z>}
+@kindex @kbd{m<a-z>}
+@kindex @kbd{[]}
+@kindex @kbd{[[}
+@kindex @kbd{]]}
+@kindex @kbd{@{}
+@kindex @kbd{@}}
+@kindex @kbd{(}
+@kindex @kbd{)}
+@kindex @kbd{M}
+@kindex @kbd{L}
+@kindex @kbd{H}
+@kindex @kbd{G}
+@kindex @kbd{E}
+@kindex @kbd{e}
+@kindex @kbd{B}
+@kindex @kbd{b}
+@kindex @kbd{W}
+@kindex @kbd{w}
+@kindex @kbd{,}
+@kindex @kbd{;}
+@kindex @kbd{T<char>}
+@kindex @kbd{F<char>}
+@kindex @kbd{t<char>}
+@kindex @kbd{f<char>}
+@kindex @kbd{|}
+@kindex @kbd{0}
+@kindex @kbd{<cr>}
+@kindex @kbd{+}
+@kindex @kbd{-}
+@kindex @kbd{^}
+@kindex @kbd{$}
+@kindex @kbd{C-p}
+@kindex @kbd{<lf>}
+@kindex @kbd{<sp>}
+@kindex @kbd{C-n}
+@kindex @kbd{C-h}
+@kindex @kbd{h}
+@kindex @kbd{j}
+@kindex @kbd{k}
+@kindex @kbd{l}
+
+@node Marking,Appending Text,Move Commands,Text Handling
+@subsection Marking
+
+Emacs mark is referred to in the region specifiers @kbd{r} and @kbd{R}.
+@xref{Emacs Preliminaries} and @pxref{Basics} for explanation. Also
+see @ref{Mark,,Mark,emacs,The GNU Emacs manual}, for an explanation of
+the Emacs mark ring.
+
+@cindex marking
+
+@table @kbd
+@item m<a-z>
+Mark the current file and position with the specified letter.
+@item m .
+Set the Emacs mark (@xref{Emacs Preliminaries}) at point.
+@item m <
+Set the Emacs mark at beginning of buffer.
+@item m >
+Set the Emacs mark at end of buffer.
+@item m ,
+Jump to the Emacs mark.
+@item :mark <char>
+ Mark position with text marker named <char>. This is an Ex command.
+@item :k <char>
+ Same as @kbd{:mark}.
+@item ``
+Exchange point and mark.
+@item ''
+Exchange point and mark and go to the first CHAR on line.
+@item '<a-z>
+Go to specified Viper mark.
+@item
+Go to specified Viper mark and go to the first CHAR on line.
+@end table
+@kindex @kbd{m<a-z>}
+@kindex @kbd{m.}
+@kindex @kbd{m>}
+@kindex @kbd{m<}
+@kindex @kbd{m,}
+@findex @kbd{:mark}
+@findex @kbd{:k}
+@kindex @kbd{''}
+@kindex @kbd{``}
+@kindex @kbd{`<a-z>}
+@kindex @kbd{'<a-z>}
+
+@node  Appending Text, Editing in Insert State, Marking,Text Handling
+@subsection Appending Text
+
+@xref{Options} to see how to change tab and shiftwidth size. See the GNU
+Emacs manual, or try @kbd{C-ha tabs} (If you have turned Emacs help on).
+Check out the variable @code{indent-tabs-mode} to put in just spaces.
+Also see options for word-wrap.
+
+@cindex inserting
+@cindex appending
+@cindex paste
+@cindex put
+
+@table @kbd
+@item <count>  a
+<count> times after the cursor.
+@item <count>  A
+<count> times at the end of line.
+@item <count>  i
+<count> times before the cursor (insert).
+@item <count>  I
+<count> times before the first CHAR of the line
+@item <count>  o
+On a new line below the current (open).
+The count is only useful on a slow terminal.
+@item <count>  O
+On a new line above the current.
+The count is only useful on a slow terminal.
+@item <count>  ><move>
+Shift the lines described by <count><move> one
+shiftwidth to the right (layout!).
+@item <count>  >>
+Shift <count> lines one shiftwidth to the right.
+@item <count>  ["<a-z1-9>]p
+Put the contents of the (default undo) buffer
+<count> times after the cursor. The register will
+be automatically downcased.
+@item <count>  ["<a-z1-9>]P
+Put the contents of the (default undo) buffer
+<count> times before the cursor. The register will
+@item [<a-z>
+Show contents of textmarker.
+@item ]<a-z>
+Show contents of register.
+@item <count>  .
+Repeat previous command <count> times. For destructive
+commands as well as undo.
+@item f1 1 and f1 2
+While @kbd{.} repeats the last destructive command,
+these two macros repeat the second-last and the third-last destructive
+commands. @xref{Vi Macros}, for more information on Vi macros.
+@item C-c M-p and C-c M-n
+In Vi state,
+these commands help peruse the history of Vi's destructive commands.
+Successive typing of @kbd{C-c M-p} causes Viper to search the history in
+the direction 
+of older commands, while hitting @kbd{C-c M-n} does so in reverse
+order. Each command in the history is displayed in the Minibuffer. The
+displayed command can 
+then be executed by typing `@kbd{.}'.
+
+Since typing the above sequences of keys may be tedious, the
+functions doing the perusing can be bound to unused keyboard keys in the
+@file{~/.vip} file. @xref{Viper Specials}, for details.
+@end table
+@kindex @kbd{C-c M-p}
+@kindex @kbd{C-c M-n}
+@kindex @kbd{.}
+@kindex @kbd{]<a-z>}
+@kindex @kbd{[<a-z>}
+@kindex @kbd{P}
+@kindex @kbd{p}
+@kindex @kbd{"<a-z1-9>p}
+@kindex @kbd{"<a-z1-9>P}
+@kindex @kbd{>>}
+@kindex @kbd{><move>}
+@kindex @kbd{O}
+@kindex @kbd{o}
+@kindex @kbd{i}
+@kindex @kbd{A}
+@kindex @kbd{a}
+
+@node Editing in Insert State, Deleting Text, Appending Text,Text Handling
+@subsection Editing in Insert State
+
+Minibuffer can be edited similarly to Insert state, and you can switch
+between Insert/Replace/Vi states at will.
+Some users prefer plain Emacs feel in the Minibuffer. To this end, set
+@var{vip-vi-style-in-minibuffer} to @code{nil}.
+
+@cindex Insert state
+
+@table @kbd
+@item C-v
+Deprive the next char of its special meaning (quoting).
+@item C-h
+One char back.
+@item C-w
+One word back.
+@item C-u
+Back to the begin of the change on the
+current line.
+
+@end table
+@kindex @kbd{C-u}
+@kindex @kbd{C-w}
+@kindex @kbd{C-v}
+
+@node Deleting Text, Changing Text, Editing in Insert State, Text Handling
+@subsection Deleting Text
+
+
+There is one difference in text deletion that you should be
+aware of. This difference comes from Emacs and was adopted in Viper
+because we find it very useful. In Vi, if you delete a line, say, and then
+another line, these two deletions are separated and are put back
+separately if you use the @samp{p} command. In Emacs (and Viper), successive
+series of deletions that are @emph{not interrupted} by other commands are
+lumped together, so the deleted text gets accumulated and can be put back
+as one chunk. If you want to break a sequence of deletions so that the
+newly deleted text could be put back separately from the previously deleted
+text, you should perform a non-deleting action, e.g., move the cursor one
+character in any direction.
+
+@cindex shifting text
+
+@table @kbd
+@item <count>  x
+Delete <count> chars under and after the cursor.
+@item <count>  X
+Delete <count> chars before the cursor.
+@item <count>  d<move>
+Delete from point to endpoint of <count><move>.
+@item <count>  dd
+Delete <count> lines.
+@item  D
+The rest of the line.
+@item <count>  <<move>
+Shift the lines described by <count><move> one
+shiftwidth to the left (layout!).
+@item <count>  <<
+Shift <count> lines one shiftwidth to the left.
+@end table
+@kindex @kbd{<<}
+@kindex @kbd{<<move>}
+@kindex @kbd{D}
+@kindex @kbd{dd}
+@kindex @kbd{d<move>}
+@kindex @kbd{X}
+@kindex @kbd{x}
+
+@node Changing Text, Search and Replace, Deleting Text,Text Handling
+@subsection Changing Text
+
+@cindex joining lines
+@cindex changing case
+@cindex quoting regions
+@cindex substitution
+
+@table @kbd
+@item <count>  r<char>
+Replace <count> chars by <char> - no <esc>.
+@item <count>  R
+Overwrite the rest of the line,
+appending change @var{count - 1} times.
+@item <count>  s
+Substitute <count> chars.
+@item <count>  S
+Change <count> lines.
+@item <count>  c<move>
+Change from begin to endpoint of <count><move>.
+@item <count>  cc
+Change <count> lines.
+@item <count>  C
+The rest of the line and <count> - 1 next lines.
+@item <count>  =<move>
+Reindent the region described by move.
+@item <count>  ~
+Switch lower and upper cases.
+@item <count>  J
+Join <count> lines (default 2).
+@item  :[x,y]s/<p>/<r>/<f>
+Substitute (on lines x through y) the pattern
+<p> (default the last pattern) with <r>.  Useful
+flags <f> are @samp{g} for @samp{global} (i.e. change every
+non-overlapping occurrence of <p>) and @samp{c} for
+@samp{confirm} (type @samp{y} to confirm a particular
+substitution, else @samp{n} ).  Instead of @kbd{/} any
+punctuation CHAR unequal to <space> <tab> and <lf> can be used as
+delimiter.
+@item  :[x,y]copy [z]
+ Copy text between @kbd{x} and @kbd{y} to the position after @kbd{z}.
+@item  :[x,y]t [z]
+ Same as @kbd{:copy}.
+@item  :[x,y]move [z]
+ Move text between @kbd{x} and @kbd{y} to the position after @kbd{z}.
+@item  &
+Repeat latest Ex substitute command, e.g.
+@kbd{:s/wrong/good}.
+@item C-c /
+Toggle case-sensitive search. With prefix argument, toggle vanilla/regular
+expression search.
+@item #c<move>
+Change upper case characters in the region to lower case.
+@item #C<move>
+Change lower case characters in the region to upper case.
+@item #q<move> 
+Insert specified string at the beginning of each line in the region
+@item C-c M-p and C-c M-n
+In Insert and Replace states, these keys are bound to commands that peruse
+the history of the text 
+previously inserted in other insert or replace commands. By repeatedly typing
+@kbd{C-c M-p} or @kbd{C-c M-n}, you will cause Viper to
+insert these previously used strings one by one.
+When a new string is inserted, the previous one is deleted. 
+
+In Vi state, these keys are bound to functions that peruse the history of
+destructive Vi commands.
+@xref{Viper Specials}, for details.
+@end table
+@kindex @kbd{C-c M-p}
+@kindex @kbd{C-c M-n}
+@kindex @kbd{#q<move> }
+@kindex @kbd{#C<move>}
+@kindex @kbd{#c<move>}
+@kindex @kbd{&}
+@findex @kbd{:substitute/<p>/<r>/<f>}
+@findex @kbd{:s/<p>/<r>/<f>}
+@findex @kbd{:copy [z]}
+@findex @kbd{:t [z]}
+@findex @kbd{:move [z]}
+@kindex @kbd{J}
+@kindex @kbd{~}
+@kindex @kbd{=<move>}
+@kindex @kbd{C}
+@kindex @kbd{cc}
+@kindex @kbd{c<move>}
+@kindex @kbd{S}
+@kindex @kbd{s}
+@kindex @kbd{R}
+@kindex @kbd{r<char>}
+
+@node Search and Replace, Yanking, Changing Text,Text Handling
+@subsection Search and Replace
+
+@xref{Groundwork}, for Ex address syntax. @xref{Options} to see how to
+get literal (non-regular-expression) search and how to stop search from
+wrapping around.
+
+@table @kbd
+@item <count>  /<string>
+To the <count>th occurrence of <string>.
+@item <count>  ?<string>
+To the <count>th previous occurrence of <string>.
+@item <count>  g<move>
+Search for the text described by move. (off by default)
+@item n
+Repeat latest @kbd{/} @kbd{?} (next).
+@item N
+Idem in opposite direction.
+@item %
+Find the next bracket and go to its match
+@item :[x,y]g/<string>/<cmd>
+@cindex text processing
+Search globally [from line x to y] for <string>
+and execute the Ex <cmd> on each occurrence.
+@item :[x,y]v/<string>/<cmd>
+Execute <cmd> on the lines that don't match.
+@item #g<move>
+Execute the last keyboard macro for each line in the region.
+@xref{Macros and Registers}, for more info.
+@item Q
+Query Replace.
+@item :ta <name>
+Search in the tags file where <name> is defined (file, line), and go to it.
+@item  :[x,y]s/<p>/<r>/<f>
+Substitute (on lines x through y) the pattern <p> (default the last
+pattern) with <r>.  Useful
+flags <f> are @samp{g} for @samp{global} (i.e. change every
+non-overlapping occurrence of <p>) and @samp{c} for
+@samp{confirm} (type @samp{y} to confirm a particular
+substitution, else @samp{n}).  Instead of @kbd{/} any
+punctuation CHAR unequal to <space> <tab> and <lf> can be used as delimiter.
+@item  &
+ Repeat latest Ex substitute command, e.g. @kbd{:s/wrong/good}.
+@end table
+@kindex @kbd{&}
+@findex @kbd{:substitute/<p>/<r>/<f>}
+@kindex @kbd{Q}
+@kindex @kbd{#g<move>}
+@findex @kbd{:v/<string>/<cmd>}
+@findex @kbd{:g/<string>/<cmd>}
+@findex @kbd{:global/<string>/<cmd>}
+@findex @kbd{:tag <name>}
+@kindex @kbd{%}
+@kindex @kbd{N}
+@kindex @kbd{n}
+@kindex @kbd{g<move>}
+@kindex @kbd{?<string>}
+@kindex @kbd{/<string>}
+
+@node Yanking,Undoing,Search and Replace,Text Handling
+@subsection Yanking
+
+@cindex cut and paste
+@cindex paste
+
+@table @kbd
+@item <count>  y<move>
+Yank from begin to endpoint of <count><move>.
+@item <count>  "<a-z>y<move>
+Yank from begin to endpoint of <count><move> to register.
+@item <count>  "<A-Z>y<move>
+Yank from begin to endpoint of <count><move> and append
+to register.
+@item <count>  yy
+<count> lines.
+@item <count>  Y
+Idem (should be equivalent to @kbd{y$} though).
+@item  m<a-z>
+Mark the cursor position with a letter.
+@item [<a-z>
+Show contents of textmarker.
+@item ]<a-z>
+Show contents of register.
+@item <count>  ["<a-z1-9>]p
+Put the contents of the (default undo) buffer
+<count> times after the cursor. The register will
+be automatically downcased.
+@item <count>  ["<a-z1-9>]P
+Put the contents of the (default undo) buffer
+<count> times before the cursor. The register will
+@end table
+@kindex @kbd{P}
+@kindex @kbd{p}
+@kindex @kbd{"<a-z1-9>p}
+@kindex @kbd{"<a-z1-9>P}
+@kindex @kbd{]<a-z>}
+@kindex @kbd{[<a-z>}
+@kindex @kbd{m<a-z>}
+@kindex @kbd{Y}
+@kindex @kbd{yy}
+@kindex @kbd{"<A-Z>y<move>}
+@kindex @kbd{"<a-z>y<move>}
+@kindex @kbd{y<move>}
+@kindex @kbd{yank}
+@findex @kbd{:yank}
+
+@node Undoing,, Yanking,Text Handling
+@subsection Undoing
+
+@cindex undo
+@cindex backup files
+
+@table @kbd
+@item  u U
+Undo the latest change.
+@item  .
+Repeat undo.
+@item :q!
+Quit Vi without writing.
+@item :e!
+Re-edit a messed-up file.
+@item :rec
+Recover file from autosave. Viper also creates backup files
+that have a @samp{~} appended to them.
+@end table
+@findex @kbd{:rec}
+@findex @kbd{:e!}
+@findex @kbd{:q!}
+@kindex @kbd{.}
+@kindex @kbd{U}
+@kindex @kbd{u}
+
+@node Display, File and Buffer Handling, Text Handling, Commands
+@section Display
+
+@cindex scrolling
+
+@table @kbd
+@item C-g
+At user level 1,
+give file name, status, current line number
+and relative position. @*
+At user levels 2 and higher, abort the current command.
+@item C-c g
+Give file name, status, current line number and relative position -- all
+user levels.
+@item C-l
+Refresh the screen. 
+@item <count> C-e
+Expose <count> more lines at bottom, cursor stays put (if possible).
+@item <count> C-y
+Expose <count> more lines at top, cursor stays put (if possible).
+@item <count> C-d
+Scroll <count> lines downward (default the number of the previous scroll;
+initialization: half a page).
+@item <count> C-u
+Scroll <count> lines upward (default the number of the previous scroll;
+initialization: half a page). 
+@item <count> C-f
+<count> pages forward.
+@item <count> C-b
+<count> pages backward (in older versions @kbd{C-b} only works without count).
+@item <count> z<cr>
+@item zH
+Put line <count> at the top of the window (default the current line).
+@item <count> z-
+@item zL
+Put line <count> at the bottom of the window
+(default the current line).
+@item <count> z.
+@item zM
+Put line <count> in the center of the window
+(default the current line).
+@end table
+@kindex @kbd{zM}
+@kindex @kbd{zL}
+@kindex @kbd{zH}
+@kindex @kbd{z<cr>}
+@kindex @kbd{z.}
+@kindex @kbd{z-}
+@kindex @kbd{z<cr>}
+@kindex @kbd{C-b}
+@kindex @kbd{C-f}
+@kindex @kbd{C-u}
+@kindex @kbd{C-d}
+@kindex @kbd{C-y}
+@kindex @kbd{C-e}
+@kindex @kbd{C-l}
+@kindex @kbd{C-g}
+
+
+@node File and Buffer Handling, Mapping, Display,Commands
+@section File and Buffer Handling
+
+@cindex multiple files
+
+In all file handling commands, space should be typed before entering the file
+name. If you need  to type a modifier, such as @kbd{>>} or @kbd{!}, don't
+put any space between the command and the modifier.
+
+@table @kbd
+@item :q
+Quit buffer except if modified.
+@item :q!
+Quit buffer without checking. In Viper, these two commands
+are identical. Confirmation is required if exiting modified buffers that
+visit files.
+@item :susp
+@item :stop
+Suspend Viper
+@item :[x,y] w
+Write the file. Viper nakes sure that a final newline is always added to
+any file where this newline is missing. This is done by setting Emacs
+variable @code{require-final-newline} to @code{t}. If you don't like this
+feature, use @code{setq-default} to set @code{require-final-newline} to
+@code{nil}. This must be done either in @file{.vip} file or in
+@code{.emacs} after Viper is loaded.
+@item :[x,y] w <name>
+Write to the file <name>.
+@item :[x,y] w>> <name>
+Append the buffer to the file <name>.  There should be no space between
+@kbd{w} and @kbd{>>}. Type space after the @kbd{>>} and see what happens.
+@item :w! <name>
+Overwrite the file <name>. In Viper, @kbd{:w} and @kbd{:w!} are identical.
+Confirmation is required for writing to an existing file (if this is not
+the file the buffer is visiting) or to a read-only file.
+@item :x,y w <name>
+Write lines x through y to the file <name>.
+@item :wq
+Write the file and kill buffer.
+@item :r <file> [<file> ...]
+Read file into a buffer, inserting its contents after the current line.
+@item :xit
+Same as @kbd{:wq}.
+@item :W
+Save unsaved buffers, asking for confirmation.
+@item :WW
+Like @kbd{W}, but without asking for confirmation. 
+@item ZZ
+Save current buffer and kill it. If user level is 1, then save all files
+and kill Emacs. Killing Emacs is the wrong way to use it, so you should
+switch to  higher user levels as soon as possible.
+@item :x [<file>]
+Save and kill buffer.
+@item :x! [<file>]
+@kbd{:w![<file>]} and @kbd{:q}.
+@item :pre
+Preserve the file -- autosave buffers.
+@item :rec
+Recover file from autosave.
+@item :f
+Print file name and lines.
+@item :cd [<dir>]
+Set the working directory to <dir> (default home directory).
+@item :pwd
+Print present working directory.
+@item :e [+<cmd>] <files>
+Edit files. If no filename is given, edit the file visited by the current
+buffer. If buffer was modified or the file changed on disk, ask for
+confirmation. Unlike Vi, Viper allows @kbd{:e} to take multiple arguments.
+The first file is edited the same way as in Vi. The rest are visited
+in the usual Emacs way.
+@item :e! [+<cmd>] <files>
+Re-edit file. If no filename, reedit current file.
+In Viper, unlike Vi, @kbd{e!} is identical to @kbd{:e}. In both cases, the
+user is asked to confirm if there is a danger of discarding changes to a
+buffer.
+@item :q!
+Quit Vi without writing.
+@item C-^
+Edit the alternate (normally the previous) file.
+@item :rew
+Obsolete
+@item :args
+List files not shown anywhere with counts for next
+@item :n [count]  [+<cmd>] [<files>]
+Edit <count> file, or edit files. The count comes from :args. 
+@item :N [count] [+<cmd>] [<files>] 
+Like @kbd{:n}, but the meaning of the variable
+@var{ex-cycle-other-window} is reversed.
+@item :b    
+Switch to another buffer. If @var{ex-cycle-other-window} is @code{t},
+switch in another window. Buffer completion is supported.
+@item :B    
+Like @kbd{:b}, but the meaning of @var{ex-cycle-other-window} is reversed.
+@item :<address>r <name>
+Read the file <name> into the buffer after the line <address>.
+@item v, V, C-v
+Edit a file in current or another window, or in another frame. File name
+is typed in Minibuffer. File completion and history are supported.
+@end table
+@kindex @kbd{v}
+@kindex @kbd{V}
+@findex @kbd{:args}
+@findex @kbd{:rew}
+@kindex @kbd{C-^}
+@findex @kbd{:e! [<files>]}
+@findex @kbd{:e [<files>]}
+@findex @kbd{:edit [<files>]}
+@findex @kbd{:edit! [<files>]}
+@findex @kbd{:q!}
+@findex @kbd{:q}
+@findex @kbd{:quit}
+@findex @kbd{:quit!}
+@findex @kbd{:f}
+@findex @kbd{:rec}
+@findex @kbd{:r}
+@findex @kbd{:read}
+@findex @kbd{:pre}
+@kindex @kbd{ZZ}
+@findex @kbd{:wq}
+@findex @kbd{:w <file>}
+@findex @kbd{:w! <file>}
+@findex @kbd{:w >> <file>}
+@findex @kbd{:write <file>}
+@findex @kbd{:write! <file>}
+@findex @kbd{:write >> <file>}
+@findex @kbd{:W}
+@findex @kbd{:WW}
+@findex @kbd{:Write}
+@findex @kbd{:WWrite}
+@findex @kbd{:WWrite}
+@findex @kbd{:x}
+@findex @kbd{:x!}
+@findex @kbd{:susp}
+@findex @kbd{:stop}
+@findex @kbd{:n [<count> | <file>]}
+@findex @kbd{:cd [<dir>]}
+@findex @kbd{:pwd}
+
+@node Mapping, Shell Commands, File and Buffer Handling, Commands
+@section Mapping
+
+@cindex keybindings
+@cindex keymapping
+
+@table @kbd
+@item :map <string>
+ Start defining a Vi-style keyboard macro.
+ For instance, typing
+ @kbd{:map www} followed by @kbd{:!wc %} and then typing @kbd{C-x )}
+ will cause @kbd{www} to run wc on
+ current file (Vi replaces @samp{%} with the current file name).
+@item C-x )
+ Finish defining a keyboard macro.
+ In Viper, this command completes the process of defining all keyboard
+macros, whether they are Emacs-style or Vi-style.
+This is a departure from Vi, needed to allow WYSIWYG mapping of
+keyboard macros and to permit the use of function keys and arbitrary Emacs
+functions in the macros.
+@item :unmap <string>
+ Deprive <string> of its mappings in Vi state.
+@item :map! <string>
+ Map a macro for Insert state.
+@item :unmap! <string>
+ Deprive <string> of its mapping in Insert state (see @kbd{:unmap}).
+@item @@<a-z>
+ In Vi state,
+ execute the contents of register as a command.
+@item @@@@
+ In Vi state,
+ repeat last register command. 
+@item @@#
+In Vi state,
+ begin keyboard macro. End with @@<a-z>. This will
+ put the macro in the proper register. Register will
+ be automatically downcased.
+ @xref{Macros and Registers}, for more info.
+@item @@!<a-z>
+ In Vi state,
+ yank anonymous macro to register
+@item *
+ In Vi state,
+ execute anonymous macro (defined by C-x( and C-x )).
+@item C-x e
+ Like @kbd{*}, but works in all Viper states.
+@item #g<move>
+ Execute the last keyboard macro for each line in the region.
+ @xref{Macros and Registers}, for more info.
+@item [<a-z>
+ Show contents of textmarker.
+@item ]<a-z>
+ Show contents of register.
+@end table
+@kindex @kbd{]<a-z>}
+@kindex @kbd{[<a-z>}
+@kindex @kbd{#g<move>}
+@kindex @kbd{*}
+@kindex @kbd{@@!<a-z>}
+@kindex @kbd{@@#}
+@kindex @kbd{@@@@}
+@kindex @kbd{@@<a-z>}
+@findex @kbd{:unmap <char>}
+@findex @kbd{:map <char> <seq>}
+@findex @kbd{:unmap! <char>}
+@findex @kbd{:map! <char> <seq>}
+
+@node Shell Commands, Options, Mapping, Commands
+@section Shell Commands
+
+@cindex % (Current file)
+
+Note that % is used in Ex commands to mean current file. If you want a %
+in your command, it must be escaped as @samp{\%}. 
+@cindex % (Ex address)
+However if % is the
+first character, it stands as the address for the whole file.
+@cindex # (Previous file)
+Similarly, @samp{#} expands to the previous file. The previous file is
+the first file in @kbd{:args} listing. This defaults
+to the previous file in the VI sense if you have one window.@refill
+
+@cindex shell commands
+
+@table @kbd
+@item :sh
+Execute a subshell in another window
+@item :[x,y]!<cmd>
+Execute a shell <cmd> [on lines x through y;
+% is replace by current file, \% is changed to %
+@item :[x,y]!! [<args>]
+Repeat last shell command [and append <args>].
+@item :!<cmd>
+Just execute command and display result in a buffer.
+@item :!! <args>
+Repeat last shell command and append <args>
+@item <count> !<move><cmd>
+The shell executes <cmd>, with standard
+input the lines described by <count><move>,
+next the standard output replaces those lines
+(think of @samp{cb}, @samp{sort}, @samp{nroff}, etc.).
+@item <count> !!<cmd>
+Give <count> lines as standard input to the
+shell <cmd>, next let the standard output
+replace those lines.
+@item :[x,y] w !<cmd>
+Let lines x to y be standard input for <cmd>
+(notice the <sp> between @kbd{w} and @kbd{!}).
+@item :<address>r !<cmd>
+Put the output of <cmd> after the line <address> (default current).
+@item :<address>r <name>
+Read the file <name> into the buffer after the line <address> (default
+current).
+@end table
+@findex @kbd{:<address>r <name>}
+@findex @kbd{:<address>r !<cmd>}
+@findex @kbd{!<cmd>}
+@findex @kbd{!!<cmd>}
+@findex @kbd{!<move><cmd>}
+@findex @kbd{:w !<cmd>}
+@findex @kbd{:x,y w !<cmd>}
+@findex @kbd{:!! <args>}
+@findex @kbd{:!<cmd>}
+@findex @kbd{:sh}
+
+@node Options,Emacs Related Commands,Shell Commands,Commands
+@section Options
+
+@cindex Vi options
+
+@table @kbd
+@item ai
+@cindex autoindent
+autoindent -- In append mode after a <cr> the
+cursor will move directly below the first
+CHAR on the previous line.  
+@item ic
+@cindex case and searching
+ignorecase -- No distinction between upper and
+lower cases when searching.
+@item magic
+@cindex literal searching
+Regular expressions used in searches; nomagic means no regexps.
+@item ro
+@cindex readonly files
+readonly -- The file is not to be changed.
+If the user attempts to write to this file, confirmation will be requested.
+@item sh=<string>
+@cindex shell
+shell -- The program to be used for shell escapes
+(default @samp{$SHELL} (default @file{/bin/sh})).
+@item sw=<count>
+@cindex layout
+@cindex shifting text
+shiftwidth -- Gives the shiftwidth (default 8 positions).
+@item sm
+@cindex paren matching
+@cindex matching parens
+showmatch -- Whenever you append a @kbd{)}, Vi shows
+its match if it's on the same page; also with
+@kbd{@{} and @kbd{@}}.  If there's no match, Vi will beep.
+@item ts=<count>
+@cindex changing tab width
+@cindex tabbing
+tabstop -- The length of a <ht>; warning: this is
+only IN the editor, outside of it <ht>s have
+their normal length (default 8 positions).
+@item wm=<count>
+@cindex auto fill
+@cindex word wrap
+wrapmargin -- In append mode Vi automatically
+puts a <lf> whenever there is a <sp> or <ht>
+within <wm> columns from the right margin.
+@item ws
+@cindex searching
+wrapscan -- When searching, the end is
+considered @samp{stuck} to the begin of the file.
+@item :set <option>
+Turn <option> on.
+@item :set no<option>
+Turn <option> off.
+@item :set <option>=<value>
+Set <option> to <value>.
+@end table
+@findex @kbd{:set <option>=<value>}
+@findex @kbd{:set no<option>}
+@findex @kbd{:set <option>}
+@findex @kbd{:set ws}
+@findex @kbd{:set wrapscan}
+@findex @kbd{:set wm=<count>}
+@findex @kbd{:set wrapmargin=<count>}
+@findex @kbd{:set ts=<count>}
+@findex @kbd{:set tabstop=<count>}
+@findex @kbd{:set tab-stop-local=<count>}
+@findex @kbd{:set sm}
+@findex @kbd{:set showmatch}
+@findex @kbd{:set sw=<count>}
+@findex @kbd{:set shiftwidth=<count>}
+@findex @kbd{:set sh=<string>}
+@findex @kbd{:set shell=<string>}
+@findex @kbd{:set ro}
+@findex @kbd{:set readonly}
+@findex @kbd{:set magic}
+@findex @kbd{:set ic}
+@findex @kbd{:set ignorecase}
+@findex @kbd{:set ai}
+@findex @kbd{:set autoindent}
+
+@node Emacs Related Commands,,Options,Commands
+@section Emacs Related Commands
+
+@table @kbd
+@item _
+Begin Meta command in Vi state. Most often used as _x (M-x).
+@item C-z
+Begin Meta command in Insert state.
+@item C-z
+Switch between Emacs and Vi states.
+@item C-x0
+Close Window
+@item C-x1
+Close Other Windows
+@item C-x2
+Split Window
+@item C-xo
+Move among windows
+@item C-xC-f
+Emacs find-file, useful in Insert state
+@item C-y 
+Put back the last killed text. Similar to Vi's @kbd{p}, but also works in
+Insert and Replace state. This command doesn't work in Vi command state,
+since this binding is taken for something else.
+@item M-y
+Undoes the last @kbd{C-y} and puts another kill from the kill ring.
+Using this command, you can try may different kills until you find the one
+you need.
+@end table
+@kindex @kbd{M-y}
+@kindex @kbd{C-y}
+@kindex @kbd{C-xC-f}
+@kindex @kbd{C-xo}
+@kindex @kbd{C-x2}
+@kindex @kbd{C-x1}
+@kindex @kbd{C-x0}
+@kindex @kbd{C-z}
+@kindex @kbd{C-z}
+@kindex @kbd{_}
+
+@node Mouse-bound Commands,,,Commands
+@section Mouse-bound Commands
+
+The following two mouse actions are normally bound to to special search and
+insert commands in of Viper:
+
+@table @kbd
+@item S-mouse-1 (Emacs)
+@item meta button1up (XEmacs)
+Holding Shift (or Meta, if XEmacs) and clicking mouse button 1 will
+initiate search for 
+a region under the mouse pointer.
+This command can take a prefix argument. Note: Viper sets this
+binding only if this mouse action is not 
+already bound to something else.
+@xref{Viper Specials}, for more information.@refill
+
+@item S-mouse-2 (Emacs)
+@item meta button2up (XEmacs)
+Holding Shift (or Meta, if XEmacs) and clicking button 2 of the mouse will
+insert a region surrounding the mouse pointer.
+This command can also take a prefix argument.
+Note: Viper sets this binding only if this mouse action is not
+already bound to something else.
+@xref{Viper Specials}, for more details.@refill
+@end table        
+@kindex @kbd{S-mouse-1}
+@kindex @kbd{S-mouse-2}
+@kindex @kbd{meta button1up}
+@kindex @kbd{meta button2up}