前言:貌似时隔上一篇博客已经过了很久了,这里再写一下关于vi(vim,gvim)的配置
一、vi编辑器的配置文件及目录
需要提到的是,vi编辑器的配置文件主要有两个地方
1. ~/.vimrc #这里以.开头说明这个配置文件是隐藏文件。
2. ~/.vim #这里的.vim是一个文件夹,文件夹也是隐藏的。
.vimrc配置文件是用以配置vim启动时的一些显示,如语法高亮、字体、行号显示....包含的东西比较多,无法一一列出
.vim文件夹中包含的东西则比较丰富,不过最主要的功能还是存放vi插件一些相关的东西(ps:vi比较强大的重要原因之一就是因为其强大而丰富的插件)。
二、我们需要什么样的编辑器?
我们需要一个什么样的编辑器,或者说我们需要什么样的一个IDE(Intergrated Development Environment),让我们先看看Eclipse的界面是如何的:
这个IDE我将其分成5个区域,各个区域的功能如图中所示,功能虽然比较强大,但是文件编辑区则显得比较局促,当文件比较大时,从其中某一行到另一行则需要不停得滑动滚轮或者ctrl+F来查找关键字
而我配置之后的vi编辑器的界面如下:
这个界面大概会有四个部分,左栏上下两个区域分别是文件浏览器和函数变量预览区域,最大的那个部分是文件编辑区,最上面那一长条是多文件标签,的确看起来比Eclipse要清爽了许多,但是功能丝毫没有少。当然如果会有一些附加的功能那就更好了,比如说自动补全,比如说更丰富的颜色高亮,比如说快捷键编译运行等等。
三、.vimrc配置文件
先贴出我的.vimrc文件,不想看的可以直接粘贴到自己的.vimrc文件中,但是这样的话,你就只能使用和我一样的界面了,就没法自己定制自己喜欢的界面了。(不过话说回来有的我也不是很懂)
还有这里先列出的配置文件不包含vim插件的配置(有的vim插件也需要在.vimrc文件中进行相应的配置才能更好的工作)。
set nocompatible if has("syntax") syntax on " 语法高亮 endif ""colorscheme molokai " elflord ron peachpuff default 设置配色方案,vim自带的配色方案保存在/usr/share/vim/vim72/colors目录下 colorscheme koehler " detect file type filetype on filetype plugin on " If using a dark background within the editing area and syntax highlighting " turn on this option as well "set background=dark set guifont=Monaco\ 10 set guifontwide=文泉驿等宽微米黑\ 10 " Uncomment the following to have Vim jump to the last position when " reopening a file if has("autocmd") au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif "have Vim load indentation rules and plugins according to the detected filetype filetype plugin indent on endif " The following are commented out as they cause vim to behave a lot " differently from regular Vi. They are highly recommended though. "set ignorecase " 搜索模式里忽略大小写 "set smartcase " 如果搜索模式包含大写字符,不使用 'ignorecase' 选项。只有在输入搜索模式并且打开 'ignorecase' 选项时才会使用。 set autowrite " 自动把内容写回文件: 如果文件被修改过,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令时进行;用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令转到别的文件时亦然。 set autoindent " 设置自动对齐(缩进):即每行的缩进值与上一行相等;使用 noautoindent 取消设置 "set smartindent " 智能对齐方式 set tabstop=4 " 设置制表符(tab键)的宽度 set softtabstop=4 " 设置软制表符的宽度 set shiftwidth=4 " (自动) 缩进使用的4个空格 set cindent " 使用 C/C++ 语言的自动缩进方式 set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "设置C/C++语言的具体缩进方式 "set backspace=2 " 设置退格键可用 set showmatch " 设置匹配模式,显示匹配的括号 set linebreak " 整词换行 set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去 "set hidden " Hide buffers when they are abandoned set mouse=a " Enable mouse usage (all modes) "使用鼠标 set number " Enable line number "显示行号 "set previewwindow " 标识预览窗口 set history=50 " set command history to 50 "历史记录50条 "--状态行设置-- set laststatus=2 " 总显示最后一个窗口的状态行;设为1则窗口数多于一个的时候显示最后一个窗口的状态行;0不显示最后一个窗口的状态行 set ruler " 标尺,用于显示光标位置的行号和列号,逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行,标尺在那里显示。否则,它显示在屏幕的最后一行上。 "--命令行设置-- set showcmd " 命令行显示输入的命令 set showmode " 命令行显示vim当前模式 "--find setting-- set incsearch " 输入字符串就显示匹配点 set hlsearch保存.vimrc之后,重新进入vim,打开一个源文件(如.cc文件,.h文件)是不是有所不同了?
四、vim常见的插件使用
vim插件我觉得是vim的精华所在,vim很多优秀的功能都是通过vim的插件来实现的。其实vim插件貌似是一套自己的语言,通过这个语言来协同工作,下面我就说我所常用的插件吧~
所有插件都可以在www.vim.org上面下到
4.1 ctags的使用
首先需要说明的是ctags不是vim 的插件,只是一个软件,用它来生成源码的信息--即下面所属的标签索引。
ctags可以建立源码树的标签索引(标签就是一个标识符被定义的地方,如函数定义),使程序员在编程时能迅速定位函数、变量、宏定义等位置去查看原形
首先先安装ctags:在终端输入sudo apt-get install ctags即可(PS:博主用的是ubuntu系统),接着就是生成tags文件。进入到对应的源码目录,具体到我,有三个目录分别是/home/helloworld/ns-allinone-2.30/ns-2.30、/usr/include/c++/4.3和/home/helloworld/cpp_src,分别是我经常工作的ns2的目录,C++库的目录以及C++中的STL的目录(貌似没有的话也没什么关系),然后再终端输入ctags -R *即可发现对应的目录下多了个tags文件,如(这里只给出了在ns目录下生成tags文件的例子)
helloworld@ubuntu:~/ns-allinone-2.30/ns-2.30$ ctags -R * helloworld@ubuntu:~/ns-allinone-2.30/ns-2.30$ ls -l tags -rw-r--r-- 1 helloworld helloworld 2380816 2013-05-31 17:20 tags
然后在.vimrc中添加以下配置信息:
"--ctags setting-- " 按下F5重新生成tag文件,并更新taglist map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR> imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR> set tags=tags set tags+=./tags "add current directory's generated tags file set tags+=/usr/include/c++/4.3/tags set tags+=~/ns-allinone-2.30/ns-2.30/tags set tags+=~/cpp_src/tags其中前两行是按下F5键自动更新tag文件,后面set tags开头的几行是设置tags文件(这里应该根据自己的情况来设置),保存.vimrc退出即可。然后随便打开一个文件,比如说我打开的是mac-gprs.cc文件,光标停在MacGprs下,按下ctrl+]就可以跳到MacGprs的定义或者 构造函数处,根据自己的需要选择即可。下面这一段来自其他博客:
tag命令用法:
Ctrl+] 跳到当前光标下单词的标签
Ctrl+O 返回上一个标签
Ctrl+T 返回上一个标签
:tag TagName 跳到TagName标签
以上命令是在当前窗口显示标签,当前窗口的文件替代为包标签的文件,当前窗口光标跳到标签位置。如果不希望在当前窗口显示标签,可以使用以下命令:
:stag TagName 新窗口显示TagName标签,光标跳到标签处
Ctrl+W + ] 新窗口显示当前光标下单词的标签,光标跳到标签处
当一个标签有多个匹配项时(函数 (或类中的方法) 被多次定义),":tags" 命令会跳转到第一处。如果在当前文件中存在匹配,那它将会被首先使用。
可以用这些命令在各匹配的标签间移动:
:tfirst 到第一个匹配
:[count]tprevious 向前 [count] 个匹配
:[count]tnext 向后 [count] 个匹配
:tlast 到最后一个匹配
或者使用以下命令选择要跳转到哪一个
:tselect TagName
输入以上命令后,vim会为你展示一个选择列表。然后你可以输入要跳转到的匹配代号 (在第一列)。其它列的信息可以让你知道标签在何处被定义过。
以下命令将在预览窗口显示标签
:ptag TagName 预览窗口显示TagName标签,光标跳到标签处
Ctrl+W + } 预览窗口显示当前光标下单词的标签,光标跳到标签处
:pclose 关闭预览窗口
:pedit file.h 在预览窗口中编辑文件file.h(在编辑头文件时很有用)
:psearch atoi 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配,在使用没有标签文件的库函数时十分有用。
4.2 vim自动补全——OmniCppComplete
其实我觉得这个挺不好用的。。。不过貌似网上都很推荐这个,先装上吧,后面会有更好用的补全工具。
功能:根据tags文件来进行补全
安装:去www.vim.org中搜索omnicppcomplete可以得到一个zip文件,将这个zip文件放在.vim文件夹下解压即可。
.vimrc配置如下:
"-- omnicppcomplete setting -- " 按下F3自动补全代码,注意该映射语句后不能有其他字符,包括tab;否则按下F3会自动补全一些乱码 imap <F3> <C-X><C-O> " 按下F2根据头文件内关键字补全 imap <F2> <C-X><C-I> 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
OmniCppComplete是基于ctags数据库即tags文件实现的(基于ctags生成的索引信息来实现自动补全的),所以在ctags -R生成tags时还需要一些额外的选项,这样生成的tags文件才能与OmniCppComplete配合运作。使用下列命令生成tags文件,就可以与OmniCppComplete配合运作:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
--c++-kinds=+p : 为C++文件增加函数原型的标签
--fields=+iaS : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
--extra=+q : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全
所以我们需要用ctags命令加上以上参数后重新在对应的源目录中生成tags文件。
关于omnicppcomplete,以下的来自其他blog(不过我觉得不是很好用)。
"-- Taglist setting -- let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以直接执行 let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边 let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表 let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏 let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim "是否一直处理tags.1:处理;0:不处理 let Tlist_Process_File_Always=1 "实时更新tags let Tlist_Inc_Winwidth=0用法: 进入vim后用命令 ":Tlist"打开/关闭taglist窗口
"-- WinManager setting -- let g:winManagerWindowLayout='FileExplorer|TagList' " 设置我们要管理的插件 "let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了,退出vim nmap wm :WMToggle<cr>用法:
" -- MiniBufferExplorer -- let g:miniBufExplMapWindowNavVim = 1 " 按下Ctrl+h/j/k/l,可以切换到当前窗口的上下左右窗口 let g:miniBufExplMapWindowNavArrows = 1 " 按下Ctrl+箭头,可以切换到当前窗口的上下左右窗口 let g:miniBufExplMapCTabSwitchBufs = 1 " 启用以下两个功能:Ctrl+tab移到下一个buffer并在当前窗口打开;Ctrl+Shift+tab移到上一个buffer并在当前窗口打开;ubuntu好像不支持 "let g:miniBufExplMapCTabSwitchWindows = 1 " 启用以下两个功能:Ctrl+tab移到下一个窗口;Ctrl+Shift+tab移到上一个窗口;ubuntu好像不支持 let g:miniBufExplModSelTarget = 1 " 不要在不可编辑内容的窗口(如TagList窗口)中打开选中的buffer用法:
"a.vim快捷键设置 nnoremap <silent> <F12> :A<CR>用法:直接F12就可以打开这个cc文件所对应的h文件,很方便有木有。
" Disable AutoComplPop. let g:acp_enableAtStartup = 0 " Use neocomplcache. let g:neocomplcache_enable_at_startup = 1 " Use smartcase. let g:neocomplcache_enable_smart_case = 1 " Use camel case completion. let g:neocomplcache_enable_camel_case_completion = 1 " Use underbar completion. let g:neocomplcache_enable_underbar_completion = 1 " Set minimum syntax keyword length. let g:neocomplcache_min_syntax_length = 1 " set the max list in the popup menu. increase the speed let g:neocomplcache_max_list=20 " Define keyword. if !exists('g:neocomplcache_keyword_patterns') let g:neocomplcache_keyword_patterns = {} endif let g:neocomplcache_keyword_patterns['default'] = '\h\w*' let g:neocomplcache_auto_completion_start_length=1 " ignore letter case let g:neocomplcache_enable_ignore_case=1用法:如下图所示
"--fold setting-- set foldmethod=syntax " 用语法高亮来定义折叠 set foldlevel=100 " 启动vim时不要自动折叠代码 set foldcolumn=5 " 设置折叠栏宽度用法:
"括号自动补全 :inoremap ( ()<ESC>i :inoremap ) <c-r>=ClosePair(')')<CR> :inoremap { {<CR>}<ESC>O :inoremap } <c-r>=ClosePair('}')<CR> :inoremap [ []<ESC>i :inoremap ] <c-r>=ClosePair(']')<CR> :inoremap " ""<ESC>i :inoremap ' ''<ESC>i function ClosePair(char) if getline('.')[col('.') - 1] == a:char return "/<Right>" else return a:char endif endfunction4.10 C++ 懒人利器:cvim插件