why-vi.rocks/index.md

3.6 KiB
Raw Blame History

suggestion box latest additions see also colophon

vi is the de facto standard text editor in any Unix-like operating system.

Here is a collection of vi(1)/ex(1) commands and command sequences.
Tested with nvi 1.79 and 2.1.3 (unicode).

Yank/delete lines

(1) mark the first line: mk
(2) move to last line
(3a) yank: y'k
(3b) delete: d'k
(4) move to destination line
(5) put with P or p

Apply regex to lines

(1) mark the first line: mk
(2) mark the last line: ml

:'k,'ls/regex/power/g

Add # to a block

:'k,'ls/^/#/

Remove trailing whitespace from a block

:'k,'ls/\ *$//

Remove the first N characters from every line

N = 5

:%s/^.\{0,5\}//

Delete all lines N-character long

N = 10

:g/^.\{10\}$/d

Delete all lines except N-character long

N = 10

:g!/^.\{10\}$/d

Search/replace paths using # as delimiter

:%s#/usr/local/log#/var/log#g

Write the file as root

:w !doas tee %

Diff the file on disk with the buffer

:w !diff -u % -

Make a backup of the file on disk

:!cp % %.bak

Sort all lines

:%!sort

Sort a block

} won't be shown

!}sort

Sort from the current line to EOF

G won't be shown

!Gsort

Delete duplicated lines in the file

:%!uniq

Delete duplicated lines in the block

} won't be shown

!}uniq

Delete duplicated lines till EOF

G won't be shown

!Guniq

Underline all lines starting with pattern

:g/^pattern /t.|s/./=/g

Search for pattern, print the containing function (start with def) and line number

:g/pattern/?^ *def ?#

Add # to paragraph containing pattern

:g/pattern/?^$?+,//-s/^/#

Sort content of a multiline CSS block

:g/{$/+,/^}/-!sort

Sort content of a multiline CSS block (media queries)

:g/^[^@].*{$/+,/}/-!sort

Format content of <p> tag to fixed width

width = 40

:g/<p>/+,/<\/p>/-!fmt -40

Reverse all lines, move m all lines to 0

:g/1*/m0

Swap Lastname, Firstname to Firstname, Lastname

:%s/\(.*\), \(.*\)/\2 \1/

Convert to lowercase

:%s/.*/\L&/

Join all lines

:%j

Copy t or move m lines containing pattern

:g/pattern/t$
:g/pattern/m$

Select a column of a table

Select 3rd column separated by colon (:)

:%!awk -F':' '{print $3}'

Insert the sum of a list of numbers after an arbitrary number of lines

(1) mark the first line: mk (2) mark the last line: ml

:'k,'l!awk 'END{print "total:", i}{i+=$1; print}'

or

:'k,'l!awk 'END{print "total:", i} ++i || 1'

Email the block

:?^$?+,//-w !mail -s "subject" email@example.com

Enable and use ex history

(1) Set ESC key to enable history or add to ~/.exrc:

:set cedit=<CTRL-V><ESC>

(2) Use it with:

:<ESC>