所谓工欲善其事必先利其器,之前在实验室干活或者学习主要以java或者简单的C为开发语言,开发工具主要以Eclipse和VC++ 6.0为主,进入公司后转战Linux,以C++语言为主,选择了VIM作为开发工具,用过一段时间之后总是感觉不顺手,于是决心整顿一下,下面开始我的研究之旅。
1. 前期准备
a) 说明:由于我使用的为linux系统,版本号为10.04,后面的配置在此系统下可用。
b) 安装vim:sudo apt-get install vim-full
c) 安装一份vim中文文档
对于英文比较挫的我,一份中文文档还是非常有必要的。方法到http://vimcdoc.sourceforge.net/下载或者在我的空间内下载。我下载的是vimcdoc-1.8.0.tar.gz,拷贝到系统任意目录下解压后执行vimcdoc.sh -i。
d) 既然是对vim进行配置,就要知道其配置文件存在什么地方。vim的配置文件存在于/etc/vim/vimrc和~/.vimrc(如果没有自行创建):/etc目录下的配置是一个全局文件,会影响到系统上所有用户,一般建议修改自己目录下的.vimrc文件
2. vim脚本学习
无论是做研究还是日常工作中,我都是抱着知其然知其所以然的态度,本次研究当然也不例外。对vim的配置实际上是有一套脚本语言控制的,和shell、python、c语言类似,包括变量定义、语句控制、函数等。
强烈建议先花上一个小时学习一下该语言,如果对C或者shell比较熟悉的话,会更容易了解。可以直接查看vim文档的第41章即在vim命令模式下执行:help vim-script-intro查看。
3. vim配置文件下载
先提供我的配置文件以及相关插件的下载http://download.csdn.net/detail/fangqingan_java/5378097。或者在我的资源列表里面搜索vim配置文件,使用时:
a) 将vimrc_fqa拷贝到~/.vimrc
b) 解压vim_fqa.zip,将.vim目录下文件拷贝到~/.vim/目录下
c) 将stl_ctags拷贝到~/Base下,可以自行修改,如果修改请修改配置文件对应地方(配置文件中搜索stl_ctags)
d) 拷贝vimcdoc-1.8.0.tar.gz到任意目录解压后执行vimcdoc.sh -i
以上路径如果没有自行创建。
4. 基础配置
一些实用的配置,大家可以根据需求选择使用。不想使用的功能直接在行首加引号注释掉。
"""""""""""""""""""
"实用设置
"""""""""""""""""""
" 设置当文件被改动时自动载入
set autoread
" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
"共享剪贴板
set clipboard+=unnamed
"从不备份
set nobackup
"自动保存
set autowrite
set ruler " 打开状态栏标尺
set cursorline " 突出显示当前行
set magic " 设置魔术
set guioptions-=T " 隐藏工具栏
set guioptions-=m " 隐藏菜单栏
" 不要使用vi的键盘模式,而是vim自己的
set nocompatible
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候,弹出确认
set confirm
" 自动缩进
set autoindent
set cindent
" 历史记录数
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
set nocompatible "不要vim模仿vi模式,建议设置,否则会有很多不兼容的问题
syntax on "打开高亮
set hlsearch "高亮显示结果
set incsearch "在输入要搜索的文字时,vim会实时匹配
5. Tab的设置
为什么要单把tab的配置抽离出来呢?是因为每个公司对tab键的需求不同,例如有的公司将tab键扩展为4个空格,有的为2个空格。又如果对所有的文件都采用相同的配置又不太合适,有些配置文件还是希望有tab键的出现。
下面脚本的函数是说在执行到特殊文件类型时才将tab转换为2个空格。
" 特定文件类型,tab键转变为空格
autocmd BufEnter *.cc,*.h,*.cpp,*.sh,*.vim exec ":call SetMyTab()"
function SetMyTab()
set smarttab
set tabstop=2
set shiftwidth=2
set softtabstop=2
set expandtab
endfunction
6. 自动添加版权声明
先介绍一下该配置的用法:按F4键可以对各类文件添加版权声明,由于不同文件的注释是不一致的,又对文件进行了区分,对于C或者C++而言采用"//"进行注释;对于shell脚本采用"#"注释;对于vim自己的脚本采用"\""进行注释;
多次按F4键不会进行多次添加,会修改文件的修改时间一项。
另外添加了一个附属的功能,对于c++中点h文件一般要有头文件保护,自动生成头文件保护,采用路径的绝对路径或者相对路径进行保护。具体参考配置说明。
"进行版权声明的设置
"添加或更新头
map <F4> :call TitleDet()<cr>
function GetTilteHead()
let s:file_name_path=toupper(expand("%:p"))
let s:file_sub_id=1
" 修改一下8行进行头文件保护路径的截取
let s:coding_id=stridx(s:file_name_path, "CODING")
let s:trunk_id=stridx(s:file_name_path, "TRUNK")
if s:coding_id != -1
let s:file_sub_id=s:coding_id + 7
elseif s:trunk_id != -1
let s:file_sub_id=s:trunk_id + 6
endif
let s:file_sub_path = strpart(s:file_name_path, s:file_sub_id)
let s:file_sub_trans_1=substitute(s:file_sub_path, '/','_','g')
let s:file_sub_trans_2=substitute(s:file_sub_trans_1, '\.','_','g')
return s:file_sub_trans_2."_"
endfunction
function AddTitle()
let s:version_pre='//'
if &filetype == 'sh'
let s:version_pre='#'
elseif &filetype == 'vim'
let s:version_pre='"'
endif
call append(0, s:version_pre.' Copyright (c) '. strftime("%Y"). ' xxx Inc. ALL RIGHTS RESERVED.')
call append(1, s:version_pre.' Author: Fang Qingan(fangqingan@163.com)')
call append(2, s:version_pre. ' Created/Modified Time: '. strftime("%c"))
call append(3, s:version_pre. ' File Name: '.expand("%"))
call append(4, s:version_pre. ' Description:')
let s:file_name = expand("%:p")
if stridx(s:file_name, "\.h") != -1
let s:file_head=GetTilteHead()
call append(5, '#ifndef '.s:file_head)
call append(6, '#define '.s:file_head)
call append(line("$"), '#endif // '.s:file_head)
endif
echohl WarningMsg | echo "Successful in adding the copyright." | echohl None
endfunction
"更新最近修改时间和文件名
function UpdateTitle()
normal m'
execute '/.*Created\/Modified Time:/s@:.*$@\=strftime(": %c")@'
normal ''
normal mk
execute "noh"
normal 'k
echohl WarningMsg | echo "Successful in updating the copy right." | echohl None
endfunction
"判断前10行代码里面,是否有Last modified这个单词,
"如果没有的话,代表没有添加过作者信息,需要新添加;
"如果有的话,那么只需要更新即可
function TitleDet()
let s:n=1
"默认为添加
while s:n < 10
let s:line = getline(s:n)
if s:line =~ '^.*Created/Modified\sTime:\S*.*$'
call UpdateTitle()
return
endif
let s:n = s:n + 1
endwhile
call AddTitle()
endfunction
7. Taglist、omnicppcomplete的配置
ctags、taglist、omnicppcomplete为写程序必备工具可以将函数、变量等生成tag文件展示出来,并能进行自动补全。
首先保证系统中安装了ctags,并且下载了taglist以及omnicppcomplete插件,或者按照步骤3设置了插件配置。
功能:按F3可以打开taglist,再次按关闭;支持对stl标准库的补全。
"进行Tlist的设置
"TlistUpdate可以更新tags
map <F3> :silent! Tlist<CR> "按下F3就可以呼出了
let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以直接执行
let Tlist_Use_Right_Window=1 "让窗口显示在右边,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
set tags+=/home/fangqingan/Base/stl_tags "填充stl_tags绝对路径
"代码补全
set completeopt=preview,menu
" set for omnicppcomplete
set nocp
filetype plugin on
8. 锦上添花
Winmanager,NERDTree和MiniBufExplorer主要提供快捷的编辑功能,如定义跳转,符号查询,符号提示与补全等。这里的三个插件,主要优化布置VIm的界面。具体来说,NERDTree提供树形浏览文件系统的界面,MiniBufExplorer提供多文件同时编辑功能,而Winmanager将这NERDTree界面和Taglist界面整合起来,使Vim更像VS!
" set for minibufexp
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1
let g:miniBufExplMoreThanOne=0
" set for nerdtree
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>
" set for vinmanager
function! <SID>ToggleWindowsManager()
if IsWinManagerVisible()
call s:CloseWindowsManager()
else
call s:StartWindowsManager()
exe 'q'
end
endfunction
9. 参考文件
a) http://stevelosh.com/blog/2010/09/coming-home-to-vim/
b) http://www.cherrot.com/2012/05/vim-configure-notes
c) http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html
d) http://sosowo.org/archives/tag/vim-tag--vim
e) http://blog.csdn.net/bokee/article/details/6633193
如有时间和精力建议大家看一下配置具体含义。
有任何问题,欢迎大家拍砖。