///////////////////////// vi Reference Warning: some vi versions don't support the more esoteric features described in this document. You can edit/redistribute this document freely, as long as you don't make false claims on original authorship. Author: Maarten Litmaath Maintainer: James Hu Version: 11 This document is also available in HTML format from . ///////////////////////// contributions Rich Salz Eamonn McManus Diomidis Spinellis Blair P. Houghton Rusty Haddock <{uunet,att,rutgers}!mimsy.umd.edu!fe2o3!rusty> Panos Tsirigotis David J. MacKenzie Kevin Carothers Dan Mercer Ze'ev Shtadler Paul Quare Dave Beyerl Lee Sailer David Gast John Arundel James Hu ///////////////////////// legenda default values : 1 <*> : `*' must not be taken literally [*] : `*' is optional ^X : X : space : carriage return : linefeed : horizontal tab : escape : your erase character : your kill character : your interrupt character : an element in the range N : number (`*' = allowed, `-' = not appropriate) CHAR : char unequal to | WORD : word followed by || ///////////////////////// move commands N | Command | Meaning ---+--------------------+----------------------------------------------- * | h | ^H | | <*> chars to the left. * | j | | ^N | <*> lines downward. * | l | | <*> chars to the right. * | k | ^P | <*> lines upward. * | $ | To the end of line <*> from the cursor. - | ^ | To the first CHAR of the line. * | _ | To the first CHAR <*> - 1 lines lower. * | - | To the first CHAR <*> lines higher. * | + | | To the first CHAR <*> lines lower. - | 0 | To the first char of the line. * | | | To column <*> (: only to the endpoint). * | f | <*> s to the right (find). * | t | Till before <*> s to the right. * | F | <*> s to the left. * | T | Till after <*> s to the left. * | ; | Repeat latest `f'|`t'|`F'|`T' <*> times. * | , | Idem in opposite direction. * | w | <*> words forward. * | W | <*> WORDS forward. * | b | <*> words backward. * | B | <*> WORDS backward. * | e | To the end of word <*> forward. * | E | To the end of WORD <*> forward. * | G | Go to line <*> (default EOF). * | H | To line <*> from top of the screen (home). * | L | To line <*> from bottom of the screen (last). - | M | To the middle line of the screen. * | ) | <*> sentences forward. * | ( | <*> sentences backward. * | } | <*> paragraphs forward. * | { | <*> paragraphs backward. - | ]] | To the next section (default EOF). - | [[ | To the previous section (default begin of file). - | ` | To the mark. - | ' | To the first CHAR of the line with the mark. - | `` | To the cursor position before the latest absolute | jump (of which are examples `/' and `G'). - | '' | To the first CHAR of the line on which the cursor | was placed before the latest absolute jump. - | /[/] | To the next occurrence of . - | /[/] | To the next occurrence of the latest search | item. - | ?[?] | To the previous occurrence of . - | ?[?] | To the previous occurrence of the latest search | item. - | //+[n] | To n-th (default 1st) line after next occurrence | of . - | ??+[n] | Idem, searching in the opposite direction. - | //-[n] | To n-th (default 1st) line before next occurrence | of . - | ??-[n] | Idem, searching in the opposite direction. - | [;] | Perform successive `/'|`?' actions. For example, | /foo/;/bar - to next `foo', then | to next `bar' | ?foo?-;/bar - to line before previous | `foo', then to next `bar' - | :/[/] | To the next line containing an occurrence of | . - | :/[/] | To the next line containing an occurrence of | the latest searched for item. - | :?[?] | To the previous line containing an occurrence | of . - | :?[?] | To the previous line containing an occurrence | of the latest searched for item. - | ://+[n] | To n-th (default 1st) line after next occurrence | of . - | :??+[n] | Idem, searching in the opposite direction. - | ://-[n] | To n-th (default 1st) line before next occurrence | of . - | :??-[n] | Idem, searching in the opposite direction. - | :[;] | Perform successive `/'|`?' actions. Each | is of the form /?[+[n]]. - | n | Repeat latest `/'|`?' (next). - | N | Idem in opposite direction. - | % | Find the next bracket and go to its match | (also with `{'|`}' and `['|`]'). - | :[x] | To the line specified by x. - | :[x]+[n] | To n-th (default 1st) line after line specified | by x. - | :[x]-[n] | To n-th (default 1st) line before line specified | by x. ///////////////////////// searching (see above) In `:' `ex' commands, an `ex' command that moves the cursor to a line of the file is a valid line number argument for commands that operate on lines and line ranges. `.' can be used as a synonym for the current line. See also `writing, editing other files, and quitting vi'. :ta | Search in the tags file[s] where is | defined (file, line), and go to it. ^] | Use the name under the cursor in a `:ta' command. ^T | Pop the previous tag off the tagstack and return | to its position. :[x,y]g// | Search globally [from line x to y] for | and execute the `ex' on each occurrence. | Multiple 's are separated by `|'. :[x,y]g//,// | Search globally [from line x to y] for and | execute the `ex' command on each line | between and the line that matches . :[x,y]v// | Execute on the lines that don't match. ///////////////////////// undoing changes u | Undo the latest change. U | Undo all changes on a line, while not having | moved off it (unfortunately). :u | Undo last substituion on line (only one) :q! | Quit vi without writing. :e! | Re-edit a messed-up file. ///////////////////////// appending text (end with ) * | a | <*> times after the cursor. * | A | <*> times at the end of line. * | i | <*> times before the cursor (insert). * | I | <*> times before the first CHAR of the line * | o | On a new line below the current (open). | The count is only useful on a slow terminal. * | O | On a new line above the current. | The count is only useful on a slow terminal. * | > | Shift the lines described by <*> one | shiftwidth to the right. * | >> | Shift <*> lines one shiftwidth to the right. * | ["]p | Put the contents of the (default undo) buffer | <*> times after the cursor. | A buffer containing lines is put only once, | below the current line. See `deleting text'. * | ["]P | Put the contents of the (default undo) buffer | <*> times before the cursor. | A buffer containing lines is put only once, | above the current line. See `deleting text'. * | . | Repeat previous command <*> times. If the last | command before a `.' command references a | numbered buffer, the buffer number is | incremented first (and the count is ignored): | | "1pu.u.u.u.u - `walk through' buffers 1 | through 5 | "1P.... - restore them - | :[x,y]t | Copy lines x through y (default current line) | to be after line . See `remembering text'. ///////////////////////// deleting text Everything deleted can be stored into a buffer. This is achieved by putting a `"' and a letter before the delete command. The deleted text will be in the buffer with the used letter. If is used as buffer name, the conjugate buffer will be augmented (i.e., appended) instead of overwritten with the text. The undo buffer always contains the latest change. Buffers <1-9> contain the latest 9 LINE deletions (`"1' is most recent). See also `remembering text'. * | x | Delete <*> chars under and after the cursor. * | X | <*> chars before the cursor. * | d | From begin to endpoint of <*>. * | dd | <*> lines. - | D | The rest of the line. * | < | Shift the lines described by <*> one | shiftwidth to the left. * | << | Shift <*> lines one shiftwidth to the left. * | . | Repeat latest command <*> times. - | :[x,y]d | Delete lines x through y | (default current line and next). ///////////////////////// changing text (end with ) * | r | Replace <*> chars by - no . * | R | Overwrite the rest of the line, | appending change <*> - 1 times. * | s | Substitute <*> chars. * | S | <*> lines. * | c | Change from begin to endpoint of <*>. * | cc | <*> lines. * | C | The rest of the line and <*> - 1 next lines. * | = | If the option `lisp' is set, this command | will realign the lines described by <*> | as though they had been typed with the option | `ai' set too. - | ~ | Switch lower and upper cases | (should be an operator, like `c'). * | J | Join <*> lines (default 2). * | . | Repeat latest command <*> times (`J' only once). - | & | Repeat latest `ex' substitute command, e.g. | `:s/wrong/good'. - | :[x,y]j | Join lines x through y | (default current line and next). - | :[x,y]j! | Idem, but with no space inbetween. - | :[x,y]m | Move lines x through y (default current line) | to be after line . See `remembering text'. - | :[x,y]s/

//| Substitute (on lines x through y) the pattern

| (default the last pattern) with . Useful | flags are `g' for `global' (i.e. change | every non-overlapping occurrence of

) and | `c' for `confirm' (type `y' to confirm a | particular substitution, else ). Instead | of `/' any punctuation CHAR unequal to | can be used as delimiter. ///////////////////////// substitute replacement patterns The basic meta-characters for the replacement pattern are `&' and `~'; these are given as `\&' and `\~' when nomagic is set. Each instance of `&' is replaced by the characters which the regular expression matched. The meta-character `~' stands, in the replacement pattern, for the defining text of the previous replacement pattern. Other meta-sequences possible in the replacement pattern are always introduced by the escaping character `\'. The sequence `\n' (with `n' in [1-9]) is replaced by the text matched by the n-th regular subexpression enclosed between `\(' and `\)'. The sequences `\u' and `\l' cause the immediately following character in the replacement to be converted to upper- or lower-case respectively if this character is a letter. The sequences `\U' and `\L' turn such conversion on, either until `\E' or `\e' is encountered, or until the end of the replacement pattern. See the `magic' option for additional meta-characters. Some examples of substitutions are shown below. :s/foo/\u& - turn `foo' into `Foo' :s/foo/\U& - turn `foo' into `FOO' :s/\(foo\) \(bar\)/\U\1\E \u\2 - turn `foo bar' into `FOO Bar' :s/foo/\u&/|s/bar/~ - capitalize foo, then capitalize bar ///////////////////////// remembering text (yanking) With yank commands you can put `"' before the command, just as with delete commands (see `deleting text'). Otherwise you only copy to the undo buffer. Using the capital letters appends to the buffer. The use of buffers is THE way of copying text to another file; see the `:e ' command. * | y | Yank from begin to endpoint of <*>. * | yy | <*> lines. * | Y | Idem (should be equivalent to `y$' though). - | :[x,y]y | Yank lines x through y into named buffer. | Using the capital letter will append to the | buffer. - | m | Mark the cursor position with a letter. - | :[x]k | Mark line x (default current) with a letter. | The letter can be used to refer to the | line in another ex command: | | :/aaa/ka - mark next line matching aaa | :'a,'a+3d - delete that line and the three | following it | :?bbb?kb - mark previous line matching bbb | :'bm. - move that line to be after current | line ///////////////////////// commands while in append|change mode ^@ | If typed as the first character of the | insertion, it is replaced with the previous | text inserted (max. 128 chars), after which | the insertion is terminated. ^V | Deprive the next char of its special meaning | (e.g. ). ^D | One shiftwidth to the left, but only if | nothing else has been typed on the line. 0^D | Remove all indentation on the current line | (there must be no other chars on the line). ^^D | Idem, but it is restored on the next line. ^T | One shiftwidth to the right, but only if | nothing else has been typed on the line. ^H | | One char back. ^W | One word back. | Back to the begin of the change on the | current line. | Like (but you get a beep as well). ///////////////////////// writing, editing other files, and quitting vi In `:' `ex' commands - if not the first CHAR on the line - `%' denotes the current file, `#' is a synonym for the alternate file (which normally is the previous file). As first CHAR on the line `%' is a shorthand for `1,$'. Marks can be used for line numbers too: '. In the `:w'|`:f'|`:cd'|`:e'|`:n' commands shell meta-characters can be used. :q | Quit vi, unless the buffer has been changed. :q! | Quit vi without writing. ^Z | Suspend vi. :w | Write the file. :w | Write to the file . :w >> | Append the buffer to the file . :w! | Overwrite the file . :x,y w | Write lines x through y to the file . :wq | Write the file and quit vi; some versions quit | even if the write was unsuccessful! | Use `ZZ' instead. ZZ | Write if the buffer has been changed, and | quit vi. If you have invoked vi with the `-r' | option, you'd better write the file | explicitly (`w' or `w!'), or quit the | editor explicitly (`q!') if you don't want | to overwrite the file - some versions of vi | don't handle the `recover' option very well. :x [] | Idem [but write to ]. :x! [] | `:w![]' and `:q'. :pre | Preserve the file - the buffer is saved as if | the system had just crashed; for emergencies, | when a `:w' command has failed and you don't | know how to save your work (see `vi -r'). :f | Set the current filename to . :cd [

] | Set the working directory to | (default home directory). :cd! [] | Idem, but don't save changes. :e [+] | Edit another file without quitting vi - the | buffers are not changed (except the undo | buffer), so text can be copied from one file to | another this way. [Execute the `ex' command | (default `$') when the new file has been | read into the buffer.] must contain no | or . See `vi startup'. :e! [+] | Idem, without writing the current buffer. ^^ | Edit the alternate (normally the previous) file. :rew | Rewind the argument list, edit the first file. :rew! | Idem, without writing the current buffer. :n [+] [] | Edit next file or specify a new argument list. :n! [+] [] | Idem, without writing the current buffer. :args | Give the argument list, with the current file | between `[' and `]'. ///////////////////////// display commands ^G | Give file name, status, current line number | and relative position. ^L | Refresh the screen (sometimes `^P' or `^R'). ^R | Sometimes vi replaces a deleted line by a `@', | to be deleted by `^R' (see option `redraw'). [*]^E | Expose <*> more lines at bottom, cursor | stays put (if possible). [*]^Y | Expose <*> more lines at top, cursor | stays put (if possible). [*]^D | Scroll <*> lines downward | (default the number of the previous scroll; | initialization: half a page). [*]^U | Scroll <*> lines upward | (default the number of the previous scroll; | initialization: half a page). [*]^F | <*> pages forward. [*]^B | <*> pages backward (in older versions `^B' only | works without count). :[x,y]l | List lines x through y (default current), | making invisible characters visible. :[x,y]p | Print lines x through y (default current). :[x,y]nu | List lines x through y (default current), | with line numbers next to each line. If in the next commands the field is present, the windowsize will change to . The window will always be displayed at the bottom of the screen. [*]z[wi] | Put line <*> at the top of the window | (default the current line). [*]z[wi]+ | Put line <*> at the top of the window | (default the first line of the next page). [*]z[wi]- | Put line <*> at the bottom of the window | (default the current line). [*]z[wi]^ | Put line <*> at the bottom of the window | (default the last line of the previous page). [*]z[wi]. | Put line <*> in the centre of the window | (default the current line). ///////////////////////// mapping and abbreviation When mapping take a look at the options `to' and `remap' (below). :map | is interpreted as , e.g. | `:map ^C :!cc %^V' to invoke `cc' (the C | compiler) from within the editor | (vi replaces `%' with the current file name). :map | Show all mappings. :unmap | Deprive of its mapping. When vi | complains about non-mapped macros (whereas no | typos have been made), first do something like | `:map Z', followed by | `:unmap ' (`Z' must not be a macro | itself), or switch to `ex' mode first with `Q'. :map! | Mapping in append mode, e.g. | `:map! \be begin^Vend;^VO'. | When in append mode is preceded by | `^V', no mapping is done. :map! | Show all append mode mappings. :unmap! | Deprive of its mapping (see `:unmap'). :ab | Whenever in append mode is preceded and | followed by a breakpoint (e.g. or `,'), it | is interpreted as , e.g. | `:ab ^P procedure'. A `^V' immediately | following inhibits expansion. :ab | Show all abbreviations. :unab | Do not consider an abbreviation | anymore (see `:unmap'). @ | Consider the contents of the named register a | command, e.g.: | o0^D:s/wrong/good/"zdd | Explanation: | o - open a new line | 0^D - remove indentation | :s/wrong/good/ - this input text is an | `ex' substitute command | - finish the input | "zdd - delete the line just | created into register `z' | Now you can type `@z' to replace `wrong' | with `good' on the current line. @@ | Repeat last register command. ///////////////////////// switch and shell commands Q | ^\ | | Switch from vi to `ex'. : | An `ex' command can be given. :vi | Switch from `ex' to vi. :sh | Execute a subshell, back to vi by `^D'. :[x,y]! | Execute a shell [on lines x through y; | these lines will serve as input for and | will be replaced by its standard output]. :[x,y]!! [] | Repeat last shell command [and append ]. :[x,y]! ! [] | Use the previous command (the second `!') in a | new command. [*]! | The shell executes , with as standard | input the lines described by <*>, | next the standard output replaces those lines | (think of `cb', `sort', `nroff', etc.). [*]!! | Append to the last and execute it, | using the lines described by the current | <*>. [*]!! | Give <*> lines as standard input to the | shell , next let the standard output | replace those lines. [*]!!! [] | Use the previous [and append to it]. :x,y w ! | Let lines x to y be standard input for | (notice the between the `w' and the `!'). :r! | Put the output of onto a new line. :r | Read the file into the buffer. ///////////////////////// vi startup vi [] | Edit the files, start with the first page of | the first file. The editor can be initialized by the shell variable `EXINIT', which looks like: EXINIT='||...' : set options map ... ab ... export EXINIT (in the Bourne shell) However, the list of initializations can also be put into a file. If this file is located in your home directory, and is named `.exrc' AND the variable `EXINIT' is NOT set, the list will be executed automatically at startup time. However, vi will always execute the contents of a `.exrc' in the current directory, if you own the file. Else you have to give the execute (`source') command yourself: :so file In a `.exrc' file a comment is introduced with a double quote character: the rest of the line is ignored. Exception: if the last command on the line is a `map[!]' or `ab' command or a shell escape, a trailing comment is not recognized, but considered part of the command. On-line initializations can be given with `vi + file', e.g.: vi +x file | The cursor will immediately jump to line x | (default last line). vi +/ file | Jump to the first occurrence of . You can start at a particular tag with: vi -t | Start in the right file in the right place. Sometimes (e.g. if the system crashed while you were editing) it is possible to recover files lost in the editor by `vi -r file'. A plain `vi -r' command shows the files you can recover. If you just want to view a file by using vi, and you want to avoid any change, instead of vi you can use the `view' or `vi -R' command: the option `readonly' will be set automatically (with `:w!' you can override this option). ///////////////////////// changing and viewing options :set