正在寻找一种正确订购ctags比赛的方法

时间:2014-04-12 09:38:22

标签: vim

我有一个正确配置ctags的代码库。当我这样做时,:tjump keyword会向我显示keyword的潜在匹配列表。

但是这些匹配并未正确排序。我正在寻找一种正确排序匹配的方法,以便最佳匹配位于列表的顶部。即: - 当我直接使用Ctrl-]时,第一次跳转应该到正确的位置。

对于使用gf的GetFile导航,我找到了includeexpr,它允许我运行自定义逻辑来确定要跳转到的文件。

  

Vim是否有类似的功能来改变tags结果?

我正在考虑的另一种方法是从:tjump获取标记列表,进行排序,并覆盖Ctrl-]的映射。

  

对于这种方法,是否有一个函数来获取:tjump的匹配列表?

也欢迎任何其他想法确保正确匹配在顶部!

感谢。

2 个答案:

答案 0 :(得分:3)

通常不清楚“正确”匹配是什么。目前Vim使用以下逻辑(来自:help tag-priority):

When there are multiple matches for a tag, this priority is used:
1. "FSC"  A full matching static tag for the current file.
2. "F C"  A full matching global tag for the current file.
3. "F  "  A full matching global tag for another file.
4. "FS "  A full matching static tag for another file.
5. " SC"  An ignore-case matching static tag for the current file.
6. "  C"  An ignore-case matching global tag for the current file.
7. "   "  An ignore-case matching global tag for another file.
8. " S "  An ignore-case matching static tag for another file.

如果你想实现自己的自定义逻辑,那么(我所知道的)与includeexpr类似,可以帮助你。

您可以创建多个代码并在tags设置中对其进行排序,以便对您的偏好进行编码。但是很难说这会是什么,并且很可能需要进行一些实验。

您可以做的另一个更复杂的事情是覆盖<c-]>键(可能还有其他人,比如<c-w>])来做一些不同的事情。类似的东西:

nnoremap <c-]> :call <SID>JumpToTag()<cr>

function! s:JumpToTag()
  " try to find a word under the cursor
  let current_word = expand("<cword>")

  " check if there is one
  if current_word == ''
    echomsg "No word under the cursor"
    return
  endif

  " find all tags for the given word
  let tags = taglist('^'.current_word.'$')

  " if no tags are found, bail out
  if empty(tags)
    echomsg "No tags found for: ".current_word
    return
  endif

  " take the first tag, or implement some more complicated logic here
  let selected_tag = tags[0]

  " edit the relevant file, jump to the tag's position
  exe 'edit '.selected_tag.filename
  exe selected_tag.cmd
endfunction

您可以使用taglist()功能找到光标下单词的标签。然后,您可以实现自己的逻辑,而不是let selected_tag = tags[0],例如过滤掉测试文件或按特定条件排序。

不幸的是,由于您手动编辑文件,因此无法维护:tnext:tprevious命令。您可以使用quickfix或位置列表替换它,使用setqflist()函数将标签按照您喜欢的方式排序,然后使用:cnext:cprev进行导航。但这是一个更多的脚本:)。如果你决定走下这个兔子洞,你可能想看一下我的tagfinder插件的来源,寻找灵感。

答案 1 :(得分:0)

基于您对@ AndrewRadev的回答的评论:

我经常创建一个“mktags”脚本来构建ctags,然后从我想要省略的标签文件中过滤掉。例如(对于sh,ksh,bash,zsh):

ctags "$@"
egrep -v "RE-for-tags-to-delete" tags > tags.$$
mv tags.$$ tags