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