vi Reference
Almost any movement/change can be preceeded with a numeric count.
MOVEMENT:
|
hjkl |
left down up right |
|
w |
word |
|
b |
back (word) |
|
|
Shift [wb] find blank delimited word |
|
0 |
beginning of line |
|
$ |
end of line |
|
_ |
first non-blank character |
|
(n)| |
(vertical bar) move to column N of the current line |
Find:
|
f(c) |
find char 'c' |
|
t(c) |
to (stop before) 'c' |
|
{ } |
start/end of para |
|
( ) |
start/end of sentence |
|
/re |
find regular expression 're' (see below) |
|
?re |
find backwards |
|
|
Shift-find will find backwards |
|
% |
match parentheses |
CHANGES:
|
x |
Delete (extract) char |
|
rx |
replace char with 'x' |
|
s... |
subs 1char w/ '...' |
|
c(m)... |
change (delete, insert) |
|
|
to movement 'm' |
|
d(m) |
delete to movement |
|
i... |
insert string '...' (before cursor) |
|
a... |
append string '...' after cursor |
|
o |
open new line (below) in insert mode |
|
O |
Open new line (above) in insert mode |
|
!(m)cmd |
will prompt for command, then pipe lines through the command |
|
> |
indent line |
|
< |
un-indent line |
|
(often used as ‘count >>’ or ‘count<<’) |
|
shift change will change to end of line
double change (eg: cc) will change whole line
shift [ia] will insert @ [start/end] of line
COMMAND MODE:
|
|
(bold indicates minimum abbreviation) |
|
:exit |
(eXit) write (if necessary), quit |
|
:quit |
quit (no changes) |
|
:write [f] |
write. If filename (f) is given, write there |
|
:edit [f] |
(re)edit -- or edit a new file (f) |
|
:file [f] |
print filename (change name of file |
|
|
that will be written to (f) ) |
|
Special Filenames: |
|
|
% |
this file |
|
# |
The last other file mentioned ("The Other file") |
|
:[R]moveL |
move to line L |
|
:[R]copyL |
copy to line L |
|
:[R]delete |
delete line |
|
:[R]!cmd |
pipe lines thru shell cmd |
|
:[R]write|cmd |
pipe Line into shell cmd |
|
|
|
|
:substitute/re/str/[gp] |
|
|
|
substitute 're' with 'str' |
|
|
g allows multiple changes per line |
|
|
p prints any changed line |
|
|
|
|
:global/re/cmd |
execute :cmd on lines |
|
|
that match expression /re/ |
|
:set |
show changed settings variables |
|
:set var[=value] |
set variable var to value |
|
some useful settings: |
|
|
[no]number |
Turn lint numbering on [off] |
|
[no]autoindent |
automatic indenting (ctrl-d to unindent) |
|
[no[showmode |
show when you are in insett |
|
[no]ignorecase |
do case insensitive searches |
|
:!shellcommand |
execute the shell command |
|
:shell |
start a shell |
REGULAR EXPRESSIONS (re)
most chars match themselves
|
. |
matches any char |
|
[abc0-9] |
matches one of a,b or c or 0 thru 9 |
|
[^abc0-9] |
matches any one character not in the set |
|
* |
any count of previous (e.g. [a-z]* would match a string of lowercase letters) |
|
\(re\) |
enclose RE as a unit |
|
* |
multiples(possibly zero) |
|
\/ |
single '/' |
|
\<,\> |
start,end of word |
|
re=// |
matches last expression |
|
^ |
(at beginning of string only) matches the start of the line |
|
$ |
(at the end of the string only) matches the end of the line |
|
|
eg: /^blahblahblah$/ would have to match the whole line. |
|
|
Note: You are not limited to using the '/' character to delimit matches and replacements: most punctuation characters can be used instead.eg: s/abc/def/ is the same as s'abc'def' (this is most useful when you have a '/' character in your match or replacement strings) |
|
|
|
|
In Replacement String: |
|
|
& |
is string matched |
|
\1 |
is string portion matched inside first \(...\) |
|
\2 |
is string portion inside second \(...\) |
|
etc. |
|