У меня есть несколько блоков текста, или, другими словами, несколько функций, как это:
def ==(other)
...
end
def to_s(full=false)
...
end
def to_a
...
end
def to_hash
...
end
def inspect
...
end
Я хочу отсортировать функции в алфавитном порядке по сигнатуре функции. Как это проще всего сделать в Vim?
def ...
. Я использую Linux, поэтому любая из этих утилит будет работать на меня.Ответы:
Это относительно просто (и, я полагаю, близко к тому, что имел в виду Джейсон):
превратите все ваши функции в один ряд, заменив все новые строки каким-нибудь причудливым символом:
сортировать эти лайнеры с помощью:
разверните все ваши функции обратно в их первоначальное индивидуальное состояние:
источник
:g/./,/^$/-s/\n/§/g
, а затем:%sort
, а затемs/§/\r/g
Я написал плагин AdvancedSorters, чтобы упростить три отдельных шага, приведенных в ответе @ romainl, в одну команду:
Шаблон здесь немного сложнее, чтобы правильно включать разделительные пустые строки.
источник
Лучший способ сделать это без написания функции, которая анализирует определения, - это заменить разделители строк, которым не предшествует,
end
другой уникальный разделитель (+ EOL +?), А затем:sort
снова подставить разделители строк. Вероятно, это может быть записано в макрос.Хотя функция может быть лучше, если вы хотите использовать визуальный выбор.
источник
Попробуйте плагин vissort. Поддерживает сортировку блоков:
Если какие-либо аргументы отсутствуют, BlockSort () запросит их. Шаблоны следующего / конечного блока отделяют блок, шаблон findtag используется для поиска строки, содержащей «тег», который будет использоваться для сортировки; tagpat и tabsub используются в качестве замены для извлечения сортировочного тега из строки, содержащей тег.
Вы можете получить vissort.vim с http://www.drchip.org/astronaut/vim/index.html#VISSORT
источник