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