Vi

From Christoph's Personal Wiki
Revision as of 01:48, 13 January 2008 by Christoph (Talk | contribs)

Jump to: navigation, search
The correct title of this article is vi. The initial letter is capitalized due to technical restrictions.

viis a screen-oriented text editor computer program run from the command line. This article will mainly discuss techniques for vim (vi improved).

Commands

Below is a very short list of the most useful commands:

Command mode
ESC
Movement command
h, j, k, l left, down, up, right
w, W, b, B forward, backward by word
H top of the screen
M middle of the screen
L last line of the screen
Ctrl-F forward one screen
Ctrl-B backward one screen
Ctrl-D forward half screen
Ctrl-U backward half screen
0 (zero), $ start, end of current line
Inserting text
a append after cursor
i insert before cursor
A append to end of line
I insert at start of line
o open a line below current line
O open a line above current line
r replace char
Delete text
x current character
dh previous character
dw current word
db previous word
dd entire line
d$ to end of line
d0 (zero) to start of line
ndd next n lines
Undelete
p insert after cursor
P insert before cursor
Goto line
:linenumber  
nG Goto line n
:7 Goto line 7
Save and exit
ZZ write if changes and quit
:wq write and quit
:w filename save to new file
:q! quit vi
Search
/pattern <RETURN> forward for a pattern
?pattern <RETURN> backward for a pattern
n repeat previous search
N repeat previous search in reverse direction
Search and replace
Example:
  • Search from current line and replace first occurance
    :s/search_string/replace_string/
  • Search from current line and replace all matches
    :s/search_string/replace_string/g
  • Search from every line, replace confirmation (with [y]es)
    :%s/search_string/replace_string/gc
    :1,$s/search_string/replace_string/gc
  • Search lines from 10 to 20
    :10,20s/search_string/replace_string/g
Undo
u the latest change
U all changes on a line
Concatenate
J concatenate two lines

Examples

  • Search and delete lines: This will search for any line starting with "vi" followed by anything and delete that line.
:%g/^vi.*/d
  • Filter command: Uses multiple search criteria. This example deletes all lines starting with "ll" or "cd".
:% ! egrep -v "(^ll|^cd)"

External commands

Ctrl-Z   # pause
fg       # resume

Bang!

  • find out how many words are in the currently opened file (from the last save):
:! wc %
  • check the PHP syntax of the currently opened (php) file:
:! php5 -l %

Reading command output

  • to include a list of files from a specific directory, try this read command:
:r ! ls -1 /home/user/path/etc
  • grab a page, using lynx, and dump it right into your editing session without leaving vim:
:r ! lynx http://en.wikipedia.org/wiki/Vi -dump 
  • etc:
:r ! ls -1 /home/user/directory | sort -r
:r ! grep string /var/log/apache2/site-error.log
:set shell ?   # check the current shell

Appending data

  • append current line (under cursor) to external file:
:.w! >> /for/bar

Pre-commands

vi +10 foo

will open the file foo and position the cursor at line 10. Another common usage is to specify a pattern:

vi +/END foo

This will open the file foo and position the cursor at the first occurrence of the pattern 'END'.

Regular expressions

Switching cases

In the replacement part of a substitution command, i.e. between the second "/" and third "/",

\u means make the following character upper case
\l means make the following character lower case
\U means make the rest of the replacement upper case
\L means make the rest of the replacement lower case
  • Make the first letter of every word from line 18 to 43 uppercase:
:18,43s/\<./\u&/g
  • Change "uPPeR" and "LoweR" in any mixture of cases to lowercase:
:s/[UuLl][PpOo][PpWw][Ee][Rr]/\L&/
  • Make the whole file uppercase:
:%s/.*/\U&/
  • Make the region from line m to line n all uppercase:
:'m,'ns/.*/\U&/
  • Make a paragraph all lowercase:
:?^$?,/^$/s/.*/\L&/
  • Make the first letter of every word in a paragraph uppercase:
:?^$?,/^$/s/\([^ ][^ ]*\)/\u&/g
  • Make the second word of each line uppercase:
:1,$s/^\([^ ]*\) \([^ ]*\) \(.*\)/\1 \U\2\e \3/

Misc

Change all lines containing something like the following:

foo      - bar

To:

;foo : bar
%s/^\([a-z].*[a-z]\)[ \t]*- /;\1 : /

Abbreviations

If you are like me and use vi for everything, you will find that there are certain words, phrases, bits of code, etc. that you are constantly using. These can all be stored as abbreviations.

The syntax for storing an abbreviation is as follows:

esc:   # to go into command mode
ab abbr phrase

For an example, say you were editing xhtml, and you wanted 'xzml' to enter standard xml header tags of <?xml version="1.0" encoding="UTF-8" ?>, you could enter:

:ab xzml <?xml version="1.0" encoding="UTF-8" ?>

Then, any time you enter 'xzml' as a word, vi automatically replaces 'xzml' with your standard table tags. The idea is to choose an abbreviation that has no chance of being a real "word", but is short and easy to remember.

Note that the above abbreviation is stored for your current session only. If you wish for it to be universally applicable and available, put the abbreviation command line in your .vimrc file.

To list all of your abbreviations, enter

:ab

Using tabs

vi -p foo1 foo2 foo3

Or, without actual "tabs" but still opening multiple files:

vi foo1 foo2 foo3

Once vi has been started with a list of files it is possible to navigate within the list with the following commands:

:n 
next - Move to the next file in the file list
:rew 
rewind - rewind the file list and open the first file in the list.

Configuring vi/vim

It is possible to extensively configure vi (or vim) to suit your personal needs.

For an example, if you would like syntax-highlighting to be used by default for most of your code files, edit your .vimrc file (located in your "home" directory. If one does not exist, create it) and add the following line:

syn on

Below are some other useful additions:

:set all          # view all current settings
:set nowrapscan   # do not wrap around file when looking for a string
:set number       # add line numbers to left of file
:set noautoindent # do not automatically indent the file
:set report=0     # always report at bottom when any number of lines are yanked
:set ignorecase   # treat capital and small letters the same when searching
:set nobackup     # do _not_ create the ~ files
:set nowritebackup

External links