之前在www.vim.org上逛,很惊讶于一个刚发布的插件居然就能获得100多的评分,很是吃惊,看了介绍才知道居然是一个类taglist的插件,并且弥补了一些taglist未曾解决的缺陷。 链接如下: Tagbar
我们以C++的头文件和实现文件为例,用图片来直观的比较一下与taglist.vim的区别。
首先是头文件,代码如下:
class CTestTagBar
{
public:
CTestTagBar();
virtual ~CTestTagBar();
protected:
int GetName(bool bOpen);
private:
int _init(int timeout);
private:
int m_ret;
};
截图如下,其中左边的是taglist,右边的是tagbar。
然后是cpp文件,代码如下:
#include "test_tagbar.h"
CTestTagBar::CTestTagBar()
{}
CTestTagBar::~CTestTagBar()
{}
int CTestTagBar::GetName(bool bOpen)
{}
int CTestTagBar::_init(int timeout)
{}
截图如下,也是左边taglist,右边tagbar。
OK,相信大家一眼就能看出来tagbar与taglist关注点的区别。笔者通过自身的使用,简单的列了几点比taglist优化了的地方。
- 支持头文件的函数列表显示
细心的读者可能会发现,tagbar对函数的可见级别也是做了区分的,分别用+ - # 并配合着色来做了区分 - 对面向对象的支持更好
taglist虽然也会列出类列表,但是整体还是很不直观 - 自动根据文件修改时间来重建
taglist在这一点上体验就很不好,其实明明可以通过这种时间戳的方式来实现
既然tagbar有这么多好处,那我们就赶紧看看怎么用吧~
nmap <silent> <F4> :TagbarToggle<CR>
let g:tagbar_ctags_bin = 'ctags'
let g:tagbar_width = 30
- 在官网上下载tagbar.vba文件,并执行:so %
- 在vimrc中加入如下配置
- 按下F4即可显示列表
OK,就这么简单!赶紧去试试吧! 好吧,说完了这么多优点,我还是不得不提几个缺点:
- 文件不支持中文路径
这个其实taglist也有这个问题,笔者做了一个fix过之后的版本,放在这里,大家有兴趣可以自行下载。 - bug较多
可能由于刚刚发布不久,所以感觉bug还是有点多,希望能尽快fix掉。
希望插件的作者能够尽快fix掉这些问题,超过taglist,指日可待!
fanhe on #
Rating 111/33,其实我一直看不懂这表示什么。说起来面向对象啊,vim的脚本的面向对象能力还是可以的,可以实现类,动态绑定,继承(子类貌似没办法用父类的方法,需要复制代码……),用来写脚本的时候还是挺好用的。
Reply
Dante on #
不好意思,是100多分,我写错了。。。
这个评分的意思就是33个人打分,总分是111,也就是说基本上每个人都打了4分的高分。
另外,vim脚本我没用到面向对象那么远,如果要涉及到大的插件的编写的话我都是直接用python了。。。
Reply
fanhe on #
子类貌似没办法用父类的方法,需要复制代码……,说明一下,这个的意思是子类方法要覆盖父类方法的时候,没办法在子类方法调用父类方法。
Reply
eric on #
我安装了tagbar,_vimrc设置好了,taglist可用,tagbar却不现实任何函数列表内容。
不知为何?
望能解答!
常来这里,学到不少东西,非常感谢!
Reply
Dante on #
呃,那就奇怪了。。配置都是对的吗?你是什么环境下?
Reply
eric on #
系统是win 7 64位的,ctags是5.8的,ctags的Path也设置了,_vimrc配置:
nmap :TagbarToggle
let g:tagbar_width = 30
同时也装有taglist插件,可用
Reply
eric on #
通过与Tagbar的作者Jan的交流,最新版的Tagbar已经解决了我的问题。感谢Jan的耐心帮助,Jan是一个相当热心的人!也感谢vimer博主的关注。
Reply
eric on #
tagbar却不显示任何函数列表内容?
Reply
依云 on #
哈哈,这个我24小时前才装上,很不错~不过有个小问题:在 tag 上按回车跳转时,光标会转到最近访问过的窗口,而不是生成 tag 所用的那个窗口,但有时它们会是不同的窗口。
Reply
Dante on #
呃,我一般用taglist和tagbar的时候就只开一个源码窗口,就是怕乱跳。。。
Reply
依云 on #
taglist 还好,从来都是跳到正确的文件,不过经常地是以为那个 tag 是当前文件里的,结果跳过去发现是另外的文件里的 -_-!
Reply
gadmyth on #
tagbar如果能像taglist一样集成在winmanager里就好了
Reply
Dante on #
呃,其实我还是比较喜欢文件列表在左边,taglist在右边,如果想要集成的话,可以尝试自己写个插件管理一下buf~
Reply
天下懒鬼 on #
Vimer,你好,最近我想试试Voom这个插件,不过Python的设置一直弄不好。python我是从其他地方直接copy过来的,然后自己设置了环境变量。不过在gvim中每次执行:Voom这个命令的时候gvim(我在win7下运行的)就不正常退出了,很郁闷。我就自己编译了一个gvim,好不容易编译成功了。结果一样。我在gvim中执行:py print 2**0.5,也是不正常退出。不过:echo has ("python")的值是1。最后我在控制台上按照教程写了一些python的小程序(我自己不会Python)也没有问题。Vimer知道是什么原因么?
Reply
Dante on #
呃,是linux下吗?
建议参考一下编译选项:
<pre lang="bash" line="1">
./configure --prefix=/usr/vim --enable-multibyte --enable-pythoninterp --with-features=huge
</pre>
Reply
天下懒鬼 on #
我在win7下面运行的,不是Linux。奇怪的是,无论是我自己编译的,还是直接下载安装的vim都是这样子。
Reply
Dante on #
用的是vim7.3吗,那要对应安装python2.7才行。
Reply
依云 on #
如果是自己编译的那么 Python 版本无所谓了。看样子似乎是注册表和环境变量里都没有说 Python 的安装位置?试试像这样设置 PYTHONPATH:
set PYTHONPATH=%xxx%\Python27\Lib;%xxx%\Python27\DLLs
Reply
天下懒鬼 on #
折腾了几天,终于找到了,确实是Python的版本问题。我的win7上原来就装了一个python2.2,后来我从别的地方copy了一个python2.7,编译的时候指定的是python2.7的目录,结果运行时,我自己写的批处理是这样子的:
set path=%path%; ./python27/bin
运行时它找到的是python2.2的目录,估计就是这个问题了,谢谢大家的帮忙
Reply
Dante on #
哈哈,解决了就好~
Reply
liu1061 on #
呵呵, 这个不错,不错,我以前就想taglist为什么不这么做! 谢谢了! 不知道还有没有能直观显示数据间结拓扑结构的插件! 呵呵
Reply
georgexsh on #
看起来不错,多谢介绍
Reply
Tivon on #
Hi, 我按楼主说的装好了tagbar 以后,打开py文件,按F4是可以打开tagbar窗口,但是里面显示的function只有文件名,能不能把函数签名如 aaa function(param1,param2)等等也显示出来? 我是win7 + gvim + ipython
谢谢!
Reply
Dante on #
呃,这里没有试过,可以看一下tagbar的文档
Reply
Tivon on #
是不是这个功能依赖 python.dl?
我的机器是64位的,python 也只能装64的,vim是32位的。。。
所以vim里找不到python27.dll
Reply
Dante on #
应该没关系。
Reply
vimest on #
这次终于看清了,原来是tagbar,不是tabbar,还以为是切换buffer的那插件,唉
Reply
sniperbat on #
HI,好,我下载并且安装tagbar以后,却无法执行script,提示说Not an editor command: TagbarToggle。在window环境下是好的,而现在我用的是Mac,MacVim,版本7.3.。。请问还有什么没设置或者可能是那方面错误么?taglist等都可以使用。
Reply
sniperbat on #
补充说明:
安装ConqueTerm也没有运行成功,情况一样。
貌似是和采用vmb安装有关系。
Reply
Dante on #
这个。。我没有试过macvim,这个问题可能没法帮你解答。。不好意思。。
Reply
sniperbat on #
换成不采用vmb安装,直接把2个plugin的vim相关文件拷贝到.vim目录相应目录里,删除.VimballRecord,就好了。。。。原因不明。
Reply