在vim中按名称排序函数
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”:
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