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