The magic of pipes.
There are fourteen commands by default:
| Key | Command | Mnemonic |
|---|---|---|
| a | ansifilter | (A)nsifilter |
| c | column -t | (C)olumn |
| d | uniq -d | show only (D)uplicate lines |
| e | uniq -c | (E)numerate (count) the duplicates |
| f | clang-format | (F)ormat source code |
| k | sort -t: -k1,1 | Sort file by (K)ey |
| l | nl -nrz -w4 -ba | (L)ine numbers |
| n | sort -n | (N)umeric sort |
| r | rev | (R)everse each |
| s | sort -f | (S)ort lines (fold case) |
| t | tac | (T)ac (reverse the file) |
| u | uniq | (U)nique (remove duplicate lines) |
| x | shuf | mi(X) up lines |
| z | cat -s | squee(Z)e blank lines |
First, it's a good idea to create a mapping to show the mappings. This will list all the shortcuts and the commands they call:
nmap <silent> <F6> <Plug>PiperShowMappings
Alternatively, you can
:call PiperShowMappings()
Each command has three mappings. Each mapping begins with cp (remember this as Change using a Pipe), followed by a letter from the table above. For example, the mappings for the "rev" command are:
| Mapping | Description |
|---|---|
| cpr | Filter region defined by vim {motion} commands |
| cprr | Filter the current line |
| cpR | Filter the entire file (note the capital letter) |
e.g.
| Mapping | Works on | Command | Effect |
|---|---|---|---|
| cpa{motion} | {motion} | ansifilter | ANSI sequences are stripped out |
| cpaa | current line | ansifilter | ANSI sequences are stripped out |
| cpA | entire file | ansifilter | ANSI sequences are stripped out |
| cpc{motion} | {motion} | column -t | Data are put into columns |
| cpcc | current line | column -t | Data are put into columns |
| cpC | entire file | column -t | Data are put into columns |
| cpd{motion} | {motion} | uniq -d | Only duplicate lines are shown |
| cpdd | current line | uniq -d | Only duplicate lines are shown |
| cpD | entire file | uniq -d | Only duplicate lines are shown |
| cpe{motion} | {motion} | uniq -c | Duplicate lines are counted |
| cpee | current line | uniq -c | Duplicate lines are counted |
| cpE | entire file | uniq -c | Duplicate lines are counted |
| cpf{motion} | {motion} | clang-format | Source lines are tidied |
| cpff | current line | clang-format | Source lines are tidied |
| cpF | entire file | clang-format | Source lines are tidied |
| cpk{motion} | {motion} | sort -t: -k1,1 | Lines are sorted by key |
| cpkk | current line | sort -t: -k1,1 | Lines are sorted by key |
| cpK | entire file | sort -t: -k1,1 | Lines are sorted by key |
| cpl{motion} | {motion} | nl -nrz -w4 -ba | Lines are numbered |
| cpll | current line | nl -nrz -w4 -ba | Lines are numbered |
| cpL | entire file | nl -nrz -w4 -ba | Lines are numbered |
| cpn{motion} | {motion} | sort -n | Lines are sorted numerically |
| cpnn | current line | sort -n | Lines are sorted numerically |
| cpN | entire file | sort -n | Lines are sorted numerically |
| cpr{motion} | {motion} | rev | Each line is written backwards |
| cprr | current line | rev | Each line is written backwards |
| cpR | entire file | rev | Each line is written backwards |
| cps{motion} | {motion} | sort -f | Lines are sorted (ignoring case) |
| cpss | current line | sort -f | Lines are sorted (ignoring case) |
| cpS | entire file | sort -f | Lines are sorted (ignoring case) |
| cpt{motion} | {motion} | tac | Lines are written in reverse order |
| cptt | current line | tac | Lines are written in reverse order |
| cpT | entire file | tac | Lines are written in reverse order |
| cpu{motion} | {motion} | uniq | Duplicate lines are removed |
| cpuu | current line | uniq | Duplicate lines are removed |
| cpU | entire file | uniq | Duplicate lines are removed |
| cpx{motion} | {motion} | shuf | Lines are written in a random order |
| cpxx | current line | shuf | Lines are written in a random order |
| cpX | entire file | shuf | Lines are written in a random order |
| cpz{motion} | {motion} | cat -s | Duplicate blank lines are removed |
| cpzz | current line | cat -s | Duplicate blank lines are removed |
| cpZ | entire file | cat -s | Duplicate blank lines are removed |
The pipes are initialised from a vim dictionary. Here's the default:
let g:piper_command_list = {
\ 'a': 'LANG=C ansifilter',
\ 'c': 'LANG=C column --table --output-separator " "',
\ 'd': 'LANG=C uniq --repeated',
\ 'e': 'LANG=C uniq --count',
\ 'f': 'LANG=C clang-format -assume-filename=%',
\ 'k': 'LANG=C sort --field-separator=: --key=1,1 --key=2,2n --key=3,3n',
\ 'l': 'LANG=C nl --number-format=rz --number-width=4',
\ 'n': 'LANG=C sort --numeric-sort',
\ 'r': 'LANG=C rev',
\ 's': 'LANG=C sort --ignore-case',
\ 't': 'LANG=C tac',
\ 'u': 'LANG=C uniq',
\ 'x': 'LANG=C shuf',
\ 'z': 'LANG=C cat --squeeze-blank',
\ }
To add your own command, or change the parameters for an existing command,
copy the script, above, into your .vimrc.
| Type This | Result |
|---|---|
| cpsip | Current paragraph is sorted |
| cpx9j | Ten lines are randomised |
| cpL | Add lines numbers to the entire file |
Copyright © Richard Russon (flatcap). Distributed under the GPLv3 http://fsf.org/