1. vim 的安装

$sudo apt-get install vim vim-scripts vim-doc <br>

其中vim-scripts包含了vim的一些基本插件,包括语法高亮,缩进等等。
vim的中文文档tar包下载地址: http://sourceforge.net/projects/vimcdoc/files/vimcdoc/
解压后其中有个doc文件夹, 将其中的内容全部复制到~/.vim/doc, 或者vim安装目录下的doc目录中, 此时vim中的help信息已经是中文的了.
网页版中文帮助文档网址http://vimcdoc.sourceforge.net/doc/help.html
首页就时vim帮助文档的目录,阅读起来更方便有效、更有针对性!

2. vim的配置文件

vim系统的配置文件在 /usr/share/vim, /etc/vim 两个文件夹下,但是,可以修改 ~/.vimrc 文件和 ~/.vim 目录来对用户单独配置vim。

3. vim的基本配置

"---------------------------------- pathogen 设置-------------------------
"pathogen插件用于管理其他vim插件,安装其他插件时候,可以直接解压覆盖到 .vim 目录下的 autoload, plugin, doc目录;
"也可以安装完pathogen之后(会在autoload目录下有一个pathogen.vim,同时在.vim 下创建 bundles目录)进入 bundles目录,
"执行 git clone xxxx 到bundles目录,利用 pathogen进行安装
execute pathogen#infect()
execute pathogen#helptags() "定义快捷键的前缀,前缀类似于命令空间,避免多个相同的快捷键冲突
"如 c, <header> c, <header><header> c 是三个不同的快捷键
let mapleader=";" "----------------------------------基本配置------------------------------
"关闭兼容模式
set nocompatible "文件类型检测,可以针对不同类型的文件加载不同的插件
filetype on
"根据侦测的文件类型,加载相应的插件
filetype plugin on "vim 自身命令行 模式自动补全
set wildmenu "设置语法高亮
if has("syntax")
syntax on
endif "高亮光标所在的行
set cul "用浅色高亮当前行
autocmd InsertEnter * se cul "设置行间隔
set linespace=0 "设置退格键可用
set backspace=2 "设置匹配模式,显示匹配的括号
set showmatch "整词换行
set linebreak "设置光标可以从行首或行末换到另一行去
set whichwrap=b,s,<,>,[,] "设置使用鼠标
set mouse=a "显示行号
set number "标志预览窗口
set previewwindow "设置历史记录条数
set history=50 "设置自动写回文件
"自动把内容写回文件: 如文件被修改过,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、
:tag、:!、:make、CTRL-]" 和 CTRL-^命令时进行;
用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令转到别的文件时亦然。
set autowrite "---------------------------------配色方案------------------------------
syntax enable syntax on "设置背景色
set background=dark "vim 配色方案
"colorscheme solarized
colorscheme desert set t_Co=256 "设置字体
set guifont=Consolas:h11 "---------------------------------设置宽度(tab等)----
"设置tab宽度
set tabstop=4 "设置软tab宽度,软tab,用空格代替tab
set softtabstop=4 "自动缩进的宽度
set shiftwidth=4 "----------------------------------设置对齐和缩进--------
"设置自动对齐,(和上一行)
set autoindent "智能对齐
"set smartindent "使用c/c++语言的自动缩进方式
set cindent "设置c/c++语言的具体缩进方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "不要用空格代替制表符
set expandtab "在行和段开始处使用制表符
set smarttab

4. 代码折叠

  1. 折叠方式foldmethod
    vim提供以下6种方法来选定折叠方式:
    manual 手工定义折叠
    indent 更多的缩进表示更高级别的折叠
    expr 用表达式来定义折叠
    syntax 用语法高亮来定义折叠
    diff 对没有更改的文本进行折叠
    marker 对文中的标志折叠
  2. 折叠级别foldlevel
    ‘foldlevel’ 是个数值选项:数字越大则打开的折叠更多。
    当 ‘foldlevel’ 为 0 时,所有的折叠关闭。
    当 ‘foldlevel’ 为正数时,一些折叠关闭。
    当 ‘foldlevel’ 很大时,所有的折叠打开。
  3. 折叠栏foldcolumn
    ‘foldcolumn’ 是个数字,它设定了在窗口的边上表示折叠的栏的宽度。当为0时,没有折叠栏。最大是12。
    一个打开的折叠由一栏来表示,顶端是 ‘-‘,其下方是 ‘|’。这栏在折叠结束的地方结束。当折叠嵌套时,嵌套的折叠出现在被包含的折叠右方一个字符位置。
    一个关闭的折叠由 ‘+’ 表示。
    当折叠栏太窄而不能显示所有叠时,显示一数字来表示嵌套的级别。
    在折叠栏点击鼠标,可以打开和关闭折叠:
    (1)点击 ‘+’ 打开在这行的关闭折叠
    (2) 在任何其他非空字符上点击,关闭这行上的打开折叠
    在vim配置文件/home/user/.vimrc中加入如下的配置:

    "--fold setting--
    set foldmethod=syntax " 用语法高亮来定义折叠
    set foldlevel=100 " 启动vim时不要自动折叠代码
    set foldcolumn=5 " 设置折叠栏宽度
  4. 常用命令
    za 打开/关闭在光标下的折叠
    zA 循环地打开/关闭光标下的折叠
    zo 打开 (open) 在光标下的折叠
    zO 循环打开 (Open) 光标下的折叠
    zc 关闭 (close) 在光标下的折叠
    zC 循环关闭 (Close) 在光标下的所有折叠
    zM 关闭所有折叠
    zR 打开所有的折叠

5. quickfix 设置

通过quickfix命令集,可以在vim内编译程序,并且直接跳转到出错位置进行修正,

然后接着进行编译和修正,直到不再出错为止。在 vim的配置文件~/.vimrc文件中加入如下配置:

"-- QuickFix setting --
" 按下F6,执行make clean
map <F6> :make clean<CR><CR><CR>
" 按下F7,执行make编译程序,并打开quickfix窗口,显示编译信息
map <F7> :make<CR><CR><CR> :copen<CR><CR>
" 按下F8,光标移到上一个错误所在的行
map <F8> :cp<CR>
" 按下F9,光标移到下一个错误所在的行
map <F9> :cn<CR>
" 以上的映射是使上面的快捷键在插入模式下也能用
imap <F6> <ESC>:make clean<CR><CR><CR>
imap <F7> <ESC>:make<CR><CR><CR> :copen<CR><CR>
imap <F8> <ESC>:cp<CR>
imap <F9> <ESC>:cn<CR>
下面的命令运行 "make" (包括你所给出的参数) 程序并捕捉其运行结果: >

:make {arguments}
如果编译时出现错误,按 ,回到vim界面,看不到出错信息了!这时,可以运行以下命令
:cw[indow] 打开quickfix窗口来查看出错信息,它会自动跳到第一处出错的地方。然后,你可以双击出错某一条出错信息,vim就会自动跳转到相应的出错位置
:cn[ext] 光标移到下一个错误所在的行
:cp[revious] 光标移到上一个错误所在的行
:cfirst 到第一处错误
:clast 到最后一处错误
:cc 空间不够时,Vim 会缩短出错信息。如果你想查看详细信息,可以使用此命令
:cl[ist] 列出所有出错信息的概览(只有那些含有文件名或行数的错误信息会被显示,需要查看那些并不含文件名或行数的信息可用“:cl[ist]!”命令)

6. ctags配置

ctags 可以建立源码树的标签索引,用于快速定位函数、变量等。

$sudo apt-get install ctags #安装ctags
$ ctags -R * #建立索引文件

~/.vimrc中对ctgs的使用进行配置

"-------------------------------------ctags设置----------------------------  
"按下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

tag命令用法:
Ctrl+] 跳到当前光标下单词的标签
Ctrl+O 返回上一个标签
Ctrl+T 返回上一个标签
:tag TagName 跳到TagName标签
以上命令是在当前窗口显示标签,当前窗口的文件替代为包标签的文件,当前窗口光标跳到标签位置。如果不希望在当前窗口显示标签,可以
:stag TagName 新窗口显示TagName标签,光标跳到标签处
Ctrl+W + ] 新窗口显示当前光标下单词的标签,光标跳到标签处
当一个标签有多个匹配项时(函数 (或类中的方法) 被多次定义),”:tags” 命令会跳转到第一处。如果在当前文件中存在匹配,那它将会被首先使用。
可以用这些命令在各匹配的标签间移动:
:tfirst 到第一个匹配
:[count]tprevious/tp 向前 [count] 个匹配
:[count]tnext/tn 向后 [count] 个匹配
:tlast 到最后一个匹配
或者使用以下命令选择要跳转到哪一个
:tselect TagName
输入以上命令后,vim会为你展示一个选择列表。然后你可以输入要跳转到的匹配代号 (在第一列)。其它列的信息可以让你知道标签在何处被定义过。
以下命令将在预览窗口显示标签
:ptag TagName 预览窗口显示TagName标签,光标跳到标签处
Ctrl+W + } 预览窗口显示当前光标下单词的标签,光标跳到标签处
:pclose 关闭预览窗口
:pedit file.h 在预览窗口中编辑文件file.h(在编辑头文件时很有用)
:psearch atoi 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配,在使用没有标签文件的库函数时十分有用。

5. 管理vim插件 pathogen

通过pathogen,可以管理vim插件。
当自己下载安装vim插件的时候,也可以在自己的插件子目录~/.vim下。在~/.vim 子目录下,设置插件目录plugin 和文档目录doc.
使用手动方式进行拷贝添加:解压 xxx.zip,将 解压后的目录中的 autoload, plugin, doc 目录中的文件拷贝到 ~/.vim目录下

对应的autoload, plugin, doc 目录中去(直接解压覆盖安装即可)。
或者使用pathogen 插件管理器来管理插件,pathogen在~/.vim/autoload目录下有 pathogen.vim, 然在.vim目录下建立
bundle目录,在bumdle目录下执行 git clone xxxx.git 获得插件,即可完成自动安装。同时,在.vimrc 文件中添加
execute pathogen#effect()
execute pathogen#helptags()

6. vim 自动补全 Onmicpp-Complete

    vim的自动补全功能可以通过 Omnicpp-Complete来实现。
在~/.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
OnmiCppComplete是基于ctags数据库即tag文件来自动补全的,所以在使用ctags -R 生成tag文件时需要加入其他选项,

才能与OnmiCppComplete配合。
ctags -R —c++-kinds=+p —fields=+iaS —extra=+q .
—c++-kinds=+p : 为C++文件增加函数原型的标签
—fields=+iaS : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
—extra=+q : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全
例如,为了添加标准c++的代码补全。

  1. 下载c++的源代码

    $sudo apt-get install build-essential  (源码会放在/usr/include/c++ 目录下)
  2. 然后生成和omnicppcomplete连接的tags文件
    在/usr/include/c++目录下执行,ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .  生成tags文件
  3. 在.vimrc 文件中添加
    set tags+=/usr/include/c++/tags

注意:在自动补全的点,Vim必须知道可能补全的定义。比如说,在namespace std命名空间下的变量和函数,必须要用using namespace std;暴露出来,否则是不能补全的。
在.cpp文件中还可以,在.h文件中这样就不是好的做法了。暂时不知道这个问题是由于我自己配置错误还是程序没有实现。
当自动补全下拉窗口弹出后,一些可用的快捷键:
Ctrl+P 向前切换成员
Ctrl+N 向后切换成员
Ctrl+E 表示退出下拉窗口, 并退回到原来录入的文字
Ctrl+Y 表示退出下拉窗口, 并接受当前选项
其他补全方式:
Ctrl+X Ctrl+L 整行补全
Ctrl+X Ctrl+N 根据当前文件里关键字补全
Ctrl+X Ctrl+K 根据字典补全
Ctrl+X Ctrl+T 根据同义词字典补全
Ctrl+X Ctrl+I 根据头文件内关键字补全
Ctrl+X Ctrl+] 根据标签补全
Ctrl+X Ctrl+F 补全文件名
Ctrl+X Ctrl+D 补全宏定义
Ctrl+X Ctrl+V 补全vim命令
Ctrl+X Ctrl+U 用户自定义补全方式
Ctrl+X Ctrl+S 拼写建议
帮助文档
:help omnicppcomplete

7. 提示函数原型 echo_func

echofunc可以在命令行中提示当前输入函数的原型。
echofunc下载地址:<http://www.vim.org/scripts/script.php?script_id=1735> 下载完成后,把echofunc.vim文件放到 ~/.vim/plugin

文件夹中
当你在vim插入(insert)模式下紧接着函数名后输入一个”(“的时候, 这个函数的声明就会自动显示在命令行中。如果这个函数有多个声明,
则可以通过按键”Alt+-“和”Alt+=”向前和向后翻页,
这个两个键可以通过设置g:EchoFuncKeyNext和g:EchoFuncKeyPrev参数来修改。这个插件需要tags文件的支持,
并且在创建tags文件的时候要加选项”—fields=+lS”(OmniCppComplete创建的tag文件也能用),
整个创建tags文件的命令如下:
$ ctags -R —fields=+lS

8. 标签浏览器 TagList

Taglist了列出了当前文件中的所有标签,宏、变量、函数等。

安装taglist: 下载taglist 的压缩包, 解压缩到 ~/.vim 目录覆盖 doc和plugin目录即可。
配置taglist:

"-- 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窗口
帮助文档
:help taglist.txt

9. cscope 设置

Cscope是一个类似于ctags的工具,不过其功能比ctags强大很多。
  1. 安装Cscope
    $ sudo apt-get install cscope
  2. 在vim配置文件/home/user/.vimrc中加入如下的配置:
    if has(“cscope”)
    set csprg=/usr/bin/cscope “ 指定用来执行cscope的命令
    set csto=0 “ 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope数据库
    set cst “ 同时搜索cscope数据库和标签文件
    set cscopequickfix=s-,c-,d-,i-,t-,e- “ 使用QuickFix窗口来显示cscope查找结果
    set nocsverb
    if filereadable(“cscope.out”) “ 若当前目录下存在cscope数据库,添加该数据库到vim
    cs add cscope.out
    elseif $CSCOPE_DB != “” “ 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
    cs add $CSCOPE_DB
    endif
    set csverb
    endif

map :cs add ./cscope.out . :cs reset
imap :cs add ./cscope.out . :cs reset
“ 将:cs find c等Cscope查找命令映射为c等快捷键(按法是先按Ctrl+Shift+-, 然后很快再按下c)
nmap s :cs find s =expand(““) :copen
nmap g :cs find g =expand(““)
nmap d :cs find d =expand(““) :copen
nmap c :cs find c =expand(““) :copen
nmap t :cs find t =expand(““) :copen
nmap e :cs find e =expand(““) :copen
nmap f :cs find f =expand(““)
nmap i :cs find i =expand(““) :copen

  1. cscope的主要功能是通过其”find”子命令来实现的
    “cscope find”的用法:
    cs find c|d|e|f|g|i|s|t name
    0 或 s 查找这个 C 符号(可以跳过注释)
    1 或 g 查找这个定义
    2 或 d 查找这个函数调用的函数
    3 或 c 查找调用过这个函数的函数
    4 或 t 查找这个字符串
    6 或 e 查找这个 egrep 模式
    7 或 f 查找这个文件
    8 或 i 查找包含这个文件的文件

  2. 用法:
    <1>、为源码建立一个cscope数据库
    $ cscope -Rbq
    $ ls cscope.*
    cscope.in.out cscope.out cscope.po.out
    <2>、用vim打开某个源码文件,末行模式下,输入“:cs add cscope.out”(该命令已被我们映射为快捷键F4),添加cscope数据库到vim。因为我们已将vim配置为启动时,自动添加当前目录下的cscope数据库,所以你再添加该cscope数据库时,vim会提示“重复cscope数据库 未被加入“
    <3>、完成前两步后,现在就可以用“cs find c”等Cscope查找命令查找关键字了。我们已在.vimrc中将“cs find c”等Cscope查找命令映射为c等快捷键(按法是先按Ctrl+Shift+-, 然后很快按下c)

帮助文档
:help ifcscop
注意:帮助文档if_cscop中,快捷键映射nmap <C-
>i :cs find i ^=expand(““)$是有误的!
比如光标“header.h”上按下i,也就是查找包含“header.h“的文件。但是按照这个映射规则,则是将i映射为cs find i ^header.h$,也就是查找包含“^header.h$“的文件,这显然不是我们想要的结果。该映射规则应该改成nmap i :cs find i =expand(““)

10. vim 常用快捷键

%  跳转到配对的括号去
[[ 跳转到当前或者上一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
][ 跳转到当前代码块(函数定义、类定义等)的结尾去(但要求代码块中'{'必须单独占一行)
]] 跳转到下一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
[/ 跳到注释开头(只对/* */注释有效)
]/ 跳到注释结尾(只对/* */注释有效)
gD 跳转到当前文件内标识符首次出现的位置,可用于跳转到全部变量的定义处;查找局部变量时,
要是多个函数中定义了该局部变量,使用gD进行查找,找到的变量定义可能不是你需要的
gd 跳转到当前函数内标识符首次出现的位置,可用于跳转到局部变量的定义处
'' 跳转到光标上次停靠的地方, 是两个\`, 而不是一个双引号
mx 设置书签,x只能是a-z的26个字母
`x 跳转到书签处("`"是1左边的键)
> 增加缩进,"x>"表示增加以下x行的缩进
< 减少缩进,"x<"表示减少以下x行的缩进
参考文章:

http://www.cnblogs.com/zhangsf/archive/2013/06/13/3134409.html

05-11 15:49