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 和局部变量的主要内容,如果未能解决你的问题,请参考以下文章

请教局部变量的问题

局部变量和全局变量的区别

全局变量 静态变量 局部变量 啥时候创建 啥时候撤销

全局变量和局部变量的区别

java 自变量 局部变量

java中静态成员变量、实例变量、局部变量何时创建、何时销毁?