Як сортувати кілька блоків тексту за першим рядком у кожному блоці 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, тому будь-яка з цих утиліт працюватиме на мене.
Хубро

Відповіді:


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 nextblock endblock findtag tagpat tagub
  • : [діапазон] виклик BlockSort (nextblock, endblock, findtag, tagpat, tagub)

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

Ви можете отримати vissort.vim з http://www.drchip.org/astronaut/vim/index.html#VISSORT

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.