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/