Вопрос по vim – Сортировка Vim Folds

14

У меня есть файл, который выглядит примерно так:

dog{{{
blah blah blah
}}}
cat{{{
blah blah
}}}
aardvark{{{
blah blah blah blah
}}}

В моем VIMRC у меня естьset foldmethod=marker, чтобы содержимое файла было свернуто в фигурных скобках. У меня вопрос, как я могу отсортировать файл на основе заголовка сгиба? Я хочуaarvaark раздел впереди, потомcat, затем .dog

У некоторых сложенных секций есть другие сгибы в них. Я не хочу сортировать эти более низкие уровни сгиба. Файл должен быть отсортирован только по сгибам уровня 1.

Ваш Ответ

3   ответа
1

Найдите и замените окончания строк так, чтобы сгибы первого уровня находились на одной строке (т. Е. Заменяя конец строки уникальной строкой, которая не 'не появляется в другом месте в файле).

использование:sort отсортировать строки в файле, как обычно.

Повторите поиск и замените, начиная с шага 1, чтобы снова ввести окончания строк.

Все это может быть записано как макрос Vim.

Шаги 1 и 3 были бы просты, если бы не быловложенные сгибы, или если был простой способ отличить сгибы верхнего уровня от вложенных (например, если строки {{{и}}} первого уровня находятся на одном уровне слева, а остальные имеют начальный пробел). Если это неВ этом случае этоВозможно, все еще возможно, но гораздо сложнее.

1

Предположим, что в вашем файле нет других сотрудников, кроме записей, и первая запись начинается с первой строки. И что у вас нет начала уровня 1 и конца на одной линии. И все ваши {} хорошо совпадают.

Перейти к первой записи и записать макрос для регистрации (qa - начать записьq - стоп)

/{^MV%k:s/\n/EEEEEE/^Mj^

Скопируйте мой или лучше запишите его самостоятельно: (^ M - означает буквальный ввод)

/ {^ M найти следующий {V% k выберите строчные тиски до конца уровня 1, но не закрывающую строку с}}}: s / \ n / EEEEEE / ^ M изменить символ 'конец линии' на какую-то уникальную строку внутри выделенияj ^ перейти на одну строку вниз и к началу строки, если в предыдущей записи были пробелы.

Запустите макрос, начиная со второй строки (предположим, что первая обрабатывается уже при записи макроса.) В обычном режиме 100000 @ a - используйте любое число, большее, чем количество ваших записей. Макрос остановится, когда будут обработаны все строки, если первая запись находится в первой строке файла. В качестве побочного эффекта он визуально выберет первую строку - отмените выбор.

Сортировать файл

:sort

Восстановить конец строки::% s / EEEEEE / ^ M / g

Примечание ^ M должно быть буквальным вводом. Чтобы набрать его используйте Ctrl-V Enter

Он работает с вложенными уровнями, потому что% переходит к соответствующему закрытию}. Вот почему важно, чтобы все {} соответствовали хорошо.

Макрос остановится, когда не смог подняться сk Вот почему у вас должна быть первая запись в первой строке. Пустые строки или все, что не является записью между записями, будет игнорироваться макросом.

Метод выше должен хорошо работать для вашего файла. Если вы хотите более общий подход со складками, используйте следующие команды в макросе вместо / {и%

Сначала откройте все складки

zj - перейти к началу следующего открытого сгиба

] z - перейти в конец текущего сгиба.

Остальная часть макроса такая же. Этот метод является более общим, но я нашел его менее надежным, поскольку он зависит от всех открытых сгибов, включения сгиба и так далее.

4

zM или же:set foldlevel=0), вы можете использовать удалитьdd и вставитьp вручную сдвинуть сложенные блоки вокруг. Это нормально для небольших объемов текста.

Для огромных текстов выЯ должен написать функцию сортировки самостоятельно, так как Vim не предлагает такую функциональность. Можно использовать следующий алгоритм:

Объедините все сложенные строки вместе с разделителем, которого нет в тексте (например,).Выполнить:sort команда.Отключите диапазон от специального разделителя.

С обработкой ошибок и угловыми случаями это 'На самом деле довольно много усилий по реализации. Я'мы сделали попытку здесь:https://gist.github.com/4145501

Похожие вопросы