您的位置:首页 > 其它

vim配置及插件安装管理

2015-05-31 00:56 393 查看

配置文件

Vim存在多个配置文件vimrc,比如/etc/vimrc,此文件影响整个系统的Vim。还有~/.vimrc,此文件只影响本用户的Vim。而且~/.vimrc文件中的配置会覆盖/etc/vimrc中的配置。这里我们只修改~/.vimrc文件。如果没有,在用戶主目录下建一个文件.vimrc。

插件安装在用戶主目录下的~/.vim目录下,解压后会有~/.vim/plugin 和 ~/.vim/doc 等目录(也可自己先创建)。

(1)~/.vim/doc下执行vim ,输入:helptags 命令,此步骤便将doc下的帮助文档加入到Vim的帮助主题中,这样我们就可以通过在Vim中运行“help taglist.txt”查看taglist帮助。

(2) ~/.vim/plugin目录下为.vim形式的插件。

当前~/.vim插件配置:

http://pan.baidu.com/s/1eQpj3xg

当前使用的vim配置效果如下:



此vim配置有以下功能:

1,按F5可以直接编译并执行C、C++、java代码以及执行shell脚本,按“F8”可进行C、C++代码的调试

2,自动插入文件头 ,新建C、C++源文件时自动插入表头:包括文件名、作者、联系方式、建立时间等,读者可根据需求自行更改

3,按“F2”可以直接消除代码中的空行

4,ctags功能:把光标定位到某一函数名上, 按下 Ctar + ], vim就可以自动切换到该函数定义处;要返回只需要按下Ctrl + t .

5,按F3左侧可打开树状文件目录和Tlist显示变量和函数,F4右侧打开函数,按类区分,折叠显示

6,:AS 横向分割窗口并打开c/h文件

7,代码折叠操作:za,打开或关闭当前折叠;zM,关闭所有折叠;zR,打开所有折叠

8,按“Ctrl + P”可自动补全关键字

9,快速查找:vim下输入/(查找关键字)

9, 指针输入->和对象输入.后会自动弹出其所有定义函数

9,[]、{}、()、”“、’ ‘等都自动补全

10,映射“Ctrl + A”为全选并复制快捷键。最基本的是按v后移动光标键选定内容按v复制,按d剪切,按p粘贴。yy复制一整行。

11,代码高亮,自动缩进,显示行号,显示状态行

12,支持鼠标选择、方向键移动

开始创建配置文件:

使用gedit编辑,便于代码复制粘贴:

[code]zlk@zlk-Lenovo-G460:~$ gedit .vimrc


内容如下:

[code]"""""""""""""""""""
" 显示相关
"""""""""""""""""""
"winpos 5 5 " 设定窗口位置
"set lines=40 columns=155 " 设定窗口大小
set nu " 显示行号
"set go= " 不要图形按钮
"color asmanian2 " 设置背景主题
"set guifont=Courier_New:h10:cANSI " 设置字体
syntax on " 语法高亮
autocmd InsertLeave * se nocul " 用浅色高亮当前行
autocmd InsertEnter * se cul " 用浅色高亮当前行
set ruler " 显示标尺
set showcmd " 输入的命令显示出来,看的清楚些
set cmdheight=1 " 命令行(在状态行下)的高度,设置为1
"set whichwrap+=<,>,h,l " 允许backspace和光标键跨越行边界(不建议)
set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离
set novisualbell " 不要闪烁
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "状态行显示的内容
set laststatus=1 " 启动显示状态行(1),总是显示状态行(2)
set foldenable " 允许折叠
set foldmethod=manual " 手动折叠
set background=dark "背景使用黑色
set nocompatible "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
" 显示中文帮助
if version >= 603
    set helplang=cn
    set encoding=utf-8
endif
" 设置配色方案
colorscheme desert
"字体
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8
"""""""""""""""""""""""""
"""""新文件标题""""""""""
"""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自动插入文件头
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()"
""定义函数SetTitle,自动插入文件头
func SetTitle()
    "如果文件类型为.sh文件
    if &filetype == 'sh'
        call setline(1,"\#########################################################################")
        call append(line("."), "\# File Name: ".expand("%"))
        call append(line(".")+1, "\# Author: zlk")
        call append(line(".")+2, "\# mail:zlk@mail.ustc.edu.cn</a>")
        call append(line(".")+3, "\# Created Time: ".strftime("%c"))
        call append(line(".")+4, "\#########################################################################")
        call append(line(".")+5, "\#!/bin/bash")
        call append(line(".")+6, "")
    else
        call setline(1, "/*************************************************************************")
        call append(line("."), " > File Name: ".expand("%"))
        call append(line(".")+1, " > Author: zlk") 
        call append(line(".")+2," > mail:zlk@mail.ustc.edn.cn")
        call append(line(".")+3, " > Created Time: ".strftime("%c"))
        call append(line(".")+4, " ************************************************************************/")
        call append(line(".")+5, "")
    endif
    if &filetype == 'cpp'
        call append(line(".")+6, "#include<iostream>")
        call append(line(".")+7, "using namespace std;")
        call append(line(".")+8, "")
    endif
    if &filetype == 'c'
        call append(line(".")+6, "#include<stdio.h>")
        call append(line(".")+7, "")
    endif
    "新建文件后,自动定位到文件末尾
    autocmd BufNewFile * normal G
endfunc

"""""""""""""""""""""""""""""""
"键盘命令
"""""""""""""""""""""""""""""""
nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>
" 映射全选+复制 ctrl+a
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
map <F12> gg=G
" 选中状态下 Ctrl+c 复制
vmap <C-c> "+y
"去空行
nnoremap <F2> :g/^\s*$/d<CR>
"比较文件
nnoremap <C-F2> :vert diffsplit
"新建标签
map <M-F2> :tabnew<CR>
"列出当前目录文件
map <C-F3> \be
"C,C++ 按F5编译运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
    exec "w"
    if &filetype == 'c'
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'cpp'
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'java'
        exec "!javac %"
        exec "!java %<"
    elseif &filetype == 'sh'
        :!./%
    endif
endfunc
"C,C++的调试
map <F8> :call Rungdb()<CR>
func! Rungdb()
    exec "w"
    exec "!g++ % -g -o %<"
    exec "!gdb ./%<"
endfunc

""""""""""""""""""""""""
""实用设置
""""""""""""""""""""""""
" 基于缩进或语法进行代码折叠 
"set foldmethod=indent
set foldmethod=syntax
" 启动 vim 时关闭折叠代码
"set nofoldenable
" 设置当文件被改动时自动载入
set autoread
" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
"代码补全
set completeopt=preview,menu
"允许插件
filetype plugin on
"共享剪贴板
set clipboard+=unnamed
"从不备份
set nobackup
"make 运行
:set makeprg=g++\ -Wall\ \ %
"自动保存
set autowrite
set ruler " 打开状态栏标尺
set cursorline " 突出显示当前行
set magic " 设置魔术
set guioptions-=T " 隐藏工具栏
set guioptions-=m " 隐藏菜单栏
"set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
" 设置在状态行显示的信息
set foldcolumn=0
set foldmethod=indent
set foldlevel=3
set foldenable " 开始折叠
" 不要使用vi的键盘模式,而是vim自己的
set nocompatible
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候,弹出确认
set confirm
" 自动缩进
set autoindent
set cindent
" Tab键的宽度
set tabstop=4
" 统一缩进为4
set softtabstop=4
set shiftwidth=4
" 不要用空格代替制表符
set noexpandtab
" 在行和段开始处使用制表符
"set smarttabr
" 历史记录数
set history=1000
"禁止生成临时文件
set nobackup
set noswapfile
"搜索忽略大小写
set ignorecase
"搜索逐字符高亮
set hlsearch
set incsearch
"行内替换
set gdefault
"编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn
" 我的状态行显示的内容(包括文件类型和解码)
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
"set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" 总是显示状态行
set laststatus=2
" 命令行(在状态行下)的高度,默认为1,这里是2
set cmdheight=2
" 侦测文件类型
filetype on
" 载入文件类型插件
filetype plugin on
" 为特定文件类型载入相关缩进文件
filetype indent on
" 保存全局变量
set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 字符间插入的像素行数目
set linespace=0
" 增强模式中的命令行自动完成操作
set wildmenu
" 使回格键(backspace)正常处理indent, eol, start等
set backspace=2
" 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l
" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key
" 通过使用: commands命令,告诉我们文件的哪一行被改变过
set report=0
" 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\
" 高亮显示匹配的括号
set showmatch
" 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1
" 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3
" 为C程序提供自动缩进
set smartindent
" 高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile * setfiletype txt
"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endfunction
filetype plugin indent on
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu

""""""""""""""""""""""""""""""""
" CTags的设定
""""""""""""""""""""""""""""""""
"设置tags
set tags=tags
set autochdir

""""""""""""""""""""""""""""""
" Tag list (ctags)
""""""""""""""""""""""""""""""""
"let Tlist_Auto_Open=1       "默认打开Taglist
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim

"""""""""""""""""""""""""""""""""""""""""""""""""""""
" minibufexpl,NEDRTree,winManager插件的一般设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""
let g:miniBufExplMapWindowNavVim = 1   
let g:miniBufExplMapWindowNavArrows = 1   
let g:miniBufExplMapCTabSwitchBufs = 1   
let g:miniBufExplModSelTarget = 1  
let g:miniBufExplMoreThanOne=0  

let g:NERDTree_title="[NERDTree]"  
let g:winManagerWindowLayout="NERDTree|TagList"  

function! NERDTree_Start()  
    exec 'NERDTree'  
endfunction  

function! NERDTree_IsValid()  
    return 1  
endfunction  

map<F3> :WMToggle<CR> 

""""""""""""""""""""""""""""""""
" OmniCppComplete
""""""""""""""""""""""""""""""""
set completeopt=menu,longest,menuone
let OmniCpp_NamespaceSearch = 2
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_ShowAccess = 1
let OmniCpp_ShowPrototypeInAbbr = 1 
let OmniCpp_MayCompleteDot = 1   
let OmniCpp_MayCompleteArrow = 1 
let OmniCpp_MayCompleteScope = 1 
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
let OmniCpp_SelectFirstItem = 2
let OmniCpp_DisplayMode=1

au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif

set tags+=tags
set tags+=/home/zlk/test/q/tags/lib_tags

"""""""""""""""""""""""""""""""""""""""""""""""""""""
" YCM插件的一般设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""
" YCM 补全菜单配色
" 菜单
"highlight Pmenu ctermfg=2 ctermbg=3 guifg=#005f87 guibg=#EEE8D5
" 选中项
highlight PmenuSel ctermfg=2 ctermbg=3 guifg=#AFD700 guibg=#106900
" 补全功能在注释中同样有效
let g:ycm_complete_in_comments=1
" 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示
let g:ycm_confirm_extra_conf=0
" 开启 YCM 标签补全引擎
let g:ycm_collect_identifiers_from_tags_files=1
" 引入 C++ 标准库tags
set tags+=/data/misc/software/misc./vim/stdcpp.tags
" YCM 集成 OmniCppComplete 补全引擎,设置其快捷键
inoremap <leader>; <C-x><C-o>
" 补全内容不以分割子窗口形式出现,只显示补全列表
set completeopt-=preview
" 从第一个键入字符就开始罗列匹配项
let g:ycm_min_num_of_chars_for_completion=1
" 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_cache_omnifunc=0
" 语法关键字补全         
let g:ycm_seed_identifiers_with_syntax=1
" 开启 YCM 标签引擎
let g:ycm_collect_identifiers_from_tags_files=1
" 引入 C++ 标准库tags
set tags+=/data/misc/software/misc./vim/stdcpp.tags

"-- A setting --
 nnoremap <silent> <F12> :A<CR>

"--cscope setting --
set cscopequickfix=s-,c-,d-,i-,t-,e-
:cs add /home/zlk/test/q/cscope.out  /home/zlk/test/q

nmap <F4> :TagbarToggle<CR>


中文帮助手册的安装

vim自带的帮助手册是英文的, 下载中文帮助的文件包并安装:

[code]wget http://nchc.dl.sourceforge.net/sourceforge/vimcdoc/vimcdoc-1.5.0.tar.gz                    
cd vimcdoc-1.5.0
sudo ./vimcdoc.sh -i


启动vim,输入:help,看看帮助文档已经变成中文

一些注意事项:

1.vim中文文档不会覆盖原英文文档,安装后vim默认使用中文文档。若想使用英文文档,可在vim中执行以下命令:

[code]:set helplang=en


同理,使用以下命令可重新使用中文文档:

[code]: set helplang=cn


2.帮助文件的文本是utf-8编码的, 如果想用vim直接查看, 需要在~/.vimrc中设置:

[code]set encoding=utf-8


Vim配色方案设置

/usr/share/vim 为vim为用户提供的共享数据或设置方案选择

执行命令 :

[code]ls -l  /usr/share/vim/vim74/colors/


可以看到系统中自带的配色方案,名字有morning,evening,desert等等,如果我们想要将配色方案改为evening,那么我们只需要在.vimrc中增加一行 colorscheme evening即可。

如果觉得配色方案太少,可以从外部下载配色方案,这里给出一个网址:

http://vimcolorschemetest.googlecode.com/svn/colors/

你可以使用工具wget下载下来,另外,给出个可以自己配色的网站:

http://bytefluent.com/vivify/

然后将.vim的文件放入/usr/share/vim/vim74/colors/目录下,然后更改.vimrc即可生效。

语法高亮:首先要在你的 ~/.vimrc 文件中增加下面几句话:

[code]syntax enable
syntax on


若想要添加自己的高亮关键字。

1.进入目录: /usr/share/vim/vimXX/syntax

这个目录下面存放的都是关键字的文件,根据文件类型分成很多个XX.vim文件。

2.打开一个需要的文件类型编辑即可

例如C语言:

[code]vim   c.vim


找到类似下面的行:

[code]syn keyword cTodo contained TODO FIXME XXX


在XXX后面添加上自己的关键字:

[code]syn keyword cTodo contained TODO FIXME XXX NOTICE WARNING Note


这样之后,每次在写这些关键字的时候,就会像FIXME一样,变成高亮的。

ctags:跳到函数定义处

对浏览代码非常的方便, 可以在函数, 变量之间跳来跳去等等.

下载网站: http://ctags.sourceforge.net/

用下面的命令解压安装:

[code]$ tar -xzvf ctags-5.8.tar.gz
$ cd ctags-5.8
$ ./configure
$ make
# sudo make install


然后去你的源码目录, 如果你的源码是多层的目录, 就去最上层的目录, 在该目录下运行命令: ctags -R,操作如下:

[code]$ cd /home/zlk/test
$ ctags -R


此时在/home//zlk/test目录下会生成一个 tags 文件, 现在用vim打开

[code]$ vim /home/zlk/test/main.c


再在vim中运行命令:

[code]:set tags=/home/zlk/test/tags


该命令将tags文件加入到vim中来, 你也可以将这句话放到~/.vimrc中去, 如果你经常在这个工程编程的话。

对于经常在不同工程间编程, 可以在.vimrc中设置:

[code]     set tags=tags
     set autochdir


把光标定位到某一函数名上, 按下 Ctar + ], vim就可以自动切换到该函数定义处!

要返回只需要按下Ctrl + t .

更多用法, 在vim命令模式输入 :help usr_29 查看即可

不过还有一个小瑕疵, 你修改程序后, 比如增加了函数定义, 删除了变量定义, tags文件不能自动rebuild, 你必须手动再运行一下命令:

[code]$ ctags -R


Taglist:显示所有变量及函数

Taglist是vim的一个插件,提供源代码符号的结构化视图。

1)从http://www.vim.org/scripts/script.php?script_id=273下载安装包,也可以从http://vim-taglist.sourceforge.net/index.html下载。

2)将Taglist安装包解压到~/.vim目录,解压后会在~/.vim目录中生成几个新子目录,如plugin和doc(安装其它插件时,可能还会新建autoload等其它目录) :

[code]unzip taglist_46.zip -d ~/.vim


3)进入~/.vim/doc目录,在Vim下运行”helptags .”命令。此步骤是将doc下的帮助文档加入到Vim的帮助主题中,这样我们就可以通过在Vim中运行“help taglist.txt”查看taglist帮助。

4)打开配置文件~/.vimrc,加入以下两行:

[code] let Tlist_Show_One_File=1  
 let Tlist_Exit_OnlyWindow=1


到此安装已经完成。

在Vim命令行下运行Tlist命令就可以打开Taglist窗口,再次运行Tlist则关闭.

我们可以通过Ctrl-w快捷键或鼠标点击在Taglist窗口和编辑区之间切换焦点,在Taglist窗口用鼠标或键盘选择某个符号,然后点击或回车,就可以跳转到该符号定义的位置。更多功能可通过在Vim命令行下运行help taglist.txt查询。

Winmanager,NERDTree和MiniBufExplorer:优化布置界面

前面介绍的几个工具和插件,主要提供快捷的编辑功能,如定义跳转,符号查询,符号提示与补全等。这里的三个插件,主要优化布置vim的界面。具体来说,NERDTree提供树形浏览文件系统的界面,MiniBufExplorer提供多文件同时编辑功能,而Winmanager将这NERDTree界面和Taglist界面整合起来,使Vim更像VS!

分别从http://www.vim.org/scripts/script.php?script_id=1658

http://www.vim.org/scripts/script.php?script_id=159

http://www.vim.org/scripts/script.php?script_id=95

下载NERDTree,MiniBufExplorer和Winmanager安装包(Winmanager还有个更新的vba版本http://www.vim.org/scripts/script.php?script_id=1440,这里选用旧版本的Winmanger)。

1)像其它插件一样,将NERDTree安装包和Winmanager安装包解压到~/.vim目录。并进入doc目录,在Vim命令行下运行”helptags .”命令。

2)MiniBufExplorer只有一个.vim文件,将其拷贝到~/.vim/plugin目录。

3)在~/.vimrc文件中加入以下几行:

[code]let g:miniBufExplMapWindowNavVim = 1   
    let g:miniBufExplMapWindowNavArrows = 1   
    let g:miniBufExplMapCTabSwitchBufs = 1   
    let g:miniBufExplModSelTarget = 1  
    let g:miniBufExplMoreThanOne=0  

    let g:NERDTree_title="[NERDTree]"  
    let g:winManagerWindowLayout="NERDTree|TagList"  

    function! NERDTree_Start()  
        exec 'NERDTree'  
    endfunction  

    function! NERDTree_IsValid()  
        return 1  
    endfunction  

    nmap wm :WMToggle<CR>


4)这个版本的Winmanager有个小bug,你在打开Winmanager界面时,会同时打开一个空的文件。这会影响后续使用,所以我们要在打开Winmanager时关掉这个空文件。在~/.vim/plugin目录下的winmanager.vim文件中找到以下函数定义并在第5行下添加第6行的内容:

[code]    function! <SID>ToggleWindowsManager()  
       if IsWinManagerVisible()  
          call s:CloseWindowsManager()  
       else  
          call s:StartWindowsManager()  
          exe 'q'  
       end  
    endfunction


现在进入我们的项目目录,打开Vim,按下组合快捷键w-m就可以我们的崭新的Vim了!再次按下w-m就可关闭界面。

Tagbar : 函数按类区分,折叠显示

tagbar类似与taglist,函数能够按类区分,支持按类折叠显示等,显示结果清晰简洁,强烈推荐:

下载:

http://www.vim.org/scripts/script.php?script_id=3465

安装:

[code]vim tagbar.vmb
:so %
:q


.vimrc中添加如下内容,按F4即可启动:

[code]nmap <F4> :TagbarToggle<CR>


omnicppcomplete:自动补全工具

下载: http://www.vim.org/scripts/script.php?script_id=1520

[code]cp omnicppcomplete-0.41.zip ~/.vim
cd ~/.vim
unzip omnicppcomplete-0.41.zip


之后打开vimrc,添加下列几段

[code] OmniCppComplete
set completeopt=menu,longest,menuone
let OmniCpp_NamespaceSearch = 2
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_ShowAccess = 1
let OmniCpp_ShowPrototypeInAbbr = 1 
let OmniCpp_MayCompleteDot = 1   
let OmniCpp_MayCompleteArrow = 1 
let OmniCpp_MayCompleteScope = 1 
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
let OmniCpp_SelectFirstItem = 2
let OmniCpp_DisplayMode=1

au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif


omnicpp利用的是tag来判断的,因此我们需要利用ctags来生成,首先要保证机器里有ctags,而且最好要5.4以上.

进入所在的cpp的目录,

运行:

[code]ctags --c-kinds=+px --c++-kinds=+px --fields=+iafksS --extra=+qf test.cpp


test.cpp为源文件

这会生成一个tag文件,打开vim,运行

[code]:set tags += tags


就会加载了.

使用的时候,在遇到->和.的时候就会自动弹出.

不过吧,这样还是麻烦.每次还得自己运行一遍ctags,然后把tags加载进来,而且,那意味着我们的有些库的头文件也不能自动补全么?

首先是自动加载tags,在vimrc中加入

[code]set tags+=tags
set tags+=/home/zlk/test/tags/lib_tags


对于我们平常用到的头文件,可以自己手动生成一份,放到固定的文件夹下,之后写代码就方便了.

比如我的lib_tags就是编译了linux的头文件生成的

[code]ctags --c-kinds=+px --c++-kinds=+px --fields=+iafksS --extra=+qf -R /usr/include/*


有了这个tag,还可以发挥vim的跳转功能.记得–extra一定要+f,这样遇到头文件我们也能跳转进头文件了.另外我加入了当前目录下的tags,这样当我们生成一个tag之后,vim就回自动加载了.

Cscope:查找函数定义及调用

在Cscope的主页: http://cscope.sourceforge.net 下载一个源码包, 解压后编译安装:

[code]# ./configure
# make
# make install       // 需要root权限


先在~/vimrc中增加一句:

[code]:set cscopequickfix=s-,c-,d-,i-,t-,e-


这个是设定是否使用 quickfix 窗口来显示 cscope 结果, 用法在后面会说到。

跟Ctags一样, 要使用其功能必须先为你的代码生成一个cscope的数据库, 在项目的根目录运行下面的命令:

[code]$ cd /home/zlk/test/
$ cscope -Rbq


此后会生成三个文件 cscope.in.out,cscope.out,cscope.po.out

打开文件, 开始Coding

进入vim后第一件事是要把刚才生成的cscope文件导入到vim中来, 用下面的命令:

[code]:cs add /home/zlk/test/cscope.out  /home/zlk/test


如果你要经常用cscope的话, 可以把上面那句加到~/.vimrc中去.

下面我们来操练一下, 查找函数vim_strsave()的定义, 用命令:

[code]:cs find g vim_strsave


查找vim_strsave()到底在那些地方被调用过了, 用命令:

[code]:cs find c vim_strsave


如果自动跳转的位置你不满意, 想看其他的结果, 可以用下面的命令打开QuickFix窗口:

[code]:cw


cscope的主要功能是通过同的子命令”find”来实现的,”cscope find”的用法:

cs find c|d|e|f|g|i|s|t name

0 或 s 查找本 C 符号(可以跳过注释)

1 或 g 查找本定义

2 或 d 查找本函数调用的函数

3 或 c 查找调用本函数的函数

4 或 t 查找本字符串

6 或 e 查找本 egrep 模式

7 或 f 查找本文件

8 或 i 查找包含本文件的文件

QuickFix 窗口:列出错误信息

当编译报错时,QuickFix会把出错的信息列出来, 供我们一条条地查看和修改. 现在成了vim的标准插件, 不用再去安装了。

用下面的命令进行编译源代码:

[code]:make


编译报很多错误后,当编译结束并退出到源码界面时, 刚才编译器报的错误都已经看不到了, 但是我们可以用QuickFix窗口再将错误信息找出来, 用下面的命令调出QuickFix窗口:

[code]:cw


http://www.vim.org/scripts/script.php?script_id=213

A.vim:c/h文件间相互切换

安装步骤:

1) 从http://www.vim.org/scripts/script.php?script_id=31下载安装包。

2) 将将a.vim 复制到 ~/.vim/plugin 文件夹中。

3)在.vimrc文件中进行配置。

[code]"-- A setting --
    nnoremap <silent> <F12> :A<CR>


A安装完成。

常用命令

:A 在新Buffer中切换到c/h文件

:AS 横向分割窗口并打开c/h文件

:*** 纵向分割窗口并打开c/h文件

:AT 新建一个标签页并打开c/h文件

YouCompleteMe:自动补全神器

YCM 集成了多种补全引擎:语义补全引擎、标签补全引擎、OmniCppComplete 补全引擎、其他补全引擎。

YouCompleteMe要求Vim版本7.3.584+,并且开启 +python , 同时YouCompleteMe要求clang版本为3.3以上。首先查看自己的版本:

[code]clang -v
vim
:version


不满足则先安装。

1.编译安装vim7.4方法:

(1) 下载所需工具

编译Vim之前,需要下载编译的相关工具和一些库

[code]sudo apt-get install libncurses5-dev libgnome2-dev libgnomeui-dev libgtk2.0-dev libatk1.0-dev libbonoboui2-dev libcairo2-dev libx11-dev libxpm-dev libxt-dev python-dev ruby-dev mercurial


(2) 卸载老版本vim

在安装新版本的Vim之前,你需要卸载原来安装的老版本Vim,依次在终端下执行下列命令:

[code]sudo apt-get remove vim  
sudo apt-get remove vim-runtime  
sudo apt-get remove gvim  
sudo apt-get remove vim-tiny  
sudo apt-get remove vim-common  
sudo apt-get remove vim-gui-common


(3) 下载新版

网址为:http://vdisk.weibo.com/s/d6HVbsUuioQZA

下载后解压:

[code]tar -xjvf vim-7.4.tar.bz2


(4) 编译安装

[code]cd vim74/
//设置Vim源码的编译属性
./configure --with-features=huge --enable-rubyinterp --enable-pythoninterp --with-python-config-dir=/usr/lib/python2.7/config-i386-linux-gnu/ --enable-perlinterp --enable-gui=gtk2 --enable-cscope --enable-luainterp --enable-perlinterp --enable-multibyte --prefix=/usr
//需要重新配置可 输入 make distclean #清理一下上一次编译生成的所有文件
sudo make VIMRUNTIMEDIR=/usr/share/vim/vim74
sudo make install


其中参数说明如下:

–with-features=huge:支持最大特性

–enable-rubyinterp:启用Vim对ruby编写的插件的支持

–enable-pythoninterp:启用Vim对python编写的插件的支持

–enable-luainterp:启用Vim对lua编写的插件的支持

–enable-perlinterp:启用Vim对perl编写的插件的支持

–enable-multibyte:多字节支持 可以在Vim中输入中文

–enable-cscope:Vim对cscope支持

–enable-gui=gtk2:gtk2支持,也可以使用gnome,表示生成gvim

–with-python-config-dir=/usr/lib/python2.7/config-i386-linux-gnu/ 指定 python 路径

–prefix=/usr:编译安装路径

2.编译安装llvm-clang3.3

先下载如下4个源码: llvm-3.3源码 clang-3.3源码 clang-tools-extra-3.3源码 compiler-rt-3.3源码

http://llvm.org/releases/3.3/llvm-3.3.src.tar.gz

http://llvm.org/releases/3.3/cfe-3.3.src.tar.gz

http://llvm.org/releases/3.3/clang-tools-extra-3.3.src.tar.gz

http://llvm.org/releases/3.3/compiler-rt-3.3.src.tar.gz

分别解压上面下载的4个文件到以下目录

[code]mkdir ~/llvm-clang
mv llvm-3.3.src.tar.gz compiler-rt-3.3.src.tar.gz clang-tools-extra-3.3.src.tar.gz cfe-3.3.src.tar.gz ~/llvm-clang
 cd ~/llvm-clang
tar -xvzf llvm-3.3.src.tar.gz
tar -xvzf compiler-rt-3.3.src.tar.gz
tar -xvzf clang-tools-extra-3.3.src.tar.gz
tar -xvzf cfe-3.3.src.tar.gz


再将工具移动到llvm的相应目录下,使得clang,clang-tools-extra和compiler-rt就可以和llvm一起编译了:

[code]mv cfe-3.3.src/ llvm-3.3.src/tools/clang/
mv clang-tools-extra-3.3.src/ llvm-3.3.src/tools/clang/extra/
mv compiler-rt-3.3.src/ llvm-3.3.src/projects/compiler-rt/


下载最新的LLVM、clang 及辅助库源码可用:

[code]svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../..
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
cd ../../../..
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
cd ..


返回~/llvm-clang目录,并新建一个目录llvm-build专门用于编译llvm-clang,使得不污染源码。

[code]mkdir llvm-build
cd llvm-build/
../llvm-3.3.src/configure --enable-optimized


建立编译环境

此种配置后,llv-clang默认安装到目录 /usr/local/ 下, 如果想改变安装目录,则加上配置: –prefix=Path 来制定 输入 make -j4

开始编译

[code]sudo make install


进行安装 (时间略久~)

如要卸载则在该目录下输入 sudo make uninstall

安装好后,输入 clang -v查看版本信息

3.安装clang标准库(可先跳过)

clang 的标准库————libc++(接口层)和 libc++abi(实现层)需要安装头文件和动态链接库(*.so)。

安装libc++

[code]cd ~/llvm-clang
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
cd libcxx/lib
./buildit


头文件已经生成到 ~/llvm-clang/libcxx/include/,要让 clang 找到必须复制到 /usr/include/c++/v1/

[code]sudo cp -r ~/llvm-clang/libcxx/include/ /usr/include/c++/v1/


*.so 文件已生成 ~/llvm-clang/libcxx/lib/libc++.so.1.0,要让 clang 访问必须复 制到 /usr/lib/,并创建软链接

[code]ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.so.1
ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.so
sudo cp ~/llvm-clang/libcxx/lib/libc++.so* /usr/lib/


类似,源码安装 libc++abi 的头文件和动态链接库:

[code]cd  ~/llvm-clang/
svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
cd libcxxabi/lib
./buildit


头文件已经生成到 ~/llvm-clang/libcxxabi/include/,要让 clang 找到必须复制到 /usr/include/c++/v1/

[code]sudo cp -r ~/llvm-clang/libcxxabi/include/ /usr/include/c++/v1/


*.so 文件已生成 ~/llvm-clang/libcxx/lib/libc++abi.so.1.0,要让 clang 访问必 须复制到 /usr/lib/,并创建软链接

[code]ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so.1
ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so
sudo cp ~/llvm-clang/libcxxabi/lib/libc++abi.so* /usr/lib/


后续可以通过如下选项进行代码编译:

[code]clang++ -std=c++11 -stdlib=libc++ -Werror -Weverything -Wno-disabled-macro- expansion -Wno-float-equal -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno- global-constructors -Wno-exit-time-destructors -Wno-missing-prototypes -Wno-padded -lc++ -lc++abi main.cpp


参数说明:

-std=c++11: 使用 C++11 新特性;

-stdlib=libc++: 指定使用 clang 的标准库头文件 /usr/include/c++/v1/;

-Werror: 将所有编译警告视为编译错误;

-Weverything: 打开所有编译警告选项。在 GCC 中,无法通过单个选项打开所有 编译警告,必须繁琐的同时指定 -Wall、-Wextra、以及大量分散的其他选项,为此clang 新增了 -Weverything。当然,有些警告意义不大,完全可忽略,如下;

-Wno-disabled-macro-expansion:禁止使用宏表达式,忽略此警告;

-Wno-float-equal:浮点类型不应使用 != 和 == 运算符,忽略此警告;

-Wno-c++98-compat、-Wno-c++98-compat-pedantic:采用 C++11 新特性的代 码无法兼容 C++98,忽略此警告;

-Wno-global-constructors:在 main() 之前存在执行的代码,忽略此警告;

-Wno-exit-time-destructors:在 main() 之后存在执行的代码,忽略此警告;

-Wno-missing-prototypes:虽有函数定义但缺失函数原型,忽略此警告;

-Wno-padded:结构体大小应为 4 字节整数倍,忽略此警告(编译器自动调整对齐 边界);

-lc++:指定链接 /usr/lib/libc++.so 标准库;

-lc++abi:指定链接 /usr/lib/libc++abi.so 标准库。注意:这两个选项非常重 要,缺失将导致链接失败!

这些参数在YouCompleteMe的配置文件.ycm_extra_conf.py的flags中设置

4.安装配置YouCompleteMe

现在安装 YCM:

第一步,下载 YCM 源码包及相关依赖:

[code]cd ~/.vim/bundle/ 
git clone https://github.com/Valloric/YouCompleteMe.git 
cd YouCompleteMe/ 
# 获取 YCM 的依赖包
git submodule update --init --recursive


第二步,下载 libclang。你系统中可能已有现成的 libclang(自行源码编译或者发行套件中自带的),最好别用,YCM 作者强烈建议你下载 LLVM 官网的提供预编译二进制文件,以避免各种妖人问题。在 http://llvm.org/releases/download.html 找到最新版 LLVM,Pre-built Binaries 下选择适合你发行套件的最新版预编译二进制文件,下载并解压至以下新建ycm_build目录中;

[code]mkdir ycm_build


第三步,编译 YCM 共享库:

[code]cd ycm_build 
cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=clang+llvm-3.4.2-x86_64-unknown-ubuntu12.04 . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
/ycmd/cpp
make ycm_support_libs


注:cmake版本太低可能会出现错误,解决如下:

下载cmake-3.2.2.tar.gz,解压:

[code]tar -xvzf cmake-3.2.2.tar.gz
cd cmake-3.2.2/
./configure
make
sudo make install


注:此时需要删除ycm_build 目录下的CMakeCache.txt文件,否则执行cmake命令还会出错

最终在 ~/.vim/bundle/YouCompleteMe/third_party/ycmd 中将生成 ycm_client_support.so、ycm_core.so、libclang.so 等三个共享库文件;

下面介绍 YCM 的设置。

设置一,YCM 后端调用 libclang 进行语义分析,而 libclang 有很多参数选项(如,是否支持 C++11 的 -std=c++11、是否把警告视为错误的 -Werror),必须有个渠道让 YCM 能告知 libclang,这可以在 .vimrc 中增加一个全局配置,但我有多个工程,每个工程使用的 libclang 参数选项不同岂不是每次都要调整 .vimrc?!YCM 采用更具弹性的方式,每个工程有一个名为 .ycm_extra_conf.py 的私有配置文件,在此文件中写入工程的编译参数选项。

基本上,根据你工程情况只需调整 .ycm_extra_conf.py 的 flags 部分,前面说过, flags 用于 YCM 调用 libclang 时指定的参数,通常应与构建脚本保持一致(如,CMakeLists.txt)。flags 会产生两方面影响,一是影响 YCM 的补全内容、一是影响代码静态分析插件 syntastic 的显示结果(详见后文“静态分析器集成”)。/usr/include/c++/4.8/ 需要替换成你系统中 C++ 标准库头文件所在路径。另外,你得注意,该配置文件其实就是个 python 脚本,python 把缩进视为语法,如果你是直接拷贝文中的 .ycm_extra_conf.py 小心缩进部分。

设置二,在 .vimrc 中增加如下配置信息:

[code]" YCM 补全菜单配色
" 菜单
highlight Pmenu ctermfg=2 ctermbg=3 guifg=#005f87 guibg=#EEE8D5
" 选中项
highlight PmenuSel ctermfg=2 ctermbg=3 guifg=#AFD700 guibg=#106900
" 补全功能在注释中同样有效
let g:ycm_complete_in_comments=1
" 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示
let g:ycm_confirm_extra_conf=0
" 开启 YCM 标签补全引擎
let g:ycm_collect_identifiers_from_tags_files=1
" 引入 C++ 标准库tags
set tags+=/data/misc/software/misc./vim/stdcpp.tags
" YCM 集成 OmniCppComplete 补全引擎,设置其快捷键
inoremap <leader>; <C-x><C-o>
" 补全内容不以分割子窗口形式出现,只显示补全列表
set completeopt-=preview
" 从第一个键入字符就开始罗列匹配项
let g:ycm_min_num_of_chars_for_completion=1
" 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_cache_omnifunc=0
" 语法关键字补全         
let g:ycm_seed_identifiers_with_syntax=1


YCM 也支持标签补全。要使用标签补全,你需要做两件事:一是让 YCM 启用标签补全引擎、二是引入 tag 文件,具体设置如下:

[code]" 开启 YCM 标签引擎
let g:ycm_collect_identifiers_from_tags_files=1
" 引入 C++ 标准库tags
set tags+=/data/misc/software/misc./vim/stdcpp.tags
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: