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


11

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

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

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


определите, что вы подразумеваете под сигнатурой функции, пожалуйста. Что это за функции? Кроме того, на какой платформе вы работаете под ОС, дистрибутив и номер версии были бы ОЧЕНЬ полезны.
mdpc

1
почему это должно быть сделано в VIM? Существуют отличные встроенные утилиты Unix / Linux, которые можно легко объединить для такого рода вещей ... awk приходит на ум.
mdpc

@mdpc: Под сигнатурой функции я имею в виду строку, содержащую def .... Я использую Linux, поэтому любая из этих утилит будет работать на меня.
Hubro

Ответы:


12

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

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

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

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

    :g/def/s/§/\r
    

1
Точно так же, если пустые строки можно считать уникальными разделителями, то это можно сделать с помощью :g/./,/^$/-s/\n/§/g, а затем :%sort, а затемs/§/\r/g
ArtBIT

3

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

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

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


Примечание. В настоящее время для этого вам понадобится довольно новый Vim 7.4.218; Скоро я предоставлю обновление, которое также поддерживает более старые версии Vim.
Инго Каркат

2

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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.