如何在Vim或CTags中调整C/C++标签导航的排序顺序?
嘿,这个问题我之前拆分头文件和源文件写代码时也碰到过!刚好有两个靠谱的解决方案,一个是从CTags生成tags文件时就调整顺序,另一个是在Vim里直接修改标签导航的排序逻辑,你可以根据自己的习惯选择:
方案一:在CTags生成时调整顺序
默认情况下CTags会按标签名+文件名的字母顺序排序,导致.h文件的标签可能排在.c前面。我们可以先生成不排序的tags,再通过shell命令把.c相关的标签条目移到前面:
- 生成不排序的tags文件:
ctags --sort=no -R .
这里--sort=no告诉CTags不要自动排序,保留标签生成的原始顺序;-R .是递归扫描当前目录的所有文件。
- 调整tags文件的顺序,把.c结尾的条目放在前面:
awk '/\.c$/ {print; next} 1' tags > new_tags && mv new_tags tags
这个awk命令会先输出所有包含.c结尾的行,再输出其他行,这样同一个标签的.c文件条目就会排在.h文件前面了。
方案二:在Vim中自定义标签排序逻辑
如果不想每次生成tags都额外处理,也可以直接在Vim里设置自定义的标签排序函数,让导航时优先显示.c文件的标签。
在你的.vimrc(或init.vim)中添加以下代码:
function! MyTagSort(tags) " 把.c文件的标签放在最前面,然后是其他文件,最后是.h文件 let c_tags = filter(copy(a:tags), 'v:val.filename =~# ''\.c$''') let other_tags = filter(copy(a:tags), 'v:val.filename !~# ''\.[ch]$''') let h_tags = filter(copy(a:tags), 'v:val.filename =~# ''\.h$''') return c_tags + other_tags + h_tags endfunction " 让Vim使用我们自定义的排序函数 let g:tag_sort_function = function('MyTagSort')
添加后重启Vim,下次用Ctrl+]跳转标签时,Vim会自动把.c文件的标签排在最前面,不用再手动选择。
两种方案各有优势:方案一修改的是tags文件本身,不管用什么编辑器打开都生效;方案二是在Vim层面调整,更灵活,适合经常切换项目的场景。
内容的提问来源于stack exchange,提问作者Andreas Otto
相关产品推荐
相关产品推荐

