How do you sort a range of lines by length?
regex, sorting, vim
Solution
Filter Visual Selection with Awk
One way to do this in vim is by filtering the visual selection with awk's length() function before sorting. For example:
:'<,'> ! awk '{ print length(), $0 | "sort -n | cut -d\\ -f2-" }'
Problem
Often I just want to sort all my `#include`'s at the top of my source and header files by their length. `vim` allows me to sort alphanumerically in a similar manner with `:{range} sort u`. In `vim`, how do you sort a range of lines by the length of the line? Such that shorter lines are followed by longer lines. Searching the internet, I found this: ``` :% s/.*/\=printf("%03d", len(submatch(0)))."|".submatch(0)/ | sor n | %s/..../ ``` But that only works to sort the entire file, and is black magic to me anyway. I'm trying to figure out how to do that same sort with a range such as from line 4 to 18, as in `:4,18 s/...` Do you have any ideas?