Для таких вещей, как:
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