在vim中获取ctags来定义,而不是声明
我遇到的问题是,vim / gvim中的ctags把我带到了一个前向声明中,而不是函数的实际定义。
任何方式来解决这个问题?
我认为最简单的方法是使用“g ctrl-”而不是“ctrl-”“。 如果只有一场比赛,它会把你带到那里。 如果有多个匹配,它会列出所有的,让你select你想要的,就像:tselect。 两全其美的。 🙂
你应该可以使用tn
和tp
跳转到各种匹配的标签。
- 按
^]
带你到第一场比赛。 - 如果这不符合你想要的,请input
:tn
进入下一个。 - 如果input太多次,可以input
:tp
返回上一个。
我相信Vim会默认到标签文件中的第一个标签。 如果您愿意,您可以select另一个:use :tj
(类似于:tselect,但是如果只有一个匹配,则自动跳转)或Ctrl-]
后跟:tn
)。
更改默认值的唯一方法是更改标签文件的顺序,但我不相信ctags提供了一个命令行选项来执行此操作。
这不像听起来那么困难,因为您基本上需要一个打开标签文件的脚本,按“类”标签对其进行sorting,然后再次将其写回。 标签中的“kind”是一个描述它是函数(f),函数原型(p),macros,枚举名等等的单个字符。如果你使用的是Linux, 理论上 ,如此简单:
#!/bin/sh ctags -R -f - . | tac > tags
由于tac
反转文件中行的顺序,因此会自动将定义放在第一位。 然而,由于头文件需要维护,Vim更加复杂,Vim更喜欢标签文件进行sorting,所以最好先浏览一下文件,然后按顺序对第一个条目(标签名称)进行sorting,然后相反的顺序。 因此,更复杂的东西可能会更好。
我为无耻的插件表示歉意,但我已经写了一个Vim插件(间接)做你所需要的。 它旨在为函数名,macros,枚举等类似的东西添加许多额外的高亮显示组。然而,这样做的其他事情之一是对标记文件进行重新sorting,以便函数实现在函数声明之前出现,从而实现你想要的(我有和你一样的需求)。 如果你不想要任何突出显示function,你可以很容易地将其全部删除:这是一个相当简单的Python程序和一个更简单的Vim脚本,可以从我的网站上获得 。
:tselect my_little_function
你会得到一个匹配列表。 或者如果你跳到一个标签,你不满意,然后键入
:tselect
你会得到最后一个活动标签的替代列表。
将以下内容添加到.vimrc文件中:
noremap <c-]> 2<c-]>
这一行导致vim自动跳转到第二个匹配(而不是第一个匹配),通常是函数定义。
这个选项对我更好
在.vimrc中放入以下行,现在可以使用鼠标双击(在文件中的variable/entry
上)跳转到标记的位置。 如果find单个匹配,它将立即跳转。 如果多个条目匹配,则会提示用户input。
:map <2-LeftMouse> g< c-]>
晚会,但对于传入vim标签googlers:
我发现使用cscope除了ctags是要走的路,至less对于C / C ++来说。 它对呼叫树更聪明,如果失败,可以将其设置为ctags。 每次运行ctags -R时运行“cscope -b”。 你会准备好去的 如果您使用下面的设置,您可以像往常一样使用Ctrl – ] / Ctrl-T,但是您也可以添加漂亮的新跳转,如跳转到函数声明并显示函数调用者的跳转列表。
" setup if has("cscope") set csto=0 set cst set nocsverb " add any database in current directory if filereadable("cscope.out") cs add cscope.out " else add database pointed to by environment elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif set csverb endif " jump to a function declaration nmap <silent> <C-\> :cs find s <CR>=expand("<cword>")<CR><CR>1<CR><CR> " show a list of where function is called nmap <silent> <C-_> :cs find c <CR>=expand("<cword>")<CR><CR>
有几种方法可以让Vim直接跳转到一个标签,如果只有一个标签匹配的话,否则会出现一个标签匹配列表。
你可以使用' tjump
命令。 例如,命令' :tjump func1
'将跳转到定义func1,如果只定义一次。 如果func1被多次定义,将会出现一个匹配的标签列表。
您可以将光标放在标签上并按下g Ctrl-]
。
您可以在视觉上select一个文本,然后按g Ctrl-]
跳转或列出匹配的标签。
你可以使用' stjump
命令。 这将在新窗口中打开标签列表中的匹配或选定的标签。
你可以按Ctrl-W g Ctrl-]
做一个:stjump。
Help: :tjump, g_Ctrl-], v_g_CTRL-], :stjump, Ctrl-W_g_Ctrl-]
你可以按2再按CTRL + ] ,这个会直接进入第二个匹配,在java中,这个通常是执行一些接口。