在vim中按名称排序函数

mon*_*nax 4 python vim

Vim可以使用"sort"命令对行进行排序.我想用vim对源代码中的函数进行排序.例如:之前

def a():
    pass
def c():
    pass
def b():
    pass
Run Code Online (Sandbox Code Playgroud)

后:

def a():
    pass
def b():
    pass
def c():
    pass
Run Code Online (Sandbox Code Playgroud)

我能这样做吗?

Run*_*olt 6

对于这样的事情:

def a():
    stmt1

    stmt2
def b():
    stmt3
Run Code Online (Sandbox Code Playgroud)

或者C:

void a()
{
    stmt1;

    stmt2;
}

void b()
{
    stmt3;
}
Run Code Online (Sandbox Code Playgroud)

您需要足够的语义知识来确定stmt1和stmt2之间的空白空间仍然是其中的一部分a.

对于python,这意味着你要提前读取第一行不是空白或缩进.您还需要考虑嵌套缩进(当函数是类或模块的一部分并且def已经缩进时).

对于C,您需要提前读取,直到匹配的结束括号 - 这意味着您需要考虑嵌套的括号.

有一个关于C++的类似话题没有答案:在C++代码中按字母顺序自动排序函数

我相信这在一般情况下是非平凡的,你最好使用yacc或其他语义解析器.您也可以手动为开头和结尾添加标记,并执行与kev建议类似的操作.

MaRkNeXt
def a():
    stmt1

    stmt2
MaRkNeXt
def b():
    stmt3
MaRkNeXt
Run Code Online (Sandbox Code Playgroud)

然后像:

:%s/$/$/
:g/^MaRkNeXt/,/MaRkNeXt/-1join!
:%sort
:%s/\$/\r/g
:g/MaRkNeXt/d
Run Code Online (Sandbox Code Playgroud)


kev*_*kev 2

自信地执行以下命令\xef\xbc\x88\xef\xbc\x89:

\n\n
:%s/$/$/\n:g/^\\w/s/^/\\r/\nggddGp\n:g/^\\w/,/^$/-1join!\n:%sort\n:%s/\\$/\\r/g\n:g/^$/d\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
def a():\n    pass\ndef b():\n    pass\ndef c():\n    pass\n
Run Code Online (Sandbox Code Playgroud)\n