一步一步的打造好用的Vim(图解)
作者:草帽的后花园——小懒虫
转载请注明:草帽的后花园
首先,创建这个文档,是一直都有的想法,有两个原因,一个是为了自己保存,另外一个是希望能带给那些在学习中遇到了同样问题的人一份小礼物,希望能对你们起到帮助的作用,而不是麻烦。
这个文档的主要任务不是为了制作一个linux下IDE,而是完成我们一些常用的功能,这些功能可以更加方便的让我们在linux文字界面下工作、编码和学习,以提高效率。
那么进入正题。整个文档的内容和软件下载地址分别为:
1. 本人使用的vim配置和界面
首先在所处用户的目录下找到.vimrc(例如是root则在/root目录下,如果是user,则在~目录下,此时我们使用ls看看目录下的文件,但是发现没有这个文件,其实这个文件隐藏了,我们可以使用ls –a来显示所有文件,如果没有就可以新建一个 vim .vimrc),将下列代码拷贝进去,但是,这里是为了适应好几个系统,其实我们一般是在linux下使用,所以没有必要设置这么多,我多其进行了一些修改。
http://www.vimer.cn/2009/10/%e6%8a%8avim%e6%89%93%e9%80%a0%e6%88%90%e4%b8%80%e4%b8%aa%e7%9c%9f%e6%ad%a3%e7%9a%84ide1.html
vimrc配置如下(为简单起见,采取注释的方式直接说明):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
if(has("win32") ||has("win95") ||has("win64") let g:iswindows=1 else let g:iswindows=0 endif set nocompatible "不要vim模仿vi模式,建议设置,否则会有很多不兼容的问题 syntax on"打开高亮 if has("autocmd") filetype plugin indent on "根据文件进行缩进 augroup vimrcEx au! autocmd FileType text setlocal textwidth=78 autocmd BufReadPost * \ if \ exe \ endif augroup END else "智能缩进,相应的有cindent,官方说autoindent可以支持各种文件的缩进,但是效果会比只支持C/C++的cindent效果会差一点,但笔者并没有看出来 set autoindent " always set autoindenting on endif set tabstop=4 "让一个tab等于4个空格 set nowrap "不自动换行 set hlsearch "高亮显示结果 set incsearch "在输入要搜索的文字时,vim会实时匹配 set backspace=indent,eol,start whichwrap+=<,>,[,] "允许退格键的使用 if(g:iswindows==1)"允许鼠标的使用 "防止linux终端下无法拷贝 if set mouse=a endif au GUIEnter * simalt ~x endif "字体的设置 set guifont=Bitstream_Vera_Sans_Mono:h9:cANSI set gfw=幼圆:h10:cGB2312 |
上面是原作者的配置,我大致采用了这样一些配置,因为我使用的是linux文字界面,所以不用考虑鼠标状态。
这个配置里面包含了一些插件的按键映射,我会一个一个做出描述,当然这些描述也只是本人个人的理解,至于对与否,本人不敢保证,毕竟大部分是从网上弄下来,理解完成的(甚至完整的誊抄,呵呵)。本人配置完成后的界面:
(左边第一栏是文件所在的目录文件夹,第二栏是sendbox.c文件的内容,第三栏是sendbox.h的内容,第四栏是tag显示栏),看起来感觉挺好的,在操作的时候c和h文件之间可以互相切换,我设置的按键是shift+z键,不过我还是没有找到任意文件之间的切换方法。只有在新建文件的时候可以切换。现在开始一步一步的打造它吧,有些功能可要可不要,按个人需求去安装和配置了。
2.插件的介绍
首先,本人要介绍8个插件,如图:
其中:
a.vim:用于*.c与*.h文件之间的切换,在命令模式下输入:A 来切换;
bufexplorer.zip:用于创建缓冲区,建立分栏页面显示,使用\be \bv \br来控制;
cscope:这个可是一个好东东,编程用起来很方便
ctags:用于生成tag的,便于查找和翻阅
cvim:这个东东就比较好了,用于编译和直接执行你编译好的文件,还有大量的快 捷设置去完成代码的补充,例如注释,主函数之类的。
nerdtree:这个是用来观看目录文件的,如上上图的第一栏就是。
omnicppcomplete:用来代码提示的,效果如上上图的紫色框取余。
snipMate:代码补齐的,这个真是很好用的说吖,规则是修改~/.vim/snippets/目录
下的*.snippets文件
3.插件的安装和其他配件的安装
插件介绍完毕了,那么现在开始说下安装吧:
首先要安装的有cscope和ctags,你可以自行去网上下载这两个的包,或者通过这个链接下载我目前使用的版本包,都行的,安装方法是先解压:
解压命令: tar–xvf cscope-15.8a.tar
tar–zxvf ctags-5.8.tar.gz
这个解压就不多说了,不同的后缀名用的参数有些不一样。
解压后基本上就是(当然有些需要有root权限)
./configure
make
makeinstall
安装完毕后,可以试试看 cscope后回车
效果如图
有这样的效果就可以了。
接下来就是配置插件了,其实说是配置,也就是把这些文件放到该放的位置就可以了,呵呵,我们将剩下的那6个拷贝到~目录下的.vim (注意这里面有一个.的哦)下面,如果你发现你的~目录下没有这个目录怎么办呢?新建一个就好了 mkdir .vim 即可。
然后进到该目录下
cd~/.vim
unzipcvim.zip
其他的也相应的解压,zip的文件使用unzip来解压。
解压完毕后基本上就可以了。接下来就是设置快捷键的问题了。
4.vim快捷键的设置
设置快捷键需要了解vim的配置文件里面的按键映射问题,其中有很多快捷键组合方式是被系统看成是信号的,例如ctrl+s,以及ctrl+q等等,有很多。
首先我们先屏蔽掉ctrl+s产生的信号吧,修改~/.bashrc文件,在最后加入一行
stty–ixon
屏蔽掉之后我们就可以修改 ~/.vimrc来实现快捷键的使用了。
配置文件的内容为:
"base setting “参考网址:http://www.cnblogs.com/moodlxs/archive/2012/03/24/2415526.html set nocompatible "不兼容vi set magic " set nu "显示行号 set ai "自动缩进 set sw=4 "自动缩进宽度 set ts=4 "tab宽度 set dy=lastline "显示最多行,不用@@ set backspace=indent,eol,start colo evening set hlsearch "高亮显示搜索结果 set incsearch set hls set showmatch set showcmd set smartindent filetype plugin on "打开插件开关 set cursorline highligh Comment ctermfg=green "注释的颜色 "hotkeys "用于新建一个vi窗口的文件----C是代表ctrl键,A是代表alt键,S是代表shift键,<CR>代表回车,<ESC>代表ESC键 nmap <C-n> <Esc>:tabnew<CR> vmap <C-n> <Esc>:tabnew<CR> imap <C-n> <Esc>:tabnew<CR> "用于切换打开的vi窗口 noremap <TAB> :tabn<CR> nmap te :tabedit<CR> "退出不保存 nmap <C-b> <Esc>:q!<CR> vmap <C-b> <Esc>:q!<CR> imap <C-b> <Esc>:q!<CR> "三种模式下的保存文件 nmap <C-s> <Esc>:w<CR> vmap <C-s> <Esc>:w<CR> imap <C-s> <Esc>:w<CR> "这个是使用了a.vim这个插件,用来切换c/h,cpp/h nmap <S-z> <ESC>:A<CR> vmap <S-z> <ESC>:A<CR> imap <S-z> <ESC>:A<CR> "这个就是调出NERDTree "=======================NERDTree============= map <F3> :NERDTreeToggle<CR> let NERDTreeShowHidden=0 let NERDTreeWinSize=30 let NERDTreeHighlightCursorline=1 nmap <silent> <F4>:TagbarToggle<CR> let g:tagbar_ctags_bin = 'ctags' let g:tagbar_width = 30 "=======================c.vim============= "c.vim的还有很多功能,请参考http://www.thegeekstuff.com/2009/01/tutorial-make-vim-as-your-cc-ide-using-cvim-plugin/ "F5编译 nmap <F5> <Esc>\rc vmap <F5> <Esc>\rc imap <F5> <Esc>\rc "F6编译并执行 nmap <F6> <Esc>\rr vmap <F6> <Esc>\rr imap <F6> <Esc>\rr "查找 "=======================find============= noremap <F7> :vimgrep/<C-R>=expand("<cword>")<CR>/j *.txt *.cpp *.h *.py*.java *.lua<CR> \| :copen<CR> noremap <F8> :vimgrep/<C-R>=expand("<cword>")<CR>/j **/*.txt **/*.cpp**/*.h **/*.py **/*.java **/*.lua<CR> \| :copen<CR> noremap <C-F7> :vimgrep/<C-R>=expand("<C-R>+")<CR>/j **/*.txt **/*.cpp**/*.h **/*.py **/*.java **/*.lua<CR> \| :copen<CR> "这个用来分屏用的 "==================================== map <F11> <ESC>\be "map <F12> :!ctags -R--fields=+lS<CR> "这个完全就是抄下来的了,具体的内容请参考: " 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() iffilereadable("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 thetags" | echohl None return endif endif ifhas("cscope") silent! execute "cs kill -1" endif iffilereadable("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 todo cscope! I cannot delete the cscope.files" | echohl None return endif endif iffilereadable("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 thecscope.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 :" iffilereadable("cscope.out") execute "cs add cscope.out" endif endif endfunction
5.总结
基本上都是从网上整理下来的,结合了自己的一些使用习惯编写的一个文档,不能说它是一个好的详细的教程,只能说是一个抛砖引玉吧。
其中这几个人的博客写的比较详细:
http://easwy.com/blog/archives/advanced-vim-skills-catalog/
http://www.vimer.cn/(其中里面有三篇关于打造vimIDE的文章写的很好)