why-vi.rocks/index.md

3.5 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.

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\}//

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

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>