taglist 和局部变量
Posted
技术标签:
【中文标题】taglist 和局部变量【英文标题】:taglist and local variable 【发布时间】:2016-09-12 13:03:07 【问题描述】:在 VIM 中使用 taglist
插件时,我们可以使用 Ctrl
+ ]
跳转到全局变量或函数。但是,如果变量是本地变量,则无法在标签中找到。我从这个link 发现我们可以使用gd
跳转到局部变量或使用gD
跳转到全局变量。
由于这超出了 taglist 命令的范围,我们不能使用Ctrl
+ t
回到我们跳转的地方。
如果没有找到标签,是否可以增强taglist
以跳转到局部变量?然后用栈返回到跳出的地方?
【问题讨论】:
当然你可以将它作为一个补丁来实现(所以你的问题的答案是“是”),但是,这不是核心标签功能,所以插件的作者可能不会接受它。 @IngoKarkat 你能告诉我如何开发这个补丁吗?我需要覆盖Ctrl
+ ]
键的行为
首先,<C-]>
与 Taglist 插件以任何方式无关。其次,<C-]>
会跳转到第一个匹配的标签,无论它在哪个文件中。如果您希望能够选择要跳转到的文件,请尝试g]
。
假设“局部变量”是指 Vim 脚本中的 s:
变量,那么您的问题是 crags
和默认的 iskeyword
之间的交互。将此添加到文件 after/syntax/vim.vim
以修复它:setlocal iskeyword+=:
。
【参考方案1】:
这是一个映射。因为 Taglist 插件实际上并没有这样定义(它只提供当前缓冲区的标签的显示,并设置标签),所以不需要与它集成。
nnoremap <silent> <C-]> :<C-u>let pos = [bufnr('')] + getpos('.')<Bar>execute 'normal!' (v:count ? v:count : '') . "\<lt>C-]>"<CR>:if pos == [bufnr('')] + getpos('.')<Bar>execute 'normal! gd'<Bar>endif<CR>
这首先记录当前缓冲区和光标位置,然后尝试执行正常的标签跳转。如果位置没有改变,我们回退到gd
命令。哦,其实我们不用查位置,可以用try...catch
代替。版本 2:
nnoremap <silent> <C-]> :<C-u>try<Bar>execute 'normal!' (v:count ? v:count : '') . "\<lt>C-]>"<Bar>catch /^Vim\%((\a\+)\)\=:E426:/<Bar>execute 'normal! gd'<Bar>endtry<CR>
【讨论】:
不是我想要的,但非常接近。感谢您的解决方案。以上是关于taglist 和局部变量的主要内容,如果未能解决你的问题,请参考以下文章