在vim中按名称排序函数

5 投票
3 回答
1436 浏览
提问于 2025-04-17 13:00

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

比如说,排序前是这样的:

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

排序后是这样的:

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

我可以这样做吗?

3 个回答

1

另一种方法是使用vim的Taglist插件。这是vim中评价最高、下载量最多的插件。

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

使用这个插件,你可以轻松查看函数,按字母顺序或按定义的顺序排列。

如果你在vimrc文件中添加以下这一行,默认的排列顺序就会变成字母顺序。

let Tlist_Sort_Type = "name"

在Taglist标签页中,你可以按's'键来切换排列顺序。

想要查看官方文档,可以在下面的链接中搜索“Tlist_Sort_Type”:

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

2

请自信地执行以下命令:

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

输出结果:

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

对于像这样的内容:

def a():
    stmt1

    stmt2
def b():
    stmt3

或者C语言:

void a()
{
    stmt1;

    stmt2;
}

void b()
{
    stmt3;
}

你需要有足够的理解能力来判断,stmt1和stmt2之间的空白区域仍然是属于的部分。

在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

撰写回答