suggestion boxlatest additionssee alsocolophon

Why? 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).

Bill Joy’s greatest gift to man - the vi editor

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

Increment / Decrement number in command mode

(1) move cursor to number
(2a) increment by one: #+
(2b) increment by N (5): 5#+
(3a) decrement by one: #-
(3b) decrement by N (9): 9#-

Add # to a block

:'k,'ls/^/#/

Remove trailing whitespace from every line

:%s/ *$//

Remove tabs

:%s/<CTRL-V><TAB>//g

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

Search/replace ^M with LF

:g/<CTRL-V><ENTER>/s///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

Format whole document

:%!fmt -s

In your .nexrc

map gF :%!fmt -s<CTRL-V><ENTER>

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&/

Surround text with pattern

:%s/.*/`pattern` & `pattern`/

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 ~/.nexrc:

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

(2) Use it with:

:<ESC>

Integrate with tmux buffer

(1) cut text from current position to mark ‘m’ into tmux buffer. Hit undo to put text back into vi buffer.

!'mtmux load-buffer -

(2) paste text from tmux buffer into vi buffer.

:r!tmux show-buffer

(3) Map in ~/.nexrc (command mode)

map gx !'mtmux load-buffer -<CTRL-V><ENTER>
map gy !'mtmux load-buffer -<CTRL-V><ENTER>u
map gp :r!tmux show-buffer<CTRL-V><ENTER>

Remap ESC to ALT-i in ~/.nexrc (insert mode)

map! <CTRL-V><ALT-i> <CTRL-V><ESC>