Подтвердить что ты не робот

Как вы сортируете ряд строк по длине?

Часто я просто хочу отсортировать все мои #include в верхней части моих исходных и заголовочных файлов по их длине.

vim позволяет сортировать буквенно-цифровым образом аналогичным образом с :{range} sort u.

В vim, как вы сортируете диапазон строк по длине строки? Так что более короткие строки сопровождаются более длинными строками.

Поиск в Интернете я нашел это:

:% s/.*/\=printf("%03d", len(submatch(0)))."|".submatch(0)/ | sor n | %s/..../

Но это работает только для сортировки всего файла и для меня черная магия. Я пытаюсь выяснить, как это сделать с диапазоном, например, с строки 4 до 18, как в :4,18 s/... Есть ли у вас какие-либо идеи?

4b9b3361

Ответ 1

Выбор фильтра с помощью Awk

Один из способов сделать это в vim - это отфильтровать визуальный выбор с помощью функции awk length() перед сортировкой. Например:

:'<,'> ! awk '{ print length(), $0 | "sort -n | cut -d\\  -f2-" }'

Ответ 2

Один из способов, ни элегантный, ни эффективный, но он работает:

Добавьте в свой файл 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 или :'<,:'>, который выбирает определенные строки.

Ответ 3

Я написал плагин AdvancedSorters, чтобы справиться с этими сложными требованиями к сортировке.

Как и в ответе @Birei, этот плагин предлагает команды расширения, которые оценивают выражение на строку, поместите это число перед линией, выполните численный сортировку, а затем удалите временный номер снова. Специализации обрабатывают общий вид по количеству символов и ширины отображения строки, поэтому вы можете просто использовать:

:SortByWidth