在vim中按名称排序函数

时间:2012-02-14 11:20:30

标签: python vim

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

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

后:

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

我能这样做吗?

3 个答案:

答案 0 :(得分:6)

对于像:

这样的事情
def a():
    stmt1

    stmt2
def b():
    stmt3

或C:

void a()
{
    stmt1;

    stmt2;
}

void b()
{
    stmt3;
}

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

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

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

有一个关于C ++的类似主题未得到答复:Automatically sort functions alphabetically in C++ code

我相信在一般情况下这是非常重要的,你最好使用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 :(得分:1)

执行以下命令(有信心):

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

输出:

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

答案 2 :(得分:1)

另一种方法可能是使用vim Taglist插件。这是vim的评价最高,下载次数最多的插件。

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

然后,您可以按字母顺序或按照定义的顺序轻松查看排序的函数。

通过在vimrc文件中添加以下行,默认顺序将按字母顺序排列。

让Tlist_Sort_Type =“name”

您可以按Taglist选项卡中的's'键来切换顺序。

在官方文档的以下链接中搜索“Tlist_Sort_Type”:

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