Why Vi Rocks 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///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//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

tag to fixed width width = 40 :g/

/+,/<\/p>/-!fmt -40 Format whole document :%!fmt -s In your .nexrc map gF :%!fmt -s 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= (2) Use it with: : 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 - map gy !'mtmux load-buffer -u map gp :r!tmux show-buffer Remap ESC to ALT-i in ~/.nexrc (insert mode) map! Source: https://why-vi.rocks/