当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 25 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-20 23:48 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
本来有了个 clangcomplete 的了, 但是还是不成熟, 主要原因是太慢了
还是决定用ctags写一个全能补全插件, 速度还是不错的, 缺点当然当然是不够准确
不过, 只要准确度能接受也就行了

============================================================
对vim的基本要求, 最好是7.3, 因为 我的是7.3, 7.2我没有测试过, 并且要有 +python 特性
代码:
set nocp
filetype plugin on


其他要求, 需要安装 python
代码:
sudo apt-get install python


最后, 这个插件不能与 omnicppcomplete 共存, 如果想用这个插件, 必须删除 omnicppcomplete

安装方法, 下载 VLOmniCpp.vba.tar.bz2, 解压后, 用 vim 打开 VLOmniCpp.vba, 然后
代码:
:so %


另外一个, 是修改过的 ctags, 下载后扔进用户目录的 bin 目录里面
如果你不想用这个 ctags, 就需要
代码:
ln -s /usr/bin/ctags ~/bin/vlctags

因为我硬编码了路径, 以后应该改成可配置的

============================================================
基本配置, 暂时只实现以下配置
代码:
    " Set MayComplete to '.'
    "   0 = disabled
    "   1 = enabled
    "   default = 1
    if !exists('g:VLOmniCpp_MayCompleteDot')
        let g:VLOmniCpp_MayCompleteDot = 1
    endif

    " Set MayComplete to '->'
    "   0 = disabled
    "   1 = enabled
    "   default = 1
    if !exists('g:VLOmniCpp_MayCompleteArrow')
        let g:VLOmniCpp_MayCompleteArrow = 1
    endif

    " Set MayComplete to '::'
    "   0 = disabled
    "   1 = enabled
    "   default = 2
    if !exists('g:VLOmniCpp_MayCompleteColon')
        let g:VLOmniCpp_MayCompleteColon = 1
    endif

    " When completeopt does not contain longest option, this setting
    " controls the behaviour of the popup menu selection
    " when starting the completion
    "   0 = don't select first item
    "   1 = select first item (inserting it to the text)
    "   2 = select first item (without inserting it to the text)
    "   default = 2
    if !exists('g:VLOmniCpp_ItemSelectionMode')
        let g:VLOmniCpp_ItemSelectionMode = 2
    endif
endfunc


使用:

代码:
class Base {
   int a;
   void Func(void)
   {
   }
};

class Derive : Base {
public:
   int b;

protected:
   int c;
   Base & Func(void);
};

int main(int argc, char *argv[])
{
   Derive d;
   d.Func();

   return 0;
}


例如这个源文件, 需要先做一个 ctags 数据库
代码:
:VTMParseFiles t.cpp

之后到 d.Func() 后面, 按 . 应该就会有提示的了.
附件:
screenshot1.png
screenshot1.png [ 24.72 KiB | 被浏览 1892 次 ]



数据库文件由这个选项配置, 默认值如下
代码:
let g:VimTagsManager_DbFile = 'VimLiteTags.db'


你可以在你的 .vimrc 配置, 如果是相对路径, 就是相对于你打开 vim 时所在的路径, 如果是绝对路径, 就是绝对路径
注意: 默认情况下, 打开vim, 当前目录都是 ~/ , 如果你想打开vim时在其他目录, 自己写脚本或者到终端切换目录后再打开 vim

============================================================
问题:
1. 暂不支持 using 语句

其他问题, 欢迎汇报.

============================================================
Changelog:
20110535: 1.支持深层次的类模版继承, 算是基本完成了类模版的补全
可如下测试, codelite没有通过 4,5 的测试, codeblocks 也一样
代码:
class A {
public:
    int a;
};

class AA {
public:
    int aa;
};

template<typename T>
class A2 {
public:
    int a2;
    T ta2;
};

template<typename T>
class B {
public:
    int b;
    T tb;
};

template<typename T1, typename T2>
class B2 : public A2<T2> {
public:
    int b2;
    T1 tb21;
    T2 tb22;
};

template<typename T>
class C : public B<T>, public B2<T, A> {
public:
    int c;
    T tc;
};

int main(int argc, char *argv[])
{
    C<AA> c;
    c.tc; // test1
    c.tb; // test2
    c.ta2; // test3
    c.tb21; // test4
    c.tb22; // test5
    c.tb; // test6
    c.b; // test7 -> failed

    return 0;
}

20110522: 1.添加类模版支持(暂支持一层模版继承). 2.修复 this-> 的一些问题
模版支持测试如下, 记得先生成 tags 数据库, 然后在有 test 字样的前面的 ; 号前按 .
欢迎贡献更完善的测试代码
代码:
class A1 {
public:
    int a1;
};

class A2 {
public:
    int a2;
};

template<typename T>
class B1 {
public:
    int b1;
    T t;
    T * Get1() { return new T; }
};

template<typename T1, typename T2>
class B2 {
public:
    int b2;
    A1 a1;
    T1 t1;
    T2 t2;
    T2 * Get2() { return new T2; }
};

template<typename T>
class C : public B1<A1>, public B2<A1, T> {
public:
    T c;
    B1<A1> b1a1;
    void Func()
    {
        this->t; // test1 -> a1
        this->t1; // test2 -> a1
        this->t2; // test3 -> failed
    }
};

int main(int argc, char *argv[])
{
    B2<A1, A2> b2;
    b2.t2; // test4
    b2.Get2(); // test5

    C<A2> c1;
    c1.c; // test6
    c1.t; // test7
    c1.Get2(); // test8
    c1.b1a1.t; // test9

    return 0;
}


附件:
VLOmniCpp.vba.tar.bz2 [32.9 KiB]
被下载 38 次
vlctags.tar.bz2 [57.54 KiB]
被下载 19 次


最后由 fanhe 编辑于 2011-05-23 14:22,总共编辑了 7 次
页首
 用户资料  
 
2 楼 
 文章标题 : Re: VLOmniCpp 0.1 - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-21 0:13 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
补充下
这个插件是以文件为单位生成与组织 tags 的, 如果你对同一个文件 parse 两次, 在第二次的时候, 如果这个文件的修改时间比你最后一次parse的时间要早, 就会忽略这个文件
也就是说, 会 '智能' 地增量 parse 文件

如果你一次需要parse很多文件, 可以用这个函数, 参数是文件列表, 如 ['main.h', 'main.cpp']
代码:
g:VTMParseFiles()


页首
 用户资料  
 
3 楼 
 文章标题 : Re: VLOmniCpp 0.1 - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-21 0:25 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
我想问一下,这个相比 omnicppcomplete 的优点是什么?


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
4 楼 
 文章标题 : Re: VLOmniCpp 0.1 - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-21 0:40 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
lilydjwg 写道:
我想问一下,这个相比 omnicppcomplete 的优点是什么?

tags 增量更新, 函数返回值支持, 而且, 据我测试, 补全速度比旧的要快, 因为旧的在搜索符号的时候, 是一次只能查找一个符号, 我这个可以一次查找几个符号.
还有, 以后会实现的模版支持, 还可以根据包含的头文件分析补全的符号
反正就是易于扩展就是了, 如果只依靠 taglist 函数, 能力非常有限!
当然, 除了 tags 增量更新外, 其他都要是通过hack ctags实现的


页首
 用户资料  
 
5 楼 
 文章标题 : Re: VLOmniCpp 0.1 - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-21 0:58 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
fanhe 写道:
tags 增量更新, 函数返回值支持, 而且, 据我测试, 补全速度比旧的要快, 因为旧的在搜索符号的时候, 是一次只能查找一个符号, 我这个可以一次查找几个符号.
还有, 以后会实现的模版支持, 还可以根据包含的头文件分析补全的符号
反正就是易于扩展就是了, 如果只依靠 taglist 函数, 能力非常有限!
当然, 除了 tags 增量更新外, 其他都要是通过hack ctags实现的


貌似很不错。不知道你是否有兴趣同时支持 Python3 呢?一般来说,像这种 Vim 插件的 Python 部分是很容易转成 Py3 的,基本上替换掉所有的 py 命令就可以了。但现在我发现你多处调用了 py 命令。有没有可能集中一下,然后根据 Python 版本分别处理?

PS: 我的 Vim 只支持 Python 3。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
6 楼 
 文章标题 : Re: VLOmniCpp 0.1 - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-21 1:18 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
lilydjwg 写道:
fanhe 写道:
tags 增量更新, 函数返回值支持, 而且, 据我测试, 补全速度比旧的要快, 因为旧的在搜索符号的时候, 是一次只能查找一个符号, 我这个可以一次查找几个符号.
还有, 以后会实现的模版支持, 还可以根据包含的头文件分析补全的符号
反正就是易于扩展就是了, 如果只依靠 taglist 函数, 能力非常有限!
当然, 除了 tags 增量更新外, 其他都要是通过hack ctags实现的


貌似很不错。不知道你是否有兴趣同时支持 Python3 呢?一般来说,像这种 Vim 插件的 Python 部分是很容易转成 Py3 的,基本上替换掉所有的 py 命令就可以了。但现在我发现你多处调用了 py 命令。有没有可能集中一下,然后根据 Python 版本分别处理?

PS: 我的 Vim 只支持 Python 3。

只有 VimTagsManager.vim 这个 .vim 文件用到 python, 其他 .vim 都没有用到 python的
直接在 VimTagsManager.vim 改应该就行了, 其他 .py 就 2to3


页首
 用户资料  
 
7 楼 
 文章标题 : Re: VLOmniCpp 0.1 - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-21 8:52 

注册: 2010-11-11 18:13
帖子: 157
系统: Ubuntu
送出感谢: 0 次
接收感谢: 4
马克马克,强烈支持
等待支持模板和using

我就不明白omnicppcomplete官网明明写着
It's not finished yet
为什么从07年就没有新版本了呢


页首
 用户资料  
 
8 楼 
 文章标题 : Re: VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-26 20:51 

注册: 2009-06-07 9:58
帖子: 43
送出感谢: 0 次
接收感谢: 0 次
嘿嘿,非常值得我学习,我目前立志于改进/重写 codeblocks的代码完成模块。


_________________
OpenCV & Codeblocks


页首
 用户资料  
 
9 楼 
 文章标题 : Re: VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-26 21:00 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
asmwarrior 写道:
嘿嘿,非常值得我学习,我目前立志于改进/重写 codeblocks的代码完成模块。

最近一个星期一直在搞模版的事, 现在算是基本完成了, 在处理名空间的事
最大的感想就是, 实在没办法做到100%精确, 只能处理风格良好的代码
如果想办法做到100%准确, 开销相当大, 对于脚本来说不可接受
你可以试一下下面这个不是很复杂的模版测试, 如果复杂的情况, 如基类加了一堆作用域, 或者基类定义在打开的某个命名空间中等等
[cpp]
class A {
public:
int a;
};

class AA {
public:
int aa;
};

template<typename T>
class A2 {
public:
int a2;
T ta2;
};
int g_b;
template<typename T>
class B {
public:
int b;
T tb;
class BB {
int bb;
void BBFunc()
{
}
};
};

template<typename T1, typename T2>
class B2 : public A2<T2> {
public:
int b2;
T1 tb21;
T2 tb22;
AA aaaa;
A2<T1> b2a2t1;
A2<A> b2a2t2;
T1 B2Get();
//T2<T1> bt2t1;
};

template<typename T = A>
class C : public B<T>, public B2<T, A> {
public:
int c;
T tc;
T Get() { return B2<T, A>::tb21; }
};

int main(int argc, char *argv[])
{
C<AA> c;
c.tc; // test1
c.tb; // test2
c.ta2; // test3
c.tb21; // test4
c.tb22; // test5
c.tb; // test6
c.b; // test7 -> failed
c.Get(); // test8
c.b2a2t1.ta2; // test9
c.b2a2t2.ta2; // test10

return 0;
}
[/cpp]

最后, 我对codeblocks的parser有点兴趣, 不知道能不能提取出来, 我可以把ctags换成cb的parser, 只要符号能存进去我的数据库就行了

上次提到的对于stl的模版支持问题, 我看了下stl的头文件, 发现, 真的不是这么好处理的...
估计codelite作者作了硬替换


最后由 fanhe 编辑于 2011-05-26 21:34,总共编辑了 2 次

页首
 用户资料  
 
10 楼 
 文章标题 : Re: VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-26 21:11 
头像

注册: 2010-09-13 19:04
帖子: 1404
地址: 0xFF00EE
送出感谢: 1
接收感谢: 3
能不能支持python啊


_________________
qq旋风离线空间下载程序
漂亮的fcitx皮肤
Fcitx皮肤合集


页首
 用户资料  
 
11 楼 
 文章标题 : Re: VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-26 21:13 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
acer4740 写道:
能不能支持python啊

可以预计, 不能支持
动态类型的语言, 我都不知道怎么搞
参数都没类型, 我怎么知道那个参数有什么成员


页首
 用户资料  
 
12 楼 
 文章标题 : Re: VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-26 21:22 
头像

注册: 2010-09-13 19:04
帖子: 1404
地址: 0xFF00EE
送出感谢: 1
接收感谢: 3
fanhe 写道:
acer4740 写道:
能不能支持python啊

可以预计, 不能支持
动态类型的语言, 我都不知道怎么搞
参数都没类型, 我怎么知道那个参数有什么成员


java呢


_________________
qq旋风离线空间下载程序
漂亮的fcitx皮肤
Fcitx皮肤合集


页首
 用户资料  
 
13 楼 
 文章标题 : Re: VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-26 21:29 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
acer4740 写道:
fanhe 写道:
acer4740 写道:
能不能支持python啊

可以预计, 不能支持
动态类型的语言, 我都不知道怎么搞
参数都没类型, 我怎么知道那个参数有什么成员


java呢

java 是静态类型吧


页首
 用户资料  
 
14 楼 
 文章标题 : Re: VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-26 21:30 
头像

注册: 2010-09-13 19:04
帖子: 1404
地址: 0xFF00EE
送出感谢: 1
接收感谢: 3
fanhe 写道:
acer4740 写道:
fanhe 写道:
acer4740 写道:
能不能支持python啊

可以预计, 不能支持
动态类型的语言, 我都不知道怎么搞
参数都没类型, 我怎么知道那个参数有什么成员


java呢

java 是静态类型吧




_________________
qq旋风离线空间下载程序
漂亮的fcitx皮肤
Fcitx皮肤合集


页首
 用户资料  
 
15 楼 
 文章标题 : Re: VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
帖子发表于 : 2011-05-26 21:36 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
acer4740 写道:
fanhe 写道:
acer4740 写道:
fanhe 写道:
acer4740 写道:
能不能支持python啊

可以预计, 不能支持
动态类型的语言, 我都不知道怎么搞
参数都没类型, 我怎么知道那个参数有什么成员


java呢

java 是静态类型吧



我不想折腾动态类型的自动补全
我写python的时候, 都是只用上下文补全而已

你的意思是是否支持java?
我不熟java, 没法支持


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 25 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译