why-vi.rocks/index.md

140 lines
3.0 KiB
Markdown

# Why vi Rocks
**[vi](https://en.wikipedia.org/wiki/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)](https://man.openbsd.org/vi.1)/[ex(1)](https://man.openbsd.org/ex.1)
or with 3rd party unitilities which make
**[vi](https://en.wikipedia.org/wiki/Vi)** rock. These all work
with at least [nvi](https://en.wikipedia.org/wiki/Nvi) 1.79 and
2.1.3 (unicode).
Helpful documents:<br />
- [Roman Zolotarev: Edit text with vi(1)](https://rgz.ee/vi.html)<br />
- [Jeff W: vi help](http://www.jeffw.com/vi/vi_help.txt)<br />
- [Maarten Litmaath: vi reference](http://www.ungerhu.com/jxh/vi.html)<br />
- [alphanrrrd: extremely concise cheatsheet](http://www.alphanrrrd.org/vi.html)<br />
- [ViEmu: Graphical vi cheatsheet](http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html)
#### 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/\ *$//
#### 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
<sub><sup>} won't be shown in the command.</sup></sub>
#### Sort from current line to EOF
!Gsort
<sub><sup>G won't be shown in the command.</sup></sub>
#### Uniq all lines
:%!uniq
#### Uniq paragraph
!}uniq
<sub><sup>} won't be shown in the command.</sup></sub>
#### Uniq from current line to EOF
!Guniq
<sub><sup>G won't be shown in the command.</sup></sub>
#### 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
#### 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