您的位置:首页 > 编程语言 > C语言/C++

将VIM改造成c++IDE

2016-04-25 16:13 513 查看

如何将vim改造成c++IDE

作为一个linux的初学者,看到网上各种吹vim的,心向往之,于是自己去网上查了相关的资料来做。伤心的是,做了两天才做好(原谅我的菜)。然而还有部分原因却是因为网上的教程不够详细和深入,没有解释为什么而直接说该怎么做,并且有些做法其实并不好。下面分享一些我的经验。

第一步:修改用户的.vimrc文件

vim安装后会在用户路径下生成一个.vimrc文件,比如/home/username/.vimrc。此外在安装目录还有一个全局版本的vimrc文件,不过.vimrc中的内容会覆盖掉vimrc中的设置,所以一般都是修改.vimrc文件。这一步网上有很多资料,我也是直接照搬的。我的.vimrc文件如下:

if(has("win32") || has("win95") || has("win64") || has("win16")) "判定当前操作系统类型
let g:iswindows=1
else
let g:iswindows=0
endif
"""""""""""""""文件设置"""""""""""""""""""""""""
set fileencodings=utf-8,gb18030,utf-16,big5 "编码设置
set nocompatible "不要 vim 模仿 vi 模式,建议设置,否则会有很多不兼容的问题\
set noswapfile "不生成 swap 文件
set nowb
set nobackup "不会生成备份文件
"""""""tags设置""""""""""""""""
set tags=tags
set tags+=/home/liyan/.vim/tags/cpptags
set tags+=/home/liyan/.vim/tags/acetags
set tags+=./tags
"""""""""""""常规设置"""""""""""""""
"字体的设置
set guifont=Courier\ 10\ Pitch\ 12 ""记住空格用下划线代替哦
set gfw=幼圆:h10:cGB2312
"let mapleader = "," ""
"let g:mapleader = "," ""设置 leader 为',',默认为„\‟
"colo Dark "配色方案
syntax on "打开高亮
""set cursorline " 高亮当前行
set ruler " 在编辑过程中,在右下角显示光标位置的状态行
set incsearch " 查询时非常方便,如要查找 book 单词,当输入到/b 时,会自动找到
" 第一个 b 开头的单词,当输入到/bo 时,会自动找到第一个 bo 开头的
" 单词,依次类推,进行查找时,使用此设置会快速找到答案,当你
" 找要匹配的单词时,别忘记回车
set vb t_vb= " vim 进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声
set mouse=a "允许鼠标的使用
"set listchars=tab:>-,trail:- "将 tab 符显示为>---,并将行尾的空格显示为-。如果你不喜欢这个特性,注释这两句即可
"set list
"""""""""""""""""""""""""""编程设置""""""""""""""""""""
set tabstop=4 "设置 tab 键的宽度
set shiftwidth=4 " 换行时行间交错使用 4 个空格
set expandtab "空格代替 TAB
set nowrap "no 自动换行
set backspace=indent,eol,start whichwrap+=<,>,[,] "允许退格键的使用
""set ai! " 设置自动缩进
set nu! " 显示行号
set showmatch " 设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
filetype on
filetype plugin on ""自动匹配文件
if has("autocmd")
filetype plugin indent on "根据文件进行缩进
augroup vimrcEx
au!
autocmd FileType text setlocal textwidth=78
autocmd BufReadPost *
\ if line("'\"") > 1 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
augroup END
else
"智能缩进,相应的有 cindent,官方说 autoindent 可以支持各种文件的缩进,
"但是效果会比只支持 C/C++的 cindent 效果会差一点,但笔者并没有看出来
set autoindent " always set autoindenting on
endif " has("autocmd")
"""""""""""""ctags 和 cscope(绑定F12)"""""""""""""""
map <F12> :call Do_CsTag()<CR>
nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>:copen<CR>
nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>:copen<CR>
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>:copen<CR>
function Do_CsTag()
let dir = getcwd()
if filereadable("tags")
if(g:iswindows==1)
let tagsdeleted=delete(dir."\\"<
cc32
/span>."tags")
else
let tagsdeleted=delete("./"."tags")
endif
if(tagsdeleted!=0)
echohl WarningMsg | echo "Fail to do tags! I cannot delete the tags" | echohl None
return
endif
endif
if has("cscope")
silent! execute "cs kill -1"
endif
if filereadable("cscope.files")
if(g:iswindows==1)
let csfilesdeleted=delete(dir."\\"."cscope.files")
else
let csfilesdeleted=delete("./"."cscope.files")
endif
if(csfilesdeleted!=0)
echohl WarningMsg | echo "Fail to do cscope! I cannot delete the cscope.files" | echohl None
return
endif
endif
if filereadable("cscope.out")
if(g:iswindows==1)
let csoutdeleted=delete(dir."\\"."cscope.out")
else
let csoutdeleted=delete("./"."cscope.out")
endif
if(csoutdeleted!=0)
echohl WarningMsg | echo "Fail to do cscope! I cannot delete the cscope.out" | echohl None
return
endif
endif
if(executable('ctags'))"silent! execute "!ctags -R --c-types=+p --fields=+S *"
silent! execute "!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q ."
endif
if(executable('cscope') && has("cscope") )
if(g:iswindows!=1)
silent! execute "!find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -o -name '*.java' -o -name '*.cs' >
cscope.files"
else
silent! execute "!dir /s/b *.c,*.cpp,*.h,*.java,*.cs >> cscope.files"
endif
silent! execute "!cscope -b"
execute "normal :"
if filereadable("cscope.out")
execute "cs add cscope.out"
endif
endif
endfunction
"""""""""""进行Taglist的设置"""""""""""""""""""""
"TlistUpdate "可以更新 tags
map <F3> :silent! Tlist<CR> "按下 F3 就可以呼出了,可以改
let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以直接执行
let Tlist_Use_Right_Window=0 "让窗口显示在右边,0 的话就是显示在左边
let Tlist_Show_One_File=1 "让 taglist 可以同时展示多个文件的函数列表,如果想只有 1 个,设置为 1
let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏
let Tlist_Exit_OnlyWindow=1 "当 taglist 是最后一个分割窗口时,自动推出 vim
let Tlist_Process_File_Always=0 "是否一直处理 tags.1:处理;0:不处理。不是一直实时更新 tags,因为没有必要
let Tlist_Inc_Winwidth=0
""""""""""""""""对 NERD_commenter 的设置(注释)"""""""""""""
let NERDShutUp=1
"支持单行和多行的选择,//格式
map <C-h> ,c<space>
"""""""""""""""""""""""""NERDTree""""""""""""""""""""""""
map <F2> :NERDTree<cr> "F2 打开NERDTree
map <F4> :NERDTreeClose<cr> "F4 关闭·········
"""""""""""""""""括号和引号补全""""""""""""""""""""
inoremap ( ()<Esc>i
inoremap [ []<Esc>i
inoremap { {<CR>}<Esc>O
autocmd Syntax html,vim inoremap < <lt>><Esc>i| inoremap > <c-r>=ClosePair('>')<CR>
inoremap ) <c-r>=ClosePair(')')<CR>
inoremap ] <c-r>=ClosePair(']')<CR>
inoremap } <c-r>=CloseBracket()<CR>
inoremap " <c-r>=QuoteDelim('"')<CR>
inoremap ' <c-r>=QuoteDelim("'")<CR>
function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf
function CloseBracket()
if match(getline(line('.') + 1), '\s*}') < 0
return "\<CR>}"
else
return "\<Esc>j0f}a"
endif
endf
function QuoteDelim(char)
let line = getline('.')
let col = col('.')
if line[col - 2] == "\\"
"Inserting a quoted quotation mark into the string
return a:char
elseif line[col - 1] == a:char
"Escaping out of the string
return "\<Right>"
else
"Starting a string
return a:char.a:char."\<Esc>i"
endif
endf
"""""""""""""""""OMNI设置"""""""""""""""""""""""""
set completeopt=menu,menuone " 关掉智能补全时的预览窗口
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
"let OmniCpp_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1


第二步:下载和安装插件

ctags

直接sudo apt-get install ctags

这是一个生成标签tag的插件,可以用来查看函数定义之类的。在其它的插件中也会用到。

cscope

一样,也是sudo apt-get install cscope

一个利用tag的更强大的查询插件。

用法:

:cs find c|d|e|f|g|i name

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

1 或 g 查找本定义

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

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

4 或 t 查找本字符串

6 或 e 查找本 egrep 模式

7 或 f 查找本文件

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

TagList

下载地址:http://www.vim.org/scripts/script.php?script_id=273

不过我感觉这个网站打开很慢,所以直接百度的。下载之后直接解压到~/.vim文件夹下面,没有~/.vim就自己建一个。在上面的.vimrc文件中设置了快捷键F3和一些选项。打开效果如下图:



NERD_tree(文件浏览)

下载地址:http://www.vim.org/scripts/script.php?script_id=1658

当然我还是直接百度的。下载后同样直接解压到~/.vim文件下面。在.vimrc中设置了F2开,F4关。:help NERD_tree.txt可以查看帮助手册。效果如下图:



autocomplpop(代码自动补全)

下载地址:http://www.vim.org/scripts/script.php?script_id=1879

百度百度。。。同上同上。。。

效果图:



code_complete(函数补全)

下载地址:http://www.vim.org/scripts/script.php?script_id=1764

同上同上同上。。。

效果图:



NERD_commenter (快速注释)

下载地址:http://www.vim.org/scripts/script.php?script_id=1218

同上同上同上。。。

操作快捷键:

\ca 在可选的注释方式之间切换,比如 C/C++ 的块注释/* */和行注释//

\cc 注释当前行

\c切换注释/非注释状态

\cs 以”性感”的方式注释

\cA 在当前行尾添加注释符,并进入 Insert 模式

\cu 取消注释

Normal 模式下,几乎所有命令前面都可以指定行数

Visual 模式下执行命令,会对选中的特定区块进行注释/反注释

各命令前缀是可以自己设置的,通常是逗号’,’或者’\’.

接下来我要说的,就是让我用掉两天时间的罪魁祸首:ctags。

要使用这个插件,首先要生成tags文件,这也是很多其它插件的基础。在.vimrc文件中设置了快捷键F12来在当前目录生成一个tags文件(请仔细阅读相关内容),它包括了当前目录及其子目录下所有c++代码文件的tag,当你想要查看某个定义时,将光标移动到目标,按下ctrl+],就会跳转到这个单词定义的地方。但是这只能查看在当前目录及子目录下代码文件中的tag。但是实际上我们经常会引用位于其它地方的头文件,这就需要我们先对那些头文件中的内容生成tag。网上的方法乱七八糟。一个比较好的方法是建立一个tags文件夹来管理所有的tags文件。比如我的就放在~/.vim/tags中,然后在.vimrc文件中设置tags文件的搜索命令(请看上文中的tags设置)。生成tags文件的命令例子:

ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=c++ -f acetags /home/liyan/ACE_wrappers


这条命令会在当前目录生成一个acetags文件,其中有/home/liyan/ACE_wrappers目录及其子目录下的所有c++代码文件的tag。请仔细百度上面的各种参数。一般时候,是不用 –language-force=c++ 的,但是如果要查看c++头文件(比如iostream)中的内容就必须要加这句话,否则会提示E426找不到tag。另外,cout这种宏定义的类型也是找不到的,除非加上参数 -I 宏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ide vim linux