VI (vee-eye) / VIM (Vi IMproved) editor. How to work in VI and VIM.

'f'This is done for ease inline commands / keys search.
If you interested to find specific command or key just put it in single quotes and search it with the browser's Ctrl+F hot key.
You should type just f (without single quotes) in such case when working in VI.
So,
'f'x equals just typing fx in Vi.
Most of VI command keys comes from Linux ed - line-oriented text editor (see man 1 ed).
So, ed is precursor of vi. If you interested in roots you also can learn Ed.
So, ed is precursor of vi. If you interested in roots you also can learn Ed.
Starting
Read, Create and Edit file | vi "file_name" |
---|---|
Read (read-only) | vi -R "file_name" or :set ro |
Open file at the end of file | vi + "file_name" |
Open file on line 1787 | vi +1787 "file_name" |
Open file on pattern | vi +/"pat tern" "file_name" |
Go to command mode | "ESC" key |
Show current mode, command or insert | :set showmode |
Cursor Movements inside the text
The cursor to the beginning of the file | 'gg' or [[ |
---|---|
Cursor to end of file (Go To) | 'G' or ]] |
Move back to the previous line character | 'h' or Ctrl+h or Backspace |
Move forward to the next line character | 'l' |
Move UP to the previous line | 'k' |
Move DOWN to the next line | 'j' |
To the first visible symbol of the curent line | '^' or '0' or Shift+- |
To the 'n' position of the current line | 'n'| |
To the end of the current line | $ |
Go to the line number 1787 | :1787 or 1787G |
Move back to the beginning of the previous sentence | '(' |
Move forward to the beginning of the next sentence | ')' |
Move back to the beginning of the current paragraph | '{' |
Move forward to the beginning of the next paragraph | '}' |
Move back to the beginning of the current section | Shift+'[' |
Move forward to the beginning of the next section | Shift+']' |
Move BACK to the beginning of a word | 'b' ('B') |
Move FORWARD to the beginning of the word | 'w' ('W') |
Move forward towards the end of a word | 'e' ('E') |
Move to the beginning/end of the block due to the symbol on which the cursor | % |
b2 w2 e2 y{ 400G :400 6 5j
Screen related movements
Redraw screen | Ctrl+'l' or Ctrl+'r' |
---|---|
Show line count and file position | Ctrl+'g' |
Move cursor back by history of movements | Ctrl+'o' |
Move cursor forward through the history of movements | Ctrl+'i' |
One screen forward | Ctrl+'f' |
One screen backward | Ctrl+'b' |
One half-screen forward (down) | Ctrl+'d' |
One half-screen backward (up) | Ctrl+'u' |
Move the current line to the top of the screen and scroll | 'z'[return] |
Move current line to the center of the screen and scroll | 'z.' |
Move current line to the bottom of the screen and scroll | 'z-' |
Move the cursor to the first line of the screen (hight) | 'H' |
Move the cursor to the middle of the screen (middle) | 'M' |
Move cursor to last line of the screen (low) | 'L' |
3L 3H cH dL yM 5e
Editing: Paste
Insert at the cursor position | 'i' |
---|---|
Insert at the beginning of the current line (Insert) | 'I' |
Insert at position after cursor ('a'fter) | 'a' |
Insert at the end of the current line (Append) | 'A' or '$a' |
Insert a paragraph below the current line | 'o' |
Insert paragraph above current line | 'O' |
25a*- [ESC]
Editing: delete
Delete character under cursor | 'x' |
---|---|
Delete character before cursor | 'X' |
Delete word (if cursor at the beginning of the word) | 'dw' |
Delete line under cursor | 'dd' |
Delete characters from cursor to the end of line | 'D' or 'd$' |
Delete characters from cursor to the end of file | 'dG' |
Delete characters from cursor to the begin of file | 'dgg' |
d2b 2dd d$(D)
Editing: delete + insert
Replacement. Delete whole line and go into edit mode | 'сс' or 'S' |
---|---|
Replacement. Delete line from current position till the and of line and go to edit mode | 'С' |
Delete character after cursor and go into edit mode | 's' |
с$(C) c0 c2w c2bw c2W
Editing: replacement
Single character replacement | 'r' |
---|---|
Replacing characters after cursor (large replace) | 'R' |
Editing: text selection + cut + paste
Character highlighting | 'v' |
---|---|
Line selection | 'V' |
Rectangular selection of lines (visual block) | 'Ctrl+v' |
Copy selected to buffer | 'y' |
Cut selection to buffer | 'd' |
Recover deleted text and paste after the cursor | 'p' |
Recover deleted text and paste before the cursor | 'P' |
Copy entire line to buffer (yank) | 'yy' or 'Y' |
v5ec
Editing: registers (:help registers)
View registers | :registers |
---|---|
Copy (append) 7 lines to the buffer named 'd' | "d7yy ("D7yy) |
Recover text from buffer 'd' after the cursor | "dp |
Recover text from buffer 'd' before the cursor | "dP |
Editing: moving text
Join a lines. Current and next lines will be merged to one | 'J' |
---|---|
Read text from a file name | :f "file_name" |
3p yw y$ y0 4yy "a5dd "Zy)
Editing: Text Substitution
Increase the numeric value by one | Ctrl+'a' |
---|---|
Decrease numerical value by one | Ctrl+'z' |
Change case to opposite | '~' |
Search and mark text
Word search by pattern | /word or /"wo rd" |
---|---|
Repeat word search forward | 'n' |
Repeat word search backward | 'N' |
Go forward to the first 'x' character on the current line | 'f'x |
Go back to the first 'x' character on the current line | 'F'x |
Set marker named 'a' at the current line | ma (you can use: a-zA-Z) |
Go to beginning of the line marked with 'a' | 'a |
Search as you typing your search text | :set incsearch |
Ignore case when searching | :set ignorecase |
dfx
Saving, reading and printing files
Save the buffer of the current window to file | :w |
---|---|
Save the buffer of the current window to a file name | :w "new_file_name" |
Exit without saving (quit!) | :q! |
Exit with saving (write quit) | :wq or ZZ |
Force exit with saving (even in "ro" (write quit!) | :wq! |
Append current window buffer with the contents of the file | |
Append current window buffer with the output of the command | :r !cal -m3 |
Override current window buffer with the contents of the file | :e "file name" |
Override current window buffer with the contents of currenty opened file | :e! |
Print file | :!lp % |
Print custom file | !lp "file_name" |
Switch to next file (if vi invoked with more than one file name) | :n |
:230,$w newfile :340,$w >>newfile :185r data :$r data :0 data :/pattern/r data
Error correction
Undo Recent Changes (undo) | 'u' |
---|---|
Restore recent changes (redo) | Сtrl+'r' |
List of undo history | :undolist |
Restore 2nd undo from latter | "2p |
Go backward in time for 4 min | :earlier 4m |
Go forward in time for 45 sec | :later 45s |
Undo last 5 changes | :undo 5 |
Restore line to previous state | 'U' |
Restore latter deletion | 'p' |
Repeat latter command | '.' |
Recover file after system interrupt | vi -r "file_name" |
Suffers from a single undo level? | :set nocompatible |
"1pu.u.u
Folds :help folding
Folds activation | :set foldmethod=indent |
---|---|
Set cursor on text to collapse fold | 'zc' |
Set cursor on text to unfold fold | 'zo' |
Set cursor on text switch between collapse / unfold | 'za' |
Many of Buffers :help buffer-list
Load a buffer into the current window | :b1(2..) |
---|---|
List of buffers and its associated files | :buffers :ls |
Delete buffer | :bd 1(2..) |
Many of Windows :help windows
Create a horizontal window with a new buffer | :new |
---|---|
Create a horizontal window with a buffer equal to the current | Ctrl+'w','s' or ':sp' |
Create a vertical window with a buffer equal to the current | Ctrl+'w','v' or ':vsp' |
Cycle movement between windows | Ctrl+'w', Ctrl+'w' |
Directional movement between windows | Ctrl+'w', arrow keys or /h/j/k/l |
Rotation window places | Ctrl+'w','r' |
Make current window on top | Ctrl+'w','K' |
Resize the current window to 10 lines | :resize 10 |
Maximize current window size | Сtrl+'w','_' |
Align dimensions of all windows | Сtrl+'w','=' |
Many of Tabs :help tabpage
Open new tab | :tabnew |
---|---|
Go to next tab | gt |
Go to previous tab | gT |
Move current tab to position 0 | :tabmove 0 |
Close tab | ':tabc' or ':q' |
Additionally
Execute shell command | :! "cmd" |
---|---|
Run shell | :!sh |
Set line length (wrapmargin) | :set wm=n |
Show line numbers (numbers) | :set nu / :set nonu / n,n# |
Preserve buffers (dont delete .swp on exit) | :pre |
Show current options | :set |
Show all options | :set all |
Shift+K | invoke help on-cursor command |
Native funcitons
Total lines number | := |
---|---|
Current line number | :.= |
Current line number and content | :# |
Print line match the pattern (its number with =) | /pattern/= |
Current line | :. |
List file line | :$ |
Every line in the file | :% |
Display line | :# or p |
Copy | co |
Move | m |
Command separator | | |
Native funcitons examples
:.,$d :20,.m$ :%d :%t$ :.,.+20d :226,$m.-2 :.,+20# :-,+t0 1,3# :/pa/+d :/pa1/,/pat2/d :.,/pattern/m23 :/pattern/;+10p :g/pattern :g/pattern :60,124g/pattern/p :1,3d|s/thier/their/ 160,224m23 13,29co100 :g /^Chapter/ .+2w >>begin (as same .+2|+2|++) :/^Part 2/, /^Part 3/g /^Chapter/ .++w>> begin | +t$ :% s/pattern/subs/g -- for every line substitute pattern by subs globally (all line long)