функция сортировки по имени в vim - PullRequest
3 голосов
/ 14 февраля 2012

Vim может сортировать строки, используя команду "sort".Я хотел бы отсортировать функции в исходном коде, используя vim.Например: до

def a():
    pass
def c():
    pass
def b():
    pass

после:

def a():
    pass
def b():
    pass
def c():
    pass

Можно ли это сделать?

Ответы [ 3 ]

6 голосов
/ 14 февраля 2012

Для таких вещей, как:

def a():
    stmt1

    stmt2
def b():
    stmt3

или C:

void a()
{
    stmt1;

    stmt2;
}

void b()
{
    stmt3;
}

Вам понадобится достаточно семантических знаний, чтобы определить, что пустое пространство между stmt1 и stmt2 все еще является частью a.

Для python это означает, что вы читаете вперед, чтобы найти первую строку, которая не является ни пустой, ни отступом. Вам также необходимо учитывать вложенные отступы (когда функции являются частью класса или модуля, а def уже имеет отступ).

Для C вам нужно читать вперед до соответствующей конечной скобки - это означает, что вам нужно будет учитывать вложенные скобки.

Существует аналогичная тема, касающаяся C ++, которая остается без ответа: Автоматически сортировать функции по алфавиту в коде C ++

Я считаю, что это не тривиально в общем случае, и вам лучше использовать yacc или какой-либо другой семантический парсер. Вы также можете вручную добавить маркеры для начала и конца и сделать что-то похожее на предложение kev.

MaRkNeXt
def a():
    stmt1

    stmt2
MaRkNeXt
def b():
    stmt3
MaRkNeXt

Тогда что-то вроде:

:%s/$/$/
:g/^MaRkNeXt/,/MaRkNeXt/-1join!
:%sort
:%s/\$/\r/g
:g/MaRkNeXt/d
1 голос
/ 20 февраля 2014

Альтернативным подходом может быть использование плагина vim Taglist.Какой самый популярный и популярный плагин для vim.

http://vim -taglist.sourceforge.net /

Затем вы можете легко просматривать упорядоченные по алфавиту функции илив порядке их определения.

При добавлении следующей строки в файл vimrc порядок по умолчанию будет алфавитным.

let Tlist_Sort_Type = "name"

Вы можетенажмите клавишу «s» на вкладке «Taglist», чтобы переключить порядок.

найдите «Tlist_Sort_Type» в приведенной ниже ссылке для официальных документов:

http://vim -taglist.sourceforge.net/manual.html

1 голос
/ 14 февраля 2012

Выполните следующую команду (с уверенностью):

:%s/$/$/
:g/^\w/s/^/\r/
ggddGp
:g/^\w/,/^$/-1join!
:%sort
:%s/\$/\r/g
:g/^$/d

Вывод:

def a():
    pass
def b():
    pass
def c():
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...