作为一个linux的初学者,看到网上各种吹vim的,心向往之,于是自己去网上查了相关的资料来做。伤心的是,做了两天才做好(原谅我的菜)。然而还有部分原因却是因为网上的教程不够详细和深入,没有解释为什么而直接说该怎么做,并且有些做法其实并不好。下面分享一些我的经验。
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."\\"."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
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可以查看帮助手册。效果如下图:
接下来我要说的,就是让我用掉两天时间的罪魁祸首: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 宏。