VimLite 0.5_272

Vim、Emacs配置和使用
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

VimLite 0.5_272

#1

帖子 fanhe » 2011-04-20 23:08

本帖已废弃,请转至此贴 viewtopic.php?f=68&t=342932

==============================================

VimLite 就是一个把 vim 变成我本人所想的 C/C++ IDE 的一个个人开源项目
用到的组件主要是 codelite 这个ide里面的
现在暂时算是完成了codelite项目模块的“移植”(用 python 重写), 基于 ctags parser 的全能补全
当然,还有一些小功能没有完成的,例如环境变量和 Custom Makefile Rules

系统要求:gvim 7.3(7.2估计也行,但是好像忘记用了什么 7.3的新特性了),同时要求vim的 +python 特性存在
同时要求

代码: 全选

set nocp
filetype plugin on
至于编译器什么的就不用说了吧

代码: 全选

sudo apt-get install build-essential
还有这些依赖(wxbase 是修改过的 ctags 需要的)

代码: 全选

sudo apt-get install python python python-lxml libwxbase2.8-0
安装方法:
下载最下面的附件,解压
1. 用 gvim 打开 VimLite-<version>.vba,执行命令
2. 把 vimlite 目录里面的文件放到用户目录下的 .vimlite 里面(正常情况下应该没有这个目录的,新建一个)

代码: 全选

:so %
============================================================
使用方法:

1. 项目管理
打开 gvim, 执行命令

代码: 全选

:VLWorkspaceOpen
这样在左侧就会出现 “DEFAULT_WORKSPACE” 字样,这是空工作空间,请不要在这个工作空间添加新项目
而是按 '.' (点),之后会看到菜单,选择 ’3. New Workspace...',之后会跳到一个新窗口,这是一个对话框交互窗口
把光标放到任何一个“控件”行,按 enter 或者 双击鼠标,会有提示输出之类的动作
例如我新建一个 Test 的工作空间(注:这类名字请最好使用符合 C 语言的变量名字,尽量不要使用特殊符号)
screenshot1.png
按 <C-x><C-s>(ctrl-x 后再 ctrl-s)会保存推出并创建工作空间

然后,再按 . ,选择 “Create A New Project...”,之后又是一个交互对话,同上的操作
最下面那个是一个项目模版列表,可以在列表上面的组合框选择不同类别,例如我选一个最简单的“Simple executable (gcc)”
注:非gnu gcc或gnu g++的编译器的模版不要选
screenshot2.png
同样按 <C-x><C-s> 结束

最后你就看到左侧多了个项目,可以展开来看看,有一个 main.c文件,双击或enter键可以打开
想编译的话,就点工具栏的三个新按钮的左边那个
screenshot3.png
screenshot3.png (2.2 KiB) 查看 3804 次
运行的话就点右边那个
screenshot4.png
就这样简单。

2. 全能补全
1) 生成必要的数据库
把光标放到左侧工作空间缓冲区的工作空间名字的行中, 按 '.' 或鼠标右键(这个估计多数不行),
选择菜单 'Parse Workspace (Quick)', 会解析整个工作空间的文件, 这可能需要一些时间的.

2) 全能补全已经开启, 按 <C-x><C-o>, 或者在成员补全的时候就会自动提示的了.
支持模版,
基本支持 stl
支持 using [namespace]

不支持函数局部变量, 因为 ctags 不解析函数局部变量或即使解析了信息也不全. 一个折衷的解决方案是用 <C-x><C-n> 补全
不支持在包含文件中使用 using namespace, 因为这本来就不推荐这样做.
不支持友元, 这个只要显示了私有成员就没问题了
不支持重载了返回类型的函数
不支持复杂的类型定义(typedef typename _Alloc::template rebind<value_type>::other _Pair_alloc_type;)
cltest02.png
3. 定制

1. 工作空间的定制
[vim]"工作空间缓冲区的宽度
let g:VLWorkspaceWinSize = 30

"工作空间缓冲区的名字
let g:VLWorkspaceBufName = '--VLWorkspace--'

"高亮工作空间缓冲区光标所在行, 若为 0, 不高亮
let g:VLWrokspaceHighlightCursorline = 1

"若为 1,编辑项目文件时,在工作空间的光标会自动定位到对应的文件所在的行
let g:VLWorkspaceLinkToEidtor = 1

"启用工具栏图标菜单(构建, 清理, 运行), 若为 0, 禁用
let g:VLWorkspaceEnableMenuBarMenu = 1

"启用菜单栏菜单(VimLite), 若为 0, 禁用
let g:VLWorkspaceEnableToolBarMenu = 1

"启用 cscope, 若为 0, 禁用(以后补充用法)
let g:VLWorkspaceEnableCscope = 1

"仅在启用 cscope 时有用, 仅连接存在的 cscope 数据库, 不主动创建.
let g:VLWorkspaceJustConnectExistCscopeDb = 1

"高亮工作空间源文件
let g:VLWorkspaceHighlightSourceFile = 1

"在标题栏中显示当前工作空间名称
let g:VLWorkspaceDispWspNameInTitle = 1

"构建项目前保存所有已修改的文件
let g:VLWorkspaceSaveAllBeforeBuild = 0

"使用基于 clang 的全能补全
let g:VLWorkspaceUseClangCC = 0

"活动项目的高亮颜色
let g:VLWorkspaceActiveProjectHlGroup = 'SpecialKey'

"弹出基于字符的菜单的按键
let g:VLWorkspaceMenuKey = '.'

"弹出基于 gtk 的菜单的按键, 这个默认值可能会表现为失效, 请修改为你想要的值
let g:VLWorkspacePopupMenuKey = '<RightRelease>'
[/vim]


1. OmniCpp 全能补全定制
[vim]"显示函数参数提示的快捷键
let g:VLW_DispCalltipsKey = '<A-p>'

"显示重载函数的下一个函数参数提示的快捷键
let g:VLW_NextCalltipsKey = '<A-j>'

"显示重载函数的上一个函数参数提示的快捷键
let g:VLW_PrevCalltipsKey = '<A-k>'

"自动检测 '.' 的全能补全
let g:VLOmniCpp_MayCompleteDot = 1

"自动检测 '>' 的全能补全
let g:VLOmniCpp_MayCompleteArrow = 1

"自动检测 ':' 的全能补全
let g:VLOmniCpp_MayCompleteColon = 1

"补全菜单选择方式
" 0 -> 不选择第一个条目
" 1 -> 选择第一个条目, 并插入文件
" 2 -> 选择第一个条目, 但不插入文本
let g:VLOmniCpp_ItemSelectionMode = 2

"映射回车键为显示函数参数提示的快捷键
"即在弹出菜单选择的是函数的时候, 直接按 Enter 键, 自动选择并结束补全并显示函数参数提示
let g:VLOmniCpp_MapReturnToDispCalltips = 1[/vim]

============================================================
下面简单介绍下项目配置
在工作空间窗口里面,在不同的节点类型按 . 会弹出不同的菜单,在项目上按 . ,选择 Settings,就会进入settings 对话框
Screenshot---ProjectSettings-- - (~-Desktop-VimLite-WorkspaceMgr-WorkspaceTest) - GVIM-1.png
内容基本一目了然,双击或enter编辑
需要说明的是,所有的选项是以 “;” (分号)分割的,相对目录都是相对于 .project 文件所在目录的
还有一些内部变量,以下是列表,$(CodeLitePath) 无意义
screenshot5.png
还有什么疑问的,可以参考codelite的项目设置说明 http://codelite.org/LiteEditor/ProjectSettings
如果你的codelite项目没有使用自定义环境变量和custom makefile rules的话,可以用vimlite打开,理论上是完全兼容的,可编译和运行
另外,如果你编译有错误,可以运行命令 :cwindow 打开quickfix窗口,具体参考 :h quickfix

PS: 安装包里面有个 00-VimLite 文件,可作为 nautilus-scripts 使用,用于方便打开 .workspace 文件的,内容如下

代码: 全选

#!/bin/sh

gvim -c "set columns+=30 | VLWorkspaceOpen $1"

以下为陈旧信息, 不支持
============================================================
20110423
效果图
Screenshot-main.c + (~-Desktop-VimLite-WorkspaceMgr-Test-C++-GTKTest) - GVIM8.png
快捷键是 <C-x><C-o>,> . : 的时候会自动弹出成员补全。我定义了一个 <C-n>,想禁掉,进去 VLWClangCodeCompletion.vim 注释掉
暂时没有做函数 calltips,你可以 set cot+=preview 来看一下预览,都是clang生成的元信息,暂未处理
已知问题,在头文件里面,没法补全。类中的成员,只能 this-> 才能补全,clang的问题,2.7,看来需要更新到2.9再试试
缺点,比较慢,没办法,需要实时找齐头文件然后分析,暂时不知道怎么正确缓存信息,如果能用sqlite缓存信息,还有如此就精确度的话,就完美了。
即使是用预编译头,也是比较慢……
明天升级到2.9,看看有没有什么大的改善

TODO: cscope 集成
TODO: 函数 calltips,vim原生没办法做成好像ide的那样的calltips,希望价格功能能随意弹出类似自动完成的下来框啊,暂时只能在命令行显示,好像echofunc一样。基于clang的calltips速度还是比较慢的,python的clang库帮顶没找到,不然用库调用应该会快一些。

============================================================
20110424
screenshot1.png
1.加快了自动完成(得益于 2.9 版本的 clang)
2.添加预编译头支持,可以大大加快clang的自动完成速度
3.添加函数 calltips 支持,见上图
4.添加cscope支持,但赞未开放,需要用的话,运行命令

代码: 全选

:call g:InitVLWCscopeDatabase()
或者增量更新

代码: 全选

:call g:UpdateVLWCscopeDatabase()
5.修复了 clang 在类作用域中,不能自动不全类成员(得益于 2.9 版本的 clang)

已知问题:
1.还是不能在头文件中补全,貌似是clang那边的问题

2.9 版的clang这里下载,10.04测试没有问题。和源里面的 clang 2.7冲突,请先删了 2.7 再装
http://code.google.com/p/vimlite/downloads/list
附件
VimLite-272.tar.bz2
(262.77 KiB) 已下载 76 次
上次由 fanhe 在 2011-09-14 22:03,总共编辑 28 次。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: VimLite 0.3.0,项目管理模块基本完成,有兴趣的帮忙测试

#2

帖子 fanhe » 2011-04-20 23:08

ProjectSettings.png
Screenshot.png
quickfix.png
Working.png
上次由 fanhe 在 2011-09-09 0:28,总共编辑 9 次。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: VimLite 0.3.0,项目管理模块基本完成,有兴趣的帮忙测试

#3

帖子 eexpress » 2011-04-20 23:10

支持下。

其实geany现在蛮好了。
● 鸣学
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: VimLite 0.3.0,项目管理模块基本完成,有兴趣的帮忙测试

#4

帖子 fanhe » 2011-04-20 23:15

eexpress 写了:支持下。

其实geany现在蛮好了。
其实 codelite 够好了,但是编辑功能就是没有 vim 爽,对于用vim上瘾的人来说,实在是难受啊
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: VimLite 0.3.0,项目管理模块基本完成,有兴趣的帮忙测试

#5

帖子 sarrow » 2011-04-21 8:46

支持!

没想到楼主这么快就完成了!
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#6

帖子 自由建客 » 2011-04-26 23:18

挺好 :em11
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#7

帖子 fanhe » 2011-04-26 23:44

细节部分差不多调完了
先写个帮助文档吧,不然别人还是无法用
可以保证一些基本的定制性
asmwarrior
帖子: 43
注册时间: 2009-06-07 9:58

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#8

帖子 asmwarrior » 2011-04-27 9:45

厉害,你是个编程高手啊!!!

ollydbg from codeblocks forum
OpenCV & Codeblocks
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#9

帖子 fanhe » 2011-04-27 10:05

asmwarrior 写了:厉害,你是个编程高手啊!!!

ollydbg from codeblocks forum
vim基本没办法直接调用二进制的库的,而clang的库的python绑定还没有,所以现在也仅仅是调用命令行的clang
但是最新版的输入可以直接从标准输入读取请求,不用保存一个临时文件,是比之前的版本快一些。
clang的命令行用户手册不全,文档也不全,我没法知道具体有哪些命令参数

我个人还是倾向codelite那样用sqlite保存符号信息,做几个索引,这样补全的时候比较快
我觉得codelite的准确度够满意的了,速度也不错
这是我下一步的工作,调试器最后再搞

另外,现在vimlite暂时不支持windows,只能在linux下测试
asmwarrior
帖子: 43
注册时间: 2009-06-07 9:58

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#10

帖子 asmwarrior » 2011-04-27 10:30

我研究过ctags的源代码,感觉很乱,基本看不懂。
你觉得sqlite的保存信息的方法是比较优良的么?
我目前对于Codeblocks里面保存symbol的方法非常熟悉,codeblocks内部采用了一个压缩的字典树
我当时写过一个文档,对于树的描述,在这里:
http://wiki.codeblocks.org/index.php?ti ... SearchTree
我感觉这种数据结构应该是很高效的,不知道sqlite内部是如何存储的,好像默认ctags参数的都是字符串结构,是不是这样子?

就代码提示的准确度来说,我感觉没有完整的preprocessor,基本上都很难达到准确的程度,还有就是type check也没有,所有如果有一堆namespace下面的话,也可能存在问题,另外就是模板。。。复杂无比,codelite里面对于模板之类的,有一大堆递归的替换调用,我是没有看懂。。。

但是这些都和编译器干的活不太一样,编译器至少还是对于语法和类型进行检查的,而codeblocks和codelite都不干这些事情,呵呵。
OpenCV & Codeblocks
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#11

帖子 fanhe » 2011-04-27 11:00

asmwarrior 写了:我研究过ctags的源代码,感觉很乱,基本看不懂。
你觉得sqlite的保存信息的方法是比较优良的么?
我目前对于Codeblocks里面保存symbol的方法非常熟悉,codeblocks内部采用了一个压缩的字典树
我当时写过一个文档,对于树的描述,在这里:
http://wiki.codeblocks.org/index.php?ti ... SearchTree
我感觉这种数据结构应该是很高效的,不知道sqlite内部是如何存储的,好像默认ctags参数的都是字符串结构,是不是这样子?

就代码提示的准确度来说,我感觉没有完整的preprocessor,基本上都很难达到准确的程度,还有就是type check也没有,所有如果有一堆namespace下面的话,也可能存在问题,另外就是模板。。。复杂无比,codelite里面对于模板之类的,有一大堆递归的替换调用,我是没有看懂。。。

但是这些都和编译器干的活不太一样,编译器至少还是对于语法和类型进行检查的,而codeblocks和codelite都不干这些事情,呵呵。
codelite的方法
Screenshot-SQLite Manager - -home-fan-Desktop-codelite_latest-LiteEditor.tags.png
screenshot1.png
可以看到了,表中都保存了必要的信息
要做的就是时事最快分析出补全要求,然后最快地从数据库中搜索出结果,后者的方法当然是索引了,前者的话,几乎所有不与编译器打交道的补全分析都差不多的了吧

可能你对ctags不熟悉,这个工具是比较古老的工具的了,不过能力还是相当不错的,就是对c++的支持不好
用了ctags,就会自动生成一些符号信息,都是以表形式给出的,恰好可以用关系型数据库保存
用原始的ctags产生的tags信息补全是vim一直以来的补全方法(主要是omnicpp)
但是最大的麻烦就是tags文件更新很不方便,于是可以用数据库的方法,以文件为单位通过比较时间戳实现增量更新

符号的解释基本上交给ctags完成就行了,它会生成表
我觉得用这个表实现代码补全,速度可以接受啊,加上索引,感觉会比clang实事分析快不少,只要准确度可以接受,没问题。

之前我比较过codeblocks和codelite的补全
codebloks的结果令我非常失望啊……
viewtopic.php?f=68&t=321063
asmwarrior
帖子: 43
注册时间: 2009-06-07 9:58

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#12

帖子 asmwarrior » 2011-04-27 11:29

fanhe 写了:
asmwarrior 写了:我研究过ctags的源代码,感觉很乱,基本看不懂。
你觉得sqlite的保存信息的方法是比较优良的么?
我目前对于Codeblocks里面保存symbol的方法非常熟悉,codeblocks内部采用了一个压缩的字典树
我当时写过一个文档,对于树的描述,在这里:
http://wiki.codeblocks.org/index.php?ti ... SearchTree
我感觉这种数据结构应该是很高效的,不知道sqlite内部是如何存储的,好像默认ctags参数的都是字符串结构,是不是这样子?

就代码提示的准确度来说,我感觉没有完整的preprocessor,基本上都很难达到准确的程度,还有就是type check也没有,所有如果有一堆namespace下面的话,也可能存在问题,另外就是模板。。。复杂无比,codelite里面对于模板之类的,有一大堆递归的替换调用,我是没有看懂。。。

但是这些都和编译器干的活不太一样,编译器至少还是对于语法和类型进行检查的,而codeblocks和codelite都不干这些事情,呵呵。
codelite的方法
Screenshot-SQLite Manager - -home-fan-Desktop-codelite_latest-LiteEditor.tags.png
screenshot1.png
可以看到了,表中都保存了必要的信息
要做的就是时事最快分析出补全要求,然后最快地从数据库中搜索出结果,后者的方法当然是索引了,前者的话,几乎所有不与编译器打交道的补全分析都差不多的了吧

可能你对ctags不熟悉,这个工具是比较古老的工具的了,不过能力还是相当不错的,就是对c++的支持不好
用了ctags,就会自动生成一些符号信息,都是以表形式给出的,恰好可以用关系型数据库保存
用原始的ctags产生的tags信息补全是vim一直以来的补全方法(主要是omnicpp)
但是最大的麻烦就是tags文件更新很不方便,于是可以用数据库的方法,以文件为单位通过比较时间戳实现增量更新

符号的解释基本上交给ctags完成就行了,它会生成表
我觉得用这个表实现代码补全,速度可以接受啊,加上索引,感觉会比clang实事分析快不少,只要准确度可以接受,没问题。

之前我比较过codeblocks和codelite的补全
codebloks的结果令我非常失望啊……
viewtopic.php?f=68&t=321063
关于ctags所采用的关系数据库,我确实不是很懂其内部的结构,举一个例子吧,例如,在c:/a.cpp 文件的第5行,有这么一个全局变量的定义:

MyTemplate<int,std::vector> aaa;

你知道具体其存储后的结果么? 是不是就是简单的存储两条内容:
类型字符串:MyTemplate<int,std::vector>
名字字符串:aaa
当然,这个symbol是一个variable
??不知道是不是这样的?
之前我比较过codeblocks和codelite的补全
codebloks的结果令我非常失望啊……
我看了一下你的比较结果,我没有具体测试过这个代码(在codeblocks下),但是我知道,大概在半年前,codeblocks加入了一些模板的参数替换的支持,这部分工作,当时是codeblocsk论坛的blueshake(也是个中国人)完成的。

实际上,codeblocks和codelite对于symbol的收集,我感觉已经没有什么区别。codeblocks使用的是自己的parser,存储结构为一个名字树。codelite采用ctags,同时存储结构为sqlite. ctags里面处理#if之类的预编译语句,似乎有其自己的一套捷径(通常只走#if的部分而不进行别的计算),我个人不是很喜欢。codeblocks的parser里面有对#if后的表达式进行处理,但是由于不是一个完整的preprocessor,所以这个技术其实也不太准确。
codeblocks里面处理类似的代码补全的方法和codelite有一些不一样,这个我觉得是codeblocks可以提高的地方。codelite在进行代码补全处理的时候,是依赖于其自身的bison/flex写的一个parser进行局部表达式分析的,这一块在codeblocks里面并没有(codeblocks里面采用了更简单的机制),而且我看过codelite的代码,主要是类型的匹配和替换采用了比较好的递归调用方法,所以替换效果挺好的。

简单的说:例如某个class template的函数返回的是参数是T,而你使用的是MyTemplate<wxString>这样的表达式,这样,T和wxString就建立了关联,接下来就遇到你的那个例子了,就可以正确的提示wxString的成员函数。

不管怎么说,codeblocks在表达式分析上,(我觉得在这一点上面)需要一个重写(至少应该借鉴codelite的方法)。
OpenCV & Codeblocks
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#13

帖子 fanhe » 2011-04-27 11:45

cpp里面的内容,数据库是不存储的
像你说的那个例子,数据库只记录了 MyTemplate 是一个模版的信息

具体的实现,应该是codelite的scope分析模块做的

如你所说,关于符号信息的存贮,两者没什么区别
如果你想知道codelite怎么支持模版的,就可以看看它的局部表达式分析实现方法
这个我还没看,因为最近在搞clang的
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#14

帖子 fanhe » 2011-04-27 11:52

个人比较喜欢codelite的关于符号信息的存贮方式,这样比较独立,容易被其他程序使用
就是不知道具体剥离工作复杂度多少,那些代码我还没看
头像
lainme
论坛版主
帖子: 7805
注册时间: 2008-09-13 19:17
系统: Arch Linux (x86_64)
联系:

Re: VimLite 0.3.5_20110424,基于clang的自动完成基本完成

#15

帖子 lainme » 2011-04-27 12:33

好吧。我准备当小白
回复