9

У меня есть несколько блоков текста, или, другими словами, несколько функций, как это:

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

Я хочу отсортировать функции в алфавитном порядке по сигнатуре функции. Как это проще всего сделать в Vim?

4 ответа4

11

Это относительно просто (и, я полагаю, близко к тому, что имел в виду Джейсон):

  1. превратить все ваши функции в один ряд, заменив все новые строки каким-нибудь причудливым символом:

    :g/def/,/end/s/\n/§
    
  2. сортировать эти лайнеры с помощью:

    :%sort
    
  3. разверните все ваши функции обратно в их первоначальное индивидуальное состояние:

    :g/def/s/§/\r
    
3

Я написал плагин AdvancedSorters, чтобы упростить три отдельных шага, приведенных в ответе @ romainl, в одну команду:

:SortRangesByRange /^def\>/,/^end\>\_s*\zs$/

Шаблон здесь немного сложнее, чтобы правильно включать разделительные пустые строки.

2

Попробуйте плагин vissort. Поддерживает сортировку блоков:

  • :'<'> BS следующий блок endblock findtag tagpat tagub
  • :[range] вызывать BlockSort(следующий блок, конечный блок, findtag, tagpat, tagsub)

Если какие-либо аргументы отсутствуют, BlockSort() запросит их. Шаблоны следующего / конечного блока отделяют блок, шаблон findtag используется для поиска строки, содержащей "тег", который будет использоваться для сортировки; tagpat и tabsub используются в качестве замены для извлечения сортировочного тега из строки, содержащей тег.

Вы можете получить vissort.vim с http://www.drchip.org/astronaut/vim/index.html#VISSORT

2

Лучший способ сделать это без написания функции, которая анализирует определения, - это заменить разделители строк, которым не предшествует end на другой уникальный разделитель (+EOL+?), А затем :sort и заново подставить строку разделители. Вероятно, это может быть записано в макрос.

Функция может быть лучше, если вы хотите использовать визуальный выбор.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .