Ответ 1
Выбор фильтра с помощью Awk
Один из способов сделать это в vim - это отфильтровать визуальный выбор с помощью функции awk length() перед сортировкой. Например:
:'<,'> ! awk '{ print length(), $0 | "sort -n | cut -d\\ -f2-" }'
Часто я просто хочу отсортировать все мои #include
в верхней части моих исходных и заголовочных файлов по их длине.
vim
позволяет сортировать буквенно-цифровым образом аналогичным образом с :{range} sort u
.
В vim
, как вы сортируете диапазон строк по длине строки? Так что более короткие строки сопровождаются более длинными строками.
Поиск в Интернете я нашел это:
:% s/.*/\=printf("%03d", len(submatch(0)))."|".submatch(0)/ | sor n | %s/..../
Но это работает только для сортировки всего файла и для меня черная магия. Я пытаюсь выяснить, как это сделать с диапазоном, например, с строки 4 до 18, как в :4,18 s/...
Есть ли у вас какие-либо идеи?
Один из способов сделать это в vim - это отфильтровать визуальный выбор с помощью функции awk length() перед сортировкой. Например:
:'<,'> ! awk '{ print length(), $0 | "sort -n | cut -d\\ -f2-" }'
Один из способов, ни элегантный, ни эффективный, но он работает:
Добавьте в свой файл vimrc
следующую функцию. Он вставляет в начале каждой строки количество символов, сортирует их численно и удаляет номера.
function! SortLines() range
execute a:firstline . "," . a:lastline . 's/^\(.*\)$/\=strdisplaywidth( submatch(0) ) . " " . submatch(0)/'
execute a:firstline . "," . a:lastline . 'sort n'
execute a:firstline . "," . a:lastline . 's/^\d\+\s//'
endfunction
Назовите его диапазоном чисел, например
:4,18call SortLines()
или в режиме Visual, используя V
, например:
:'<,'>call SortLines()
EDIT: Ops, теперь я понял, что это решение очень похоже на ваше. Это было прекрасно, только %
означает полный буфер вместо :4,18
или :'<,:'>
, который выбирает определенные строки.
Я написал плагин AdvancedSorters, чтобы справиться с этими сложными требованиями к сортировке.
Как и в ответе @Birei, этот плагин предлагает команды расширения, которые оценивают выражение на строку, поместите это число перед линией, выполните численный сортировку, а затем удалите временный номер снова. Специализации обрабатывают общий вид по количеству символов и ширины отображения строки, поэтому вы можете просто использовать:
:SortByWidth