Как отсортировать несколько блоков текста по первой строке в каждом блоке Vim?

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

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

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

18
задан Hubro
15.05.2023 5:12 Количество просмотров материала 2375
Распечатать страницу

4 ответа

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

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

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

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

    :g/def/s/§/\r
    
10
отвечен romainl 2023-05-16 13:00

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

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

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

3
отвечен Ingo Karkat 2023-05-16 15:17

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

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

2
отвечен Jason 2023-05-16 17:34

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

  • :'< '>БС nextblock endblock findtag tagpat tagsub
  • :[диапазон]звонок BlockSort(nextblock,endblock,findtag,tagpat,tagsub)

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

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

2
отвечен user21497 2023-05-16 19:51

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх