Revert @documentencoding changes in the docs.
[bpt/emacs.git] / doc / misc / viper.texi
CommitLineData
4009494e
GM
1% -*-texinfo-*-
2\input texinfo
3
4@comment Using viper.info instead of viper in setfilename breaks DOS.
5@comment @setfilename viper
6@comment @setfilename viper.info
db78a8cb 7@setfilename ../../info/viper
4009494e
GM
8
9@copying
ab422c4d 10Copyright @copyright{} 1995--1997, 2001--2013 Free Software Foundation, Inc.
4009494e
GM
11
12@quotation
13Permission is granted to copy, distribute and/or modify this document
6a2c4aec 14under the terms of the GNU Free Documentation License, Version 1.3 or
4009494e 15any later version published by the Free Software Foundation; with no
debf4439
GM
16Invariant Sections, with the Front-Cover texts being ``A GNU Manual'',
17and with the Back-Cover Texts as in (a) below. A copy of the license
18is included in the section entitled ``GNU Free Documentation License''.
4009494e 19
6f093307 20(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
6bf430d1 21modify this GNU manual.''
4009494e
GM
22@end quotation
23@end copying
24
0c973505 25@dircategory Emacs misc features
4009494e 26@direntry
9e7a4bcf 27* VIPER: (viper). A VI-emulation mode for Emacs.
4009494e
GM
28@end direntry
29
30@finalout
31
32@titlepage
33@title Viper Is a Package for Emacs Rebels
34@subtitle a Vi emulator for Emacs
c7cac5cc 35@subtitle November 2008, Viper Version 3.11.2
4009494e
GM
36
37@author Michael Kifer (Viper)
38@author Aamod Sane (VIP 4.4)
39@author Masahiko Sato (VIP 3.5)
40
41@page
42@vskip 0pt plus 1filll
43@insertcopying
44@end titlepage
45
5dc584b5
KB
46@contents
47
4009494e 48@ifnottex
1a5d3215
GM
49@node Top
50@top Viper
4009494e
GM
51
52We believe that one or more of the following statements are adequate
53descriptions of Viper:
54
55@example
56Viper Is a Package for Emacs Rebels;
57it is a VI Plan for Emacs Rescue
58and/or a venomous VI PERil.
59@end example
60
61Technically speaking, Viper is a Vi emulation package for Emacs. It
62implements all Vi and Ex commands, occasionally improving on them and
63adding many new features. It gives the user the best of both worlds: Vi
64keystrokes for editing combined with the power of the Emacs environment.
65
66Viper emulates Vi at several levels, from the one that closely follows Vi
67conventions to the one that departs from many of them. It has many
68customizable options, which can be used to tailor Viper to the work habits
69of various users.
70This manual describes Viper, concentrating on the differences from Vi and
71new features of Viper.
72
73Viper, formerly known as VIP-19, was written by Michael Kifer. It is based
74on VIP version 3.5 by Masahiko Sato and VIP version 4.4 by Aamod Sane.
75About 15% of the code still comes from those older packages.
76
f99f1641 77Viper is intended to be usable without reading this manual; the defaults
4009494e
GM
78are set to make Viper as close to Vi as possible. At startup, Viper will
79try to set the most appropriate default environment for you, based on
80your familiarity with Emacs. It will also tell you the basic GNU Emacs window
81management commands to help you start immediately.
82
83Although this manual explains how to customize Viper, some basic
84familiarity with Emacs Lisp is a plus.
85
86It is recommended that you read the Overview node. The other nodes may
87be visited as needed.
88
89Comments and bug reports are welcome.
90@code{kifer@@cs.stonybrook.edu} is the current address for Viper bug reports.
76f1a3c3 91Please use the Ex command @kbd{:submitReport} for this purpose.
4009494e 92
5dc584b5 93@insertcopying
4009494e
GM
94@end ifnottex
95
96@menu
97* Overview:: Read for a smoother start
98* Improvements over Vi:: New features, Improvements
99* Customization:: How to customize Viper
100* Commands:: Vi and Ex Commands
1a5d3215
GM
101* GNU Free Documentation License:: The license for this documentation.
102* Acknowledgments::
4009494e
GM
103* Key Index:: Index of Vi and Ex Commands
104* Function Index:: Index of Viper Functions
105* Variable Index:: Index of Viper Variables
106* Package Index:: Index of Packages Mentioned in this Document
107* Concept Index:: Vi, Ex and Emacs concepts
4009494e
GM
108@end menu
109@iftex
110@unnumbered Introduction
111
112We believe that one or more of the following statements are adequate
113descriptions of Viper:
114
115@example
116Viper Is a Package for Emacs Rebels;
117it is a VI Plan for Emacs Rescue
118and/or a venomous VI PERil.
119@end example
120
121Viper is a Vi emulation package for Emacs. Viper contains virtually all
122of Vi and Ex functionality and much more. It gives you the best of both
123worlds: Vi keystrokes for editing combined with the GNU Emacs
124environment. Viper also fixes some common complaints with Vi commands.
125This manual describes Viper, concentrating on the differences from Vi
126and on the new features of Viper.
127
128Viper was written by Michael Kifer. It is based on VIP version 3.5 by
129Masahiko Sato and VIP version 4.4 by Aamod Sane. About 15% of the code
130still comes from those older packages.
131
f99f1641
PE
132Viper is intended to be usable out of the box, without reading this manual;
133the defaults are set to make Viper as close to Vi as possible. At
4009494e
GM
134startup, Viper will attempt to set the most appropriate default environment
135for you, based on your familiarity with Emacs. It will also tell you the
136basic GNU Emacs window management commands to help you start immediately.
137
138Although this manual explains how to customize Viper, some basic
139familiarity with Emacs Lisp is a plus.
140
141It is recommended that you read the chapter Overview. The other chapters
142will be useful for customization and advanced usage.
143
144You should also learn to use the Info on-line hypertext manual system that
145comes with Emacs. This manual can be read as an Info file. Try the command
146@kbd{@key{ESC} x info} with vanilla Emacs sometime.
147
148Comments and bug reports are welcome.
149@code{kifer@@cs.stonybrook.edu} is the current address for Viper bug reports.
76f1a3c3 150Please use the Ex command @kbd{:submitReport} for this purpose.
4009494e
GM
151
152@end iftex
153
1a5d3215 154@node Overview
4009494e
GM
155@chapter Overview of Viper
156
157Viper is a Vi emulation on top of Emacs. At the same time, Viper provides a
158virtually unrestricted access to Emacs facilities. Perfect compatibility
159with Vi is possible but not desirable. This chapter tells you about the
160Emacs ideas that you should know about, how to use Viper within Emacs and
161some incompatibilities.
162
163This manual is written with the assumption that you are an experienced Vi
164user who wants to switch to Emacs while retaining the ability to edit files
165Vi style. Incredible as it might seem, there are experienced Emacs users
166who use Viper as a backdoor into the superior (as every Vi user already knows)
167world of Vi! These users are well familiar with Emacs bindings and prefer them
168in some cases, especially in the Vi Insert state. John Hawkins
169<jshawkin@@eecs.umich.edu> has provided a set of customizations, which
170enables additional Emacs bindings under Viper. These customizations can be
171included in your @file{~/.viper} file and are found at the following URL:
172@file{http://traeki.freeshell.org/files/viper-sample}.
173
174@menu
175* Emacs Preliminaries:: Basic concepts in Emacs.
176* Loading Viper:: Loading and Preliminary Configuration.
177* States in Viper:: Viper has four states orthogonal to Emacs
178 modes.
179* The Minibuffer:: Command line in Emacs.
180* Multiple Files in Viper:: True multiple file handling.
181* Unimplemented Features:: That are unlikely to be implemented.
182@end menu
183
1a5d3215 184@node Emacs Preliminaries
4009494e
GM
185@section Emacs Preliminaries
186
187@cindex buffer
188@cindex point
189@cindex mark
190@cindex text
191@cindex looking at
192@cindex end (of buffer)
193@cindex end (of line)
194@cindex region
195
196Emacs can edit several files at once. A file in Emacs is placed in a
197@dfn{buffer} that usually has the same name as the file. Buffers are also used
198for other purposes, such as shell interfaces, directory editing, etc.
199@xref{Dired,,Directory Editor,emacs,The
76f1a3c3 200GNU Emacs Manual}, for an example.
4009494e
GM
201
202A buffer has a distinguished position called the @dfn{point}.
203A @dfn{point} is always between 2 characters, and is @dfn{looking at}
204the right hand character. The cursor is positioned on the right hand
205character. Thus, when the @dfn{point} is looking at the end-of-line,
1df7defd 206the cursor is on the end-of-line character, i.e., beyond the last
76f1a3c3 207character on the line. This is the default Emacs behavior.
4009494e
GM
208
209The default settings of Viper try to mimic the behavior of Vi, preventing
210the cursor from going beyond the last character on the line. By using
211Emacs commands directly (such as those bound to arrow keys), it is possible
212to get the cursor beyond the end-of-line. However, this won't (or
213shouldn't) happen if you restrict yourself to standard Vi keys, unless you
76f1a3c3 214modify the default editing style. @xref{Customization}.
4009494e
GM
215
216In addition to the @dfn{point}, there is another distinguished buffer
217position called the @dfn{mark}. @xref{Mark,,Mark,emacs,The GNU Emacs
218manual}, for more info on the mark. The text between the @dfn{point} and
219the @dfn{mark} is called the @dfn{region} of the buffer. For the Viper
220user, this simply means that in addition to the Vi textmarkers a--z, there
221is another marker called @dfn{mark}. This is similar to the unnamed Vi
222marker used by the jump commands @kbd{``} and @kbd{''}, which move the
223cursor to the position of the last absolute jump. Viper provides access to
224the region in most text manipulation commands as @kbd{r} and @kbd{R} suffix
225to commands that operate on text regions, e.g., @kbd{dr} to delete region,
226etc.
227
228Furthermore, Viper lets Ex-style commands to work on the current region.
229This is done by typing a digit argument before @kbd{:}. For instance,
230typing @kbd{1:} will prompt you with something like @emph{:123,135},
231assuming that the current region starts at line 123 and ends at line
232135. There is no need to type the line numbers, since Viper inserts them
233automatically in front of the Ex command.
234
76f1a3c3 235@xref{Basics}, for more info.
4009494e
GM
236
237@cindex window
238@cindex mode line
239@cindex buffer information
240@cindex Minibuffer
241@cindex command line
242@cindex buffer (modified)
243
244Emacs divides the screen into tiled @dfn{windows}. You can see the
245contents of a buffer through the window associated with the buffer. The
246cursor of the screen is positioned on the character after @dfn{point}.
247Every window has a @dfn{mode line} that displays information about the buffer.
248You can change the format of the mode
249line, but normally if you see @samp{**} at the beginning of a mode line it
250means that the buffer is @dfn{modified}. If you write out the contents of
251a buffer to a file, then the buffer will become not modified. Also if
252you see @samp{%%} at the beginning of the mode line, it means that the file
253associated with the buffer is write protected. The mode line will also
254show the buffer name and current major and minor modes (see below).
255A special buffer called @dfn{Minibuffer} is displayed as the last line
9ff0b02b
MK
256in a minibuffer window. The minibuffer window is used for command input
257output. Viper uses minibuffer window for @kbd{/} and @kbd{:}
76f1a3c3 258commands.
4009494e
GM
259
260@cindex mode
261@cindex keymap
262@cindex local keymap
263@cindex global keymap
264@cindex major mode
265@cindex minor mode
266
267An Emacs buffer can have a @dfn{major mode} that customizes Emacs for
268editing text of a particular sort by changing the functionality of the keys.
269Keys are defined using a @dfn{keymap} that records the bindings between
270keystrokes and
271functions. The @dfn{global keymap} is common to all the
272buffers. Additionally, each buffer has its @dfn{local keymap} that determines the
273@dfn{mode} of the buffer. If a function is bound to some key in the local
274keymap then that function will be executed when you type the key.
275If no function is bound to a key in the
276local map, however, the function bound to the key in the global map
277will be executed. @xref{Major Modes,Major Modes,Major Modes,emacs,The
76f1a3c3 278GNU Emacs Manual}, for more information.
4009494e
GM
279
280A buffer can also have a @dfn{minor mode}. Minor modes are options that
281you can use or not. A buffer in @code{text-mode} can have
282@code{auto-fill-mode} as minor mode, which can be turned off or on at
283any time. In Emacs, a minor mode may have it own keymap,
284which overrides the local keymap when the minor mode is turned on. For
285more information, @pxref{Minor Modes,Minor Modes,Minor Modes,emacs,The
76f1a3c3 286GNU Emacs Manual}.
4009494e
GM
287
288@cindex Viper as minor mode
289@cindex Control keys
290@cindex Meta key
291
292Viper is implemented as a collection of minor modes. Different minor modes
293are involved when Viper emulates Vi command mode, Vi insert mode, etc.
294You can also turn Viper on and off at any time while in Vi command mode.
295@xref{States in Viper}, for
76f1a3c3 296more information.
4009494e
GM
297
298Emacs uses Control and Meta modifiers. These are denoted as C and M,
1df7defd 299e.g., @kbd{^Z} as @kbd{C-z} and @kbd{Meta-x} as @kbd{M-x}. The Meta key is
4009494e
GM
300usually located on each side of the Space bar; it is used in a manner
301similar to the Control key, e.g., @kbd{M-x} means typing @kbd{x} while
302holding the Meta key down. For keyboards that do not have a Meta key,
303@key{ESC} is used as Meta. Thus @kbd{M-x} is typed as @kbd{@key{ESC}
304x}. Viper uses @key{ESC} to switch from Insert state to Vi state. Therefore
305Viper defines @kbd{C-\} as its Meta key in Vi state. @xref{Vi State}, for
76f1a3c3 306more info.
4009494e
GM
307
308Emacs is structured as a Lisp interpreter around a C core. Emacs keys
309cause Lisp functions to be called. It is possible to call these
310functions directly, by typing @kbd{M-x function-name}.
311
1a5d3215 312@node Loading Viper
4009494e
GM
313@section Loading Viper
314
315The most common way to load it automatically is to include the following
316lines (in the given order!):
317
318@lisp
319(setq viper-mode t)
320(require 'viper)
321@end lisp
322
323@noindent
324in your @file{~/.emacs} file. The @file{.emacs} file is placed in your
325home directory and it is be executed every time you invoke Emacs. This is
326the place where all general Emacs customization takes place. Beginning with
327version 20.0, Emacsen have an interactive interface, which simplifies the
328job of customization significantly.
329
330Viper also uses the file @file{~/.viper} for Viper-specific customization.
331The location of Viper customization file can be changed by setting the
332variable @code{viper-custom-file-name} in @file{.emacs} @emph{prior} to loading
333Viper.
334
335The latest versions of Emacs have an interactive customization facility,
336which allows you to (mostly) bypass the use of the @file{.emacs} and
337@file{.viper} files. You can reach this customization
338facility from within Viper's VI state by executing the Ex command
339@kbd{:customize}.
340
341Once invoked, Viper will arrange to bring up Emacs buffers in Vi state
342whenever this makes sense.
343@xref{Packages that Change Keymaps}, to find out when forcing Vi command state
344on a buffer may be counter-productive.
345
346Even if your @file{.emacs} file does not invoke Viper automatically,
347you can still load Viper and enter the Vi command state by typing the
348following from within Emacs:
349
350@lisp
351M-x viper-mode
352@end lisp
353
354When Emacs first comes up, if you have not specified a file on the
355command line, it will show the @samp{*scratch*} buffer, in the
356@samp{Lisp Interaction} mode. After you invoke Viper, you can start
357editing files by using @kbd{:e}, @kbd{:vi}, or @kbd{v} commands.
358(@xref{File and Buffer Handling}, for more information on @kbd{v} and other
359new commands that, in many cases, are more convenient than @kbd{:e},
76f1a3c3 360@kbd{:vi}, and similar old-style Vi commands.)
4009494e
GM
361
362Finally, if at some point you would want to de-Viperize your running
363copy of Emacs after Viper has been loaded, the command @kbd{M-x
364viper-go-away} will do it for you. The function @code{toggle-viper-mode}
365toggles Viperization of Emacs on and off.
366
1a5d3215 367@node States in Viper
4009494e
GM
368@section States in Viper
369
370@kindex @kbd{C-z}
371@kindex @key{ESC}
372@kindex @kbd{i}
373@cindex Emacs state
374@cindex Vi state
375@cindex Insert state
376@cindex Replace state
377@cindex Ex commands
378@findex @code{viper-go-away}
379@findex @code{toggle-viper-mode}
380
381Viper has four states, Emacs, Vi, Insert, and Replace.
382
383@table @samp
384@item Emacs state
385This is the state plain vanilla Emacs is normally in. After you have loaded
386Viper, @kbd{C-z} will normally take you to Vi command state. Another
387@kbd{C-z} will take you back to Emacs state. This toggle key can be
388changed, @pxref{Customization} You can also type @kbd{M-x viper-mode} to
76f1a3c3 389change to Vi state.
4009494e
GM
390
391
392For users who chose to set their user level to 1 at Viper setup time,
393switching to Emacs state is deliberately made harder in order to not
394confuse the novice user. In this case, @kbd{C-z} will either iconify Emacs
395(if Emacs runs as an application under X) or it will stop Emacs (if
396Emacs runs on a dumb terminal or in an Xterm window).
397
398@item Vi state
399This is the Vi command mode. Any of the Vi commands, such as @kbd{i, o, a},
400@dots{}, will take you to Insert state. All Vi commands may
401be used in this mode. Most Ex commands can also be used.
402For a full list of Ex commands supported by Viper, type
403@kbd{:} and then @key{TAB}. To get help on any issue, including the Ex
404commands, type @kbd{:help}. This will invoke Viper Info
405(if it is installed). Then typing @kbd{i} will prompt you for a topic to
406search in the index. Note: to search for Ex commands in the index, you
407should start them with a @kbd{:}, e.g., @kbd{:WW}.
408
409In Viper, Ex commands can be made to work on the current Emacs region.
410This is done by typing a digit argument before @kbd{:}.
411For instance, typing @kbd{1:} will prompt you with something like
412@emph{:123,135}, assuming that the current region starts at line 123 and
413ends at line 135. There is no need to type the line numbers, since Viper
414inserts them automatically in front of the Ex command.
415
416@item Insert state
417Insert state is the Vi insertion mode. @key{ESC} will take you back to
418Vi state. Insert state editing can be done, including auto-indentation. By
419default, Viper disables Emacs key bindings in Insert state.
420
421@item Replace state
422Commands like @kbd{cw} invoke the Replace state. When you cross the
423boundary of a replacement region (usually designated via a @samp{$} sign),
424it will automatically change to Insert state. You do not have to worry
425about it. The key bindings remain practically the same as in Insert
426state. If you type @key{ESC}, Viper will switch to Vi command mode, terminating the
76f1a3c3 427replacement state.
4009494e
GM
428@end table
429
430@cindex mode line
431
432The modes are indicated on the @dfn{mode line} as <E>, <I>, <V>, and <R>,
433so that the multiple modes do not confuse you. Most of your editing can be
434done in Vi and Insert states. Viper will try to make all new buffers be in Vi
435state, but sometimes they may come up in Emacs state. @kbd{C-z}
436will take you to Vi state in such a case. In some major modes, like Dired,
437Info, Gnus, etc., you should not switch to Vi state (and Viper will not
438attempt to do so) because these modes are not intended for text editing and
439many of the Vi keys have special meaning there. If you plan to read news,
440browse directories, read mail, etc., from Emacs (which you should start
441doing soon!), you should learn about the meaning of the various keys in
442those special modes (typing @kbd{C-h m} in a buffer provides
443help with key bindings for the major mode of that buffer).
444
f99f1641 445If you switch to Vi in Dired or similar modes, no harm is done. It is just
4009494e
GM
446that the special key bindings provided by those modes will be temporarily
447overshadowed by Viper's bindings. Switching back to Viper's Emacs state
448will revive the environment provided by the current major mode.
449
450States in Viper are orthogonal to Emacs major modes, such as C mode or Dired
451mode. You can turn Viper on and off for any Emacs state. When Viper is turned
452on, Vi state can be used to move around. In Insert state, the bindings for
453these modes can be accessed. For beginners (users at Viper levels 1 and 2),
454these bindings are suppressed in Insert state, so that new users are not
455confused by the Emacs states. Note that unless you allow Emacs bindings in
456Insert state, you cannot do many interesting things, like language
457sensitive editing. For the novice user (at Viper level 1), all major mode
458bindings are turned off in Vi state as well. This includes the bindings for
459key sequences that start with @kbd{C-c}, which practically means that all
460major mode bindings are unsupported. @xref{Customization}, to find out how
461to allow Emacs keys in Insert state.
462
463@menu
464* Emacs State:: This is the state you should learn more about when
465 you get up to speed with Viper.
466* Vi State:: Vi commands are executed in this state.
467* Insert State:: You can enter text, and also can do sophisticated
468 editing if you know enough Emacs commands.
469* Replace State:: Like Insert mode, but it is invoked via the
470 replacement commands, such as cw, C, R, etc.
471@end menu
472
1a5d3215 473@node Emacs State
4009494e
GM
474@subsection Emacs State
475
476@kindex @kbd{C-z}
477@cindex Emacs state
478
479
480You will be in this mode only by accident (hopefully). This is the state
481Emacs is normally in (imagine!!). Now leave it as soon as possible by
482typing @kbd{C-z}. Then you will be in Vi state (sigh of relief) :-).
483
484Emacs state is actually a Viperism to denote all the major and minor modes
485(@pxref{Emacs Preliminaries}) other than Viper that Emacs can be in. Emacs
486can have several modes, such as C mode for editing C programs, LaTeX mode
487for editing LaTeX documents, Dired for directory editing, etc. These are
488major modes, each with a different set of key-bindings. Viper states are
489orthogonal to these Emacs major modes. The presence of these language
490sensitive and other modes is a major win over Vi. @xref{Improvements over
76f1a3c3 491Vi}, for more.
4009494e
GM
492
493The bindings for these modes can be made available in the Viper Insert state
494as well as in Emacs state. Unless you specify your user level as 1 (a
495novice), all major mode key sequences that start with @kbd{C-x} and
496@kbd{C-c} are also available in Vi state. This is important because major
497modes designed for editing files, such as cc-mode or latex-mode, use key
498sequences that begin with @kbd{C-x} and @kbd{C-c}.
499
500There is also a key that lets you temporarily escape to Vi command state
501from the Insert state: typing @kbd{C-z} will let you execute a
502single Vi command while staying in Viper's Insert state.
503
504
1a5d3215 505@node Vi State
4009494e
GM
506@subsection Vi State
507
508@cindex Vi state
509
510This is the Vi command mode. When Viper is in Vi state, you will see the sign
511<V> in the mode line. Most keys will work as in Vi. The notable
512exceptions are:
513
514@table @kbd
515@item C-x
516@kindex @kbd{C-x}
517@kbd{C-x} is used to invoke Emacs commands, mainly those that do window
518management. @kbd{C-x 2} will split a window, @kbd{C-x 0} will close a
519window. @kbd{C-x 1} will close all other windows. @kbd{C-xb} is used to
520switch buffers in a window, and @kbd{C-xo} to move through windows.
521These are about the only necessary keystrokes.
522For the rest, see the GNU Emacs Manual.
523
524@item C-c
525@kindex @kbd{C-c}
526For user levels 2 and higher, this key serves as a prefix key for the key
527sequences used by various major modes. For users at Viper level 1, @kbd{C-c}
528simply beeps.
529
530@item C-g and C-]
531@kindex @kbd{C-g}
532@kindex @kbd{C-]}
533
534These are the Emacs @samp{quit} keys.
535There will be cases where you will have to
536use @kbd{C-g} to quit. Similarly, @kbd{C-]} is used to exit
537@samp{Recursive Edits} in Emacs for which there is no comparable Vi
538functionality and no key-binding. Recursive edits are indicated by
539@samp{[]} brackets framing the modes on the mode line.
540@xref{Recursive Edit,Recursive
541Edit,Recursive Edit,emacs,The GNU Emacs Manual}.
542At user level 1, @kbd{C-g} is bound to @code{viper-info-on-file}
543function instead.
4009494e
GM
544@item C-\
545@kindex @kbd{C-\}
546@cindex Meta key
547
548Viper uses @key{ESC} as a switch between Insert and Vi states. Emacs uses
549@key{ESC} for Meta. The Meta key is very important in Emacs since many
550functions are accessible only via that key as @kbd{M-x function-name}.
551Therefore, we need to simulate it somehow. In Viper's Vi, Insert, and
552Replace states, the meta key is set to be @kbd{C-\}. Thus, to get
553@kbd{M-x}, you should type @kbd{C-\ x} (if the keyboard has no Meta key,
554which is rare these days).
555This works both in the Vi command state and in the Insert and Replace
556states. In Vi command state, you can also use @kbd{\ @key{ESC}} as the
557meta key.
558
559Note: Emacs binds @kbd{C-\} to a function that offers to change the
560keyboard input method in the multilingual environment. Viper overrides this
561binding. However, it is still possible to switch the input method by typing
562@kbd{\ C-\} in the Vi command state and @kbd{C-z \ C-\} in the Insert state.
563Or you can use the MULE menu in the menubar.
564@end table
565@noindent
566Other differences are mostly improvements. The ones you should know
567about are:
568
569@table @samp
570@item Undo
571@kindex @kbd{u}
572@kbd{u} will undo. Undo can be repeated by the @kbd{.} key. Undo itself
573can be undone. Another @kbd{u} will change the direction. The presence
574of repeatable undo means that @kbd{U}, undoing lines, is not very
575important. Therefore, @kbd{U} also calls @code{viper-undo}.
576@cindex multiple undo
577@cindex undo
578
579
580@item Counts
581Most commands, @kbd{~}, @kbd{[[}, @kbd{p}, @kbd{/}, @dots{}, etc., take counts.
582
583@comment ]] Just to balance parens
584@item Regexps
585Viper uses Emacs Regular Expressions for searches. These are a superset of
586Vi regular
587expressions, excepting the change-of-case escapes @samp{\u}, @samp{\L},
588@dots{}, etc. @xref{Regexps,,Syntax of Regular Expressions,emacs,The
589GNU Emacs Manual}, for details.
590Files specified to @kbd{:e} use @code{csh} regular expressions
591(globbing, wildcards, what have you).
592However, the function @code{viper-toggle-search-style}, bound to @kbd{C-c /},
593lets the user switch from search with regular expressions to plain vanilla
594search and vice versa. It also lets one switch from case-sensitive search
595to case-insensitive and back.
596@xref{Viper Specials}, for more details.
597@cindex regular expressions
598@cindex vanilla search
599@cindex case-sensitive search
600@cindex case-insensitive search
601@kindex @kbd{C-c /}
602
603@item Ex commands
604@cindex Ex commands
605The current working directory of a buffer is automatically inserted in the
606minibuffer if you type @kbd{:e} then space. Absolute filenames are
607required less often in Viper. For file names, Emacs uses a convention that
608is slightly different from other programs. It is designed to minimize the
609need for deleting file names that Emacs provides in its prompts. (This is
610usually convenient, but occasionally the prompt may suggest a wrong file
611name for you.) If you see a prompt @kbd{/usr/foo/} and you wish to edit the
612file @kbd{~/.viper}, you don't have to erase the prompt. Instead, simply
613continue typing what you need. Emacs will interpret @kbd{/usr/foo/~/.viper}
614correctly. Similarly, if the prompt is @kbd{~/foo/} and you need to get to
615@kbd{/bar/file}, keep typing. Emacs interprets @kbd{~/foo//bar/} as
616@kbd{/bar/file}, since when it sees @samp{//}, it understands that
617@kbd{~/foo/} is to be discarded.
618
619The command @kbd{:cd} will change the default directory for the
620current buffer. The command @kbd{:e} will interpret the
621filename argument in @code{csh}. @xref{Customization}, if you
622want to change the default shell.
623The command @kbd{:next} takes counts from
624@kbd{:args}, so that @kbd{:rew} is obsolete. Also, @kbd{:args} will show only
625the invisible files (i.e., those that are not currently seen in Emacs
626windows).
627
628When applicable, Ex commands support file completion and history. This
629means that by typing a partial file name and then @key{TAB}, Emacs will try
630to complete the name or it will offer a menu of possible completions.
631This works similarly to Tcsh and extends the behavior of Csh. While Emacs
632is waiting for a file name, you can type @kbd{M-p} to get the previous file
633name you typed. Repeatedly typing @kbd{M-p} and @kbd{M-n} will let you
634browse through the file history.
635
636Like file names, partially typed Ex commands can be completed by typing
637@key{TAB}, and Viper keeps the history of Ex commands. After typing
638@kbd{:}, you can browse through the previously entered Ex commands by
639typing @kbd{M-p} and @kbd{M-n}. Viper tries to rationalize when it puts Ex
640commands on the history list. For instance, if you typed @kbd{:w!@: foo},
641only @kbd{:w!} will be placed on the history list. This is because the
642last history element is the default that can be invoked simply by typing
643@kbd{: @key{RET}}. If @kbd{:w!@: foo} were placed on the list, it would be all to
644easy to override valuable data in another file. Reconstructing the full
645command, @kbd{:w!@: foo}, from the history is still not that hard, since Viper
646has a separate history for file names. By typing @kbd{: M-p}, you will get
9ff0b02b 647@kbd{:w!} in the minibuffer. Then, repeated @kbd{M-p} will get you through
4009494e
GM
648the file history, inserting one file name after another.
649
650In contrast to @kbd{:w!@: foo}, if the command were @kbd{:r foo}, the entire
651command will appear in the history list. This is because having @kbd{:r}
652alone as a default is meaningless, since this command requires a file
653argument.
4009494e
GM
654@end table
655@noindent
9ff0b02b 656As in Vi, Viper's destructive commands can be re-executed by typing `@kbd{.}'.
4009494e
GM
657However, in addition, Viper keeps track of the history of such commands. This
658history can be perused by typing @kbd{C-c M-p} and @kbd{C-c M-n}.
659Having found the appropriate command, it can be then executed by typing
660`@kbd{.}'.
661@xref{Improvements over Vi}, for more information.
662
1a5d3215 663@node Insert State
4009494e
GM
664@subsection Insert State
665
666@cindex Insert state
667
668To avoid confusing the beginner (at Viper level 1 and 2), Viper makes only the
669standard Vi keys available in Insert state. The implication is that
670Emacs major modes cannot be used in Insert state.
671It is strongly recommended that as soon as you are comfortable, make the
672Emacs state bindings visible (by changing your user level to 3 or higher).
673@xref{Customization},
76f1a3c3 674to see how to do this.
4009494e
GM
675
676Once this is done, it is possible to do quite a bit of editing in
677Insert state. For instance, Emacs has a @dfn{yank} command, @kbd{C-y},
678which is similar to Vi's @kbd{p}. However, unlike @kbd{p}, @kbd{C-y} can be
679used in Insert state of Viper. Emacs also has a kill ring where it keeps
680pieces of text you deleted while editing buffers. The command @kbd{M-y} is
44e97401 681used to delete the text previously put back by Emacs's @kbd{C-y} or by Vi's
4009494e
GM
682@kbd{p} command and reinsert text that was placed on the kill-ring earlier.
683
684This works both in Vi and Insert states.
685In Vi state, @kbd{M-y} is a much better alternative to the usual Vi's way
686of recovering the 10 previously deleted chunks of text. In Insert state,
687you can
688use this as follows. Suppose you deleted a piece of text and now you need
689to re-insert it while editing in Insert mode. The key @kbd{C-y} will put
690back the most recently deleted chunk. If this is not what you want, type
691@kbd{M-y} repeatedly and, hopefully, you will find the chunk you want.
692
693Finally, in Insert and Replace states, Viper provides the history of
694pieces of text inserted in previous insert or replace commands. These
695strings of text can be recovered by repeatedly typing @kbd{C-c M-p} or
696@kbd{C-c M-n} while in Insert or Replace state. (This feature is disabled
697in the minibuffer: the above keys are usually bound to other histories,
698which are more appropriate in the minibuffer.)
699
700
701@cindex Meta key
702
703You can call Meta functions from Insert state. As in Vi state, the Meta key
704is @kbd{C-\}. Thus @kbd{M-x} is typed as @kbd{C-\ x}.
705
706Other Emacs commands that are useful in Insert state are @kbd{C-e}
707and @kbd{C-a}, which move the cursor to the end and the beginning of the
708current line, respectively. You can also use @kbd{M-f} and @kbd{M-b},
709which move the cursor forward (or backward) one word.
710If your display has a Meta key, these functions are invoked by holding the
711Meta key and then typing @kbd{f} and @kbd{b}, respectively. On displays
712without the Meta key, these functions are invoked by typing
713@kbd{C-\ f} and @kbd{C-\ b} (@kbd{C-\} simulates the Meta key in Insert
714state, as explained above).
715
716The key @kbd{C-z} is sometimes also useful in Insert state: it allows you
717to execute a single command in Vi state without leaving the Insert state!
718For instance, @kbd{C-z d2w} will delete the next two words without leaving
719the Insert state.
720
721When Viper is in Insert state, you will see <I> in the mode line.
722
1a5d3215 723@node Replace State
4009494e
GM
724@subsection Replace State
725
726@cindex Replace state
727
728This state is entered through Vi replacement commands, such as @kbd{C},
729@kbd{cw}, etc., or by typing @kbd{R}. In Replace state, Viper puts <R> in
730the mode line to let you know which state is in effect. If Replace state is
731entered through @kbd{R}, Viper stays in that state until the user hits
732@key{ESC}. If this state is entered via the other replacement commands,
733then Replace state is in effect until you hit @key{ESC} or until you cross
734the rightmost boundary of the replacement region. In the latter case, Viper
735changes its state from Replace to Insert (which you will notice by the
736change in the mode line).
737
738Since Viper runs under Emacs, it is possible to switch between buffers
739while in Replace state. You can also move the cursor using the arrow keys
740(even on dumb terminals!)@: and the mouse. Because of this freedom (which is
741unattainable in regular Vi), it is possible to take the cursor outside the
742replacement region. (This may be necessary for several reasons, including
743the need to enable text selection and region-setting with the mouse.)
744
745The issue then arises as to what to do when the user
746hits the @key{ESC} key. In Vi, this would cause the text between cursor and
747the end of the replacement region to be deleted. But what if, as is
748possible in Viper, the cursor is not inside the replacement region?
749
750To solve the problem, Viper keeps track of the last cursor position while it
751was still inside the replacement region. So, in the above situation, Viper
752would delete text between this position and the end of the replacement
753region.
754
1a5d3215 755@node The Minibuffer
4009494e
GM
756@section The Minibuffer
757
758@cindex Minibuffer
759
9ff0b02b 760The minibuffer is where commands are entered in. Editing can be done
4009494e
GM
761by commands from Insert state, namely:
762
763@table @kbd
764@item C-h
765Backspace
766@item C-w
767Delete Word
768@item C-u
769Erase line
770@item C-v
771Quote the following character
772@item @key{RET}
773Execute command
774@item C-g and C-]
775Emacs quit and abort keys. These may be necessary. @xref{Vi State}, for an
776explanation.
777@item M-p and M-n
778These keys are bound to functions that peruse minibuffer history. The
779precise history to be perused depends on the context. It may be the history
780of search strings, Ex commands, file names, etc.
9ff0b02b
MK
781@item C-s
782If the minibuffer is entered via the Viper search commands @kbd{/} or
783@kbd{?}, then this key inserts the last search string used by the
784Emacs incremental search command
785(which is bound to @kbd{C-s} everywhere except in this case).
4009494e
GM
786@end table
787
9ff0b02b
MK
788Most of the Emacs keys are functional in the minibuffer. While in the
789minibuffer, Viper tries to make editing resemble Vi's behavior when the
4009494e 790latter is waiting for the user to type an Ex command. In particular, you
9ff0b02b 791can use the regular Vi commands to edit the minibuffer. You can switch
4009494e 792between the Vi state and Insert state at will, and even use the replace mode.
9ff0b02b 793Initially, the minibuffer comes up in Insert state.
4009494e 794
9ff0b02b 795Some users prefer plain Emacs bindings in the minibuffer. To this end, set
4009494e
GM
796@code{viper-vi-style-in-minibuffer} to @code{nil} in @file{.viper}.
797@xref{Customization}, to learn how to do this.
798
9ff0b02b
MK
799When the minibuffer changes Viper states, you will notice that the appearance
800of the text there changes as well. This is useful because the minibuffer
4009494e 801has no mode line to tell which Vi state it is in.
9ff0b02b 802The appearance of the text in the minibuffer can be changed.
4009494e
GM
803@xref{Viper Specials}, for more details.
804
1a5d3215 805@node Multiple Files in Viper
4009494e
GM
806@section Multiple Files in Viper
807
808@cindex multiple files
809@cindex managing multiple files
810
811Viper can edit multiple files. This means, for example that you never need
812to suffer through @code{No write since last change} errors.
813Some Viper elements are common over all the files.
814
815@table @samp
816@item Textmarkers
817@cindex markers
818@cindex textmarkers
819Textmarkers remember @emph{files and positions}.
820If you set marker @samp{a} in
821file @file{foo}, start editing file @file{bar} and type @kbd{'a}, then
822@emph{YOU WILL SWITCH TO FILE @file{foo}}. You can see the contents of a
823textmarker using the Viper command @kbd{[<a-z>} where <a-z> are the
76f1a3c3 824textmarkers, e.g., @kbd{[a} to view marker @samp{a} .
4009494e
GM
825@item Repeated Commands
826Command repetitions are common over files. Typing @kbd{!!} will repeat the
827last @kbd{!} command whichever file it was issued from.
828Typing @kbd{.} will repeat the last command from any file, and
829searches will repeat the last search. Ex commands can be repeated by typing
76f1a3c3 830@kbd{: @key{RET}}.
4009494e
GM
831Note: in some rare cases, that @kbd{: @key{RET}} may do something dangerous.
832However, usually its effect can be undone by typing @kbd{u}.
833@item Registers
834@cindex registers
835Registers are common to files. Also, text yanked with @kbd{y} can be
836put back (@kbd{p}) into any file. The Viper command @kbd{]<a-z>}, where <a-z> are
837the registers, can be used to look at the contents of a register, e.g.,
838type @kbd{]a} to view register @samp{a}.
839
840There is one difference in text deletion that you should be
841aware of. This difference comes from Emacs and was adopted in Viper
842because we find it very useful. In Vi, if you delete a line, say, and then
843another line, these two deletions are separated and are put back
844separately if you use the @samp{p} command. In Emacs (and Viper), successive
845series of deletions that are @emph{not interrupted} by other commands are
846lumped together, so the deleted text gets accumulated and can be put back
847as one chunk. If you want to break a sequence of deletions so that the
848newly deleted text could be put back separately from the previously deleted
849text, you should perform a non-deleting action, e.g., move the cursor one
850character in any direction.
851@item Absolute Filenames
852@cindex absolute file names
853The current directory name for a file is automatically prepended to the
854file name in any
855@kbd{:e}, @kbd{:r}, @kbd{:w}, etc., command (in Emacs, each buffer has a
856current directory).
9ff0b02b 857This directory is inserted in the minibuffer once you type space after
4009494e
GM
858@kbd{:e, r}, etc. Viper also supports completion of file names and Ex
859commands (@key{TAB}), and it keeps track of
860command and file history (@kbd{M-p}, @kbd{M-n}).
861Absolute filenames are required less
862often in Viper.
863
864You should be aware that Emacs interprets @kbd{/foo/bar//bla} as
865@kbd{/bla} and @kbd{/foo/~/bar} as @kbd{~/bar}. This is designed to
866minimize the need for erasing file names that Emacs suggests in its
867prompts, if a suggested file name is not what you wanted.
868
869The command @kbd{:cd} will change the default directory for the
870current Emacs buffer. The Ex command @kbd{:e} will interpret the
871filename argument in @samp{csh}, by default. @xref{Customization}, if you
872want to change this.
873@end table
874
875@noindent
876Currently undisplayed files can be listed using the @kbd{:ar} command. The
877command @kbd{:n} can be given counts from the @kbd{:ar} list to switch to
878other files. For example, use `:n3' to move to the third file in that list.
879
1a5d3215 880@node Unimplemented Features
4009494e
GM
881@section Unimplemented Features
882
883Unimplemented features include:
884
885@itemize @bullet
886@item
887@kbd{:ab} and @kbd{:una} are not implemented, since
888@kbd{:ab} is considered obsolete, since Emacs has much
889more powerful facilities for defining abbreviations.
890@item
891@kbd{:set option?} is not implemented. The current
892@kbd{:set} can also be used to set Emacs variables.
893@item
894@kbd{:se list} requires modification of the display code for Emacs, so
895it is not implemented.
896A useful alternative is @code{cat -t -e file}. Unfortunately, it cannot
897be used directly inside Emacs, since Emacs will obdurately change @samp{^I}
76f1a3c3 898back to normal tabs.
4009494e
GM
899@end itemize
900
1a5d3215 901@node Improvements over Vi
4009494e
GM
902@chapter Improvements over Vi
903
904Some common problems with Vi and Ex have been solved in Viper. This
905includes better implementation of existing commands, new commands, and
906the facilities provided by Emacs.
907
908@menu
909* Basics:: Basic Viper differences, Multi-file effects.
910* Undo and Backups:: Multiple undo, auto-save, backups and changes
911* History:: History for Ex and Vi commands.
912* Macros and Registers:: Keyboard Macros (extended ".")@: @@reg execution.
913* Completion:: Filename and Command Completion for Ex.
914* Improved Search:: Incremental Search and Buffer Content Search.
915* Abbreviation Facilities:: Normal Abbrevs, Templates, and Dynamic Abbrevs.
916* Movement and Markers:: Screen Editor movements, viewing textmarkers.
917* New Commands:: Commands that do not exist in Vi.
918* Useful Packages:: A Sampling of some Emacs packages, and things
919 you should know about.
920@end menu
921
1a5d3215 922@node Basics
4009494e
GM
923@section Basics
924
925The Vi command set is based on the idea of combining motion commands
926with other commands. The motion command is used as a text region
927specifier for other commands.
928We classify motion commands into @dfn{point commands} and
76f1a3c3 929@dfn{line commands}.
4009494e
GM
930
931@cindex point commands
932
933The point commands are:
934
935@quotation
936@kbd{h}, @kbd{l}, @kbd{0}, @kbd{$}, @kbd{w}, @kbd{W}, @kbd{b}, @kbd{B},
937@kbd{e}, @kbd{E}, @kbd{(}, @kbd{)}, @kbd{/}, @kbd{?}, @kbd{`}, @kbd{f},
938@kbd{F}, @kbd{t}, @kbd{T}, @kbd{%}, @kbd{;}, @kbd{,}, @kbd{^}
939@end quotation
940
941@cindex line commands
942
943The line commands are:
944
945@quotation
946@kbd{j}, @kbd{k}, @kbd{+}, @kbd{-}, @kbd{H}, @kbd{M}, @kbd{L}, @kbd{@{},
947@kbd{@}}, @kbd{G}, @kbd{'}, @kbd{[[}, @kbd{]]}, @kbd{[]}
948@end quotation
949
950@cindex region
951@cindex region specification
952@cindex expanding (region)
953@cindex describing regions
954@cindex movement commands
955
956@noindent
957If a point command is given as an argument to a modifying command, the
958region determined by the point command will be affected by the modifying
959command. On the other hand, if a line command is given as an argument to a
960modifying command, the region determined by the line command will be
961enlarged so that it will become the smallest region properly containing the
962region and consisting of whole lines (we call this process @dfn{expanding
963the region}), and then the enlarged region will be affected by the modifying
964command.
965Text Deletion Commands (@pxref{Deleting Text}), Change commands
966(@pxref{Changing Text}), even Shell Commands (@pxref{Shell Commands})
967use these commands to describe a region of text to operate on.
968Thus, type @kbd{dw} to delete a word, @kbd{>@}} to shift a paragraph, or
969@kbd{!'afmt} to format a region from @samp{point} to textmarker
970@samp{a}.
971
972@cindex r and R region specifiers
973
974Viper adds the region specifiers @samp{r} and @samp{R}. Emacs has a
975special marker called @dfn{mark}. The text-area between the current cursor
976position @dfn{point} and the @dfn{mark} is called the @dfn{region}.
977@samp{r} specifies the raw region and @samp{R} is the expanded region
978(i.e., the minimal contiguous chunk of full lines that contains the raw
979region).
980@kbd{dr} will now delete the region, @kbd{>r} will shift it, etc.
981@kbd{r,R} are not motion commands, however. The special mark is set by
982@kbd{m.} and other commands. @xref{Marking}, for more info.
983
984Viper also adds counts to most commands for which it would make sense.
985
986In the Overview chapter, some Multiple File issues were discussed
987(@pxref{Multiple Files in Viper}). In addition to the files, Emacs has
988buffers. These can be seen in the @kbd{:args} list and switched using
989@kbd{:next} if you type @kbd{:set ex-cycle-through-non-files t}, or
990specify @code{(setq ex-cycle-through-non-files t)} in your @file{.viper}
991file. @xref{Customization}, for details.
992
1a5d3215 993@node Undo and Backups
4009494e
GM
994@section Undo and Backups
995
996@cindex undo
997
998Viper provides multiple undo. The number of undo's and the size is limited
999by the machine. The Viper command @kbd{u} does an undo. Undo can be
1000repeated by typing @kbd{.} (a period). Another @kbd{u} will undo the undo,
1001and further
1002@kbd{.} will repeat it. Typing @kbd{u} does the first undo, and changes the
1003direction.
1004
1005@cindex backup files
1006@cindex auto save
1007
1008Since the undo size is limited, Viper can create backup files and
1009auto-save files. It will normally do this automatically. It is possible
1010to have numbered backups, etc. For details, @pxref{Backup,,Backup and
76f1a3c3 1011Auto-Save,emacs,The GNU Emacs Manual}.
4009494e
GM
1012
1013@comment [ balance parens
1014@cindex viewing registers and markers
1015@cindex registers
1016@cindex markers
1017@cindex textmarkers
1018
1019The results of the 9 previous changes are available in the 9 numeric
1020registers, as in Vi. The extra goody is the ability to @emph{view} these
1021registers, in addition to being able to access them through @kbd{p} and
1022@kbd{M-y} (@xref{Insert State}, for details.)
1023The Viper command @kbd{] register} will display the contents of any
1024register, numeric or alphabetical. The related command @kbd{[ textmarker}
1025will show the text around the textmarker. @samp{register} and @samp{textmarker}
1026can be any letters from a through z.
1027@comment ] balance parens
1028
1a5d3215 1029@node History
4009494e
GM
1030@section History
1031
1032@cindex history
1033@cindex Minibuffer
1034
1035History is provided for Ex commands, Vi searches, file names, pieces of
1036text inserted in earlier commands that use Insert or Replace state, and for
1037destructive commands in Vi state. These are
1038useful for fixing those small typos that screw up searches and @kbd{:s},
1039and for eliminating routine associated with repeated typing of file names
1040or pieces of text that need to be inserted frequently.
9ff0b02b 1041At the @kbd{:} or @kbd{/} prompts in the minibuffer, you can do the following:
4009494e
GM
1042
1043@table @kbd
1044@item M-p and M-n
1045To move to previous and next history items. This causes the history
1046items to appear on the command line, where you can edit them, or
1047simply type Return to execute.
1048@item M-r and M-s
1049To search backward and forward through the history.
1050@item @key{RET}
1051Type @key{RET} to accept a default (which is displayed in the prompt).
1052@end table
1053
1054The history of insertions can be perused by
1055typing @kbd{C-c M-p} and @kbd{C-c M-n} while in Insert or Replace state.
1056The history of destructive Vi commands can be perused via the same keys
1057when Viper is in Vi state. @xref{Viper Specials}, for details.
1058
1059All Ex commands have a file history. For instance, typing @kbd{:e}, space
1060and then @kbd{M-p} will bring up the name of the previously typed file
1061name. Repeatedly typing @kbd{M-p}, @kbd{M-n}, etc., will let you browse
1062through the file history.
1063
1064Similarly, commands that have to do with switching buffers
1065have a buffer history, and commands that expect strings or regular
1066expressions keep a history on those items.
1067
1a5d3215 1068@node Macros and Registers
4009494e
GM
1069@section Macros and Registers
1070
1071@cindex keyboard macros
1072@cindex macros
1073@cindex registers
1074@cindex register execution
1075
1076Viper facilitates the use of Emacs-style keyboard macros. @kbd{@@#} will
1077start a macro definition. As you type, the commands will be executed, and
1078remembered (This is called ``learn mode'' in some editors.)
1079@kbd{@@register} will complete the macro, putting it into @samp{register},
1080where @samp{register} is any character from @samp{a} through @samp{z}. Then
1081you can execute this macro using @kbd{@@register}. It is, of course,
1082possible to yank some text into a register and execute it using
1083@kbd{@@register}. Typing @kbd{@@@@}, @kbd{@@RET}, or @kbd{@@C-j} will
76f1a3c3 1084execute the last macro that was executed using @kbd{@@register}.
4009494e
GM
1085
1086Viper will automatically lowercase the register, so that pressing the
1087@kbd{SHIFT} key for @kbd{@@} will not create problems. This is for
1088@kbd{@@} macros and @kbd{"p} @emph{only}. In the case of @kbd{y},
1089@kbd{"Ayy} will append to @emph{register a}. For @kbd{[,],',`}, it
1090is an error to use a Uppercase register name.
1091
1092@comment [ balance parens
1093@cindex viewing registers and markers
1094
1095The contents of a register can be seen by @kbd{]register}. (@kbd{[textmarker}
1096will show the contents of a textmarker).
1097@comment ] balance parens
1098
1099@cindex last keyboard macro
1100
1101The last keyboard macro can also be executed using
1102@kbd{*}, and it can be yanked into a register using @kbd{@@!register}.
1103This is useful for Emacs style keyboard macros defined using @kbd{C-x(}
1104and @kbd{C-x)}. Emacs keyboard macros have more capabilities.
1105@xref{Keyboard Macros,,Keyboard Macros,emacs, The GNU Emacs Manual}, for
76f1a3c3 1106details.
4009494e
GM
1107
1108Keyboard Macros allow an interesting form of Query-Replace:
1109@kbd{/pattern} or @kbd{n} to go to the next pattern (the query), followed by a
1110Keyboard Macro execution @kbd{@@@@} (the replace).
1111
1112Viper also provides Vi-style macros. @xref{Vi Macros}, for details.
1113
1114
1a5d3215 1115@node Completion
4009494e
GM
1116@section Completion
1117
1118@cindex completion
1119
1120Completion is done when you type @key{TAB}. The Emacs completer does not
1121grok wildcards in file names. Once you type a wildcard, the completer will
1122no longer work for that file name. Remember that Emacs interprets a file name
1123of the form @kbd{/foo//bar} as @kbd{/bar} and @kbd{/foo/~/bar} as
1124@kbd{~/bar}.
1125
1a5d3215 1126@node Improved Search
4009494e
GM
1127@section Improved Search
1128
1129@cindex buffer search
1130@cindex word search
1131
1132Viper provides buffer search, the ability to search the buffer for a region
1133under the cursor. You have to turn this on in @file{.viper} either by calling
1134
1135@example
1136(viper-buffer-search-enable)
1137@end example
1138
1139@noindent
1140or by setting @code{viper-buffer-search-char} to, say, @kbd{f3}:
1141@example
1142(setq viper-buffer-search-char ?g)
1143@end example
1144
1145@noindent
1146If the user calls @code{viper-buffer-search-enable} explicitly (the first
1147method), then @code{viper-buffer-search-char} will be set to @kbd{g}.
1148Regardless of how this feature is enabled, the key
1149@code{viper-buffer-search-char} will take movement commands, like
1150@kbd{w,/,e}, to find a region and then search for the contents of that
1151region. This command is very useful for searching for variable names, etc.,
1152in a program. The search can be repeated by @kbd{n} or reversed by @kbd{N}.
1153
1154@cindex incremental search
1155
1156Emacs provides incremental search. As you type the string in, the
1157cursor will move to the next match. You can snarf words from the buffer
1158as you go along. Incremental Search is normally bound to @kbd{C-s} and
1159@kbd{C-r}. @xref{Customization}, to find out how to change the bindings
1160of @kbd{C-r or C-s}.
1161For details, @pxref{Incremental Search,,Incremental
76f1a3c3 1162Search,emacs,The GNU Emacs Manual}.
4009494e
GM
1163
1164@cindex query replace
1165
1166Viper also provides a query replace function that prompts through the
9ff0b02b 1167minibuffer. It is invoked by the @kbd{Q} key in Vi state.
4009494e
GM
1168
1169@cindex mouse search
1170
1171On a window display, Viper supports mouse search, i.e., you can search for a
1172word by clicking on it. @xref{Viper Specials}, for details.
1173
1174Finally, on a window display, Viper highlights search patterns as it finds
1175them. This is done through what is known as @emph{faces} in Emacs. The
1176variable that controls how search patterns are highlighted is
1177@code{viper-search-face}. If you don't want any highlighting at all, put
1178@example
1179(copy-face 'default 'viper-search-face)
1180@end example
1181@vindex @code{viper-search-face}
1182@noindent
1183in @file{~/.viper}. If you want to change how patterns are highlighted, you
1184will have to change @code{viper-search-face} to your liking. The easiest
1185way to do this is to use Emacs customization widget, which is accessible
1186from the menubar. Viper customization group is located under the
1187@emph{Emulations} customization group, which in turn is under the
1188@emph{Editing} group (or simply by typing @kbd{:customize}). All Viper
1189faces are grouped together under Viper's
1190@emph{Highlighting} group.
1191
1192Try it: it is really simple!
1193
1a5d3215 1194@node Abbreviation Facilities
4009494e
GM
1195@section Abbreviation Facilities
1196
1197@cindex abbrevs
1198
1199It is possible in Emacs to define abbrevs based on the contents of the
1200buffer.
1201Sophisticated templates can be defined using the Emacs abbreviation
1202facilities. @xref{Abbrevs,,Abbreviations,emacs,The GNU Emacs Manual}, for
1203details.
1204
1205@cindex dynamic abbrevs
1206
1207Emacs also provides Dynamic Abbreviations. Given a partial word, Emacs
1208will search the buffer to find an extension for this word. For instance,
1209one can type @samp{Abbreviations} by typing @samp{A}, followed by a keystroke
1210that completed the @samp{A} to @samp{Abbreviations}. Repeated typing
1211will search further back in the buffer, so that one could get
1212@samp{Abbrevs} by repeating the
1213keystroke, which appears earlier in the text. Emacs binds this to
1214@kbd{@key{ESC} /}, so you will have to find a key and bind the function
1215@code{dabbrev-expand} to that key.
1216Facilities like this make Vi's @kbd{:ab} command obsolete.
1217
1a5d3215 1218@node Movement and Markers
4009494e
GM
1219@section Movement and Markers
1220
1221@cindex Ex style motion
1222@cindex line editor motion
1223
1224Viper can be set free from the line--limited movements in Vi, such as @kbd{l}
1225refusing to move beyond the line, @key{ESC} moving one character back,
1226etc. These derive from Ex, which is a line editor. If your @file{.viper}
1227contains
1228
1229@example
1230@code{(setq viper-ex-style-motion nil)}
1231@end example
1232
1233@noindent
1234the motion will be a true screen editor motion. One thing you must then
1235watch out for is that it is possible to be on the end-of-line character.
1236The keys @kbd{x} and @kbd{%} will still work correctly, i.e., as if they
1237were on the last character.
1238
1239@vindex @code{viper-syntax-preference}
1240@cindex syntax table
1241
1242The word-movement commands @kbd{w}, @kbd{e}, etc., and the associated
1243deletion/yanking commands, @kbd{dw}, @kbd{yw}, etc., can be made to
1244understand Emacs syntax tables. If the variable
1245@code{viper-syntax-preference} is set to @code{strict-vi} then
1246the meaning of @emph{word} is the same as in
1247Vi. However, if the value is @code{reformed-vi} (the default) then the
1248alphanumeric symbols will be those specified by the current Emacs syntax
1249table (which may be different for different major modes) plus the
1250underscore symbol @kbd{_}, minus some non-word symbols, like '.;,|, etc.
1251Both @code{strict-vi} and @code{reformed-vi} work close to Vi in
1252traditional cases, but @code{reformed-vi} does a better job when editing
1253text in non-Latin alphabets.
1254
1255The user can also specify the value @code{emacs}, which would
1256make Viper use exactly the Emacs notion of word. In particular, the
1257underscore may not be part of a word. Finally, if
1258@code{viper-syntax-preference} is set to @code{extended}, Viper words would
1259consist of characters that are classified as alphanumeric @emph{or} as
1260parts of symbols. This is convenient for writing programs and in many other
1261situations.
1262
1263@code{viper-syntax-preference} is a local variable, so it can have different
1264values for different major modes. For instance, in programming modes it can
1265have the value @code{extended}. In text modes where words contain special
1266characters, such as European (non-English) letters, Cyrillic letters, etc.,
1267the value can be @code{reformed-vi} or @code{emacs}.
1268
1269Changes to @code{viper-syntax-preference} should be done in the hooks to
1270various major modes by executing @code{viper-set-syntax-preference} as in
1271the following example:
1272
1273@example
1274(viper-set-syntax-preference nil "emacs")
1275@end example
1276
1277@findex @code{viper-set-syntax-preference}
1278
1279The above discussion of the meaning of Viper's words concerns only Viper's
1280movement commands. In regular expressions, words remain the same as in
1281Emacs. That is, the expressions @code{\w}, @code{\>}, @code{\<}, etc., use
44e97401 1282Emacs's idea of what is a word, and they don't look into the value of
4009494e
GM
1283variable @code{viper-syntax-preference}. This is because Viper doesn't change
1284syntax tables in fear of upsetting the various major modes that set these
1285tables.
1286
1287@cindex textmarkers
1288
1289Textmarkers in Viper remember the file and the position, so that you can
1290switch files by simply doing @kbd{'a}. If you set up a regimen for using
1291Textmarkers, this is very useful. Contents of textmarkers can be viewed
1292by @kbd{[marker}. (Contents of registers can be viewed by @kbd{]register}).
1293
1a5d3215 1294@node New Commands
4009494e
GM
1295@section New Commands
1296
1297These commands have no Vi analogs.
1298
1299@table @kbd
1300@item C-x, C-c
1301@kindex @kbd{C-x}
1302@kindex @kbd{C-c}
1303These two keys invoke many important Emacs functions. For example, if you
1304hit @kbd{C-x} followed by @kbd{2}, then the current window will be split
1305into 2. Except for novice users, @kbd{C-c} is also set to execute an Emacs
1306command from the current major mode. @key{ESC} will do the same, if you
1307configure @key{ESC} as Meta by setting @code{viper-no-multiple-ESC} to @code{nil}
1308in @file{.viper}. @xref{Customization}. @kbd{C-\} in Insert, Replace, or Vi
76f1a3c3 1309states will make Emacs think @kbd{Meta} has been hit.
4009494e
GM
1310@item \
1311@kindex @kbd{\}
1312Escape to Emacs to execute a single Emacs command. For instance,
1313@kbd{\ @key{ESC}} will act like a Meta key.
1314@item Q
1315@kindex @kbd{Q}
1316@cindex query replace
1317@kbd{Q} is for query replace. By default,
1318each string to be replaced is treated as a regular expression. You can use
1319@code{(setq viper-re-query-replace nil)} in your @file{.emacs} file to
1320turn this off. (For normal searches, @kbd{:se nomagic} will work. Note
1321that @kbd{:se nomagic} turns Regexps off completely, unlike Vi).
1322@item v
1323@itemx V
1324@itemx C-v
1325@kindex @kbd{v}
1326@kindex @kbd{V}
1327@kindex @kbd{C-v}
1328These keys are used to visit files. @kbd{v} will switch to a buffer
9ff0b02b 1329visiting file whose name can be entered in the minibuffer. @kbd{V} is
4009494e
GM
1330similar, but will use a window different from the current window.
1331@kbd{C-v} is like @kbd{V}, except that a new frame (X window) will be used
1332instead of a new Emacs window.
1333@item #
1334@kindex @kbd{#}
1335If followed by a certain character @var{ch}, it becomes an operator whose
1336argument is the region determined by the motion command that follows
1337(indicated as <move>).
1338Currently, @var{ch} can be one of @kbd{c}, @kbd{C}, @kbd{g}, @kbd{q}, and
1339@kbd{s}. For instance, @kbd{#qr} will prompt you for a string and then
76f1a3c3 1340prepend this string to each line in the buffer.
4009494e
GM
1341@item # c
1342@kindex @kbd{#c<move>}
1343@cindex changing case
1344Change upper-case characters in the region to lower-case
1345(@code{downcase-region}).
1346Emacs command @kbd{M-l} does the same for words.
1347@item # C
1348@kindex @kbd{#C<move>}
1349Change lower-case characters in the region to upper-case. For instance,
1350@kbd{# C 3 w} will capitalize 3 words from the current point
1351(@code{upcase-region}).
1352Emacs command @kbd{M-u} does the same for words.
1353@item # g
1354@kindex @kbd{#g<move>}
1355Execute last keyboard macro for each line in the region
76f1a3c3 1356(@code{viper-global-execute}).
4009494e
GM
1357@item # q
1358@kindex @kbd{#q<move>}
1359Insert specified string at the beginning of each line in the region
1360(@code{viper-quote-region}). The default string is composed of the comment
1361character(s) appropriate for the current major mode.
1362@item # s
1363@kindex @kbd{#s<move>}
1364Check spelling of words in the region (@code{spell-region}).
1365The function used for spelling is determined from the variable
1366@code{viper-spell-function}.
1367@vindex @code{viper-spell-function}
1368@item *
1369@kindex @kbd{*}
1370Call last keyboard macro.
1371@item m .
1372Set mark at point and push old mark off the ring
1373@item m<
1374@item m>
1375Set mark at beginning and end of buffer, respectively.
1376@item m,
1377Jump to mark and pop mark off the ring. @xref{Mark,,Mark,emacs,The GNU
1378Emacs Manual}, for more info.
1379@item ] register
1380@kindex @kbd{]<a-z>}
1381View contents of register
1382@item [ textmarker
1383@kindex @kbd{[<a-z>}
1384View filename and position of textmarker
1385@item @@#
1386@item @@register
1387@item @@!
1388@kindex @kbd{@@#}
1389@kindex @kbd{@@<a-z>}
1390@kindex @kbd{@@!}
1391@cindex keyboard macros
1392@cindex register execution
1393
1394Begin/end keyboard macro. @@register has a different meaning when used after
1395a @kbd{@@#}. @xref{Macros and Registers}, for details
1396@item []
1397@kindex @kbd{[]}
1398Go to end of heading.
1399@item g <@emph{movement command}>
1400Search buffer for text delimited by movement command. The canonical
1401example is @kbd{gw} to search for the word under the cursor.
76f1a3c3 1402@xref{Improved Search}, for details.
4009494e
GM
1403@item C-g and C-]
1404@kindex @kbd{C-g}
1405@kindex @kbd{C-]}
1406Quit and Abort Recursive edit. These may be necessary on occasion.
1407@xref{Vi State}, for a reason.
1408@item C-c C-g
1409@kindex @kbd{C-c C-g}
1410Hitting @kbd{C-c} followed by @kbd{C-g} will display the information on the
1411current buffer. This is the same as hitting @kbd{C-g} in Vi, but, as
1412explained above, @kbd{C-g} is needed for other purposes in Emacs.
1413@item C-c /
1414@kindex @kbd{C-c /}
1415Without a prefix argument, this command toggles
1416case-sensitive/case-insensitive search modes and plain vanilla/regular
1417expression search. With the prefix argument 1, i.e.,
1418@kbd{1 C-c /}, this toggles case-sensitivity; with the prefix argument 2,
1419toggles plain vanilla search and search using
1420regular expressions. @xref{Viper Specials}, for alternative ways to invoke
1421this function.
1422@cindex vanilla search
1423@cindex case-sensitive search
1424@cindex case-insensitive search
1425
1426@item M-p and M-n
1427@kindex @kbd{M-p}
1428@kindex @kbd{M-n}
9ff0b02b 1429In the minibuffer, these commands navigate through the minibuffer
4009494e
GM
1430histories, such as the history of search strings, Ex commands, etc.
1431
9ff0b02b
MK
1432@item C-s
1433@kindex @kbd{C-s}
1434If the minibuffer is entered via a Viper search commands @kbd{/} or @kbd{?},
1435then typing this key inserts the last search string used by the
1436Emacs incremental search command (that is bound to @kbd{C-s} everywhere
1437except in this case).
1438
4009494e
GM
1439@item C-c M-p and C-c M-n
1440@kindex @kbd{C-c M-p}
1441@kindex @kbd{C-c M-n}
1442@cindex Insertion history
1443@cindex Insertion ring
1444@cindex Command history
1445@cindex Command ring
1446
1447In Insert or Replace state, these commands let the user
1448peruse the history of insertion strings used in previous insert or replace
1449commands. Try to hit @kbd{C-c M-p} or @kbd{C-c M-n} repeatedly and see what
1450happens. @xref{Viper Specials}, for more.
1451
1452In Vi state, these commands let the user peruse the history of Vi-style
1453destructive commands, such as @kbd{dw}, @kbd{J}, @kbd{a}, etc.
1454By repeatedly typing @kbd{C-c M-p} or @kbd{C-c M-n} you will cycle Viper
1455through the recent history of Vi commands, displaying the commands one by
1456one. Once
1457an appropriate command is found, it can be executed by typing `@kbd{.}'.
1458
1459Since typing @kbd{C-c M-p} is tedious, it is more convenient to bind an
1460appropriate function to a function key on the keyboard and use that key.
1461@xref{Viper Specials}, for details.
1462
1463@item Ex commands
1464@findex @kbd{:args}
1465@findex @kbd{:n}
1466@findex @kbd{:pwd}
1467@findex @kbd{:pre}
1468The commands @kbd{:args}, @kbd{:next}, @kbd{:pre} behave
1469differently. @kbd{:pwd} exists to get current directory.
1470The commands @kbd{:b} and @kbd{:B} switch buffers around. @xref{File and
1471Buffer Handling}, for details.
1472There are also the new commands @kbd{:RelatedFile} and
1473@kbd{PreviousRelatedFile} (which abbreviate to @kbd{R} and @kbd{P},
1474respectively. @xref{Viper Specials}, for details.
1475@findex @kbd{:RelatedFile}
1476@findex @kbd{:PreviousRelatedFile}
1477@end table
1478
1479Apart from the new commands, many old commands have been enhanced. Most
1480notably, Vi style macros are much more powerful in Viper than in Vi. @xref{Vi
1481Macros}, for details.
1482
1a5d3215 1483@node Useful Packages
4009494e
GM
1484@section Useful Packages
1485
1486Some Emacs packages are mentioned here as an aid to the new Viper user, to
1487indicate what Viper is capable of.
1488A vast number comes with the standard Emacs distribution, and many more exist
1489on the net and on the archives.
1490
1491This manual also mentions some Emacs features a new user
1492should know about. The details of these are found in the GNU Emacs
1493Manual.
1494
1495The features first. For details, look up the Emacs Manual.
1496
1497@table @samp
1498@item Make
1499@cindex make
1500@cindex compiling
1501
1502Makes and Compiles can be done from the editor. Error messages will be
1503parsed and you can move to the error lines.
1504@item Shell
1505@cindex shell
1506@cindex interactive shell
1507You can talk to Shells from inside the editor. Your entire shell session
1508can be treated as a file.
1509@item Mail
1510@cindex email
1511@cindex mail
1512Mail can be read from and sent within the editor. Several sophisticated
1513packages exist.
1514@item Language Sensitive Editing
1515Editing modes are written for most computer languages in existence. By
1516controlling indentation, they catch punctuation errors.
1517@end table
1518
1519The packages, below, represents a drop in the sea of special-purpose
1520packages that come with standard distribution of Emacs.
1521
1522@table @samp
1523@item Transparent FTP
1524@cindex transparent ftp
1525@pindex ange-ftp.el
1526@code{ange-ftp.el} can ftp from the editor to files on other machines
1527transparent to the user.
1528@item RCS Interfaces
1529@cindex version maintenance
1530@cindex RCS
1531@pindex vc.el
1532@code{vc.el} for doing RCS commands from inside the editor
1533@item Directory Editor
1534@cindex dired
1535@pindex dired.el
1536@code{dired.el} for editing contents of directories and for navigating in
1537the file system.
1538@item Syntactic Highlighting
1539@cindex font-lock
1540@pindex font-lock.el
1541@code{font-lock.el} for automatic highlighting various parts of a buffer
1542using different fonts and colors.
1543@item Saving Emacs Configuration
1544@cindex desktop
1545@pindex desktop.el
1546@code{desktop.el} for saving/restoring configuration on Emacs exit/startup.
1547@item Spell Checker
1548@cindex ispell
1549@pindex ispell.el
1550@code{ispell.el} for spell checking the buffer, words, regions, etc.
1551@item File and Buffer Comparison
1552@cindex ediff
1553@pindex ediff.el
1554@code{ediff.el} for finding differences between files and for applying
1555patches.
1556@end table
1557
1558@noindent
1559Emacs Lisp archives exist on
1560@samp{archive.cis.ohio-state.edu}
76f1a3c3 1561and @samp{wuarchive.wustl.edu}
4009494e
GM
1562
1563
1a5d3215 1564@node Customization
4009494e
GM
1565@chapter Customization
1566
1567@cindex customization
1568
1569Customization can be done in 2 ways.
1570
1571@itemize @bullet
1572@item
1573@cindex initialization
1574@cindex .viper
1575Elisp code in a @file{.viper} file in your home directory. Viper
1576loads @file{.viper} just before it does the binding for mode
1577hooks. This is recommended for experts only.
1578@item
1579@cindex .emacs
1580Elisp code in your @file{.emacs} file before and after the @code{(require
1581'viper)} line. This method is @emph{not} recommended, unless you know what
1582you are doing. Only two variables, @code{viper-mode} and
1583@code{viper-custom-file-name}, are supposed to be customized in @file{.emacs},
76f1a3c3 1584prior to loading Viper (i.e., prior to @code{(require 'viper)} command.
4009494e
GM
1585@item
1586@cindex :customize
1587By executing the @kbd{:customize} Ex command. This takes you to the Emacs
1588customization widget, which lets you change the values of Viper
1589customizable variables easily. This method is good for novice and
1590experts alike. The customization code in the form of Lisp commands will be
1591placed in @file{~/.emacs} or some other customization file depending on the
1592version of Emacs that you use. Still, it is recommended to separate
1593Viper-related customization produced by the Emacs customization widget
1594and keep it in the @file{.viper} file.
1595
1596Some advanced customization cannot be accomplished this way, however, and
1597has to be done in Emacs Lisp in the @file{.viper} file. For the common
1598cases, examples are provided that you can use directly.
1599@end itemize
1600
1601
1602@menu
1603* Rudimentary Changes:: Simple constant definitions.
1604* Key Bindings:: Enabling Emacs Keys, Rebinding keys, etc.
1605* Packages that Change Keymaps:: How to deal with such beasts.
1606* Viper Specials:: Special Viper commands.
1607* Vi Macros:: How to do Vi style macros.
1608@end menu
1609
1a5d3215 1610@node Rudimentary Changes
4009494e
GM
1611@section Rudimentary Changes
1612
1613@cindex setting variables
1614@cindex variables for customization
1615@findex @kbd{:set}
1616
1617An easy way to customize Viper is to change the values of constants used in
1618Viper. Here is the list of the constants used in Viper and their default
1619values. The corresponding :se command is also indicated. (The symbols
1620@code{t} and @code{nil} represent ``true'' and ``false'' in Lisp).
1621
1622Viper supports both the abbreviated Vi variable names and their full
1623names. Variable completion is done on full names only. @key{TAB} and
1624@key{SPC} complete
1625variable names. Typing `=' will complete the name and then will prompt for
1626a value, if applicable. For instance, @kbd{:se au @key{SPC}} will complete the
1627command to @kbd{:set autoindent}; @kbd{:se ta @key{SPC}} will complete the command
1628and prompt further like this: @kbd{:set tabstop = }.
1629However, typing @kbd{:se ts @key{SPC}} will produce a ``No match'' message
1630because @kbd{ts} is an abbreviation for @kbd{tabstop} and Viper supports
1631completion on full names only. However, you can still hit @key{RET}
1632or @kbd{=}, which will complete the command like this: @kbd{:set ts = } and
1633Viper will be waiting for you to type a value for the tabstop variable.
1634To get the full list of Vi variables, type @kbd{:se @key{SPC} @key{TAB}}.
1635
1636@table @code
1637@item viper-auto-indent nil
1638@itemx :se ai (:se autoindent)
1639@itemx :se ai-g (:se autoindent-global)
1640If @code{t}, enable auto indentation.
1641by @key{RET}, @kbd{o} or @kbd{O} command.
1642
1643@code{viper-auto-indent} is a local variable. To change the value globally, use
1644@code{setq-default}. It may be useful for certain major modes to have their
1645own values of @code{viper-auto-indent}. This can be achieved by using
1646@code{setq} to change the local value of this variable in the hooks to the
1647appropriate major modes.
1648
1649@kbd{:se ai} changes the value of @code{viper-auto-indent} in the current
1650buffer only; @kbd{:se ai-g} does the same globally.
1651@item viper-electric-mode t
1652If not @code{nil}, auto-indentation becomes electric, which means that
1653@key{RET}, @kbd{O}, and @kbd{o} indent cursor according to the current
1654major mode. In the future, this variable may control additional electric
1655features.
1656
1657This is a local variable: @code{setq} changes the value of this variable
1658in the current buffer only. Use @code{setq-default} to change the value in
1659all buffers.
1660@item viper-case-fold-search nil
1661@itemx :se ic (:se ignorecase)
1662If not @code{nil}, search ignores cases.
1663This can also be toggled by quickly hitting @kbd{/} twice.
1664@item viper-re-search nil
1665@itemx :se magic
1666If not @code{nil}, search will use regular expressions; if @code{nil} then
1667use vanilla search.
1668This behavior can also be toggled by quickly hitting @kbd{/} trice.
1669@item buffer-read-only
1670@itemx :se ro (:se readonly)
1671Set current buffer to read only. To change globally put
1672@code{(setq-default buffer-read-only t)} in your @file{.emacs} file.
1673@item blink-matching-paren t
1674@itemx :se sm (:se showmatch)
1675Show matching parens by blinking cursor.
1676@item tab-width t (default setting via @code{setq-default})
1677@itemx :se ts=value (:se tabstop=value)
1678@itemx :se ts-g=value (:se tabstop-global=value)
1679@code{tab-width} is a local variable that controls the width of the tab stops.
1680To change the value globally, use @code{setq-default}; for local settings,
1681use @code{setq}.
1682
1683The command @kbd{:se ts}
1684sets the tab width in the current
1685buffer only; it has no effect on other buffers.
1686
1687The command @kbd{:se ts-g} sets tab width globally,
1688for all buffers where the tab is not yet set locally,
1689including the new buffers.
1690
1691Note that typing @key{TAB} normally
1692doesn't insert the tab, since this key is usually bound to
1693a text-formatting function, @code{indent-for-tab-command} (which facilitates
1694programming and document writing). Instead, the tab is inserted via the
1695command @code{viper-insert-tab}, which is bound to @kbd{S-tab} (shift + tab).
1696
1697On some non-windowing terminals, Shift doesn't modify the @key{TAB} key, so
1698@kbd{S-tab} behaves as if it were @key{TAB}. In such a case, you will have
1699to bind @code{viper-insert-tab} to some other convenient key.
1700
1701@item viper-shift-width 8
1702@itemx :se sw=value (:se shiftwidth=value)
1703The number of columns shifted by @kbd{>} and @kbd{<} commands.
1704@item viper-search-wrap-around t
1705@itemx :se ws (:se wrapscan)
1706If not @code{nil}, search wraps around the end/beginning of buffer.
1707@item viper-search-scroll-threshold 2
1708If search lands within this many lines of the window top or bottom, the
1709window will be scrolled up or down by about 1/7-th of its size, to reveal
f99f1641 1710the context. If the value is negative, don't scroll.
4009494e
GM
1711@item viper-tags-file-name "TAGS"
1712The name of the file used as the tag table.
1713@item viper-re-query-replace nil
1714If not @code{nil}, use reg-exp replace in query replace.
1715@item viper-want-ctl-h-help nil
1716If not @code{nil}, @kbd{C-h} is bound to @code{help-command};
1717otherwise, @kbd{C-h} is bound as usual in Vi.
1718@item viper-vi-style-in-minibuffer t
1719If not @code{nil}, Viper provides a high degree of compatibility with Vi
9ff0b02b
MK
1720insert mode when you type text in the minibuffer; if @code{nil}, typing in
1721the minibuffer feels like plain Emacs.
4009494e
GM
1722@item viper-no-multiple-ESC t
1723If you set this to @code{nil}, you can use @key{ESC} as Meta in Vi state.
1724Normally, this is not necessary, since graphical displays have separate
1725Meta keys (usually on each side of the space bar). On a dumb terminal, Viper
1726sets this variable to @code{twice}, which is almost like @code{nil}, except
1727that double @key{ESC} beeps. This, too, lets @key{ESC} to be used as a Meta.
4009494e
GM
1728@item viper-fast-keyseq-timeout 200
1729Key sequences separated by this many milliseconds are treated as Vi-style
1730keyboard macros. If the key sequence is defined as such a macro, it will be
1731executed. Otherwise, it is processed as an ordinary sequence of typed keys.
1732
1733Setting this variable too high may slow down your typing. Setting it too
1734low may make it hard to type macros quickly enough.
4009494e
GM
1735@item viper-ex-style-motion t
1736Set this to @code{nil}, if you want @kbd{l,h} to cross
1737lines, etc. @xref{Movement and Markers}, for more info.
1738@item viper-ex-style-editing t
1739Set this to @code{nil}, if you want
1740@kbd{C-h} and @key{DEL} to not stop
1741at the beginning of a line in Insert state, @key{X} and @key{x} to delete
1742characters across lines in Vi command state, etc.
1743@item viper-ESC-moves-cursor-back t
1744It @code{t}, cursor moves back 1 character when switching from insert state to vi
1745state. If @code{nil}, the cursor stays where it was before the switch.
1746@item viper-always t
1747@code{t} means: leave it to Viper to decide when a buffer must be brought
1748up in Vi state,
1749Insert state, or Emacs state. This heuristics works well in virtually all
1750cases. @code{nil} means you either has to invoke @code{viper-mode} manually
1751for each buffer (or you can add @code{viper-mode} to the appropriate major mode
1752hooks using @code{viper-load-hook}).
1753
1754This option must be set in the file @file{~/.viper}.
1755@item viper-custom-file-name "~/.viper"
1756File used for Viper-specific customization.
1757Change this setting, if you want. Must be set in @file{.emacs} (not @file{.viper}!)
1758before Viper is loaded. Note that you
1759have to set it as a string inside double quotes.
1760@item viper-spell-function 'ispell-region
1761Function used by the command @kbd{#c<move>} to spell.
1762@item viper-glob-function
1763The value of this variable is the function symbol used to expand wildcard
1764symbols. This is platform-dependent. The default tries to set this variable
1765to work with most shells, MS Windows, OS/2, etc. However, if it
1766doesn't work the way you expect, you should write your own.
1767Use @code{viper-glob-unix-files} and @code{viper-glob-mswindows-files} in
1768@file{viper-util.el} as examples.
1769
1770This feature is used to expand wildcards in the Ex command @kbd{:e}.
1771Note that Viper doesn't support wildcards in the @kbd{:r} and @kbd{:w}
1772commands, because file completion is a better mechanism.
1773@findex @code{viper-glob-function}
1774
1775@item ex-cycle-other-window t
1776If not @code{nil}, @kbd{:n} and @kbd{:b} will cycle through files in another
1777window, if one exists.
1778@item ex-cycle-through-non-files nil
1779@kbd{:n} does not normally cycle through buffers. Set this to get
1780buffers also.
1781@item viper-want-emacs-keys-in-insert
1782This is set to @code{nil} for user levels 1 and 2 and to @code{t} for user
1783levels 3 and 4. Users who specify level 5 are allowed to set this variable
1784as they please (the default for this level is @code{t}). If set to
1785@code{nil}, complete Vi compatibility is provided in Insert state. This is
1786really not recommended, as this precludes you from using language-specific
1787features provided by the major modes.
1788@item viper-want-emacs-keys-in-vi
1789This is set to @code{nil} for user
1790level 1 and to @code{t} for user levels 2--4.
1791At level 5, users are allowed to set this variable as they please (the
1792default for this level is @code{t}).
1793If set to @code{nil}, complete Vi compatibility is provided
1794in Vi command state. Setting this to @code{nil} is really a bad idea,
1795unless you are a novice, as this precludes the use
1796of language-specific features provided by the major modes.
1797@item viper-keep-point-on-repeat t
1798If not @code{nil}, point is not moved when the user repeats the previous
1799command by typing `.' This is very useful for doing repeated changes with
1800the @kbd{.} key.
1801@item viper-repeat-from-history-key 'f12
1802Prefix key used to invoke the macros @kbd{f12 1} and @kbd{f12 2} that repeat
1803the second-last and the third-last destructive command.
1804Both these macros are bound (as Viper macros) to
1805@code{viper-repeat-from-history},
1806which checks the second key by which it is invoked to see which of the
1807previous commands to invoke. Viper binds @kbd{f12 1} and @kbd{f12 2} only,
1808but the user can bind more in @file{~/.viper}. @xref{Vi Macros}, for how to do
1809this.
1810@item viper-keep-point-on-undo nil
1811If not @code{nil}, Viper tries to not move point when undoing commands.
1812Instead, it will briefly move the cursor to the place where change has
1813taken place. However, if the undone piece of text is not seen in window,
1814then point will be moved to the place where the change took place.
1815Set it to @code{t} and see if you like it better.
1816@item viper-delete-backwards-in-replace nil
1817If not @code{nil}, @key{DEL} key will delete characters while moving the cursor
1818backwards. If @code{nil}, the cursor will move backwards without deleting
1819anything.
1820@item viper-replace-overlay-face 'viper-replace-overlay-face
1821On a graphical display, Viper highlights replacement regions instead of
1822putting a @samp{$} at the end. This variable controls the so called
1823@dfn{face} used to highlight the region.
1824
1825By default, @code{viper-replace-overlay-face} underlines the replacement on
1826monochrome displays and also lays a stipple over them. On color displays,
1827replacement regions are highlighted with color.
1828
1829If you know something about Emacs faces and don't like how Viper highlights
1830replacement regions, you can change @code{viper-replace-overlay-face} by
1831specifying a new face. (Emacs faces are described in the Emacs Lisp
1832reference.) On a color display, the following customization method is
1833usually most effective:
173076b4 1834@smallexample
4009494e
GM
1835(set-face-foreground viper-replace-overlay-face "DarkSlateBlue")
1836(set-face-background viper-replace-overlay-face "yellow")
173076b4 1837@end smallexample
4009494e
GM
1838For a complete list of colors available to you, evaluate the expression
1839@code{(x-defined-colors)}. (Type it in the buffer @code{*scratch*} and then
1840hit the @kbd{C-j} key.
1841
1842@item viper-replace-overlay-cursor-color "Red"
1843@vindex @code{viper-replace-overlay-cursor-color}
1844Cursor color when it is inside the replacement region.
1845This has effect only on color displays and only when Emacs runs as an X
1846application.
1847@item viper-insert-state-cursor-color nil
1848@vindex @code{viper-insert-state-cursor-color}
1849If set to a valid color, this will be the cursor color when Viper is in
1850insert state.
1851@item viper-emacs-state-cursor-color nil
1852@vindex @code{viper-emacs-state-cursor-color}
1853If set to a valid color, this will be the cursor color when Viper is in
1854emacs state.
1855@item viper-replace-region-end-delimiter "$"
1856A string used to mark the end of replacement regions. It is used only on
1857TTYs or if @code{viper-use-replace-region-delimiters} is non-@code{nil}.
1858@item viper-replace-region-start-delimiter ""
1859A string used to mark the beginning of replacement regions. It is used
1860only on TTYs or if @code{viper-use-replace-region-delimiters} is non-@code{nil}.
1861@item viper-use-replace-region-delimiters
1862If non-@code{nil}, Viper will always use @code{viper-replace-region-end-delimiter} and
1863@code{viper-replace-region-start-delimiter} to delimit replacement regions,
1864even on color displays (where this is unnecessary). By default, this
1865variable is non-@code{nil} only on TTYs or monochrome displays.
1866@item viper-allow-multiline-replace-regions t
1867If non-@code{nil}, multi-line text replacement regions, such as those produced by
1868commands @kbd{c55w}, @kbd{3C}, etc., will stay around until the user exits
1869the replacement mode. In this variable is set to @code{nil}, Viper will
1870emulate the standard Vi behavior, which supports only intra-line
1871replacement regions (and multi-line replacement regions are deleted).
1872@item viper-toggle-key "\C-z"
1873Specifies the key used to switch from Emacs to Vi and back.
1874Must be set in @file{.viper}. This variable can't be
1875changed interactively after Viper is loaded.
1876
1877In Insert state, this key acts as a temporary escape to Vi state, i.e., it
1878will set Viper up so that the very next command will be executed as if it
1879were typed in Vi state.
4009494e
GM
1880@item viper-buffer-search-char nil
1881Key used for buffer search. @xref{Viper Specials}, for details.
1882@item viper-surrounding-word-function 'viper-surrounding-word
1883The value of this variable is a function name that is used to determine
1884what constitutes a word clicked upon by the mouse. This is used by mouse
1885search and insert.
1886@item viper-search-face 'viper-search-face
1887Variable that controls how search patterns are highlighted when they are
1888found.
1889@item viper-vi-state-hook nil
1890List of parameterless functions to be run just after entering the Vi
1891command state.
1892@item viper-insert-state-hook nil
1893Same for Insert state. This hook is also run after entering Replace state.
1894@item viper-replace-state-hook nil
1895List of (parameterless) functions called just after entering Replace state
1896(and after all @code{viper-insert-state-hook}).
1897@item viper-emacs-state-hook nil
1898List of (parameterless) functions called just after switching from Vi state
1899to Emacs state.
1900@item viper-load-hook nil
1901List of (parameterless) functions called just after loading Viper. This is
1902the last chance to do customization before Viper is up and running.
1903@end table
1904@noindent
1905You can reset some of these constants in Viper with the Ex command @kbd{:set}
1906(when so indicated in the table). Or you
1907can include a line like this in your @file{.viper} file:
1908@example
1909(setq viper-case-fold-search t)
1910@end example
1911@vindex @code{viper-auto-indent}
1912@vindex @code{viper-electric-mode}
1913@vindex @code{viper-case-fold-search}
1914@vindex @code{viper-re-search}
1915@vindex @code{viper-shift-width}
1916@vindex @code{buffer-read-only}
1917@vindex @code{viper-search-wrap-around}
1918@vindex @code{viper-search-scroll-threshold}
1919@vindex @code{viper-search-face}
1920@vindex @code{viper-tags-file-name}
1921@vindex @code{viper-re-query-replace}
1922@vindex @code{viper-want-ctl-h-help}
1923@vindex @code{viper-vi-style-in-minibuffer}
1924@vindex @code{viper-no-multiple-ESC}
1925@vindex @code{viper-always}
4009494e
GM
1926@vindex @code{viper-fast-keyseq-timeout}
1927@vindex @code{viper-ex-style-motion}
1928@vindex @code{viper-ex-style-editing}
1929@vindex @code{viper-ESC-moves-cursor-back}
1930@vindex @code{viper-custom-file-name}
1931@vindex @code{viper-spell-function}
1932@vindex @code{ex-cycle-other-window}
1933@vindex @code{ex-cycle-through-non-files}
1934@vindex @code{viper-want-emacs-keys-in-insert}
1935@vindex @code{viper-want-emacs-keys-in-vi}
1936@vindex @code{viper-keep-point-on-repeat}
1937@vindex @code{viper-keep-point-on-undo}
1938@vindex @code{viper-delete-backwards-in-replace}
1939@vindex @code{viper-replace-overlay-face}
1940@vindex @code{viper-replace-region-end-symbol}
1941@vindex @code{viper-replace-region-start-symbol}
1942@vindex @code{viper-allow-multiline-replace-regions}
1943@vindex @code{viper-toggle-key}
4009494e
GM
1944@vindex @code{viper-buffer-search-char}
1945@vindex @code{viper-surrounding-word-function}
1946@vindex @code{viper-vi-state-hook}
1947@vindex @code{viper-insert-state-hook}
1948@vindex @code{viper-replace-state-hook}
1949@vindex @code{viper-emacs-state-hook}
1950
1a5d3215 1951@node Key Bindings
4009494e
GM
1952@section Key Bindings
1953
1954@cindex key bindings
1955@cindex keymaps
1956
1957Viper lets you define hot keys, i.e., you can associate keyboard keys
1958such as F1, Help, PgDn, etc., with Emacs Lisp functions (that may already
1959exist or that you will write). Each key has a "preferred form" in
1960Emacs. For instance, the Up key's preferred form is [up], the Help key's
1961preferred form is [help], and the Undo key has the preferred form [f14].
1962You can find out the preferred form of a key by typing @kbd{M-x
1963describe-key-briefly} and then typing the key you want to know about.
1964
1965Under the X Window System, every keyboard key emits its preferred form,
1966so you can just type
1967
1968@lisp
1969(global-set-key [f11] 'calendar) ; L1, Stop
1970(global-set-key [f14] 'undo) ; L4, Undo
1971@end lisp
1972
1973@noindent
1974to bind L1 (a key that exists on some SUN workstations) so it will invoke
1975the Emacs Calendar and to bind L4 so it will undo changes.
1976However, on a dumb terminal or in an Xterm window, even the standard arrow
1977keys may
1978not emit the right signals for Emacs to understand. To let Emacs know about
1979those keys, you will have to find out which key sequences they emit
1980by typing @kbd{C-q} and then the key (you should switch to Emacs state
1981first). Then you can bind those sequences to their preferred forms using
4f4a84ec 1982@code{input-decode-map} as follows:
4009494e
GM
1983
1984@lisp
1985(cond ((string= (getenv "TERM") "xterm")
4f4a84ec
SM
1986(define-key input-decode-map "\e[192z" [f11]) ; L1
1987(define-key input-decode-map "\e[195z" [f14]) ; L4, Undo
4009494e
GM
1988@end lisp
1989
1990The above illustrates how to do this for Xterm. On VT100, you would have to
1991replace "xterm" with "vt100" and also change the key sequences (the same
1992key may emit different sequences on different types of terminals).
1993
1994The above keys are global, so they are overwritten by the local maps
1995defined by the major modes and by Viper itself. Therefore, if you wish to
1996change a binding set by a major mode or by Viper, read this.
1997
1998Viper users who wish to specify their own key bindings should be concerned
1999only with the following three keymaps:
2000@code{viper-vi-global-user-map} for Vi state commands,
2001@code{viper-insert-global-user-map} for Insert state commands,
2002and @code{viper-emacs-global-user-map} for Emacs state commands (note:
2003customized bindings for Emacs state made to @code{viper-emacs-global-user-map}
2004are @emph{not} inherited by Insert state).
2005
2006For more information on Viper keymaps, see the header of the file
2007@file{viper.el}.
2008If you wish to change a Viper binding, you can use the
2009@code{define-key} command, to modify @code{viper-vi-global-user-map},
2010@code{viper-insert-global-user-map}, and @code{viper-emacs-global-user-map}, as
2011explained below. Each of these key maps affects the corresponding Viper state.
2012The keymap @code{viper-insert-global-user-map} also affects Viper's Replace
2013state.
2014
2015@noindent
2016If you want to
2017bind a key, say @kbd{C-v}, to the function that scrolls
2018page down and to make @kbd{0} display information on the current buffer,
2019putting this in @file{.viper} will do the trick in Vi state:
2020@example
2021(define-key viper-vi-global-user-map "\C-v" 'scroll-down)
2022@end example
2023@noindent
2024To set a key globally,
2025@example
2026(define-key viper-emacs-global-user-map "\C-c m" 'smail)
2027(define-key viper-vi-global-user-map "0" 'viper-info-on-file)
2028@end example
2029@noindent
2030Note, however, that this binding may be overwritten by other keymaps, since
2031the global keymap has the lowest priority.
2032To make sure that nothing will override a binding in Emacs state, you
2033can write this:
2034@example
2035(define-key viper-emacs-global-user-map "\C-c m" 'smail)
2036@end example
2037@noindent
2038To customize the binding for @kbd{C-h} in Insert state:
2039@example
173076b4
GM
2040(define-key viper-insert-global-user-map "\C-h"
2041 'my-del-backwards-function)
4009494e
GM
2042@end example
2043@noindent
2044
2045Each Emacs command key calls some Lisp function. If you have enabled the
2046Help, (@pxref{Rudimentary Changes}) @kbd{C-h k} will show you the function
2047for each specific key; @kbd{C-h b} will show all bindings, and @kbd{C-h m}
2048will provide information on the major mode in effect. If Help is not
2049enabled, you can still get help in Vi state by prefixing the above commands
2050with @kbd{\}, e.g., @kbd{\ C-h k} (or you can use the Help menu in the
2051menu bar, if Emacs runs under X).
2052
2053Viper users can also change bindings on a per major mode basis. As with
2054global bindings, this can be done separately for each of the three main Viper
2055states. To this end, Viper provides the function
2056@code{viper-modify-major-mode}.
2057@findex @code{viper-modify-major-mode}
2058
2059To modify keys in Emacs state for @code{my-favorite-major-mode}, the user
2060needs to create a sparse keymap, say, @code{my-fancy-map}, bind whatever
2061keys necessary in that keymap, and put
2062
2063@example
2064(viper-modify-major-mode 'dired-mode 'emacs-state my-fancy-map)
2065@end example
2066
2067@noindent
2068in @file{~/.viper}. To do the same in Vi and Insert states, you should use
2069@code{vi-state} and @code{insert-state}. Changes in Insert state are also
2070in effect in Replace state. For instance, suppose that the user wants to
2071use @kbd{dd} in Vi state under Dired mode to delete files, @kbd{u} to unmark
2072files, etc. The following code in @file{~/.viper} will then do the job:
2073
2074@example
2075(setq my-dired-modifier-map (make-sparse-keymap))
2076(define-key my-dired-modifier-map "dd" 'dired-flag-file-deletion)
2077(define-key my-dired-modifier-map "u" 'dired-unmark)
2078(viper-modify-major-mode 'dired-mode 'vi-state my-dired-modifier-map)
2079@end example
2080
2081A Vi purist may want to modify Emacs state under Dired mode so that
2082@kbd{k}, @kbd{l}, etc., will move around in directory buffers, as in
2083Vi. Although this is not recommended, as these keys are bound to useful
2084Dired functions, the trick can be accomplished via the following code:
2085
2086@example
2087(setq my-dired-vi-purist-map (make-sparse-keymap))
2088(define-key my-dired-vi-purist-map "k" 'viper-previous-line)
2089(define-key my-dired-vi-purist-map "l" 'viper-forward-char)
173076b4
GM
2090(viper-modify-major-mode 'dired-mode
2091 'emacs-state my-dired-vi-purist-map)
4009494e
GM
2092@end example
2093
2094Yet another way to customize key bindings in a major mode is to edit the
2095list @code{viper-major-mode-modifier-list} using the customization widget.
2096@vindex @code{viper-major-mode-modifier-list}
2097(This variable is in the Viper-misc customization group.)
2098The elements of this list are triples of the form: (major-mode viper-state
2099keymap), where the keymap contains bindings that are supposed to be active
2100in the given major mode and the given viper-state.
2101
2102Effects similar to key binding changes can be achieved by defining Vi
2103keyboard macros using the Ex commands @kbd{:map} and @kbd{:map!}. The
2104difference is that multi-key Vi macros do not override the keys they are
2105bound to, unless these keys are typed in quick succession. So, with macros,
2106one can use the normal keys alongside with the macros. If per-mode
2107modifications are needed, the user can try both ways and see which one is
2108more convenient.
2109@findex @kbd{:map}
2110@xref{Vi Macros}, for details.
2111
2112Note: in major modes that come up in @emph{Emacs state} by default, the
2113aforesaid modifications may not take place immediately (but only after the
2114buffer switches to some other Viper state and then back to Emacs state). To
2115avoid this, one should add @code{viper-change-state-to-emacs} to an
2116appropriate hook of that major mode. (Check the function
2117@code{viper-set-hooks} in @file{viper.el} for examples.) However, if you
2118did not set @code{viper-always} to @code{nil}, chances are that you won't
2119need to perform the above procedure, because Viper will take care of most
2120useful defaults.
2121
2122
2123Finally, Viper has a facility that lets the user define per-buffer
2124bindings, i.e., bindings that are in effect in some specific buffers
2125only. Unlike per-mode bindings described above, per-buffer bindings can be
2126defined based on considerations other than the major mode. This is done
2127via the function @code{viper-add-local-keys}, which lets one specify bindings
2128that should be in effect in the current buffer only and for a specific Viper
2129state. For instance,
2130@lisp
2131(viper-add-local-keys 'vi-state '(("ZZ" .@: TeX-command-master)
2132 ("ZQ" .@: viper-save-kill-buffer)))
2133@end lisp
2134@noindent
2135redefines @kbd{ZZ} to invoke @code{TeX-command-master} in @code{vi-state}
2136and @kbd{ZQ} to save-then-kill the current buffer. These bindings take
2137effect only in the buffer where this command is executed. The typical use
2138of this function is to execute the above expression from within a function
2139that is included in a hook to some major mode. For instance, the above
2140expression
2141could be called from a function, @code{my-tex-init}, which may be added to
2142@code{tex-mode-hook} as follows:
2143@lisp
2144(add-hook 'tex-mode-hook 'my-tex-init)
2145@end lisp
2146@noindent
2147When TeX mode starts, the hook is executed and the above Lisp expression is
2148evaluated. Then, the bindings for @kbd{ZZ} and @kbd{ZQ} are changed in Vi
2149command mode for all buffers in TeX mode.
2150
2151Another useful application is to bind @kbd{ZZ} to @code{send-mail}
2152in the Mail mode buffers (the specifics of this depend on which mail
2153package you are using, @code{rmail}, @code{mh-e}, @code{vm}, etc.
2154For instance, here is how to do this for @code{mh-e}, the Emacs interface
2155to MH:
2156@lisp
2157(defun mh-add-vi-keys ()
2158 "Set up ZZ for MH-e and XMH."
2159 (viper-add-local-keys 'vi-state '(("ZZ" .@: mh-send-letter))))
2160(add-hook 'mh-letter-mode-hook 'mh-add-vi-keys)
2161@end lisp
2162
2163You can also use @code{viper-add-local-keys} to set per buffer
2164bindings in Insert state and Emacs state by passing as a parameter the
2165symbols @code{insert-state} and @code{emacs-state}, respectively.
2166As with global bindings, customized local bindings done to Emacs state
2167are not inherited by Insert state.
2168
2169On rare occasions, local keys may be added by mistake. Usually this is done
2170indirectly, by invoking a major mode that adds local keys (e.g.,
2171@code{shell-mode} redefines @key{RET}). In such a case, exiting the wrong
2172major mode won't rid you from unwanted local keys, since these keys are
2173local to Viper state and the current buffer, not to the major mode.
2174In such situations, the remedy is to type @kbd{M-x viper-zap-local-keys}.
2175
2176So much about Viper-specific bindings.
2177@xref{Customization,,Customization,emacs,The GNU Emacs
2178Manual}, and the Emacs quick reference card for the general info on key
2179bindings in Emacs.
2180
4f4a84ec 2181@vindex @code{input-decode-map}
4009494e
GM
2182@vindex @code{function-key-map}
2183@vindex @code{viper-vi-global-user-map}
2184@vindex @code{viper-insert-global-user-map}
2185@vindex @code{viper-emacs-global-user-map}
2186@findex @code{viper-add-local-keys}
2187@findex @code{viper-zap-local-keys}
2188
1a5d3215
GM
2189@node Packages that Change Keymaps
2190@section Packages that Change Keymaps
4009494e
GM
2191@cindex C-c and Viper
2192@cindex Viper and C-c
2193
2194Viper is designed to coexist with all major and minor modes of Emacs. This
2195means that bindings set by those modes are generally available with Viper
2196(unless you explicitly prohibit them by setting
2197@code{viper-want-emacs-keys-in-vi} and @code{viper-want-emacs-keys-in-insert} to
2198@code{nil}).
2199If @code{viper-always} is set to @code{t} (which is the default), Viper
2200will try to bring each buffer
2201in the Viper state that is most appropriate for that buffer.
2202Usually, this would be the Vi state, but sometimes it could be the Insert
2203state or the Emacs state.
2204
2205Some major mode bindings will necessarily be overwritten by Viper. Indeed, in
2206Vi state, most of the 1-character keys are used for Vi-style editing. This
2207usually causes no problems because most packages designed for editing files
2208typically do not bind such keys. Instead, they use key sequences that start
2209with @kbd{C-x} and @kbd{C-c}. This is why it was so important for us to
2210free up @kbd{C-x} and @kbd{C-c}.
2211It is common for language-specific major modes to bind @key{TAB} and
2212@kbd{C-j} (the line feed) keys to various formatting functions. This is
2213extremely useful, but may require some getting used to for a Vi user. If you
2214decide that this feature is not for you, you can re-bind these keys as
2215explained earlier (@pxref{Customization}).
2216
2217Binding for @key{TAB} is one of the most unusual aspects of Viper for many
2218novice users. In Emacs, @key{TAB} is used to format text and programs, and
2219is extremely useful. For instance, hitting @key{TAB} causes the current
2220line to be re-indented in accordance with the context. In programming,
2221this is very important, since improper automatic indentation would
2222immediately alert the programmer to a possible error. For instance, if a
2223@kbd{)} or a @kbd{"} is missing somewhere above the current
2224line, @key{TAB} is likely to mis-indent the line.
2225
2226For this reason, Viper doesn't change the standard Emacs binding of
2227@key{TAB}, thereby sacrificing Vi compatibility
2228(except for users at level 1). Instead, in Viper, the key
2229@kbd{S-tab} (shift+ tab) is chosen to emulate Vi's @key{TAB}.
2230
2231We should note that on some non-windowing terminals, Shift doesn't modify
2232the @key{TAB} key, so @kbd{S-tab} behaves as if it were @key{TAB}. In such
2233a case, you will have to bind @code{viper-insert-tab} to some other
2234convenient key.
2235
2236Some packages, notably Dired, Gnus, Info, etc., attach special meaning to
2237common keys like @key{SPC}, @kbd{x}, @kbd{d}, @kbd{v}, and others. This
2238means that Vi command state is inappropriate for working with these
2239packages. Fortunately, these modes operate on read-only buffers and are
2240designed not for editing files, but for special-purpose browsing, reading
2241news, mail, etc., and Vi commands are meaningless in these situations. For
2242this reason, Viper doesn't force Vi state on such major modes---it
2243brings them in Emacs state. You can switch to Vi state by typing @kbd{C-z}
2244if, for instance, you want to do Vi-style search in a buffer (although,
2245usually, incremental search, which is bound to @kbd{C-s}, is sufficient in
2246these situations). But you should then switch back to Emacs state if you
2247plan to continue using these major modes productively. You can also switch
2248to Vi temporarily, to execute just one command. This is done by typing
2249@kbd{C-c \}. (In some of these modes, @kbd{/} and @kbd{:} are bound
2250Vi-style, unless these keys perform essential duties.)
2251
2252If you would like certain major modes to come up in Emacs state rather than
2253Vi state (but Viper thinks otherwise), you should put these major modes
2254on the @code{viper-emacs-state-mode-list} list and delete them from
2255@code{viper-vi-state-mode-list}.
2256Likewise, you can force Viper's Insert state on a major mode by putting it
2257in @code{viper-insert-state-mode-list}.
2258@vindex @code{viper-emacs-state-mode-list}
2259@vindex @code{viper-insert-state-mode-list}
2260@vindex @code{viper-vi-state-mode-list}
2261
2262It is also possible to impose Vi on some major modes, even though they may
2263bind common keys to specialized commands. This might make sense for modes
2264that bind only a small number of common keys. For instance, Viper subverts
2265the Shell mode by changing the bindings for @kbd{C-m} and @kbd{C-d} using
2266@code{viper-add-local-keys} described in the section on customization
2267(@pxref{Customization}).
2268
2269In some cases, some @emph{minor} modes might override certain essential
2270bindings in Vi command state. This is not a big problem because this
2271can happen only in the beginning, when the minor mode kicks in. Typing
2272@code{M-x viper-mode} will correct the situation. Viper knows about
2273several such minor modes and takes care of them, so the above trick
2274is usually not necessary. If you find that some minor mode, e.g.,
2275@code{nasty-mode} interferes with Viper, putting the following in
2276@file{.viper} should fix the problem:
2277@lisp
2278(viper-harness-minor-mode "nasty-mode")
2279@end lisp
2280@noindent
2281The argument to @code{viper-harness-minor-mode} is the name of the file for the
2282offending minor mode with the suffixes @file{.el} and @file{.elc} removed.
2283
2284It may not be always obvious which minor mode is at fault. The only
2285guidance here is to look into the file that defines the minor mode you are
2286suspecting, say @file{nasty-mode.el}, and see if it has a variable called
2287@code{nasty-mode-map}. Then check if there is a statement of the form
2288@lisp
2289(define-key nasty-mode-map key function)
2290@end lisp
2291@noindent
2292that binds the misbehaving
2293keys. If so, use the above line to harness @code{nasty-mode}. If your
2294suspicion is wrong, no harm is done if you harness a minor mode that
2295doesn't need to be harnessed.
2296
2297It is recommended to harness even those minor modes that don't override
2298Viper keys, but still have their own keymaps. A general way to
2299make a minor mode, @code{my-mode},
2300compatible with Viper is to have the file @file{my-mode.el} include the following code:
2301
2302@lisp
2303(when (fboundp 'viper-harness-minor-mode)
2304 (let ((lib (file-name-sans-extension
2305 (file-name-nondirectory load-file-name))))
2306 (viper-harness-minor-mode lib)))
2307@end lisp
2308
2309@vindex @code{viper-want-emacs-keys-in-vi}
2310@vindex @code{viper-want-emacs-keys-in-insert}
2311@vindex @code{viper-always}
2312@findex @code{viper-set-hooks}
2313@findex @code{viper-mode}
2314@findex @code{viper-harness-minor-mode}
2315@findex @code{remove-hook}
2316@findex @code{add-hook}
2317
1a5d3215 2318@node Viper Specials
4009494e
GM
2319@section Viper Specials
2320
2321Viper extends Vi with a number of useful features. This includes various
2322search functions, histories of search strings, Ex commands, insertions, and
2323Vi's destructive commands. In addition, Viper supports file name completion
2324and history, completion of Ex commands and variables, and many other
2325features. Some of these features are explained in detail elsewhere in this
2326document. Other features are explained here.
2327
2328@table @code
2329@item (viper-buffer-search-enable)
2330@item viper-buffer-search-char nil
2331Enable buffer search. Explicit call to @code{viper-buffer-search-enable}
2332sets @code{viper-buffer-search-char} to @kbd{g}. Alternatively, the user can
2333set @code{viper-buffer-search-char} in @file{.viper} to a key sequence
2334to be used for buffer search. There is no need to call
2335@code{viper-buffer-search-enable} in that case.
2336@findex @code{viper-buffer-search-enable}
2337@vindex @code{viper-buffer-search-char}
2338@item viper-toggle-search-style
2339This function, bound to @kbd{C-c /}, lets one toggle case-sensitive and
2340case-insensitive search, and also switch between plain vanilla search and
2341search via regular expressions. Without the prefix argument, the user is
2342asked which mode to toggle. With prefix argument 1, this toggles
2343case-sensitivity. With prefix argument 2, regular expression/vanilla search
2344will be toggled.
2345
2346However, we found that the most convenient way to toggle
2347these options is to bind a Vi macro to
2348bind @kbd{//} to toggles case sensitivity and to @kbd{///} to toggles
2349vanilla search. Thus, quickly hitting @kbd{/} twice will switch Viper from
2350case sensitive search to case-insensitive. Repeating this once again will
2351restore the original state. Likewise, quickly hitting @kbd{/} three times
2352will switch you from vanilla-style search to search via regular expressions.
2353If you hit something other than @kbd{/} after the first @kbd{/} or if the
2354second @kbd{/} doesn't follow quickly enough, then Viper will issue the
2355usual prompt @kbd{/} and will wait for input, as usual in Vi.
2356If you don't like this behavior, you can ``unrecord'' these macros in your
2357@file{~/.viper} file. For instance, if you don't like the above feature, put
2358this in @file{~/.viper}:
2359@example
2360(viper-set-searchstyle-toggling-macros 'undefine)
2361@end example
2362@findex @code{viper-set-searchstyle-toggling-macros}
2363
2364If you don't like this feature as a default, but would still like to have
2365it in some major modes, you can do so by first unsetting it globally, as
2366shown above, and then setting it in the desired major modes as follows:
2367@example
2368(viper-set-searchstyle-toggling-macros nil 'c-mode)
2369(viper-set-searchstyle-toggling-macros nil 'lisp-mode)
2370@end example
2371
2372@item Vi-isms in Emacs state
2373Some people find it useful to use the Vi-style search key, `/', to invoke
2374search in modes which Viper leaves in emacs-state. These modes are:
2375@code{dired-mode}, @code{mh-folder-mode},
2376@code{Info-mode}, and @code{Buffer-menu-mode}
2377(more may be added in the future). So, in the above modes, Viper binds `/'
2378so that it will behave Vi-style. Furthermore, in those major modes, Viper
2379binds `:' to invoke ex-style commands, like in vi-state. And, as described
2380above, `//' and `///' get bound to Vi-style macros that toggle
2381case-insensitivity and regexp-search.
2382
2383If you don't like these features---which I don't really understand---you
2384can unbind `/' and `:' in @code{viper-dired-modifier-map} (for Dired) or in
2385@code{viper-slash-and-colon-map}, for other modes.
2386@vindex @code{viper-slash-and-colon-map}
2387@vindex @code{viper-dired-modifier-map}
2388
2389To unbind the macros `//' and `///' for a major mode where you feel they
2390are undesirable, execute @code{viper-set-emacs-state-searchstyle-macros} with a
2391non-@code{nil} argument. This can be done either interactively, by supplying a
2392prefix argument, or by placing
2393@example
2394(viper-set-emacs-state-searchstyle-macros 'undefine)
2395@end example
2396@findex @code{viper-set-emacs-state-searchstyle-macros}
2397in the hook to the major mode (e.g., @code{dired-mode-hook}).
2398@xref{Vi Macros}, for more information on Vi macros.
2399
2400@item viper-heading-start
2401@item viper-heading-end
2402@cindex headings
2403@cindex sections
2404@cindex paragraphs
2405@cindex sentences
2406Regular Expressions for @kbd{[[} and @kbd{]]}. Note that Emacs defines
2407Regexps for paragraphs and sentences. @xref{Paragraphs,,Paragraphs and
2408Sentences,emacs,The GNU Emacs Manual}, for details.
2409@item M-x viper-set-expert-level
2410@findex @code{viper-set-expert-level}
2411Change your user level interactively.
2412@item viper-smart-suffix-list '("" "tex" "c" "cc" "el" "p")
2413@vindex @code{viper-smart-suffix-list}
2414Viper supports Emacs-style file completion when it prompts the user for a
2415file name. However, in many cases, the same directory may contain files
2416with identical prefix but different suffixes, e.g., prog.c, prog.o,
2417paper.tex, paper.dvi. In such cases, completion will stop at the `.'.
2418If the above variable is a list of strings representing suffixes, Viper will
2419try these suffixes
2420in the order listed and will check if the corresponding file exists.
2421
2422For instance, if completion stopped at `paper.'@: and the user typed
2423@key{RET},
2424then Viper will check if the files `paper.', `paper.tex', `paper.c', etc., exist.
2425It will take the first such file. If no file exists, Viper will give a chance
2426to complete the file name by typing the appropriate suffix. If `paper.'@: was
2427the intended file name, hitting return will accept it.
2428
2429To turn this feature off, set the above variable to @code{nil}.
2430
2431@item viper-insertion-ring-size 14
2432@vindex @code{viper-insertion-ring-size}
2433@cindex Insertion ring
2434Viper remembers what was previously inserted in Insert and Replace states.
2435Several such recent insertions are kept in a special ring of strings of size
2436@code{viper-insertion-ring-size}.
2437If you enter Insert or Replace state you can reinsert strings from this
2438ring by typing @kbd{C-c M-p} or @kbd{C-c M-n}. The former will search the
2439ring in
2440the direction of older insertions, and the latter will search in
2441the direction of newer insertions. Hitting @kbd{C-c M-p} or @kbd{C-c M-n}
2442in succession
2443will undo the previous insertion from the ring and insert the next item on
2444the ring. If a larger ring size is needed, change the value of the above
2445variable in the @file{~/.viper} file.
2446
2447Since typing these sequences of keys may be tedious, it is suggested that the
2448user should bind a function key, such as @kbd{f31}, as follows:
2449@example
2450(define-key viper-insert-global-user-map [f31]
2451 'viper-insert-prev-from-insertion-ring)
2452@end example
2453This binds @kbd{f31} (which is usually @kbd{R11} on a Sun workstation)
2454to the function that inserts the previous string in the insertion history.
2455To rotate the history in the opposite
2456direction, you can either bind an unused key to
2457@code{viper-insert-next-from-insertion-ring} or hit any digit (1 to 9) then
2458@kbd{f31}.
2459
2460One should not bind the above functions to @kbd{M-p} or @kbd{M-n}, since
9ff0b02b 2461this will interfere with the minibuffer histories and, possibly, other
4009494e
GM
2462major modes.
2463
2464@item viper-command-ring-size 14
2465@vindex @code{viper-command-ring-size}
2466@cindex Destructive command ring
2467@cindex Destructive command history
2468Viper keeps track of the recent history of destructive
2469commands, such as @kbd{dw}, @kbd{i}, etc.
2470In Vi state,
2471the most recent command can be re-executed by hitting `@kbd{.}', as in Vi.
2472However, repeated typing @kbd{C-c M-p} will cause Viper to show the
2473previous destructive commands in the minibuffer. Subsequent hitting `@kbd{.}'
2474will execute the command that was displayed last.
2475The key @kbd{C-c M-n} will cycle through the command history in the
2476opposite direction.
2477Since typing @kbd{C-c M-p} may be tedious, it is more convenient to bind an
2478appropriate function to an unused function key on the keyboard and use that
2479key. For instance, the following
2480@example
2481(define-key viper-vi-global-user-map [f31]
2482 'viper-prev-destructive-command)
2483@end example
2484binds the key @kbd{f31} (which is usually @kbd{R11} on a Sun workstation)
2485to the function that searches the command history in the direction of older
2486commands. To search in the opposite
2487direction, you can either bind an unused key to
2488@code{viper-next-destructive-command} or hit any digit (1 to 9) then @kbd{f31}.
2489
2490One should not bind the above functions to @kbd{M-p} or @kbd{M-n}, since
9ff0b02b 2491this will interfere with the minibuffer histories and, possibly, other
4009494e
GM
2492major modes.
2493
2494@item viper-minibuffer-vi-face 'viper-minibuffer-vi-face
2495@item viper-minibuffer-insert-face 'viper-minibuffer-insert-face
2496@item viper-minibuffer-emacs-face 'viper-minibuffer-emacs-face
2497These faces control the appearance of the minibuffer text in the
2498corresponding Viper states. You can change the appearance of these faces
44e97401 2499through Emacs's customization widget, which is accessible through the
4009494e
GM
2500menubar.
2501
2502Viper is located in this widget under the @emph{Emulations} customization
2503subgroup of the @emph{Editing} group. All Viper faces are grouped together
2504in Viper's @emph{Highlighting} customization subgroup.
2505
2506Note that only the text you type in is affected by the above faces.
9ff0b02b 2507Prompts and minibuffer messages are not affected.
4009494e
GM
2508
2509Purists who do not like adornments in the minibuffer can always zap them by
2510putting
2511@example
2512(copy-face 'default 'viper-minibuffer-vi-face)
2513(copy-face 'default 'viper-minibuffer-insert-face)
2514(copy-face 'default 'viper-minibuffer-emacs-face)
2515@end example
2516in the @file{~/.viper} file or through the customization widget, as
2517described above. However, in that case, the user will not have any
2518indication of the current Viper state in the minibuffer. (This is important
2519if the user accidentally switches to another Viper state by typing @key{ESC} or
2520@kbd{C-z}).
2521@item M-x viper-go-away
2522@findex @code{viper-go-away}
2523Make Viper disappear from the face of your running Emacs instance. If your
2524fingers start aching again, @kbd{M-x viper-mode} might save your day.
2525@item M-x toggle-viper-mode
2526@findex @code{toggle-viper-mode}
2527Toggle Viperization of Emacs on and off.
2528@end table
2529
2530@cindex Multifile documents and programs
2531
2532Viper provides some support for multi-file documents and programs.
2533If a document consists of several files we can designate one of them as a
2534master and put the following at the end of that file:
2535@lisp
2536;; Local Variables:
2537;; eval: (viper-setup-master-buffer "file1" "file2" "file3" "file4")
2538;; End:
2539@end lisp
2540@noindent
2541where @code{file1} to @code{file4} are names of files related to the master
2542file. Next time, when the master file is visited, the command
2543@code{viper-setup-master-buffer} will be evaluated and the above files will
2544be associated with the master file. Then, the new Ex command
2545@kbd{:RelatedFile} (abbr.@: @kbd{:R}) will display files 1 to 4 one after
2546another, so you can edit them. If a file is not in any Emacs buffer, it
2547will be visited. The command @kbd{PreviousRelatedFile} (abbr., @kbd{:P})
2548goes through the file list in the opposite direction.
2549@findex @kbd{:RelatedFile}
2550@findex @kbd{:PreviousRelatedFile}
2551
2552These commands are akin to @kbd{:n} and @kbd{:N}, but they allow the user to
2553focus on relevant files only.
2554
2555Note that only the master file needs to have the aforementioned block of
2556commands. Also, ";;" above can be replaced by some other
2557markers. Semicolon is good for Lisp programs, since it is considered a
2558comment designator there. For LaTeX, this could be "%%%", and for C the
2559above block should be commented out.
2560
2561Even though these commands are sometimes useful, they are no substitute for
2562the powerful @emph{tag table} facility of Emacs. Viper's @kbd{:tag} command
2563in a primitive interface to Emacs tags. @xref{Tags,Tags,Tags,emacs,
2564The GNU Emacs Manual}, for more information on tags.
2565
2566The following two commands are normally bound to a mouse click and are part
2567of Viper. They work only if Emacs runs as an application under X
2568Windows (or under some other window system for which a port of GNU Emacs 20
2569is available). Clicking the mouse when Emacs is invoked in an Xterm window
2570(using @code{emacs -nw}) will do no good.
2571
2572@table @code
2573@cindex mouse
2574@cindex mouse-search
2575@item viper-mouse-search-key (meta shift 1)
2576@vindex @code{viper-mouse-insert-key}
2577This variable controls the @emph{mouse-search} feature of Viper. The
2578default value
2579states that holding Meta and Shift keys while clicking mouse button 1
2580should initiate search for a region under the mouse pointer (defined
2581below). This command can take a prefix argument, which indicates the
2582occurrence of the pattern to search for.
2583
2584Note: while loading initially, Viper binds this mouse action only if it is
2585not already bound to something else. If you want to use the mouse-search
2586feature, and the @kbd{Meta-Shift-Mouse-1} mouse action is already bound to
2587something else, you can rebind the mouse-search feature by setting
2588@code{viper-mouse-search-key} to something else in your @code{~/.viper}
2589file:
2590@lisp
2591(setq viper-mouse-search-key '(meta 1))
2592@end lisp
2593This would bind mouse search to the action invoked by pressing the
2594Meta key and clicking mouse button 1. The allowed values of
2595@code{viper-mouse-search-key} are lists that contain a mouse-button number
2596(1,2, or 3) and any combination of the words `control', `meta', and
2597`shift'.
2598
2599If the requested mouse action (e.g., (meta 1)) is already taken for other
2600purposes then you have to confirm your intention by placing the following
2601command in @code{~/.viper} after setting @code{viper-mouse-search-key}:
2602@lisp
2603(viper-bind-mouse-search-key 'force)
2604@end lisp
2605
2606You can also change this setting interactively, through the customization
2607widget of Emacs (type @kbd{:customize}).
2608
2609The region that is chosen as a pattern to search for is determined as
2610follows. If search is invoked via a single click, Viper chooses the region
2611that lies between the beginning of the ``word'' under the pointer (``word''
2612is understood in Vi sense) and the end of that word. The only difference
2613with Vi's words is that in Lisp major modes `-' is considered an
2614alphanumeric symbol. This is done for the convenience of working with Lisp
2615symbols, which often have an `-' in them. Also, if you click on a
2616non-alphanumeric character that is not a word separator (in Vi sense) then
2617this character will also be considered alphanumeric, provided that it is
2618adjacent (from either side) to an alphanumeric character. This useful
2619feature gives added control over the patterns selected by the mouse click.
2620
2621On a double-click, the region is determined by the beginning of the current
2622Vi's ``Word'' (i.e., the largest non-separator chunk of text) and the End
2623of that ``Word'' (as determined by the @kbd{E} command).
2624
2625On a triple-click, the region consists of the entire line where the click
2626occurred with all leading and trailing spaces and tabs removed.
2627
2628@cindex mouse-insert
2629@item viper-mouse-insert-key (meta shift 2)
2630@vindex @code{viper-mouse-insert-key}
2631This variable controls the @emph{mouse-insert} feature of Viper.
2632The above default value states that
2633holding Meta and Shift keys while clicking mouse button 2
2634should insert the region surrounding the
2635mouse pointer. The rules defining this region are the same as for
2636mouse-search. This command takes an optional prefix argument, which
2637indicates how many such regions to snarf from the buffer and insert. (In
2638case of a triple-click, the prefix argument is ignored.)
2639
2640Note: while loading initially, Viper binds this mouse action only if it not
2641already bound to something else. If you want to use this feature and the
2642default mouse action is already bound, you can rebind mouse-insert by
2643placing this command in @code{~/.viper}:
2644@lisp
2645(setq viper-mouse-insert-key '(meta 2))
2646@end lisp
2647If you want to bind mouse-insert to an action even if this action is
2648already taken for other purposes in Emacs, then you should add this command
2649to @code{~/.viper}, after setting @code{viper-mouse-insert-key}:
2650@lisp
2651(viper-bind-mouse-insert-key 'force)
2652@end lisp
2653
2654This value can also be changed via the Emacs customization widget at the
2655menubar.
2656
2657@item viper-multiclick-timeout
2658This variable controls the rate at which double-clicking must occur for the
2659purpose of mouse search and mouse insert. By default, this is set to
2660@code{double-click-time} in Emacs and to
2661@code{mouse-track-multi-click-time} milliseconds in XEmacs.
2662@end table
2663@kindex @kbd{S-Mouse-1}
2664@kindex @kbd{S-Mouse-2}
2665@kindex @kbd{meta shift button1up}
2666@kindex @kbd{meta shift button2up}
2667@vindex @code{viper-multiclick-timeout}
2668@findex @code{viper-mouse-click-insert-word}
2669@findex @code{viper-mouse-click-search-word}
2670
2671Note: The above functions search and insert in the selected window of
2672the latest active frame. This means that you can click in another window or
2673another frame and have search or insertion done in the frame and window you
2674just left. This lets one use these functions in a multi-frame
2675configuration. However, this may require some getting used to. For
2676instance, if you are typing in a frame, A, and then move the mouse to frame
2677B and click to invoke mouse search, search (or insertion) will be performed
1df7defd 2678in frame A@. To perform search/insertion in frame B, you will first have to
4009494e
GM
2679shift focus there, which doesn't happen until you type a character or
2680perform some other action in frame B---mouse search doesn't shift focus.
2681
2682If you decide that you don't like the above feature and always want
2683search/insertion be performed in the frame where the click occurs, don't
2684bind (and unbind, if necessary) @code{viper-mouse-catch-frame-switch} from
2685the mouse event it is bound to.
2686
2687Mouse search is integrated with Vi-style search, so you can
2688repeat it with @kbd{n} and @kbd{N}. It should be also noted that, while
2689case-sensitivity of search in Viper is controlled by the variable
2690@code{viper-case-fold-search}, the case of mouse search is
2691controlled by the Emacs variable @code{case-fold-search}, which may be set
2692differently from @code{viper-case-fold-search}. Therefore, case-sensitivity
2693of mouse search may be different from that of the usual Vi-style search.
2694
2695Finally, if the way Viper determines the word to be searched for or to be
2696inserted is not what you want, there is a variable,
2697@code{viper-surrounding-word-function}, which can be changed to indicate
2698another function for snarfing words out of the buffer. The catch is that
2699you will then have to write such a function and make it known to your
2700Emacs. The function @code{viper-surrounding-word} in @file{viper.el} can be
2701used as a guiding example.
2702
1a5d3215 2703@node Vi Macros
4009494e
GM
2704@section Vi Macros
2705
2706@cindex Vi macros
2707
2708Viper supports much enhanced Vi-style macros and also facilitates the use
2709of Emacs-style macros. To define a temporary macro, it is generally more
2710convenient to use Emacs keyboard macro facility. Emacs keyboard macros are
2711usually defined anonymously, and the latest macro can be executed by typing
2712@kbd{C-x e} (or @kbd{*}, if Viper is in Vi state). If you need to use several
2713temporary macros, Viper lets you save them to a
2714register (a lowercase letter); such macros can then be executed by typing
2715@kbd{@@a} in Vi state (if a macro was previously saved in register
2716@kbd{a}).
2717@xref{Macros and Registers}, for details.
2718
2719If, however, you need to use a macro regularly, it must be given a
2720permanent name and saved. Emacs manual explains how to do this, but
2721invocation of named Emacs macros is quite different from Vi's. First,
2722invocation of permanent Emacs macros takes time because it requires typing
2723too many keys (to a Vi user's taste, anyway).
2724Second, binding such macros to function keys, for
2725fast access, hogs valuable real estate on the keyboard.
2726
2727Vi-style macros are better in that respect, since Vi lets the user overload
2728the meaning of key sequences: keys typed in fast succession are treated
2729specially, if this key sequence is bound to a macro.
2730
2731Viper provides Vi-style keyboard macros through the usual Ex commands,
2732@kbd{:map} and
2733@kbd{:map!}. These macros are much more powerful in Viper than
2734they are in the original Vi and in other emulators. This is because Viper
2735implements an enhanced vi-style
2736interface to the powerful Emacs keyboard macro facility.
2737
2738First, any Emacs
2739command can be executed while defining a macro, not just the Vi
2740commands. In particular, the user can invoke Emacs commands via @kbd{M-x
2741command-name} or by pressing various function keys on the keyboard. One
2742can even use the mouse, although this is usually not useful and is not
2743recommended (and macros defined with the use of the mouse cannot be saved in
2744command history and in the startup file, for future use).
2745
2746Macros defined by mixing Vi and Emacs commands are represented as
2747vectors. So, don't be confused when you see one (usually through the
2748history of Ex commands). For instance, if @kbd{gg} is defined by typing
2749@kbd{l}, the up-arrow key and @kbd{M-x next-line}, its definition will look
2750as follows in Emacs:
2751
2752@example
2753[l up (meta x) n e x t - l i n e return]
2754@end example
2755
2756Second, Viper macros are defined in a WYSIWYG style. This means that
2757commands are executed as you type them, so you can see precisely what is
2758being defined. Third, macros can be bound to arbitrary sequences of keys,
2759not just to printable keys. For instance, one can define a macro that will
2760be invoked by hitting @kbd{f3} then @kbd{f2} function keys. (The keys
2761@kbd{delete} and @kbd{backspace} are excluded; also, a macro invocation
2762sequence can't start with @key{ESC}. Some other keys, such as @kbd{f1} and
2763@kbd{help}, can't be bound to macros under Emacs, since they
2764are bound in @code{key-translation-map}, which overrides any other binding
2765the user gives to keys. In general, keys that have a binding in
2766@code{key-translation-map} can't be bound to a macro.)
2767
2768Fourth, in Viper, one can define macros that are specific to a given
2769buffer, a given major mode, or macros that are defined for all buffers. In
2770fact, the same macro name can have several different definitions: one
2771global, several definitions for various major modes, and
2772definitions for various specific buffers. Buffer-specific definitions
2773override mode-specific definitions, which, in turn, override global
2774definitions.
2775
2776As if all that is not enough, Viper (through its interface to Emacs
2777macros) lets the user define keyboard macros that ask for confirmation or
2778even prompt the user for input and then continue. To do this, one should
2779type @kbd{C-x q} (for confirmation) or @kbd{C-u C-x q} (for prompt).
2780For details, @pxref{Keyboard Macro Query,,Customization,emacs,The GNU Emacs
76f1a3c3 2781Manual}.
4009494e 2782
f99f1641 2783When the user finishes defining a macro (which is done by typing @kbd{C-x)},
4009494e
GM
2784a departure from Vi), you will be asked whether you want this
2785macro to be global, mode-specific, or buffer-specific. You will also be
2786given a chance to save the macro in your @file{~/.viper} file.
2787This is the easiest way to save a macro and make
2788it permanently available. If you work your startup files with bare hands,
2789here is how Viper saves the above macro so that it will be
2790available in Viper's Insert state (and Replace state) in buffer @code{my-buf}
2791only:
2792
2793@example
2794(viper-record-kbd-macro "gg" 'insert-state
2795 [l up (meta x) n e x t - l i n e return]
2796 "my-buf")
2797@end example
2798
2799@noindent
2800To do the same for Vi state and all buffers with the major mode
2801@code{cc-mode}, use:
2802
2803@example
2804(viper-record-kbd-macro "gg" 'vi-state
2805 [l up (meta x) n e x t - l i n e return]
2806 'cc-mode)
2807@end example
2808
2809@noindent
2810Both macro names and macro definitions are vectors of symbols that denote
2811keys on the keyboard. Some keys, like @kbd{\}, @kbd{ }, or digit-keys must
2812be escaped with a backslash. Modified keys are represented as lists. For
2813instance, holding Meta and Control and pressing @kbd{f4} is represented as
2814@kbd{(control meta f4)}.
2815If all members of a vectors are printable characters (or sequences, such as
2816@kbd{\e}, @kbd{\t}, for @key{ESC} and @key{TAB}), then they can also be represented as
2817strings:
2818
2819@example
2820(viper-record-kbd-macro "aa" 'vi-state "aaa\e" "my-buffer")
2821@end example
2822
2823@noindent
2824Thus, typing @kbd{aa} fast in Vi state will switch Viper to Insert state
2825(due to the first @kbd{a}), insert @kbd{aa}, and then it will switch back to Vi
2826state. All this will take effect only in the buffer named @code{my-buffer}.
2827
2828Note that the last argument to @code{viper-record-kbd-macro} must be either a
2829string (a buffer name), a symbol representing a major mode, or @code{t};
2830the latter says that the macro is to be defined for all buffers
2831(which is how macros are defined in original Vi).
2832
2833For convenience, Viper also lets you define Vi-style macros in its Emacs
2834state. There is no Ex command, like @kbd{:map} and @kbd{:map!} for doing
2835this, but the user can include such a macro in the @file{~/.viper} file. The
2836only thing is that the @code{viper-record-kbd-macro} command should specify
2837@code{emacs-state} instead of @code{vi-state} or @code{insert-state}.
2838
2839The user can get rid of a macro either by using the Ex commands @kbd{:unmap}
2840and @kbd{:unmap!} or by issuing a call to @code{viper-unrecord-kbd-macro}.
2841The latter is more powerful, since it can delete macros even in
2842@code{emacs-state}. However, @code{viper-unrecord-kbd-macro} is usually
2843needed only when the user needs to get rid of the macros that are already
2844predefined in Viper.
2845The syntax is:
2846@findex @code{viper-unrecord-kbd-macro}
2847@example
2848(viper-unrecord-kbd-macro macro state)
2849@end example
2850@noindent
2851The second argument must be @code{vi-state}, @code{insert-state}, or
2852@code{emacs-state}. The first argument is a name of a macro. To avoid
2853mistakes in specifying names of existing macros, type @kbd{M-x
2854viper-describe-kbd-macros} and use a name from the list displayed by this
2855command.
2856
2857If an error occurs during macro definition, Emacs
2858aborts the process, and it must be repeated. This is analogous to Vi,
2859except that in Vi the user doesn't know there is an error until the macro is
2860actually run. All that means that in order for a definition to be
2861successful, the user must do some simple planning of the process in
2862advance, to avoid errors. For instance, if you want to map @kbd{gg} to
2863@kbd{llll} in Vi state, you must make sure that there is enough room on the
2864current line. Since @kbd{l} moves the cursor forward, it may signal an
2865error on reaching the end of line, which will abort the definition.
2866
2867These precautions are necessary only when defining macros; they will help
2868avoid the need to redo the job. When macros are actually run, an error
2869during the execution will simply terminate the current execution
2870(but the macro will remain mapped).
2871
2872A macro name can be a string of characters or a vector of keys.
2873The latter makes it possible to define macros bound to, say, double-hits
2874on a function key, such as @kbd{up} or @kbd{f13}.
2875This is very useful if you run out of function keys on your keyboard; it
2876makes Viper macro facility a @emph{keyboard doubler}, so to speak.
2877
2878Elsewhere (@xref{Key Bindings}, for details), we review
2879the standard Emacs mechanism for binding function keys to commands.
2880For instance,
2881
2882@example
2883(global-set-key [f13] 'repeat-complex-command)
2884@end example
2885
2886@noindent
2887binds the key f13 to the Emacs function that repeats the last minibuffer
2888command. Under Viper, however, you may still use this key for additional
2889purposes, if you bind, say, a double-hitting action for that key to some
2890other function. Emacs doesn't allow the user to do that, but Viper does
2891this through its keyboard macro facility. To do this, type @kbd{:map }
2892first. When you are asked to enter a macro name, hit f13 twice, followed by
2893@key{RET} or @key{SPC}.
2894
2895Emacs will now start the mapping process by actually executing
2896Vi and Emacs commands, so that you could see what will happen each time the
2897macro is executed. Suppose now we wanted to bind the key sequence
2898@kbd{f13 f13} to the command @code{eval-last-sexp}. To accomplish this, we
2899can type @kbd{M-x eval-last-sexp} followed by @kbd{C-x )}.
2900If you answer positively to Viper's offer to save this macro in @file{~/.viper}
2901for future uses, the following will be inserted in that file:
2902
2903@example
2904(viper-record-kbd-macro [f16 f16] 'vi-state
2905 [(meta x) e v a l - l a s t - s e x p]
2906 'lisp-interaction-mode)
2907@end example
2908
2909To illustrate the above point, Viper provides two canned macros, which, by
2910default, are bound to @kbd{[f12 \1]} and @kbd{[f12 \2]} (invoked by typing
2911@kbd{f12} then @kbd{1} and @kbd{2}, respectively). These macros are useful
2912shortcuts to Viper's command ring history. The first macro will execute the
2913second-last destructive command (the last one is executed by @kbd{.}, as
2914usual). The second macro executes the third-last command.
2915
2916If you need to go deeper into the command history, you will have to use
2917other commands, as described earlier in this section; or you can bind,
2918say, @kbd{f12 \3} like this:
2919
2920@example
2921(viper-record-kbd-macro [f12 \3] 'vi-state
2922 [(meta x) r e p e a t - f r o m - h i s t o r y]
2923 t)
2924@end example
2925
2926
2927Note that even though the macro uses the function key @kbd{f12}, the key is
2928actually free and can still be bound to some Emacs function via
2929@code{define-key} or @code{global-set-key}.
2930
2931
2932Viper allows the user to define macro names that are prefixes of other macros.
2933For instance, one can define @kbd{[[} and @kbd{[[[[} to be macros.
2934If you type the exact sequence of such keys and then pause, Viper will
2935execute the right macro. However, if you don't pause and, say, type
2936@kbd{[[[[text} then the conflict is resolved as follows. If only one of the
2937key sequences, @kbd{[[} or @kbd{[[[[} has a definition applicable to the
2938current buffer, then, in fact, there is no conflict and the right macro
2939will be chosen. If both have applicable definitions, then the first one
2940found will be executed. Usually this is the macro with a shorter name. So,
2941in our case, @kbd{[[[[text} will cause the macro @kbd{[[} to be executed
2942twice and then the remaining keys, @kbd{t e x t}, will be processed.
2943
2944When defining macros using @kbd{:map} or @kbd{:map!}, the user enters
2945the actually keys to be used to invoke the macro. For instance, you
2946should hit the actual key @kbd{f6} if it is to be part of a macro
2947name; you do @emph{not} write @kbd{f 6}. When entering keys, Viper
2948displays them as strings or vectors (e.g., @code{"abc"} or @code{[f6
2949f7 a]}). The same holds for unmapping. Hitting @key{TAB} while
2950typing a macro name in the @kbd{:unmap} or @kbd{:unmap!} command will
2951cause name completion. Completions are displayed as strings or
2952vectors. However, as before, you don't actually type @samp{"},
2953@samp{[}, or @samp{]} that appear in the completions. These are
2954meta-symbols that indicate whether the corresponding macro name is a
2955vector or a string.
2956
2957One last difference from Vi: Vi-style keyboard macros cannot be defined in
2958terms of other Vi-style keyboard macros (but named Emacs macros are OK).
2959More precisely, while defining or executing a macro, the special meaning
2960of key sequences (as Vi macros) is ignored.
2961This is because it is all too easy to create an infinite loop in this way.
2962Since Viper macros are much more powerful than Vi's it is impossible to
2963detect such loops. In practice, this is not really a limitation but,
2964rather, a feature.
2965
9ff0b02b 2966We should also note that Vi macros are disabled in the minibuffer, which
4009494e
GM
2967helps keep some potential troubles away.
2968
2969The rate at which the user must type keys in order for them to be
2970recognized as a timeout macro is controlled by the variable
2971@code{viper-fast-keyseq-timeout}, which defaults to 200 milliseconds.
2972
2973For the most part, Viper macros defined in @file{~/.viper} can be shared
2974between X and TTY modes.
2975The problem with TTY may be that the function keys there generate sequences
2976of events instead of a single event (as under a window system).
2977Emacs maps some of these sequences back to the logical keys
2978(e.g., the sequences generated by the arrow keys are mapped to @kbd{up},
2979@kbd{left}, etc.). However, not all function keys are mapped in this way.
2980Macros that are bound to key sequences that contain such unmapped function
2981keys have to be redefined for TTY's (and possibly for every type of TTY you
2982may be using). To do this, start Emacs on an appropriate TTY device and
2983define the macro using @kbd{:map}, as usual.
2984
2985@findex @code{viper-describe-kbd-macros}
2986Finally, Viper provides a function that conveniently displays all macros
2987currently defined. To see all macros along with their definitions, type
2988@kbd{M-x viper-describe-kbd-macros}.
2989
1a5d3215 2990@node Commands
4009494e
GM
2991@chapter Commands
2992
2993This section is a semi-automatically bowdlerized version of the Vi
2994reference created by @* @samp{maart@@cs.vu.nl} and others. It can be
76f1a3c3 2995found on the Vi archives. This reference has been adapted for Viper.
4009494e
GM
2996
2997@menu
9360256a
GM
2998* Groundwork:: Textual Conventions and Viper basics
2999* Text Handling:: Moving, Editing, Undoing.
3000* Display:: Scrolling.
3001* File and Buffer Handling:: Editing, Writing and Quitting.
3002* Mapping:: Mapping Keys, Keyboard Macros
3003* Shell Commands:: Accessing Shell Commands, Processing Text
3004* Options:: Ex options, the @kbd{:set} commands
3005* Emacs Related Commands:: Meta Keys, Windows
4009494e
GM
3006* Mouse-bound Commands:: Search and insertion of text
3007@end menu
3008
1a5d3215 3009@node Groundwork
4009494e
GM
3010@section Groundwork
3011
3012The VI command set is based on the idea of combining motion commands
3013with other commands. The motion command is used as a text region
3014specifier for other commands.
3015We classify motion commands into @dfn{point commands} and
76f1a3c3 3016@dfn{line commands}.
4009494e
GM
3017
3018@cindex point commands
3019
3020The point commands are:
3021
3022@quotation
3023@kbd{h}, @kbd{l}, @kbd{0}, @kbd{$}, @kbd{w}, @kbd{W}, @kbd{b}, @kbd{B},
3024@kbd{e}, @kbd{E}, @kbd{(}, @kbd{)}, @kbd{/}, @kbd{?}, @kbd{`}, @kbd{f},
3025@kbd{F}, @kbd{t}, @kbd{T}, @kbd{%}, @kbd{;}, @kbd{,}, @kbd{^}
3026@end quotation
3027
3028@cindex line commands
3029
3030The line commands are:
3031
3032@quotation
3033@kbd{j}, @kbd{k}, @kbd{+}, @kbd{-}, @kbd{H}, @kbd{M}, @kbd{L}, @kbd{@{},
3034@kbd{@}}, @kbd{G}, @kbd{'}, @kbd{[[}, @kbd{]]}, @kbd{[]}
3035@end quotation
3036@noindent
3037
3038Text Deletion Commands (@pxref{Deleting Text}), Change commands
3039(@pxref{Changing Text}), even Shell Commands (@pxref{Shell Commands})
3040use these commands to describe a region of text to operate on.
3041
3042@cindex r and R region specifiers
3043
3044Viper adds two region descriptors, @kbd{r} and @kbd{R}. These describe
3045the Emacs regions (@pxref{Basics}), but they are not movement commands.
3046
3047The command description uses angle brackets @samp{<>} to indicate
3048metasyntactic variables, since the normal conventions of using simple
3049text can be confusing with Viper where the commands themselves are
3050characters. Watch out where @kbd{<} shift commands and @kbd{<count>} are
3051mentioned together!!!
3052
3053@kindex <move>
3054@kindex <a-z>
3055@kindex <address>
3056@cindex <move>
3057@cindex <a-z>
3058@cindex <address>
3059@cindex movements
3060
3061@samp{<move>} refers to the above movement commands, and @samp{<a-z>}
3062refers to registers or textmarkers from @samp{a} to @samp{z}. Note
3063that the @samp{<move>} is described by full move commands, that is to
3064say they will take counts, and otherwise behave like normal move commands.
3065@cindex Ex addresses
3066@samp{<address>} refers to Ex line addresses, which include
3067
3068@table @kbd
3069@item .@: <No address>
3070Current line
3071@item .+n .-n
3072Add or subtract for current line
3073@item number
3074Actual line number, use @kbd{.=} to get the line number
3075@item '<a-z>
3076Textmarker
3077@item $
3078Last line
3079@item x,y
3080Where x and y are one of the above
3081@item %
3082@cindex % (Ex address)
3083For the whole file, same as (1,$).
3084@item /<pat>/
3085@itemx ?<pat>?
3086Next or previous line with pattern <pat>.
3087
3088Note that the pattern is allowed to contain newline character (inserted as
3089@kbd{C-qC-j}). Therefore, one can search for patterns that span several
3090lines.
3091@end table
3092
3093@cindex % (Current file)
3094Note that @samp{%} is used in Ex commands @kbd{:e} and @kbd{:r <shell-cmd>}
3095to mean current file. If you want a @samp{%} in your command, it must be
3096escaped as @samp{\%}. Note that @kbd{:w} and the regular @kbd{:r <file>}
3097command doesn't support the meta symbols @samp{%} and @samp{#}, because
3098file history is a better mechanism.
3099@cindex # (Previous file)
3100Similarly, @samp{#} expands to the previous file. The previous file is
3101the first file in @kbd{:args} listing. This defaults to previous window
3102in the VI sense if you have one window only.
3103
3104@kindex <args>
3105@kindex <cmd>
3106@cindex <args>
3107@cindex <cmd>
3108@noindent
3109Others like @samp{<args> -- arguments}, @samp{<cmd> -- command} etc.
3110should be fairly obvious.
3111
3112@noindent
3113Common characters referred to include:
3114
3115@table @kbd
3116@item <sp>
3117Space
3118@item <ht>
3119Tab
3120@item <lf>
3121Linefeed
3122@item <esc>
3123Escape
3124@item <cr>
3125Return, Enter
3126@end table
3127@cindex <cr>
3128@cindex <esc>
3129@cindex <lf>
3130@cindex <ht>
3131@cindex <sp>
3132
3133@cindex words
3134@cindex WORDS
3135@cindex char
3136@cindex CHAR
3137
3138We also use @samp{word} for alphanumeric/non-alphanumeric words, and
3139@samp{WORD} for whitespace delimited words. @samp{char} refers to any
3140@acronym{ASCII} character, @samp{CHAR} to non-whitespace character.
3141Brackets @samp{[]} indicate optional parameters; @samp{<count>} also
3142optional, usually defaulting to 1. Brackets are elided for
3143@samp{<count>} to eschew obfuscation.
3144
3145Viper's idea of Vi's words is slightly different from Vi. First, Viper
3146words understand Emacs symbol tables. Therefore, all symbols declared to be
3147alphanumeric in a symbol table can automatically be made part of the Viper
3148word. This is useful when, for instance, editing text containing European,
3149Cyrillic, Japanese, etc., texts.
3150
3151Second, Viper lets you depart from Vi's idea of a word by changing the a
3152syntax preference via the customization widget (the variable
3153@code{viper-syntax-preference}) or by executing
3154@code{viper-set-syntax-preference} interactively.
3155
3156By default, Viper syntax preference is @code{reformed-vi}, which means that
3157Viper considers only those symbols to be part of a word that are specified
3158as word-symbols by the current Emacs syntax table (which may be different
3159for different major modes) plus the underscore symbol @kbd{_}, minus the
3160symbols that are not considered words in Vi (e.g., `,',;, etc.), but may be
3161considered as word-symbols by various Emacs major modes. Reformed-Vi works
3162very close to Vi, and it also recognizes words in other
3163alphabets. Therefore, this is the most appropriate mode for editing text
3164and is likely to fit all your needs.
3165
3166You can also set Viper syntax preference to @code{strict-vi}, which would
3167cause Viper to view all non-English letters as non-word-symbols.
3168
3169You can also specify @code{emacs} as your preference, which would
3170make Viper use exactly the same notion of a word as Emacs does. In
3171particular, the underscore may not be part of a word in some major modes.
3172
3173Finally, if @code{viper-syntax-preference} is set to @code{extended}, Viper
3174words would consist of characters that are classified as alphanumeric
3175@emph{or} as parts of symbols. This is convenient for editing programs.
3176
3177@code{viper-syntax-preference} is a local variable, so it can have different
3178values for different major modes. For instance, in programming modes it can
3179have the value @code{extended}. In text modes where words contain special
3180characters, such as European (non-English) letters, Cyrillic letters, etc.,
3181the value can be @code{reformed-vi} or @code{emacs}.
3182If you consider using different syntactic preferences for different major
3183modes, you should execute, for example,
3184
3185@example
3186(viper-set-syntax-preference nil "extended")
3187@end example
3188
3189in the appropriate major mode hooks.
3190
3191@vindex @code{viper-syntax-preference}
3192@findex @code{viper-set-syntax-preference}
3193@cindex syntax table
3194
3195
3196
3197The above discussion concerns only the movement commands. In regular
3198expressions, words remain the same as in Emacs. That is, the expressions
44e97401 3199@code{\w}, @code{\>}, @code{\<}, etc., use Emacs's idea of what is a word,
4009494e
GM
3200and they don't look into the value of variable
3201@code{viper-syntax-preference}. This is because Viper avoids changing
3202syntax tables in order to not thwart the various major modes that set these
3203tables.
3204
65e7ca35 3205The usual Emacs convention is used to indicate Control Characters, i.e.,
4009494e
GM
3206C-h for Control-h. @emph{Do not confuse this with a sequence of separate
3207characters
3208C, -, h!!!} The @kbd{^} is itself, never used to indicate a
3209Control character.
3210
3211Finally, we note that Viper's Ex-style commands can be made to work on the
3212current Emacs region. This is done by typing a digit argument before
3213@kbd{:}. For instance, typing @kbd{1:} will prompt you with something like
3214@emph{:123,135}, assuming that the current region starts at line 123 and
3215ends at line 135. There is no need to type the line numbers, since Viper
3216inserts them automatically in front of the Ex command.
3217@cindex Ex commands
3218
1a5d3215 3219@node Text Handling
4009494e
GM
3220@section Text Handling
3221
3222@menu
9360256a
GM
3223* Move Commands:: Moving, Searching
3224* Marking:: Textmarkers in Viper and the Emacs Mark.
3225* Appending Text:: Text insertion, Shifting, Putting
3226* Editing in Insert State:: Autoindent, Quoting etc.
3227* Deleting Text:: Deleting
3228* Changing Text:: Changing, Replacement, Joining
3229* Search and Replace:: Searches, Query Replace, Pattern Commands
3230* Yanking:: Yanking, Viewing Registers
3231* Undoing:: Multiple Undo, Backups
4009494e
GM
3232@end menu
3233
1a5d3215 3234@node Move Commands
4009494e
GM
3235@subsection Move Commands
3236
3237@cindex movement commands
3238@cindex searching
3239@cindex textmarkers
3240@cindex markers
3241@cindex column movement
3242@cindex paragraphs
3243@cindex headings
3244@cindex sections
3245@cindex sentences
3246@cindex matching parens
3247@cindex paren matching
3248
3249@table @kbd
3250@item <count> h C-h
3251<count> chars to the left.
3252@item <count> j <lf> C-n
3253<count> lines downward.
3254@item <count> l <sp>
3255<count> chars to the right.
3256@item <count> k C-p
3257<count> lines upward.
3258@item <count> $
3259To the end of line <count> from the cursor.
3260@item <count> ^
f99f1641 3261To the first CHAR <count> @minus{} 1 lines lower.
4009494e
GM
3262@item <count> -
3263To the first CHAR <count> lines higher.
3264@item <count> + <cr>
3265To the first CHAR <count> lines lower.
3266@item 0
3267To the first char of the line.
3268@item <count> |
3269To column <count>
3270@item <count> f<char>
3271<count> <char>s to the right (find).
3272@item <count> t<char>
3273Till before <count> <char>s to the right.
3274@item <count> F<char>
3275<count> <char>s to the left.
3276@item <count> T<char>
3277Till after <count> <char>s to the left.
3278@item <count> ;
3279Repeat latest @kbd{f t F T} <count> times.
3280@item <count> ,
3281Repeat latest @kbd{f t F T}
3282<count> times in opposite direction.
3283@item <count> w
3284<count> words forward.
3285@item <count> W
3286<count> WORDS forward.
3287@item <count> b
3288<count> words backward.
3289@item <count> B
3290<count> WORDS backward.
3291@item <count> e
3292To the end of word <count> forward.
3293@item <count> E
3294To the end of WORD <count> forward.
3295@item <count> G
3296Go to line <count> (default end-of-file).
3297@item <count> H
3298To line <count> from top of the screen (home).
3299@item <count> L
3300To line <count> from bottom of the screen (last).
3301@item M
3302To the middle line of the screen.
3303@item <count> )
3304<count> sentences forward.
3305@item <count> (
3306<count> sentences backward.
3307@item <count> @}
3308<count> paragraphs forward.
3309@item <count> @{
3310<count> paragraphs backward.
3311@item <count> ]]
3312To the <count>th heading.
3313@item <count> [[
3314To the <count>th previous heading.
3315@item <count> []
3316To the end of <count>th heading.
3317@item m<a-z>
3318Mark the cursor position with a letter.
3319@item `<a-z>
3320To the mark.
3321@item '<a-z>
3322To the first CHAR of the line with the mark.
3323@item [<a-z>
3324Show contents of textmarker.
3325@item ]<a-z>
3326Show contents of register.
3327@item ``
3328To the cursor position before the latest absolute
3329jump (of which are examples @kbd{/} and @kbd{G}).
3330@item ''
3331To the first CHAR of the line on which the cursor
3332was placed before the latest absolute jump.
3333@item <count> /<string>
3334To the <count>th occurrence of <string>.
3335@item <count> /<cr>
3336To the <count>th occurrence of <string> from previous @kbd{/ or ?}.
3337@item <count> ?<string>
3338To the <count>th previous occurrence of <string>.
3339@item <count> ?<cr>
3340To the <count>th previous occurrence of <string> from previous @kbd{?@: or /}.
3341@item n
3342Repeat latest @kbd{/} @kbd{?} (next).
3343@item N
3344Repeat latest search in opposite direction.
3345@item C-c /
3346Without a prefix argument, this command toggles
3347case-sensitive/case-insensitive search modes and plain vanilla/regular
3348expression search. With the prefix argument 1, i.e.,
3349@kbd{1 C-c /}, this toggles case-sensitivity; with the prefix argument 2,
3350toggles plain vanilla search and search using
3351regular expressions. @xref{Viper Specials}, for alternative ways to invoke
3352this function.
3353@cindex vanilla search
3354@cindex case-sensitive search
3355@cindex case-insensitive search
3356@item %
3357Find the next bracket/parenthesis/brace and go to its match.
3358By default, Viper ignores brackets/parentheses/braces that occur inside
3359parentheses. You can change this by setting
3360@code{viper-parse-sexp-ignore-comments} to @code{nil} in your @file{.viper} file.
3361This option can also be toggled interactively if you quickly hit @kbd{%%%}.
3362
3363This latter feature is implemented as a vi-style keyboard macro. If you
3364don't want this macro, put
3365
3366@example
3367(viper-set-parsing-style-toggling-macro 'undefine)
3368@end example
3369@findex @code{viper-set-parsing-style-toggling-macro}
3370
3371in your @file{~/.viper} file.
3372
3373@end table
3374@kindex @kbd{%}
3375@kindex @kbd{C-c /}
3376@kindex @kbd{N}
3377@kindex @kbd{n}
3378@kindex @kbd{?<cr>}
3379@kindex @kbd{/<cr>}
3380@kindex @kbd{?<string>}
3381@kindex @kbd{/<string>}
3382@kindex @kbd{''}
3383@kindex @kbd{``}
3384@kindex @kbd{]<a-z>}
3385@kindex @kbd{[<a-z>}
3386@kindex @kbd{'<a-z>}
3387@kindex @kbd{`<a-z>}
3388@kindex @kbd{m<a-z>}
3389@kindex @kbd{[]}
3390@kindex @kbd{[[}
3391@kindex @kbd{]]}
3392@kindex @kbd{@{}
3393@kindex @kbd{@}}
3394@kindex @kbd{(}
3395@kindex @kbd{)}
3396@kindex @kbd{M}
3397@kindex @kbd{L}
3398@kindex @kbd{H}
3399@kindex @kbd{G}
3400@kindex @kbd{E}
3401@kindex @kbd{e}
3402@kindex @kbd{B}
3403@kindex @kbd{b}
3404@kindex @kbd{W}
3405@kindex @kbd{w}
3406@kindex @kbd{,}
3407@kindex @kbd{;}
3408@kindex @kbd{T<char>}
3409@kindex @kbd{F<char>}
3410@kindex @kbd{t<char>}
3411@kindex @kbd{f<char>}
3412@kindex @kbd{|}
3413@kindex @kbd{0}
3414@kindex @kbd{<cr>}
3415@kindex @kbd{+}
3416@kindex @kbd{-}
3417@kindex @kbd{^}
3418@kindex @kbd{$}
3419@kindex @kbd{C-p}
3420@kindex @kbd{<lf>}
3421@kindex @kbd{<sp>}
3422@kindex @kbd{C-n}
3423@kindex @kbd{C-h}
3424@kindex @kbd{h}
3425@kindex @kbd{j}
3426@kindex @kbd{k}
3427@kindex @kbd{l}
3428@vindex @code{viper-parse-sexp-ignore-comments}
3429
1a5d3215 3430@node Marking
4009494e
GM
3431@subsection Marking
3432
3433Emacs mark is referred to in the region specifiers @kbd{r} and @kbd{R}.
3434@xref{Emacs Preliminaries}, and @xref{Basics}, for explanation. Also
3435see @ref{Mark,,Mark,emacs,The GNU Emacs manual}, for an explanation of
3436the Emacs mark ring.
3437
3438@cindex marking
3439
3440@table @kbd
3441@item m<a-z>
3442Mark the current file and position with the specified letter.
3443@item m .
3444Set the Emacs mark (@pxref{Emacs Preliminaries}) at point.
3445@item m ^
3446Set the Emacs mark (@pxref{Emacs Preliminaries}) back to where it was last
3447set with the @kbd{m.} command. This is useful when you set the mark with
3448@kbd{m.}, but then some other command (such as @kbd{L} or @kbd{G}) changes
3449it in a way that you didn't like.
3450@item m <
3451Set the Emacs mark at beginning of buffer.
3452@item m >
3453Set the Emacs mark at end of buffer.
3454@item m ,
3455Jump to the Emacs mark.
3456@item :mark <char>
3457Mark position with text marker named <char>. This is an Ex command.
3458@item :k <char>
3459Same as @kbd{:mark}.
3460@item ``
3461Exchange point and mark.
3462@item ''
3463Exchange point and mark and go to the first CHAR on line.
3464@item '<a-z>
3465Go to specified Viper mark.
db671917 3466@item `<a-z>
4009494e
GM
3467Go to specified Viper mark and go to the first CHAR on line.
3468@end table
3469@kindex @kbd{m<a-z>}
3470@kindex @kbd{m.}
3471@kindex @kbd{m>}
3472@kindex @kbd{m<}
3473@kindex @kbd{m,}
3474@kindex @kbd{m^}
3475@findex @kbd{:mark}
3476@findex @kbd{:k}
3477@kindex @kbd{''}
3478@kindex @kbd{``}
3479@kindex @kbd{`<a-z>}
3480@kindex @kbd{'<a-z>}
3481
1a5d3215 3482@node Appending Text
4009494e
GM
3483@subsection Appending Text
3484
3485@xref{Options}, to see how to change tab and shiftwidth size. See the GNU
3486Emacs manual, or try @kbd{C-ha tabs} (If you have turned Emacs help on).
3487Check out the variable @code{indent-tabs-mode} to put in just spaces.
3488Also see options for word-wrap.
3489
3490@cindex inserting
3491@cindex appending
3492@cindex paste
3493@cindex put
3494
3495@table @kbd
3496@item <count> a
3497<count> times after the cursor.
3498@item <count> A
3499<count> times at the end of line.
3500@item <count> i
3501<count> times before the cursor (insert).
3502@item <count> I
3503<count> times before the first CHAR of the line
3504@item <count> o
3505On a new line below the current (open).
3506The count is only useful on a slow terminal.
3507@item <count> O
3508On a new line above the current.
3509The count is only useful on a slow terminal.
3510@item <count> ><move>
3511Shift the lines described by <count><move> one
3512shiftwidth to the right (layout!).
3513@item <count> >>
3514Shift <count> lines one shiftwidth to the right.
3515@item <count> ["<a-z1-9>]p
3516Put the contents of the (default undo) buffer
3517<count> times after the cursor. The register will
3518be automatically down-cased.
3519@item <count> ["<a-z1-9>]P
3520Put the contents of the (default undo) buffer
3521<count> times before the cursor. The register will
3522@item [<a-z>
3523Show contents of textmarker.
3524@item ]<a-z>
3525Show contents of register.
3526@item <count> .
3527Repeat previous command <count> times. For destructive
3528commands as well as undo.
3529@item f1 1 and f1 2
3530While @kbd{.} repeats the last destructive command,
3531these two macros repeat the second-last and the third-last destructive
3532commands. @xref{Vi Macros}, for more information on Vi macros.
3533@item C-c M-p and C-c M-n
3534In Vi state,
3535these commands help peruse the history of Vi's destructive commands.
3536Successive typing of @kbd{C-c M-p} causes Viper to search the history in
3537the direction
3538of older commands, while hitting @kbd{C-c M-n} does so in reverse
9ff0b02b 3539order. Each command in the history is displayed in the minibuffer. The
4009494e
GM
3540displayed command can
3541then be executed by typing `@kbd{.}'.
3542
3543Since typing the above sequences of keys may be tedious, the
3544functions doing the perusing can be bound to unused keyboard keys in the
3545@file{~/.viper} file. @xref{Viper Specials}, for details.
3546@end table
3547@kindex @kbd{C-c M-p}
3548@kindex @kbd{C-c M-n}
3549@kindex @kbd{.}
3550@kindex @kbd{]<a-z>}
3551@kindex @kbd{[<a-z>}
3552@kindex @kbd{P}
3553@kindex @kbd{p}
3554@kindex @kbd{"<a-z1-9>p}
3555@kindex @kbd{"<a-z1-9>P}
3556@kindex @kbd{>>}
3557@kindex @kbd{><move>}
3558@kindex @kbd{O}
3559@kindex @kbd{o}
3560@kindex @kbd{i}
3561@kindex @kbd{A}
3562@kindex @kbd{a}
3563
1a5d3215 3564@node Editing in Insert State
4009494e
GM
3565@subsection Editing in Insert State
3566
3567Minibuffer can be edited similarly to Insert state, and you can switch
3568between Insert/Replace/Vi states at will.
9ff0b02b 3569Some users prefer plain Emacs feel in the minibuffer. To this end, set
4009494e
GM
3570@var{viper-vi-style-in-minibuffer} to @code{nil}.
3571
3572@cindex Insert state
3573
3574@table @kbd
3575@item C-v
3576Deprive the next char of its special meaning (quoting).
3577@item C-h
3578One char back.
3579@item C-w
3580One word back.
3581@item C-u
3582Back to the begin of the change on the
3583current line.
3584
3585@end table
3586@kindex @kbd{C-u}
3587@kindex @kbd{C-w}
3588@kindex @kbd{C-v}
3589
1a5d3215 3590@node Deleting Text
4009494e
GM
3591@subsection Deleting Text
3592
3593
3594There is one difference in text deletion that you should be
3595aware of. This difference comes from Emacs and was adopted in Viper
3596because we find it very useful. In Vi, if you delete a line, say, and then
3597another line, these two deletions are separated and are put back
3598separately if you use the @samp{p} command. In Emacs (and Viper), successive
3599series of deletions that are @emph{not interrupted} by other commands are
3600lumped together, so the deleted text gets accumulated and can be put back
3601as one chunk. If you want to break a sequence of deletions so that the
3602newly deleted text could be put back separately from the previously deleted
3603text, you should perform a non-deleting action, e.g., move the cursor one
3604character in any direction.
3605
3606@cindex shifting text
3607
3608@table @kbd
3609@item <count> x
3610Delete <count> chars under and after the cursor.
3611@item <count> X
3612Delete <count> chars before the cursor.
3613@item <count> d<move>
3614Delete from point to endpoint of <count><move>.
3615@item <count> dd
3616Delete <count> lines.
3617@item D
3618The rest of the line.
3619@item <count> <<move>
3620Shift the lines described by <count><move> one
3621shiftwidth to the left (layout!).
3622@item <count> <<
3623Shift <count> lines one shiftwidth to the left.
3624@end table
3625@kindex @kbd{<<}
3626@kindex @kbd{<<move>}
3627@kindex @kbd{D}
3628@kindex @kbd{dd}
3629@kindex @kbd{d<move>}
3630@kindex @kbd{X}
3631@kindex @kbd{x}
3632
1a5d3215 3633@node Changing Text
4009494e
GM
3634@subsection Changing Text
3635
3636@cindex joining lines
3637@cindex changing case
3638@cindex quoting regions
3639@cindex substitution
3640
3641@table @kbd
3642@item <count> r<char>
f99f1641 3643Replace <count> chars by <char>; no <esc>.
4009494e
GM
3644@item <count> R
3645Overwrite the rest of the line,
f99f1641 3646appending change @var{count} @minus{} 1 times.
4009494e
GM
3647@item <count> s
3648Substitute <count> chars.
3649@item <count> S
3650Change <count> lines.
3651@item <count> c<move>
3652Change from begin to endpoint of <count><move>.
3653@item <count> cc
3654Change <count> lines.
3655@item <count> C
f99f1641 3656The rest of the line and <count> @minus{} 1 next lines.
4009494e
GM
3657@item <count> =<move>
3658Reindent the region described by move.
3659@item <count> ~
3660Switch lower and upper cases.
3661@item <count> J
3662Join <count> lines (default 2).
3663@item :[x,y]s/<pat>/<repl>/<f>
3664Substitute (on lines x through y) the pattern
3665<pat> (default the last pattern) with <repl>. Useful
1df7defd 3666flags <f> are @samp{g} for @samp{global} (i.e., change every
4009494e
GM
3667non-overlapping occurrence of <pat>) and @samp{c} for
3668@samp{confirm} (type @samp{y} to confirm a particular
3669substitution, else @samp{n} ). Instead of @kbd{/} any
3670punctuation CHAR unequal to <space> <tab> and <lf> can be used as
3671delimiter.
3672
3673In Emacs, @samp{\&} stands for the last matched expression, so
3674@kbd{s/[ab]+/\&\&/} will double the string matched by @kbd{[ab]}.
3675Viper doesn't treat @samp{&} specially, unlike Vi: use @samp{\&} instead.
3676
3677Viper does not parse search patterns and does not expand special symbols
3678found there (e.g., @samp{~} is not expanded to the result of the previous
3679substitution).
3680
3681Note: @emph{The newline character (inserted as @kbd{C-qC-j})
3682can be used in <repl>}.
3683@item :[x,y]copy [z]
3684Copy text between @kbd{x} and @kbd{y} to the position after @kbd{z}.
3685@item :[x,y]t [z]
3686Same as @kbd{:copy}.
3687@item :[x,y]move [z]
3688Move text between @kbd{x} and @kbd{y} to the position after @kbd{z}.
3689@item &
1df7defd 3690Repeat latest Ex substitute command, e.g.,
4009494e
GM
3691@kbd{:s/wrong/right}.
3692@item :x,yp
3693@itemx :g/Pat/p
3694@itemx :v/Pat/p
3695The above commands display certain buffer lines in a
3696temporary buffer. The first form above displays the buffer lines between
3697@kbd{x} and @kbd{y}. The second displays the lines of the buffer, which
3698match a given pattern. The third form displays the lines that do @emph{not}
3699match the given pattern.
3700@item #c<move>
3701Change upper-case characters in the region to lower-case.
3702@item #C<move>
3703Change lower-case characters in the region to upper-case.
3704@item #q<move>
3705Insert specified string at the beginning of each line in the region
3706@item C-c M-p and C-c M-n
3707In Insert and Replace states, these keys are bound to commands that peruse
3708the history of the text
3709previously inserted in other insert or replace commands. By repeatedly typing
3710@kbd{C-c M-p} or @kbd{C-c M-n}, you will cause Viper to
3711insert these previously used strings one by one.
3712When a new string is inserted, the previous one is deleted.
3713
3714In Vi state, these keys are bound to functions that peruse the history of
3715destructive Vi commands.
3716@xref{Viper Specials}, for details.
3717@end table
3718@kindex @kbd{C-c M-p}
3719@kindex @kbd{C-c M-n}
3720@kindex @kbd{#q<move> }
3721@kindex @kbd{#C<move>}
3722@kindex @kbd{#c<move>}
3723@kindex @kbd{&}
3724@kindex @kbd{\&}
3725@findex @kbd{:substitute/<pat>/<repl>/<f>}
3726@findex @kbd{:s/<pat>/<repl>/<f>}
3727@findex @kbd{:copy [z]}
3728@findex @kbd{:t [z]}
3729@findex @kbd{:move [z]}
3730@kindex @kbd{J}
3731@kindex @kbd{~}
3732@kindex @kbd{=<move>}
3733@kindex @kbd{C}
3734@kindex @kbd{cc}
3735@kindex @kbd{c<move>}
3736@kindex @kbd{S}
3737@kindex @kbd{s}
3738@kindex @kbd{R}
3739@kindex @kbd{r<char>}
3740
1a5d3215 3741@node Search and Replace
4009494e
GM
3742@subsection Search and Replace
3743
3744@xref{Groundwork}, for Ex address syntax. @xref{Options}, to see how to
3745get literal (non-regular-expression) search and how to stop search from
3746wrapping around.
3747
3748@table @kbd
3749@item C-c /
3750Toggle case-sensitive search. With prefix argument, toggle vanilla/regular
3751expression search.
3752@item <count> /<string>
3753To the <count>th occurrence of <string>.
3754
3755Viper does not parse search patterns and does not expand special symbols
3756found there (e.g., @samp{~} is not expanded to the result of the previous
3757substitution).
3758
9ff0b02b
MK
3759After typing @kbd{/} or @kbd{?} all the usual Emacs minibuffer commands, such as
3760@kbd{M-p} and @kbd{M-n} are available. In addition, typing @kbd{C-s} will
3761insert the last search string used by the Emacs incremental search command
3762(which is bound to @kbd{C-s} everywhere except in this case).
3763
4009494e
GM
3764@item <count> ?<string>
3765To the <count>th previous occurrence of <string>.
3766@item <count> g<move>
3767Search for the text described by move. (off by default)
3768@item n
3769Repeat latest @kbd{/} @kbd{?} (next).
3770@item N
3771Idem in opposite direction.
3772@item %
3773Find the next bracket and go to its match
3774@item :[x,y]g/<string>/<cmd>
3775@cindex text processing
3776Search globally [from line x to y] for <string>
3777and execute the Ex <cmd> on each occurrence.
3778@item :[x,y]v/<string>/<cmd>
3779Execute <cmd> on the lines that don't match.
3780@item #g<move>
3781Execute the last keyboard macro for each line in the region.
3782@xref{Macros and Registers}, for more info.
3783@item Q
3784Query Replace.
3785@item :ta <name>
3786Search in the tags file where <name> is defined (file, line), and go to it.
3787@item :[x,y]s/<pat>/<repl>/<f>
3788Substitute (on lines x through y) the pattern <pat> (default the last
3789pattern) with <repl>. Useful
1df7defd 3790flags <f> are @samp{g} for @samp{global} (i.e., change every
4009494e
GM
3791non-overlapping occurrence of <pat>) and @samp{c} for
3792@samp{confirm} (type @samp{y} to confirm a particular
3793substitution, else @samp{n}). Instead of @kbd{/} any
3794punctuation character other than <space> <tab> and <lf> can be used as
3795delimiter.
3796
3797Note: @emph{The newline character (inserted as @kbd{C-qC-j})
3798can be used in <repl>}.
3799@item &
1df7defd 3800Repeat latest Ex substitute command, e.g., @kbd{:s/wrong/right}.
4009494e
GM
3801@item :global /<pattern>/<ex-command>
3802@itemx :g /<pattern>/<ex-command>
3803Execute <ex-command> on all lines that match <pattern>.
3804@item :vglobal /<pattern>/<ex-command>
3805@itemx :v /<pattern>/<ex-command>
3806Execute <ex-command> on all lines that do not match <pattern>.
3807@end table
3808@kindex @kbd{&}
3809@findex @kbd{:substitute/<pat>/<repl>/<f>}
3810@kindex @kbd{Q}
3811@kindex @kbd{#g<move>}
3812@findex @kbd{:v}
3813@findex @kbd{:g}
3814@findex @kbd{:global}
3815@findex @kbd{:vglobal}
3816@findex @kbd{:tag <name>}
3817@kindex @kbd{%}
3818@kindex @kbd{N}
3819@kindex @kbd{n}
3820@kindex @kbd{g<move>}
3821@kindex @kbd{?<string>}
3822@kindex @kbd{/<string>}
3823
1a5d3215 3824@node Yanking
4009494e
GM
3825@subsection Yanking
3826
3827@cindex cut and paste
3828@cindex paste
3829
3830@table @kbd
3831@item <count> y<move>
3832Yank from begin to endpoint of <count><move>.
3833@item <count> "<a-z>y<move>
3834Yank from begin to endpoint of <count><move> to register.
3835@item <count> "<A-Z>y<move>
3836Yank from begin to endpoint of <count><move> and append
3837to register.
3838@item <count> yy
3839<count> lines.
3840@item <count> Y
3841Idem (should be equivalent to @kbd{y$} though).
3842@item m<a-z>
3843Mark the cursor position with a letter.
3844@item [<a-z>
3845Show contents of textmarker.
3846@item ]<a-z>
3847Show contents of register.
3848@item <count> ["<a-z1-9>]p
3849Put the contents of the (default undo) buffer
3850<count> times after the cursor. The register will
3851be automatically down-cased.
3852@item <count> ["<a-z1-9>]P
3853Put the contents of the (default undo) buffer
3854<count> times before the cursor. The register will
3855@end table
3856@kindex @kbd{P}
3857@kindex @kbd{p}
3858@kindex @kbd{"<a-z1-9>p}
3859@kindex @kbd{"<a-z1-9>P}
3860@kindex @kbd{]<a-z>}
3861@kindex @kbd{[<a-z>}
3862@kindex @kbd{m<a-z>}
3863@kindex @kbd{Y}
3864@kindex @kbd{yy}
3865@kindex @kbd{"<A-Z>y<move>}
3866@kindex @kbd{"<a-z>y<move>}
3867@kindex @kbd{y<move>}
3868@kindex @kbd{yank}
3869@findex @kbd{:yank}
3870
1a5d3215 3871@node Undoing
4009494e
GM
3872@subsection Undoing
3873
3874@cindex undo
3875@cindex backup files
3876
3877@table @kbd
3878@item u U
3879Undo the latest change.
3880@item .
3881Repeat undo.
3882@item :q!
3883Quit Vi without writing.
3884@item :e!
3885Re-edit a messed-up file.
3886@item :rec
3887Recover file from autosave. Viper also creates backup files
3888that have a @samp{~} appended to them.
3889@end table
3890@findex @kbd{:rec}
3891@findex @kbd{:e!}
3892@findex @kbd{:q!}
3893@kindex @kbd{.}
3894@kindex @kbd{U}
3895@kindex @kbd{u}
3896
1a5d3215 3897@node Display
4009494e
GM
3898@section Display
3899
3900@cindex scrolling
3901
3902@table @kbd
3903@item C-g
3904At user level 1,
3905give file name, status, current line number
3906and relative position.@*
3907At user levels 2 and higher, abort the current command.
3908@item C-c g
f99f1641 3909Give file name, status, current line number and relative position---all
4009494e
GM
3910user levels.
3911@item C-l
3912Refresh the screen.
3913@item <count> C-e
3914Expose <count> more lines at bottom, cursor stays put (if possible).
3915@item <count> C-y
3916Expose <count> more lines at top, cursor stays put (if possible).
3917@item <count> C-d
3918Scroll <count> lines downward (default the number of the previous scroll;
3919initialization: half a page).
3920@item <count> C-u
3921Scroll <count> lines upward (default the number of the previous scroll;
3922initialization: half a page).
3923@item <count> C-f
3924<count> pages forward.
3925@item <count> C-b
3926<count> pages backward (in older versions @kbd{C-b} only works without count).
3927@item <count> z<cr>
3928@item zH
3929Put line <count> at the top of the window (default the current line).
3930@item <count> z-
3931@item zL
3932Put line <count> at the bottom of the window
3933(default the current line).
3934@item <count> z.
3935@item zM
3936Put line <count> in the center of the window
3937(default the current line).
3938@end table
3939@kindex @kbd{zM}
3940@kindex @kbd{zL}
3941@kindex @kbd{zH}
3942@kindex @kbd{z<cr>}
3943@kindex @kbd{z.}
3944@kindex @kbd{z-}
3945@kindex @kbd{z<cr>}
3946@kindex @kbd{C-b}
3947@kindex @kbd{C-f}
3948@kindex @kbd{C-u}
3949@kindex @kbd{C-d}
3950@kindex @kbd{C-y}
3951@kindex @kbd{C-e}
3952@kindex @kbd{C-l}
3953@kindex @kbd{C-g}
3954
3955
1a5d3215 3956@node File and Buffer Handling
4009494e
GM
3957@section File and Buffer Handling
3958
3959@cindex multiple files
3960
3961In all file handling commands, space should be typed before entering the file
3962name. If you need to type a modifier, such as @kbd{>>} or @kbd{!}, don't
3963put any space between the command and the modifier.
3964
3965Note that many Ex commands, e.g., @kbd{:w}, accept command arguments. The
3966effect is that the command would start acting on the current region. For
3967instance, if the current region spans the lines 11 through 22, then if you
3968type @kbd{1:w} you would see @samp{:11,22w} in the minibuffer.
3969
3970@table @kbd
3971@item :q
3972Quit buffer except if modified.
3973@item :q!
3974Quit buffer without checking. In Viper, these two commands
3975are identical. Confirmation is required if exiting modified buffers that
3976visit files.
3977@item :suspend
3978@item :stop
3979Suspend Viper
3980@item :[x,y] w
3981Write the file. Viper makes sure that a final newline is always added to
3982any file where this newline is missing. This is done by setting Emacs
3983variable @code{require-final-newline} to @code{t}. If you don't like this
3984feature, use @code{setq-default} to set @code{require-final-newline} to
3985@code{nil}. This must be done in @file{.viper} file.
3986@item :[x,y] w <name>
3987Write to the file <name>.
3988@item :[x,y] w>> <name>
3989Append the buffer to the file <name>. There should be no space between
3990@kbd{w} and @kbd{>>}. Type space after the @kbd{>>} and see what happens.
3991@item :w!@: <name>
3992Overwrite the file <name>. In Viper, @kbd{:w} and @kbd{:w!} are identical.
3993Confirmation is required for writing to an existing file (if this is not
3994the file the buffer is visiting) or to a read-only file.
3995@item :x,y w <name>
3996Write lines x through y to the file <name>.
3997@item :wq
3998Write the file and kill buffer.
3999@item :r <file> [<file> ...]
4000Read file into a buffer, inserting its contents after the current line.
4001@item :xit
4002Same as @kbd{:wq}.
4003@item :Write
4004@itemx :W
4005Save all unsaved buffers, asking for confirmation.
4006@item :WWrite
4007@itemx :WW
4008Like @kbd{W}, but without asking for confirmation.
4009@item ZZ
4010Save current buffer and kill it. If user level is 1, then save all files
4011and kill Emacs. Killing Emacs is the wrong way to use it, so you should
4012switch to higher user levels as soon as possible.
4013@item :x [<file>]
4014Save and kill buffer.
4015@item :x!@: [<file>]
4016@kbd{:w![<file>]} and @kbd{:q}.
4017@item :pre
f99f1641 4018Preserve the file---autosave buffers.
4009494e
GM
4019@item :rec
4020Recover file from autosave.
4021@item :f [<file>]
4022without the argument, prints file name and character/line information afout
4023the currently visited file. With an argument, sets the currently visited
4024filename to @file{file}.
4025@item :cd [<dir>]
4026Set the working directory to <dir> (default home directory).
4027@item :pwd
4028Print present working directory.
4029@item :e [+<cmd>] <files>
4030Edit files. If no filename is given, edit the file visited by the current
4031buffer. If buffer was modified or the file changed on disk, ask for
4032confirmation. Unlike Vi, Viper allows @kbd{:e} to take multiple arguments.
4033The first file is edited the same way as in Vi. The rest are visited
4034in the usual Emacs way.
4035@item :e!@: [+<cmd>] <files>
4036Re-edit file. If no filename, re-edit current file.
4037In Viper, unlike Vi, @kbd{e!} is identical to @kbd{:e}. In both cases, the
4038user is asked to confirm if there is a danger of discarding changes to a
4039buffer.
4040@item :q!
4041Quit Vi without writing.
4042@item C-^
4043Edit the alternate (normally the previous) file.
4044@item :rew
4045Obsolete
4046@item :args
4047List files not shown anywhere with counts for next
4048@item :n [count] [+<cmd>] [<files>]
4049Edit <count> file, or edit files. The count comes from @kbd{:args}.
4050@item :N [count] [+<cmd>] [<files>]
4051Like @kbd{:n}, but the meaning of the variable
4052@var{ex-cycle-other-window} is reversed.
4053@item :b
4054Switch to another buffer. If @var{ex-cycle-other-window} is @code{t},
4055switch in another window. Buffer completion is supported.
4056The variable @var{viper-read-buffer-function} controls which function is
4057actually used to read the buffer name. The default is @code{read-buffer},
4058but better alternatives are also available in Emacs (e.g.,
4059@code{iswitchb-read-buffer}).
4060@vindex @var{viper-read-buffer-function}
4061@item :B
4062Like @kbd{:b}, but the meaning of @var{ex-cycle-other-window} is reversed.
4063@item :<address>r <name>
4064Read the file <name> into the buffer after the line <address>.
4065@item v, V, C-v
4066Edit a file in current or another window, or in another frame. File name
9ff0b02b 4067is typed in minibuffer. File completion and history are supported.
4009494e
GM
4068@end table
4069@kindex @kbd{v}
4070@kindex @kbd{V}
4071@findex @kbd{:args}
4072@findex @kbd{:rew}
4073@kindex @kbd{C-^}
4074@findex @kbd{:e!@: [<files>]}
4075@findex @kbd{:e [<files>]}
4076@findex @kbd{:edit [<files>]}
4077@findex @kbd{:edit!@: [<files>]}
4078@findex @kbd{:q!}
4079@findex @kbd{:q}
4080@findex @kbd{:quit}
4081@findex @kbd{:quit!}
4082@findex @kbd{:f}
4083@findex @kbd{:rec}
4084@findex @kbd{:r}
4085@findex @kbd{:read}
4086@findex @kbd{:pre}
4087@kindex @kbd{ZZ}
4088@findex @kbd{:wq}
4089@findex @kbd{:w <file>}
4090@findex @kbd{:w!@: <file>}
4091@findex @kbd{:w >> <file>}
4092@findex @kbd{:write <file>}
4093@findex @kbd{:write!@: <file>}
4094@findex @kbd{:write >> <file>}
4095@findex @kbd{:W}
4096@findex @kbd{:WW}
4097@findex @kbd{:Write}
4098@findex @kbd{:WWrite}
4099@findex @kbd{:WWrite}
4100@findex @kbd{:x}
4101@findex @kbd{:x!}
4102@findex @kbd{:suspend}
4103@findex @kbd{:stop}
4104@findex @kbd{:n [<count> | <file>]}
4105@findex @kbd{:cd [<dir>]}
4106@findex @kbd{:pwd}
4107
1a5d3215 4108@node Mapping
4009494e
GM
4109@section Mapping
4110
4111@cindex key bindings
4112@cindex key mapping
4113
4114@table @kbd
4115@item :map <string>
4116Start defining a Vi-style keyboard macro.
4117For instance, typing
4118@kbd{:map www} followed by @kbd{:!wc %} and then typing @kbd{C-x )}
4119will cause @kbd{www} to run wc on
4120current file (Vi replaces @samp{%} with the current file name).
4121@item C-x )
4122Finish defining a keyboard macro.
4123In Viper, this command completes the process of defining all keyboard
4124macros, whether they are Emacs-style or Vi-style.
4125This is a departure from Vi, needed to allow WYSIWYG mapping of
4126keyboard macros and to permit the use of function keys and arbitrary Emacs
4127functions in the macros.
4128@item :unmap <string>
4129Deprive <string> of its mappings in Vi state.
4130@item :map!@: <string>
4131Map a macro for Insert state.
4132@item :unmap!@: <string>
4133Deprive <string> of its mapping in Insert state (see @kbd{:unmap}).
4134@item @@<a-z>
4135In Vi state,
4136execute the contents of register as a command.
4137@item @@@@
4138In Vi state,
4139repeat last register command.
4140@item @@#
4141In Vi state,
4142begin keyboard macro. End with @@<a-z>. This will
4143put the macro in the proper register. Register will
4144be automatically down-cased.
4145@xref{Macros and Registers}, for more info.
4146@item @@!<a-z>
4147In Vi state,
4148yank anonymous macro to register
4149@item *
4150In Vi state,
4151execute anonymous macro (defined by C-x( and C-x )).
4152@item C-x e
4153Like @kbd{*}, but works in all Viper states.
4154@item #g<move>
4155Execute the last keyboard macro for each line in the region.
4156@xref{Macros and Registers}, for more info.
4157@item [<a-z>
4158Show contents of textmarker.
4159@item ]<a-z>
4160Show contents of register.
4161@end table
4162@kindex @kbd{]<a-z>}
4163@kindex @kbd{[<a-z>}
4164@kindex @kbd{#g<move>}
4165@kindex @kbd{*}
4166@kindex @kbd{@@!<a-z>}
4167@kindex @kbd{@@#}
4168@kindex @kbd{@@@@}
4169@kindex @kbd{@@<a-z>}
4170@findex @kbd{:unmap <char>}
4171@findex @kbd{:map <char> <seq>}
4172@findex @kbd{:unmap!@: <char>}
4173@findex @kbd{:map!@: <char> <seq>}
4174
1a5d3215 4175@node Shell Commands
4009494e
GM
4176@section Shell Commands
4177
4178@cindex % (Current file)
4179
4180The symbol @samp{%} is used in Ex shell commands to mean current file. If
4181you want a @samp{%} in your command, it must be escaped as @samp{\%}.
4182@cindex @samp{%} (Ex address)
4183However if @samp{%} is the first character, it stands as the address for
4184the whole file.
4185@cindex @samp{#} (Previous file)
4186Similarly, @samp{#} expands to the previous file. The previous file is the
4187first file in @kbd{:args} listing. This defaults to the previous file in
76f1a3c3 4188the VI sense if you have one window.
4009494e
GM
4189
4190Symbols @samp{%} and @samp{#} are also used in the Ex commands @kbd{:e} and
4191@kbd{:r <shell-cmd>}. The commands @kbd{:w} and the regular @kbd{:r
4192<file>} command don't support these meta symbols, because file history is a
4193better mechanism.
4194
4195@cindex shell commands
4196
4197@table @kbd
4198@item :sh
4199Execute a subshell in another window
4200@item :[x,y]!<cmd>
4201Execute a shell <cmd> [on lines x through y;
4202% is replace by current file, \% is changed to %
4203@item :[x,y]!!@: [<args>]
4204Repeat last shell command [and append <args>].
4205@item :!<cmd>
4206Just execute command and display result in a buffer.
4207@item :!!@: <args>
4208Repeat last shell command and append <args>
4209@item <count> !<move><cmd>
4210The shell executes <cmd>, with standard
4211input the lines described by <count><move>,
4212next the standard output replaces those lines
4213(think of @samp{cb}, @samp{sort}, @samp{nroff}, etc.).
4214@item <count> !!<cmd>
4215Give <count> lines as standard input to the
4216shell <cmd>, next let the standard output
4217replace those lines.
4218@item :[x,y] w !<cmd>
4219Let lines x to y be standard input for <cmd>
4220(notice the <sp> between @kbd{w} and @kbd{!}).
4221@item :<address>r !<cmd>
4222Put the output of <cmd> after the line <address> (default current).
4223@item :<address>r <name>
4224Read the file <name> into the buffer after the line <address> (default
4225current).
4226@item :make
4227Run the make command in the current directory.
4228@end table
4229@findex @kbd{:<address>r <name>}
4230@findex @kbd{:<address>r !<cmd>}
4231@findex @kbd{!<cmd>}
4232@findex @kbd{!!<cmd>}
4233@findex @kbd{!<move><cmd>}
4234@findex @kbd{:w !<cmd>}
4235@findex @kbd{:x,y w !<cmd>}
4236@findex @kbd{:!!@: <args>}
4237@findex @kbd{:!<cmd>}
4238@findex @kbd{:sh}
4239@findex @kbd{:make}
4240
1a5d3215 4241@node Options
4009494e
GM
4242@section Options
4243
4244@cindex Vi options
4245
4246@table @kbd
4247@item autoindent
4248@itemx ai
4249@cindex autoindent
f99f1641 4250autoindent: In append mode after a <cr> the
4009494e
GM
4251cursor will move directly below the first
4252character on the previous line.
4253This setting affects the current buffer only.
4254@item autoindent-global
4255@itemx ai-global
4256Same as `autoindent', but affects all buffers.
4257@item noautoindent
4258@itemx noai
4259Cancel autoindent.
4260@item noautoindent-global
4261@itemx noai-g
4262Cancel autoindent-global.
4263@item ignorecase
4264@itemx ic
4265@cindex case and searching
f99f1641 4266ignorecase: No distinction between upper and lower cases when searching.
4009494e
GM
4267@item noignorecase
4268@itemx noic
4269Cancel ignorecase.
4270@item magic
4271@itemx ma
4272@cindex literal searching
4273Regular expressions used in searches; nomagic means no regexps.
4274@item nomagic
4275@item noma
4276Cancel magic.
4277@item readonly
4278@itemx ro
4279@cindex readonly files
f99f1641 4280readonly: The file is not to be changed.
4009494e
GM
4281If the user attempts to write to this file, confirmation will be requested.
4282@item noreadonly
4283@itemx noro
4284Cancel readonly.
4285@item shell=<string>
4286@itemx sh=<string>
4287@cindex shell
f99f1641 4288shell: The program to be used for shell escapes
4009494e
GM
4289(default @samp{$SHELL} (default @file{/bin/sh})).
4290@item shiftwidth=<count>
4291@itemx sw=<count>
4292@cindex layout
4293@cindex shifting text
f99f1641 4294shiftwidth: Gives the shiftwidth (default 8 positions).
4009494e
GM
4295@item showmatch
4296@itemx sm
4297@cindex paren matching
4298@cindex matching parens
f99f1641 4299showmatch: Whenever you append a @kbd{)}, Vi shows
4009494e
GM
4300its match if it's on the same page; also with
4301@kbd{@{} and @kbd{@}}. If there's no match, Vi will beep.
4302@item noshowmatch
4303@itemx nosm
4304Cancel showmatch.
4305@item tabstop=<count>
4306@itemx ts=<count>
4307@cindex changing tab width
4308@cindex tabbing
f99f1641 4309tabstop: The length of a <ht>; warning: this is
4009494e
GM
4310only IN the editor, outside of it <ht>s have
4311their normal length (default 8 positions).
4312This setting affects the current buffer only.
4313@item tabstop-global
4314@itemx ts-g
4315Same as `tabstop', but affects all buffers.
4316@item wrapmargin=<count>
4317@itemx wm=<count>
4318@cindex auto fill
4319@cindex word wrap
f99f1641 4320wrapmargin: In append mode Vi automatically
4009494e
GM
4321puts a <lf> whenever there is a <sp> or <ht>
4322within <wm> columns from the right margin.
4323@item wrapscan
4324@itemx ws
4325@cindex searching
f99f1641 4326wrapscan: When searching, the end is
4009494e
GM
4327considered @samp{stuck} to the begin of the file.
4328@item nowrapscan
4329@itemx nows
4330Cancel wrapscan.
4331@item :set <option>
4332Turn <option> on.
4333@item :set no<option>
4334Turn <option> off.
4335@item :set <option>=<value>
4336Set <option> to <value>.
4337@end table
4338@findex @kbd{:set <option>=<value>}
4339@findex @kbd{:set no<option>}
4340@findex @kbd{:set <option>}
4341@findex @kbd{:set ws}
4342@findex @kbd{:set wrapscan}
4343@findex @kbd{:set wm=<count>}
4344@findex @kbd{:set wrapmargin=<count>}
4345@findex @kbd{:set ts=<count>}
4346@findex @kbd{:set tabstop=<count>}
4347@findex @kbd{:set tab-stop-local=<count>}
4348@findex @kbd{:set sm}
4349@findex @kbd{:set showmatch}
4350@findex @kbd{:set sw=<count>}
4351@findex @kbd{:set shiftwidth=<count>}
4352@findex @kbd{:set sh=<string>}
4353@findex @kbd{:set shell=<string>}
4354@findex @kbd{:set ro}
4355@findex @kbd{:set readonly}
4356@findex @kbd{:set magic}
4357@findex @kbd{:set ic}
4358@findex @kbd{:set ignorecase}
4359@findex @kbd{:set ai}
4360@findex @kbd{:set autoindent}
4361
1a5d3215 4362@node Emacs Related Commands
4009494e
GM
4363@section Emacs Related Commands
4364
4365@table @kbd
4366@item C-\
4367Begin Meta command in Vi or Insert states. Most often used as C-\ x (M-x).
4368
4369Note: Emacs binds @kbd{C-\} to a function that offers to change the
4370keyboard input method in the multilingual environment. Viper overrides this
4371binding. However, it is still possible to switch the input method by typing
4372@kbd{\ C-\} in the Vi command state and @kbd{C-z \ C-\} in the Insert state.
4373Or you can use the MULE menu on the menubar.
4374@item C-z
4375In Insert and Replace states, prepare Viper to accept the next command and
4376execute it as if Viper was in Vi state. Then return to Insert state.
4377
4378In Vi state, switch to Emacs state; in Emacs state, switch to Vi state.
4379@item C-c \
4380Switches to Vi state for the duration of a single command. Then goes back
4381to the original Viper state. Works from Vi, Insert, Replace, and Emacs states.
4382@item C-x0
4383Close Window
4384@item C-x1
4385Close Other Windows
4386@item C-x2
4387Split Window
4388@item C-xo
4389Move among windows
4390@item C-xC-f
4391Emacs find-file, useful in Insert state
4392@item C-y
4393Put back the last killed text. Similar to Vi's @kbd{p}, but also works in
4394Insert and Replace state. This command doesn't work in Vi command state,
4395since this binding is taken for something else.
4396@item M-y
4397Undoes the last @kbd{C-y} and puts another kill from the kill ring.
4398Using this command, you can try may different kills until you find the one
4399you need.
4400@end table
4401@kindex @kbd{M-y}
4402@kindex @kbd{C-y}
4403@kindex @kbd{C-xC-f}
4404@kindex @kbd{C-xo}
4405@kindex @kbd{C-x2}
4406@kindex @kbd{C-x1}
4407@kindex @kbd{C-x0}
4408@kindex @kbd{C-z}
4409@kindex @kbd{C-\}
4410@kindex @kbd{C-c\}
4411
1a5d3215 4412@node Mouse-bound Commands
4009494e
GM
4413@section Mouse-bound Commands
4414
4415The following two mouse actions are normally bound to special search and
4416insert commands in of Viper:
4417
4418@table @kbd
4419@item S-Mouse-1
4420Holding Shift and clicking mouse button 1 will
4421initiate search for
4422a region under the mouse pointer.
4423This command can take a prefix argument. Note: Viper sets this
4424binding only if this mouse action is not
4425already bound to something else.
76f1a3c3 4426@xref{Viper Specials}, for more information.
4009494e
GM
4427
4428@item S-Mouse-2
4429Holding Shift and clicking button 2 of the mouse will
4430insert a region surrounding the mouse pointer.
4431This command can also take a prefix argument.
4432Note: Viper sets this binding only if this mouse action is not
4433already bound to something else.
76f1a3c3 4434@xref{Viper Specials}, for more details.
4009494e
GM
4435@end table
4436@kindex @kbd{S-Mouse-1}
4437@kindex @kbd{S-Mouse-2}
4438@kindex @kbd{meta button1up}
4439@kindex @kbd{meta button2up}
4440
1a5d3215
GM
4441@node GNU Free Documentation License
4442@appendix GNU Free Documentation License
4443@include doclicense.texi
4444
4445@node Acknowledgments
4009494e
GM
4446@unnumbered Acknowledgments
4447
4448Viper, formerly known as VIP-19, was written by Michael Kifer. Viper is
4449based on the original VIP package by Masahiko Sato and on its enhancement,
4450VIP 4.4, by Aamod Sane. This manual is an adaptation of the manual for VIP
44514.4, which, in turn, was based on Sato's manual for VIP 3.5.
4452
4453Many contributors on the Net pointed out bugs and suggested a number of
4454useful features. Scott Bronson and Samuel Padgett contributed patches that
4455were incorporated in this code. Here is a hopefully complete list of
4456contributors:
4457
4458@example
4459aaronl@@vitelus.com (Aaron Lehmann),
4460ahg@@panix.com (Al Gelders),
4461amade@@diagram.fr (Paul-Bernard Amade),
4462ascott@@fws214.intel.com (Andy Scott),
4463bronson@@trestle.com (Scott Bronson),
4464cook@@biostat.wisc.edu (Tom Cook),
4465csdayton@@midway.uchicago.edu (Soren Dayton),
4466dave@@hellgate.utah.edu,
4467dm@@scs.cs.nyu.edu (David Mazieres),
4468dominik@@strw.LeidenUniv.nl (Carsten Dominik),
4469dwallach@@cs.princeton.edu (Dan Wallach),
4470dwight@@toolucky.llnl.gov (Dwight Shih),
4471dxc@@xprt.net (David X Callaway),
4472edmonds@@edmonds.home.cs.ubc.ca (Brian Edmonds),
4473gin@@mo.msk.ru (Golubev I.N.),
4474gviswana@@cs.wisc.edu (Guhan Viswanathan),
1df7defd 4475gvr@@halcyon.com (George V. Reilly),
4009494e
GM
4476hatazaki@@bach.convex.com (Takao Hatazaki),
4477hpz@@ibmhpz.aug.ipp-garching.mpg.de (Hans-Peter Zehrfeld),
4478irie@@t.email.ne.jp (Irie Tetsuya),
4479jackr@@dblues.engr.sgi.com (Jack Repenning),
1df7defd 4480jamesm@@bga.com (D.J. Miller II),
4009494e
GM
4481jjm@@hplb.hpl.hp.com (Jean-Jacques Moreau),
4482jl@@cse.ogi.edu (John Launchbury),
4483jobrien@@hchp.org (John O'Brien),
4484johnw@@borland.com (John Wiegley),
4485kanze@@gabi-soft.fr (James Kanze),
4486kin@@isi.com (Kin Cho),
4487kwzh@@gnu.org (Karl Heuer),
4488lindstro@@biostat.wisc.edu (Mary Lindstrom),
4489lektu@@terra.es (Juanma Barranquero),
4490lennart.borgman.073@@student.lu.se (Lennart Borgman),
4491minakaji@@osaka.email.ne.jp (Mikio Nakajima),
4492Mark.Bordas@@East.Sun.COM (Mark Bordas),
4493meyering@@comco.com (Jim Meyering),
4494martin@@xemacs.org (Martin Buchholz),
4495mbutler@@redfernnetworks.com (Malcolm Butler),
4496mveiga@@dit.upm.es (Marcelino Veiga Tuimil),
4497paulk@@summit.esg.apertus.com (Paul Keusemann),
4498pfister@@cs.stonybrook.edu (Hanspeter Pfister),
4499phil_brooks@@MENTORG.COM (Phil Brooks),
4500pogrell@@informatik.hu-berlin.de (Lutz Pogrell),
4501pradyut@@cs.uchicago.edu (Pradyut Shah),
4502roderick@@argon.org (Roderick Schertler),
4503rxga@@ulysses.att.com,
4504sawdey@@lcse.umn.edu (Aaron Sawdey),
4505simonb@@prl.philips.co.uk (Simon Blanchard),
4506spadgett1@@nc.rr.com (Samuel Padgett),
4507stephen@@farrell.org (Stephen Farrell),
4508storm@@cua.dk (Kim F. Storm),
4509sudish@@MindSpring.COM (Sudish Joseph),
4510schwab@@issan.informatik.uni-dortmund.de (Andreas Schwab)
4511terra@@diku.dk (Morten Welinder),
4512thanh@@informatics.muni.cz (Han The Thanh),
4513toma@@convex.convex.com,
4514vrenjak@@sun1.racal.com (Milan Vrenjak),
4515whicken@@dragon.parasoft.com (Wendell Hicken),
4516zapman@@cc.gatech.edu (Jason Zapman II),
4517@end example
4518
1a5d3215 4519@node Key Index
4009494e
GM
4520@unnumbered Key Index
4521
4522@printindex ky
4523
1a5d3215 4524@node Function Index
4009494e
GM
4525@unnumbered Function Index
4526
4527@printindex fn
4528
1a5d3215 4529@node Variable Index
4009494e
GM
4530@unnumbered Variable Index
4531
4532@printindex vr
4533
1a5d3215 4534@node Package Index
4009494e
GM
4535@unnumbered Package Index
4536
4537@printindex pg
4538
1a5d3215 4539@node Concept Index
4009494e
GM
4540@unnumbered Concept Index
4541
4542@printindex cp
4543
4009494e 4544@bye