分类: LINUX
2011-08-04 09:36:46
最近转用UBUNTU操作系统,习惯了windows下的source insight看代码,乍一下没找到合适的替代工具还真不习惯。
幸好现在网络资源丰富,从网上看了不少帖子,还是使用vim来搭建开发环境来的好。
我的环境:
UBUNTU 10.04
VIM - Vi IMproved 7.2
有些达人前辈已经给我们铺好路了:
《手把手教你把 Vim 改装成一个 IDE 编程环境》- 吴垠, 吴的blog:http://blog.csdn.net/wooin
《vim使用进阶: 使用vim提高你的文本编辑效率》-Easwy Yang,其bolg:http://easwy.com/blog/
用vim搭建IDE,主要是在vim的基础上安装一些vim的插件,和开发相关的第三方工具。
vim插件搜索地址:
先上张图片:
1. vim还是gvim?
刚开始的时候确实不知道选用哪个,按理说都差不多,gvim相比vim支持要好一点,但vim更简洁一些,也更通用一些,不过本人还是倾向于花哨点的gvim:),原因有二:一是本人主要是在graphic界面看代码,gvim更方便些;二是我喜欢的一些主题vim显示效果实在太差。
一用gvim,就出现了个问题,菜单栏的汉字显示不出来,解决之:
此方法使得gvim可以识别 zh_CN.utf8。
2. .vim和.vimrc
用户目录下创建.vim目录和.vimrc目录,.vim目录用于安放vim插件,.vimrc用于vim启动时调用。
我的.vim目录树:
|---autoload
| |---vimball.vim
| |---genutils.vim
| |---lookupfile.vim
| |---mark.vim
|---.VimballRecord
|---doc
| |---taglist.txt
| |---bufexplorer.txt
| |---tags
| |---pi_vimball.txt
| |---winmanager.txt
| |---ctags_highlighting.txt
| |---supertab.txt
| |---lookupfile.txt
| |---csupport.txt
| |---mark.txt
|---plugin
| |---ctags_highlighting.vim
| |---sessionman.vim
| |---taglist.vim
| |---winmanager.vim
| |---genutils.vim
| |---c.vim
| |---vimballPlugin.vim
| |---lookupfile.vim
| |---mark.vim
| |---wintagexplorer.vim
| |---winfileexplorer.vim
| |---a.vim
| |---supertab.vim
| |---echofunc.vim
| |---Search_Word.vim
| |---bufexplorer.vim
|---mktypes.py
|---colors
| |---bandit.vim
|---ftplugin
| |---colours_bandit.vim
| |---c.vim
|---c-support
| |---doc
| | |---ChangeLog
| | |---c-hotkeys.tex
| | |---c-hotkeys.pdf
| |---scripts
| | |---wrapper.sh
| |---codesnippets
| | |---main.c
| | |---main.cc
| | |---print_double_array.c.noindent
| | |---Makefile
| | |---Makefile.multi-target.template
| | |---calloc_int_matrix.c
| | |---calloc_double_matrix.c
| | |---print_array.cc.noindent
| | |---print_int_array.c.noindent
| |---templates
| | |---c.statements.template
| | |---cpp.comments.template
| | |---cpp.cpp.template
| | |---c.cpp.template
| | |---cpp.preprocessor.template
| | |---c.preprocessor.template
| | |---Templates
| | |---c.comments.template
| | |---cpp.idioms.template
| | |---c.idioms.template
| | |---cpp.statements.template
| |---wordlists
| | |---stl_index.list
| | |---c-c++-keywords.list
| | |---k+r.list
| |---rc
| | |---customization.gvimrc
| | |---customization.ctags
| | |---customization.vimrc
| | |---customization.indent.pro
|---syntax
| |---colours_bandit.vim
| |---c.vim
|---README.csupport
|---.netrwhist
|---sessions
| |---emc.viminfo
| |---emcx.vim
| |---emc
|---extra_source
| |---mktypes
| | |---setup.py
此目录下的东东基本上是安装插件的时候,解压自动覆盖生成的,插件主要是在plugin目录下。
插件不知道是干嘛的? --- 看一下上边二位前辈的大帖,再不行上vim网站上搜一下即可,安装步骤都会有。
插件不会用? --- 重复上一问题答案,再不行用vim的超级help^_^
我的.vimrc内容:
"
" my vim configuration
"
" 关闭compatible
set nocompatible
" 开启语法高亮
syntax on
" 设置文字编码自动识别
set fencs=gbk,utf-8,ucs-bom,gb18030,gb2312,cp936
" 使用鼠标
set mouse=a
" 设置高亮搜索
set hlsearch
" 输入字符串就显示匹配点
set incsearch
" 输入的命令显示出来,看的清楚些。
set showcmd
set background=dark
set history=50 "历史记录50条
filetype plugin indent on "打开文件类型检测
set completeopt=longest,menu "关闭智能补全时的预览窗口
"颜色方案
colorscheme bandit "desert颜色方案
"界面设置.
set ruler "显示当前位置
set number "显示行号
"set nonumber "不显示行号
"格式设置.
set autoindent "自动缩进
set smartindent "智能缩进
set cindent "C缩进
set tabstop=4 "硬TAB
set softtabstop=4 "软TAB
set shiftwidth=4 "缩进空格数
set expandtab "空格替换TAB
"set smarttab "智能TAB
set tags=tags; "ctags
set autochdir "ctags
" TagList"
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
" BufExplorer"
let g:bufExplorerDefaultHelp=0
let g:bufExplorerShowRelativePath=1
let g:bufExplorerSortBy='mru'
let g:bufExplorerSplitRight=0
let g:bufExplorerSplitVertical=1
let g:bufExplorerSplitVertSize = 30
autocmd BufWinEnter /[Buf/ List/] setl nonumber
" winManager setting"
let g:winManagerWindowLayout = "FileExplorer,BufExplorer|TagList"
let g:winManagerWidth = 30
let g:defaultExplorer = 0
nmap
nmap
nmap
nmap
" lookupfile setting"
let g:LookupFile_MinPatLength = 2
let g:LookupFile_PreserveLastPattern = 0
let g:LookupFile_PreservePatternHistory = 1
let g:LookupFile_AlwaysAcceptFirst = 1
let g:LookupFile_AllowNewFiles = 0
if filereadable("./filenametags")
let g:LookupFile_TagExpr = '"./filenametags"'
endif
nmap
nmap
nmap
" cscope setting"
set cscopequickfix=s-,c-,d-,i-,t-,e-
nmap
nmap
nmap
nmap
nmap
nmap
nmap
nmap
" 代码折叠
set foldmethod=syntax
set foldlevel=100 " 启动 vim 时不要自动折叠代码
" superTab
let g:SuperTabRetainCompletionType=2
let g:SuperTabDefaultCompletionType="
" ctags_highlighting
let b:TypesFileRecurse = 1
let b:TypesFileDoNotGenerateTags = 1
let b:TypesFileIncludeLocals = 1
"let b:TypesFileIncludeSynMatches =1
"let b:TypesFileLanguages = ['c']
" Fn 快捷键
" F5 - LookUpFile, F6 - cscope
nnoremap
nnoremap
这里我要说一下我的偏好了:背景一定要黑色,快捷键喜欢用Fn来做,语法高亮一定要全,不然太不舒服了。
3. 我的workspace备份
1)手工操作
我的会话保存名为:workspace.vim和workspace.viminfo,分别由mksession和wviminfo命令完成。
有一些设置跟我们的工程目录是密切相关的,我把这些设置都放在workspacex.vim中:
"set project path
set path+=~/src/emc2-2.3.5/**
" lookup file tag file
let g:LookupFile_TagExpr = string('/home/username/emc2-2.3.5/src/filenametags')
" cscope setting
if has("cscope")
set csprg=/usr/bin/cscope
set csto=1
set cst
set nocsverb
" add any database in current directory
if filereadable("/home/username/src/emc2-2.3.5/cscope.out")
cs add /home/username/src/emc2-2.3.5/cscope.out /home/username/src/emc2-2.3.5
endif
set csverb
endif
2)插件
当然使用gvim保存会话,可以使用sessionman插件,不过它只有session的相关操作,对viminfo没有保存,可以手动修改其插件,
在session保存和读取的地方相应加上wviminfo!和rviminfo命令即可,用这个插件还是很方便的。不要忘了手工写x.vim扩展文件。
4. 补充
按照前辈们的帖子来做就是省心,不过有个地方还是不满意,那就是语法高亮不全,包括宏、局部变量等。
决定使用主题bandit和插件ctags_highlighting来解决这个问题!
换上bandit主题,看着还是挺好的,不过看c/c++文件的那个绿色注释太显眼了,改成淡绿的(在bandi.vim中修改):
" Comments are green
let ColourAssignment['Comment'] = {"GUIFG": '#008800', "CTERMFG": 'Green', "TERM": 'Bold'}
好了,装上ctags_highlighting,发现它只能显示当前目录和第一级子目录中文件的补充高亮!!!
修改ctags_highlighting.vim,使用子目录级到16级,够用就行:
let fname = expand(file . ':p:h') . '/types_' . a:suffix . '.vim'
let para = ':p:h'
for i in range(16)
if filereadable(fname)
exe 'so ' . fname
break
endif
let para = para . ':h'
let fname = expand(file . para) . '/types_' . a:suffix . '.vim'
endfor
因为我看的c++代码的后缀名是.cc和.hh,ctags_highlighting的作者没有加上此类型,只有自己手工加了:
第50几行:
autocmd BufRead,BufNewFile *.cc call ReadTypes('c') " add
autocmd BufRead,BufNewFile *.hh call ReadTypes('c') " add
第70几行:
let extensionLookup =
/ {
/ '[ch]/(pp/)/?' : "c",
/ 'cc' : "c",
/ 'hh' : "c",
/ 'p[lm]' : "pl",
/ 'java' : "java",
/ 'pyw/?' : "py",
/ 'rb' : "ruby",
/ 'cs' : "cs",
/ 'php' : "php",
/ 'vhdl/?' : "vhdl",
/ }
第130几行:
if index(['cpp', 'h', 'hpp', 'cc', 'hh'], expand(file . ':e')) != -1 " modify
使用ctags_highlighting插件+bandit主题有个问题,就是保存会话后,下次启动会话现使用这个高亮插件,使用mark.vim插件高亮的颜色出不来,在bandit主题中加入颜色定义会解决这个问题:
" For mark.vim plugin
highlight def MarkWord1 ctermbg=Cyan ctermfg=Black guibg=#8CCBEA guifg=Black
highlight def MarkWord2 ctermbg=Green ctermfg=Black guibg=#A4E57E guifg=Black
highlight def MarkWord3 ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black
highlight def MarkWord4 ctermbg=Red ctermfg=Black guibg=#FF7272 guifg=Black
highlight def MarkWord5 ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black
highlight def MarkWord6 ctermbg=Blue ctermfg=Black guibg=#9999FF guifg=Black
OK了,现在可以看到很全的语法高亮了!!!
当然,你可以自己修改高亮设置,下面这个就是我设置的类似Source Insight的高亮:
5. 总结
从开发流程的角度,来总结一下创建整个开发环境的步骤:
1)先cd到工程源码的目录下,如:
cd /home/username/src/emc2-2.3.5/
2)运行build-env.sh脚本,此脚本创建必需的tags文件、cscope文件等,脚本内容如下:
#!/bin/bash
ctags -R --fields=+lS --c-kinds=+pxl --c-kinds=+pxl
cscope -Rbq
# generate tag file for lookupfile plugin
echo -e "!_TAG_FILE_SORTED/t2/t/2=foldcase/" > filenametags
find `pwd` -not -regex '.*/./(png/|gif/)' -type f -printf "%f/t%p/t1/n" | /
sort -f >> filenametags
此时目录下会生成一些文件:tags,filenametags,cscope.*
3)运行gvim,在gvim内运行:
:UpdateTypesFile
这个命令会生成ctags_highlighting插件所需要的types_*.vim文件。
这时候可以打开一个源文件,然后保存会话,可以从File->Session里面操作。
退出gvim。
4)切换至~/.vim/sessions目录下,可以看到有相应的session文件生成了,如项目emc的会话文件包括:emc 和 emc.viminfo,
因为filenametags和cscope文件是工程相关的,也就是其路径不好在.vimrc中为各个工程都指定,所以在此编辑emcx.vim文件,这个文件可以在打开会话emc时自动调用:
"set project path
set path+=~/src/emc2-2.3.5/**
" lookup file tag file
let g:LookupFile_TagExpr = string('/home/username/src/emc2-2.3.5/filenametags')
" cscope setting
if has("cscope")
set csprg=/usr/bin/cscope
set csto=1
set cst
set nocsverb
" add any database in current directory
if filereadable("/home/username/src/emc2-2.3.5/cscope.out")
cs add /home/username/src/emc2-2.3.5/cscope.out /home/username/src/emc2-2.3.5
endif
set csverb
endif
5)再次打开gvim,打开会话文件,此时所有的插件应该都能使用了,可以挨个测试下好不好用。
最后保存一下会话,退出。
至此,可以在任何目录下运行gvim,然后打开session,来进行自己的开发了:)