将VIM改造成c++IDE
2016-04-25 16:13
639 查看
如何将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 宏。
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- VIM编译器显示TAB和TAB转换为空格
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- 不喜欢 IDE?试试看 grepgitvi
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- 菜鸟说给菜鸟听之VIM--入门篇(1)
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制