why-vi.rocks/index.md

3.8 KiB

Why vi Rocks

vi is the de facto standard Unix editor, you find it in every *NIX derived OS.

Here you will find a collection of commands, command sequences in vi(1)/ex(1) or with 3rd party unitilities which make vi rock \m/. These all work with at least nvi 1.79 and 2.1.3 (unicode).

We are always looking for suggestions that go beyond the basics.
For the latest additions check the git repo.

Helpful documents:

Yank / delete an arbitrary number of 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 an arbitrary number of lines

1) mark the first line: mk
2) mark the last line: ml
:'k,'ls/regex/power/g

Add # to block of text

:'k,'ls/^/#/

Remove trailing whitespace of block of text

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

Remove the first N (5) characters from every line

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

Delete all lines N (10) characters long

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

Delete all lines except N (10) characters long

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

Search and replace PATHs, using different delimiter

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

Write file as root

:w !doas tee %

Diff the file on disk with the file in the buffer

:w !diff -u % -

Make a backup of the file on disk

:!cp % %.bak

Sort all lines

:%!sort

Sort paragraph

!}sort

} won't be shown in the command.

Sort from current line to EOF

!Gsort

G won't be shown in the command.

Uniq all lines

:%!uniq

Uniq paragraph

!}uniq

} won't be shown in the command.

Uniq from current line to EOF

!Guniq

G won't be shown in the command.

Underline all lines starting with CHAPTER

:g/^CHAPTER /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 multiline CSS blocks

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

Sort content of multiline CSS blocks (media queries)

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

Reformat HTML paragraphs to a fixed width (40)

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

Invert the order of all lines, move (m) all lines to 0

:g/1*/m0

Swap "Lastname, Firstname" to "Firstname, Lastname"

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

Change all text 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 (3rd) from formated text seperated by ':'

:%!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}'

More compact version:
:'k,'l!awk 'END{print "Total:", i} ++i || 1'

Email the current paragraph

:?^$?+,//-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>