vim使用点滴记录

(重新排版,最早发布于2014-04-08 )

我的.vimrc配置文件:https://github.com/xuzhezhaozhao/my_vimrc/blob/master/_vimrc

1. 基本设置

.vimrc中设置

set nocompatible "使用vim设置,不使用vi设置模式,推荐设置
set cindent "C编程情况下的自动缩进,当输入一个大括号然后回车时,会自动缩进一个tab
set nu "显示行号
set ruler  "设置状态栏标尺
set tabstop=8 "设置一个tab为8个空格大小
set expandtab "space 代替tab输入
set cursorline "高亮当前行
hi CursorLine   cterm=NONE ctermbg=darkred ctermfg=white guibg=darkred guifg=white "高亮颜色设置, 个人不太喜欢, 默认最好
set cursorcolumn "高亮列, 不太习惯, 我没使用
set hlsearch "高亮搜索结果, 输入 :set nohl 取消高亮的搜索结果
set cc=80 "设置标尺,高亮显示第80行
set autochdir "自动设置当前编辑的文件所在路径为工作路径, 用 gvim直接打开文件时有用
set so=3 "光标在上下边界还有3行时就开始自动滚屏
set ignorecase smartcase "搜索时默认不区分大小写,只有搜索关键字中出现一个大字母时才区分大小写
set incsearch  "即时搜索, 边输入边搜索
set showcmd "命令模式时显示输入的命令
syntax on "语法高亮
filetype plugin on "文件类型检查
set backspace=indent,eol,start  "设置backspeac键可以删除字符
set whichwrap=<,>,[,],h,l  "具体查看 :help, 设置左右方向键在行头行尾是否转至上/下一行

" 共享剪贴板, 直接 yank or paste 即可操作系统剪贴板
set clipboard+=unnamed

2. 常用命令

搜索

  • 在单词下按 * 号搜索该单词
  • :nohl 取消高亮的搜索结果
  • :set ignorecase “设置大小写区分
  • :set noignorecase “不区分大小写
  • /string “向下搜
  • ?string “向上搜
  • / “搜索匹配的单词,而不是字符串
  • n 下一个搜索结果
  • N 上一个搜索结果

替换

:[range]s/pattern/string/[c,e,g,i]  也可以用 # 作分隔符, 此时中间出现的 / 不作为分隔符
`range` 指的是范围,1,7 指从第一行至第七行,1,$ 指从第一行至最后一行,也就是整篇文章,也可以 % 代表。 % 是目前编辑的文章,# 是前一次编辑的文章。
`pattern` 就是要被替换掉的字串,可以用 regexp 來表示。
`string` 将 pattern 由 string 所取代。
`c` confirm,每次替换前会询问。
`e` 不显示 error。
`g` globe,不询问,整行替换。
`i` ignore 不分大小写。

全局替换

:%s/pattern/string/g

替换单词

:%s//string/g

大小写替换

`~` 将光标下的字母改变大小写
`3~` 将光标位置开始的3个字母改变其大小写
`g~~` 改变当前行字母的大小写
`U` 将可视模式下选择的字母全改成大写字母
`u` 将可视模式下选择的字母全改成小写
`gUU` 将当前行的字母改成大写
`3gUU` 将从光标开始到下面3行字母改成大写
`guu` 将当前行的字母全改成小写
`gUw` 将光标下的单词改成大写。
`guw` 将光标下的单词改成小写。

vim中大小写转化的命令是gu或者gU, 形象一点的解释就是小u意味着转为小写;大U意味着转为大写, 剩下的就是对这两个命令的限定(限定操作的行,字母,单词)等等.

折叠命令

`zc` 关闭当前打开的折叠
`zo` 打开当前的折叠

`zm` 关闭所有折叠
`zM` 关闭所有折叠及其嵌套的折叠
`zr` 打开所有折叠
`zR` 打开所有折叠及其嵌套的折叠

`zd` 删除当前折叠
`zE` 删除所有折叠

`zj` 移动至下一个折叠
`zk` 移动至上一个折叠

`zn` 禁用折叠
`zN` 启用折叠

其他

:so ~/.vimrc  重新加载vim配置文件
:<C-F> 列出历史命令
"+yy 复制当前行到剪贴板

visual mode 选中正行的情况下, 用 >><< 可以整体移动一个缩进.

3. 代码片段插件:UltiSnips

使用方法: 按官网教程下载tar包安装好, 然后下载default snippets后将其中文件解压出来放在UltiSnips文件夹中. 编辑 UltiSnips文件夹中对应的文件即可编辑每种文件使用的snippets.

4. 插件管理插件:pathogen (淘汰,用 Vundle 替代)

5. 语法检查插件:Syntastic

保存文件后会自动检查语法错误, 并在出错位置给出提出, 很好用.
可以指定编译器和编译参数,参考其官方文档。

6. vim内置命令quickfix

quickfix功能将编译过程中产生的错误信息保存到文件中,然后vim利用这些信息跳转到源文件的对应位置,我们就可以进行错误的修正,之后跳到下一个错误重复上述操作,从而极大地提高编译错误的修改效率。

在vim中除了文本编辑功能外,还可以直接地调用外部的编译器完成程序的编译工作,实现这一功能,只要简单地使用vim命令:

:make

:make命令执行的程序为vim变量makeprg的值,默认makeprg=make,使用Makefile机制进行项目的编译、管理。可以通过set makeprg=xxx的命令修改makeprg的值,从而使make命令执行不同的编译。例如:

:set makeprg=gcc\ hello.c\ -o\ hello

常用的quickfix命令为:

:cc 显示详细错误信息
:cp 跳到上一个错误
:cn 跳到下一个错误
:cl 列出所有错误
:cw 如果有错误列表,则打开quickfix窗口,没有则什么也不错
:copen [num] 打开quickfix窗口,可以在后面添加窗口高度参数
:cclose 关闭quickfix窗口
:col 到前一个旧的错误列表
:cnew 到后一个较新的错误列表

7. 自动补全插件:OmniCppComplete(可用Youcompleteme替代)

需要 Exuberant Ctags的支持. ubuntu 使用如下命令下载:

$ sudo apt-get install exuberant-ctags

使用如下命令生成库函数及变量的tags:

$ cd /usr/include
$ sudo ctags -R --c++-kinds=+p --fields=+iaS --extra=+q

再在.vimrc文件添加如下行:

set nocp
filetype plugin on
set tags+=/usr/include/tags

默认的补全命令为 CTRL X + CTRL O, 可以映射为CTRL F12:

map  :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . "生成tags文件

CTRL + E 取消补全, 返回之前输入的字符状态.
不过对于STL的补全有问题, 可以使用 tags for std c++ 这个插件, 完美实现对STL补全.

8. 添加对STL的补全插件:tags for std c++

结合上面的OOmniCppComplete插件使用。

9. 函数参数自动补全及代码片段插件:code_complete

在.vimrc中更改热键为 CTRL L. 使用 tab作热键会与UltiSnips插件冲突.

let g:CodeCompl_Hotkey=""

本插件也是基于tags的, 先要生成tags, 输入 “函数名+(” 后按 热键 自动补全参数, 使用tab切换参数.
本插件也可以定义代码片段, plugin 文件夹下 .template 文件中可定义代码片段, 也可以在.vim 文件夹下的 templates文件夹建立.cpp文件, 文件名即为代码片段的快捷键,文件内容为代码片段.

10. 自动跳转到定义处

跳转功能的实现也是基于tags的, 生成好tags之后, 在函数名下按 CTRL ] 会自动跳转到函数定义处, 再按 CTRL+O 即可返回跳转前的位置.

11. 超级tab键插件: SuperTab

使用tab键智能补全, 不用一直按ctrl p, ctrl n了. 超赞!

12. 高亮单词插件: Mark

支持正则式的匹配高亮.
常用命令:
- m 用来使得光标处的单词着色
- n 使得原先着色的单词取消着色
- r 输入r后再输入正则表达式,可以高亮匹配的相关单词

参考本篇博客: http://blog.csdn.net/jibing57/article/details/7847834

13. 映射CTRL + S键保存

禁用掉终端CTRL+S快捷键功能
CTRL-S:挂起终端(XON)
CTRL-Q:恢复终端(XOFF)
要禁止这些键盘映射,在~/.bashrc中加入

stty -ixon

然后修改vim中的按键映射,在 ~/.vimrc中加入

nmap <C-S> :update
vmap <C-S> <C-C>:update
imap <C-S> <C-O>:update

14. gvim下字体设置

注意终端vim中无法更改字体, 以下设置针对gvim. 推荐使用这款字体 Consolas + 中文雅黑混合版, 备份下载地址: http://pan.baidu.com/s/1dDGcVLJ, 并在.vimrc中加入如下行:

set guifont=YaHei\ Consolas\ Hybrid\ 12,Fixed\ 12

使用 :set guifont=* 命令可查看字体列表.

15. gvim 中使用pyclewn进行调试

参考: http://easwy.com/blog/archives/advanced-vim-skills-vim-gdb-pyclewn/
pyclewn 下载地址: http://sourceforge.net/projects/pyclewn/
在pyclewn的源码目录中有一个名为INSTALL的文件,介绍了如何在UNIX以及windows上安装pyclewn.
安装完pyclewn后,启动gvim,执行:help pyclewn命令,就可以看到pyclewn的帮助文件,里面有很多有用的信息。
在gvim中使用 :Pyclewn 命令即可启动Pyclewn调试模式.

:Cfile a.out // 加载调试文件
:Cbreak 50 // 设置断点

C命令后面的内容会传递给GDB.
设置好断点之后,就可以开始调试了。pyclewn已经定义了一些调试相关的键映射,我们可以通过下面的命令加载这些键映射:

:Cmapkeys 

执行这条命令后会自动列出所以的键映射.

(gdb) mapkeys
  C-B : break "${fname}":${lnum} # set breakpoint at current line
  C-D : down
  C-E : clear "${fname}":${lnum} # clear breakpoint at current line
  C-N : next
  C-P : print ${text}            # print value of selection at mouse position
  C-U : up
  C-X : print *${text}           # print value referenced by word at mouse position
  C-Z : sigint                   # kill the inferior running program
  S-A : info args
  S-B : info breakpoints
  S-C : continue
  S-F : finish
  S-L : info locals
  S-Q : quit
  S-R : run
  S-S : step
  S-W : where
  S-X : foldvar ${lnum}          # expand/collapse a watched variable

如果觉得pyclewn缺省所设置的键映射不能满足自己的需求,也可以自己定义更多GDB调试键映射,方法是把pyclewn 发行目录中的runtime目录中的.clewn_keys.gdb拷贝到你的HOME目录,然后修改此文件定制自己的键绑定即可。

常用命令:

:Cfile a.out " 加载调试文件
:nbclose " 关闭调试
:set previewheight=8 " 设置调试窗口大小
:Cdbgvar var " 添加变量var监视
:Cdelvar var " 删除变量var监视
:Chelp  " GDB命令帮助
:Cproject  " 保存当前调试设置到一个工程文件中
:C " 列出所有调试命令
:Chelp <C-D> " 列出所有GDB帮助命令
:sb (clewn)_dbgvar “ 新建变量监视窗口

在watch变量时, 有些变量为class, 可以用快捷键 ‘X’ 展开其内容.

:set previewheight=6 " 设置调试窗口大小, 宽度为 8 

16. 源码安装 vim / 更新vim

参考: http://www.vim.org/mercurial.php
更新vim时使用源码安装, 安装参考网址中给出的方法即可,但默认编译没用加入python支持,可以修改src/Makefile文件,将以下行的 注释 “#” 去掉即可。

#CONF_OPT_PYTHON = --enable-pythoninterp

另外还有加入gui的支持, 要不然只是终端vim更新了, gvim没有更新. 请参考 How to build vim with gui option from sources 这个帖子.
最后用 update-alternatives命令更新命令优先级.

补充: 最近google被墙了, 用 hg 下不到vim最新的源码了, 可以用goagent代理, ubuntu下 System settings -> Network -> Network proxy -> Method 选 Manual, http, https proty都填入127.0.0.1, 端口8087, 然后点 Apply system wide.
但现在用hg命令down vim源码还是会有问题, 参考 给mercurial hg设置goagent代理这篇博客修改hg配置文件即可.

17. 显示函数变量名插件:taglist

(对于写C/C++的程序员来说,tagbar更好用些,变量之类的显示的更好)

常用命令:

:TlistToggle "打开taglist窗口, 不跳转 
:TlistOpen "打开taglist窗口,并跳转到taglist窗口
:TlistAddFiles /my/project/dir/*.c "添加taglist的文件 
:TlistAddFilesRecursive /my/project/dir *.c "递归添加文件 
:TlistUpdate "更新taglist,当使用 d 删除一个taglist文件后,使用可命令可重新显示该文件
zc / -  "折叠
zo / + "展开
zR / * "全部展开
zC "全部折叠
x "最大 / 最小 taglist窗口

.vimrc 中设置

let Tlist_Show_One_File=1 "只显示当前文件的taglist
let Tlist_Auto_Open=1 "启动vim时自动打开taglist窗口
let Tlist_Exit_OnlyWindow "当仅有taglist窗口时,退出vim
set updatetime=100 ".vimrc, 根据光标位置自动更新高亮tag的间隔时间,单位为毫秒 
let Tlist_File_Fold_Auto_Close=1 " 自动折叠非当前文件list    

18. tagbar插件:tagbar

在显示变量方面比taglist好,推荐使用。
常用命令:

:TagbarOpen
:TagbarToggle

折叠命令与taglist类似,可以使用vim内置的折叠命令

zR "全展
zM "全折

.vimrc中设置


let g:tagbar_left=1 "使其出现在左边
set updatetime=100 "根据光标位置自动更新高亮tag的间隔时间,单位为毫秒
let g:tagbar_width=25 "设置窗口宽度
" let g:tagbar_compact=1 "不显示顶部帮助信息,节省空间
let g:tagbar_show_linenumbers = 1 "显示绝对行号
let g:tagbar_expand = 1 "自动扩展gui窗口
" autocmd VimEnter * nested :TagbarOpen  "启动vim时自动打开tagbar
autocmd VimEnter * nested :call tagbar#autoopen(1) "若文件类型支持,则自动打开tagbar
autocmd BufEnter * nested :call tagbar#autoopen(0) "打开新标签时,自动打开tagbar

19. 快速注释插件:NERD Commenter

C/C++注释比较方便。

20. 参考vimrc文件

一个大牛的vimrc配置文件,看了一下,学到了很多东西,把其中一些加入到自己的vimrc文件中了。
http://amix.dk/vim/vimrc.html
修改版:http://blog.csdn.net/redguardtoo/article/details/1172136

21. 括号的自动补全和删除

(不用了,可以使用 auto-pairs插件,更方便)

参考:http://oldj.net/article/vim-parenthesis/

自动补全:

" 插入匹配括号
inoremap ( ()<LEFT>
inoremap [ []<LEFT>
inoremap { {}<LEFT>

自动删除:

" 按退格键时判断当前光标前一个字符,如果是左括号,则删除对应的右括号以及括号中间的内容
function! RemovePairs()
    let l:line = getline(".")
    let l:previous_char = l:line[col(".")-1] " 取得当前光标前一个字符

    if index(["(", "[", "{"], l:previous_char) != -1
        let l:original_pos = getpos(".")
        execute "normal %"
        let l:new_pos = getpos(".")

        " 如果没有匹配的右括号
        if l:original_pos == l:new_pos
            execute "normal! a\"
            return
        end

        let l:line2 = getline(".")
        if len(l:line2) == col(".")
            " 如果右括号是当前行最后一个字符
            execute "normal! v%xa"
        else
            " 如果右括号不是当前行最后一个字符
            execute "normal! v%xi"
        end

    else
        execute "normal! a\"
    end
endfunction
" 用退格键删除一个左括号时同时删除对应的右括号
inoremap  :call RemovePairs()a

自动删除(不使用,有时候不方便):

" 输入一个右括号时,如果上一个字符也是右括号,则删除它,避免出现重复字符
function! RemoveNextDoubleChar(char)
    let l:line = getline(".")
    let l:next_char = l:line[col(".")] " 取得当前光标后一个字符

    if a:char == l:next_char
        execute "normal! l"
    else
        execute "normal! i" . a:char . ""
    end
endfunction
inoremap ) :call RemoveNextDoubleChar(')')a
inoremap ] :call RemoveNextDoubleChar(']')a
inoremap } :call RemoveNextDoubleChar('}')a

22. 启动时自动最大化gvim窗口

安装wmctrl:

sudo apt-get install wmctrl

在 ~/.vimrc 中加上:

" 最大化窗口
function Maximize_Window()
  silent !wmctrl -r :ACTIVE: -b add,maximized_vert,maximized_horz
endfunction

在 ~/.bashrc 中加上:

alias gvim='gvim -c "call Maximize_Window()"'

修改 /usr/share/applications/gvim.desktop 文件,将 Exec一栏的内容改为如下:

Exec=gvim -f %F -c "call Maximize_Window()"

23. 一键编译单个源文件

vim中 变量 % 表示 当前文件名。help %< 可以查看更多。
如此只需在vimrc中如下设置:

set makeprg=g++\ -g\ %

"设置F5一键编译:
nmap <F5> :make<CR>
vmap <F5> <C-C>:make<CR>
imap <F5> <C-O>:make<CR>

24. vim抓取光标下的单词,可用于map中

:expand("")

Cscope文档中推荐的映射:

nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>

=是什么意思?赋值语句?是插入某个寄存器值的意思,=是表达式寄存器的意思。所以这句话是在命令行插入expand("")的值,也就是当前光标下的单词。
其实在后再输入就是当前光标下单词的意思,=expand("")应该是等效的。

25. 录制宏

开始录制

:ESC - q a "将宏存储在寄存器a中

停止录制

:q

播放宏

:98@a "重复播放宏98次

26. 提示函数原型插件:echofunc(淘汰)

(会与后面的自动补全插件 YouCompleteme 冲突 ,使得vim完全卡死, 这个问题我搞了一天,最后才发现是因为插件冲突!)

鼠标放在函数名上时显示函数原型,基于tags,输入函数名 + ( 显示函数原型,不爽的是不能跟括号自动补全功能一起用。

27. 使用自带插件netrw远程编辑文件

vim从7.0之后就自带插件netrw了,该插件用了浏览文件,也可以远程编辑文件,非常方便,支持ssh, ftp, http. 由于安全问题,每次保存远程文件都要输入密码,所有可以参考netrw的help文档中的netrw-hack-ssh一块解决每次输入密码的问题,或者看这里Linux下无需输入密码自动登陆ssh服务器方法。编辑方法非常简单:

$ vim scp://[email protected]/

会列出xuzz账号主目录的所有文件。
也可以指定编辑文件:

$ vim scp://[email protected]/test/netrw.test

注意不要用 /home/xuzz 路径前缀,因为前面已经表示了是主机 192.168.0.104 的 /home/xuzz 目录。
当然也可启动vim之后再编辑,如在vim中:

:e scp://[email protected]/test/netrw.test
:tabedit scp://[email protected]/test/netrw.test

跟编辑本地文件是一样的。

28. 文件查找插件:CtrlP

(杀手级插件)

Vim的CtrlP基本完全实现了sublime的功能,可以模糊查询定位:工程下的所有文件,打开的buffer,buffer内的tag,最近访问的文件。通过externsion,甚至可以定位mark,register,cmdline history,yankring。虽然在操作体验上还不如sublime,但是功能上已经超越了师傅,更是拉下fuzzyfinder,lookupfiles这些老一辈Vim插件好几条街。

Note:
- 要新建文件,只需输入文件名,然后按 ctrl - y,支持自动新建目录,非常方便。
- ctrl - b 和 ctrl - f: 切换搜索文件模式,file,buffer, MRU等
- ctrl - z: 标记多个文件
- ctrl - o: 打开标记的文件
- ctrl - t: 在new tab中打开文件
- ctrl - d: 在 path 与 file 匹配模式间切换

29. 自动保存插件:auto save

在.vimrc文件中添加如下行启用该插件:

let g:auto_save = 1  " enable AutoSave on Vim startup

30. 解决中文乱码问题

有时候打开在windows写写的代码时会发现中文有乱码,解决方法也很简单,在.vimrc文件中添加如下行:

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8

31. 插件管理插件:Vundle

(杀手级插件)

也是用来管理插件的插件,但比pathogen好用,支持升级插件,非常方便,强烈建议使用。

32. 语法补全及跳转插件:Youcompleteme

(杀手级插件)

注意:
- 使用这个插件一定不要用 echofunc 这个插件,两个插件有冲突,会使得vim卡死!
- 发现一个很奇怪的问题,在设置启动vim时自动打开 Tagbar 和 Nerdtree 时,自动补全功能有时候会失效!

这个插件应该是vim下最强的代码补全插件了,支持模糊匹配,对于C/C++,可以支持语义补全,就跟VS差不多了,补全效果也确实可以媲美VS + Assist X 了。插件的安装也比较复杂,应该所有vim插件里面最麻烦的了。
安装:
按照作者提供的安装方法,使用quick installation。
安装:

      $ sudo apt-get install build-essential cmake
      $ sudo apt-get install python-dev
      $ cd ~/.vim/bundle/YouCompleteMe
      $ ./install.sh --clang-completer
  • 配置.ycm_extra_conf.py 文件 .

.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/ 目录下有一份作者提供的模板,
在flag里面添加如下内容(系统文件用-isyetem,第三方文件用 -I

'-isystem',  
'/usr/include',  
'-isystem',  
'/usr/include/c++/'

如果要让其对C++标准库补全生效,还要把配置文件中的这几行(从try到pass这4行)注释掉:

      # NOTE: This is just for YouCompleteMe; it's highly likely that your project  
      # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR  
      # ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.  
      try:  
        final_flags.remove( '-stdlib=libc++' )  
      except ValueError:  
        pass  
  • 使其与 UltiSnips 插件兼容
    因为Youcompleteme会占用tab键,使得UltiSnips 代码片段无法使用,可以按这里的办法解决,即在.vimrc中加入3行:
let g:ycm_key_list_select_completion = ['','']
let g:ycm_key_list_previous_completion = ['','']
let g:SuperTabDefaultCompletionType = ''

这样UltiSnips的tab优先级高,就不冲突了。

可以在.vimrc中对插件进行设置,并且支持进行语义的跳转,而不是像基于tags的胡乱跳。

因为YCM默认开启来syntastic功能,即静态预防检查,随着你的输入会刷新gutter,以显示错误或警告的signs。如果你还使用vim-gitgutter插件,则无法正常显示。这时我的做法是,关闭YouCompleteMe的syntastic,独立安装syntastic插件。

let g:ycm_show_diagnostics_ui = 0               " 关闭ycm的syntastic

33. 树形文件浏览插件:NerdTree

以树形目录显示文件,浏览起来很方便。

34. 使得Nerdtree 和 Tagbar 共用左边一个窗口,效果如下:

+-----------+-------------+
| nerd tree | edited file |
| contents  |             |
+-----------+             |
| tagbar    |             |
| contents  |             |
+-----------+-------------+

方法参考了 这里 ,仅加入了修改窗口宽度的语句,使用原方法会使得两个水平窗口一样宽, 在 .vimrc 中加入如下代码:

" =========== NERDTree 和 Tagbar 共用一个窗口 ========

function! ToggleNERDTreeAndTagbar() 
let w:jumpbacktohere = 1

" Detect which plugins are open
if exists('t:NERDTreeBufName')
    let nerdtree_open = bufwinnr(t:NERDTreeBufName) != -1
else
    let nerdtree_open = 0
endif
let tagbar_open = bufwinnr('__Tagbar__') != -1

" Perform the appropriate action
if nerdtree_open && tagbar_open
    NERDTreeClose
    TagbarClose
elseif nerdtree_open
    TagbarOpen
    wincmd J
    wincmd k
    wincmd L
elseif tagbar_open
    NERDTree
    wincmd J
    wincmd k
    wincmd L
else
    NERDTree
    TagbarOpen
    wincmd J
    wincmd k
    wincmd L
endif

" 改变窗口宽度
vertical resize +50 

" Jump back to the original window
" for window in range(1, winnr('$'))
"     execute window . 'wincmd w'
"     if exists('w:jumpbacktohere')
"        unlet w:jumpbacktohere
"        break
"    endif
"endfor  

endfunction

" nnoremap \ :call ToggleNERDTreeAndTagbar()

" 打开 vim 时自动打开 NERDTree 和 Tagbar
autocmd vimenter * call ToggleNERDTreeAndTagbar()

" ===================================================

35. 全局搜索插件:CtrlSF

在工程范围内搜索,跟VS的搜索差不多,后端由 ag 处理,作者是个中国人,很强大。
先要装ag:

$ sudo apt-get install silversearcher-ag

插件可以直接传递参数给 ag 调用,详看 help CtrlSFman ag
.vimrc 配置:

" 按 ctrl-D 开始准备输入
nnoremap  :CtrlSF

" <C-C>查找光标下单词
nmap <C-C> :CtrlSF=expand("")<CR><CR>
" 也可以用 表示光标下单词
" nmap <C-C> :CtrlSF

36. 自动补全括号、引号插件:auto-pairs

对于大括号的自动匹配很智能,只要开启了 smartintent 则回车就可以自动换行,比使用map的好,非常方便。

37. 管理vim工作空间的插件: CtrlSpace

方便管理buffers, tabs

38. 显示不可见字符

:set invlist
:set nolist

39. 配色管理插件: Color-Scheme-Explorer

默认的配色方案有点刺眼, 可以选一个暗色的配色方案. 该可以很方便的预览各种配色方案. 不用一个一个去 :color.
推荐配色: http://www.vim.org/scripts/script.php?script_id=463 这个插件里面有 7 种配色 其中 neon 很不错, 推荐.
我自己对neon做了一些修改, 并加入了补全菜单的配色:
https://github.com/xuzhezhaozhao/my_vimrc/blob/master/neon.vim

40. Doxygen 辅助插件: DoxygenToolkit

Doxygen 是一种用于 C/C++、Java™、Python 和其他编程语言的文档系统. 该插件可以自动生成可以被Doxygen识别的注释风格模板.
安装好了之后, 可以在VIM的配置文件中(/etc/vimrc)为doxygentoolkit这个插件配置一些全局变量:

let g:doxygenToolkit_authorName="your name"
let g:doxygenToolkit_briefTag_funcName="yes"

41. Doxygen 语法高亮插件: DoxyGen Syntax

在.vimrc中加入如下行打开语法高亮:

let g:load_doxygen_syntax=1

42. 可视化操作历史插件: Gundo

vim对undo历史的保存非常完整, 不像一般的编辑器, 是类似 list 的形式保存, vim是用 tree 的形式保存, 但是要完全利用vim这个强大的功能却不容易, 一般用户只会用 u , ctrl - R 来做undo和redo. Gundo插件完美的解决了这个问题, 使用户在 undo history 中畅游, 并且用 diff 的格式显示的每次编辑的差别.

43. 标记程序中待处理位置插件: TaskList

有时候写程序可能有个地方没想好, 但由于某种原因, 可能要先做下面的事, 为了防止忘记, 可以在这处程序位置做个标记, 比如在这个位置标记”XXX”, “TODO”等字符, 这个插件就是将所有标记位置列表显示处理.

:TaskList "显示标记, q 退出. 默认 t 打开TaskList.

44. 在vim中打开终端插件: conqueterm-vim

:ConqueTermSplit bash "在窗口底部打开一个bash shell窗口.

如果要经常在vim和终端切换的话, 那么这个插件是最好的选择, 这个插件可以在vim中打开一个模拟终端, 可以执行shell命令, 并且可以很方便的看到输出结果. 该插件默认映射了三个特殊的键:

 F9: 将visual 模式下选中的内容发送给终端,
 F10: 将当前文件内容发送给终端
 F11: 执行当前文件, 当前文件必须为可执行的文件. 
:h conqueterm 查看帮助. 

45. 格式化代码插件: vim-clang-format

(clang-format](http://clang.llvm.org/docs/ClangFormat.html)是一个格式化代码的工具, 支持多种代码风格. 该插件将其集成在了vim中, 使用起来非常方便. 比clang-format网站提供的用python的方案要好. 代码风格是可以自己配置的, 在工程目录下建一个名为.clang-format的文件, 通过

$ clang-format -style=llvm -dump-config > .clang-format

可以获得一个模板 .clang-format 文件, 根据自己的需求修改即可.
我习惯vs格式代码的快捷键, 所以我这样映射, 格式化全部代码:

map  :ClangFormat

46. XML编辑插件: xml.vim

提供了自动补全标签的功能, 输入 > 后自动补全tag, 再输入一个tag会换行光标停在中间行. 非常方便.

47. Java开发插件: eclim

众所周知, 开发java一般用eclipse, 而eclim项目可以将eclipse的功能集成在你最喜欢的编辑器中, 比如 vim 中. eclim 配合YouCompleteMe 插件使用可以达到非常完美的补全效果.

参考: http://www.yeolar.com/note/2013/07/12/vim-ycm/

48. 头文件切换插件: a.vim

在源文件与相应的头文件间切换. 查看插件的源代码文件, 可以定制插件的很多功能, 包括默认头文件搜索路径, 头文件后缀等等.

:A switches to the header file corresponding to the current file being edited (or vise versa)
:AS splits and switches
:AV vertical splits and switches
:AT new tab and switches
:AN cycles through matches
:IH switches to file under cursor
:IHS splits and switches
:IHV vertical splits and switches
:IHT new tab and switches
:IHN cycles through matches
ih switches to file under cursor
is switches to the alternate file of file under cursor (e.g. on   switches to foo.cpp)
ihn cycles through matches

49. 引号括号匹配插件:Surround

方便删除匹配的括号, 引号, 具体用法查看其github主页.

ds' : 删除光标下匹配的单引号

ds" : 删除匹配的双引号

ds( : 同理

cs"' : 将双引号变成单引号

cs([ : 同理, 小括号变中括号

50. 格式对齐插件: tabular

有一个介绍视频, 主要用来对齐文本.

 :Tabularize /{pattern}

51. markdown 插件: vim-markdown

支持markdown语法高亮. 与chrome插件Markdown Preview Plus一起使用实现实时预览.

52. C family 高亮增强插件: clighter

可以高亮C++里面的class, 而且是基于语法的, 后台是clang, 需要libclang.so.

53. buffer间书签插件: vim-bookmark

vim 自带的书签功能不支持buffer间跳转, 这个插件提供了跨越buffer的书签功能, 非常方便.

54. 高效的vim快捷命令

在知乎上看到这个问题:你最爱的一个 Vim 命令是什么,看了大家的回答,觉得很有意思,下面记录几个我觉得比较有用的。

在任何格式的文本中,想插入一些数据,只需要写一小段代码,然后选中这段代码,执行

 !python

这段代码的执行结果就被插入在了这段代码所在的位置。连删除这段代码的操作都不需要了。

zz "居中

55. 去除Gvim 全屏底部留白

(强迫症…)
全屏下 GVim 的左侧和底部会出现白边,可以在 ~/.gtkrc-2.0 文件中加入一下设置:

style "vimfix" {
    bg[NORMAL] = "#303030"
}
widget "vim-main-window.*GtkForm" style "vimfix"

#303030 是颜色, 根据你自己的 vim 配色修改就好了.

56. %匹配多个字符的跳转插件: matchit.vim

vim 自带的命令 % 可以在匹配的括号间跳转,这个插件可以在多个字符定义的匹配项间跳转

57. 修改 sigh area color

sigh area 就是语法检查时有错误显示 >> 的那一列, 其在color schem 中对应的高亮组是 SighColumn, 如下在配色文件中修改:

highlight SignColumn guibg=bg guifg=NONE

58. 在服务器上使用自己编译的vim (无sudo权限情况下)

由于使用 YouCompleteMe插件 需要的 vim 版本较高, 而服务器上的 vim 版本无法满足要求, 于是在将在本机编译好的 vim (服务器缺少依赖编译不了) 文件夹上传到服务器中, 这时候直接运行编译好的 vim 二进制文件会提示错误:

Error detected while processing /home/xuzz/.vimrc:
line  126:
E484: Can't open file /usr/local/share/vim/syntax/syntax.vim

原因是 vim的 $VIM$VIMRUNTIME 两个环境变量的设置, 解决方法如下:

  1. 在本机打开 vim, 执行 :echo $VIM 和 :echo $VIMRUNTIME 命令获得两个环境变量内容, 如我的是 /usr/local/share/vim 和 /usr/local/share/vim/vim74, 然后将 /usr/local/share/vim 文件夹拷贝到服务器上.

  2. 在 服务器的 .vimrc 中设置 $VIM 和 $VIMRUNTIME, 在 .vimrc 中添加如下行 (把相应地址改成你自己的地址)

let $VIM = "/home/xuzz/usr/local/share/vim"
let $VIMRUNTIME = "/home/xuzz/usr/local/share/vim/vim74"

之后还可能会遇到很多问题, 我把我遇到的问题及解决办法总结如下:

1) 还有可能会无法启动 vim, 因为编译的时候可能开启了额外的功能, 可能会提示缺少动态库, 这个时候可以在 .bashrc 中添加一行设置加载动态库的路径

export LD_LIBRARY_PATH=/home/xuzz/lib/:$LD_LIBRARY_PATH

这样把需要的动态库放到对应路径中就可以了.

2) vim 使用 YCM 还需要有 /usr/lib/x86_64-linux-gnu/libstdc++.so.6, 把这个库拷贝到上面指定的 lib 文件夹中就可以了.

3) 若启动 vim -g 出现 “E121: Undefined variable: paste#paste_cmd” 这个错误, 则需要把 $VIMRUNTIME/autoload/paste.vim 拷贝到 .vim/autoload 中.

4) 还可能遇到语法高亮失效的情况, 执行 “:syntax on” 时出现

Error detected while processing /usr/share/vim/vim64/syntax/syntax.vim:
line 42:
E216: No such group or event: filetypedetect BufRead

原因是 rumtimepath 设置问题, 这里给出了个办法, 在 .vimrc 中加入一行

runtimepath=~/.vim,/etc/vim,/usr/share/vim/vimfiles,/usr/share/vim/addons,/usr/share/vim/vim74,/usr/share/vim/vimfiles,/usr/share/vim/addons/after,~/.vim/after

59. 仿sublime多选编辑插件:vim-multiple-cursors

类型 sublime 里面的多选编辑功能, 非常不错.

60. 自动生成项目tags插件:vim-tags

自动在 project 根目录生成 tags. 用 tags 结合 youcompleteme 作跳转工具还是非常强大的(youcompleteme 有时只能跳到声明, tags 可以跳到定义).

61. 每次都在同一个 vim 窗口打开新标签编辑文件

在.bashrc中设置

alias gvim='gvim --servername local_vim --remote-tab-silent 2>/dev/null'

62. 自动删除多余行尾的多余空格

将下面的内容写入 .vimrc, 作者是 Vigil

" Remove trailing whitespace when writing a buffer, but not for diff files.
" From: Vigil rainslide.net>
function RemoveTrailingWhitespace()
    if &ft != "diff"
        let b:curcol = col(".")
        let b:curline = line(".")
        silent! %s/\s\+$//
        silent! %s/\(\s*\n\)\+\%$//
        call cursor(b:curline, b:curcol)
    endif
endfunction
autocmd BufWritePre * call RemoveTrailingWhitespace()

63. 代码风格格式化工具 vim-autoformat

================================================================
参考:
http://my.oschina.net/shelllife/blog/109919
http://hi.baidu.com/gpstrive/item/f0f2ca0a24fd8e91a3df439b
http://blog.csdn.net/honpey/article/details/9225311
http://blog.sina.com.cn/s/blog_60a38c850101lp3u.html
http://blog.csdn.net/jibing57/article/details/7847834
http://www.iplaysoft.com/top10-programming-fonts.html
http://www.2maomao.com/blog/vim-7-pack-configured/
http://easwy.com/blog/archives/advanced-vim-skills-vim-gdb-pyclewn/
http://www.vim.org/mercurial.php
http://297020555.blog.51cto.com/1396304/683908
http://amix.dk/vim/vimrc.html
http://blog.csdn.net/redguardtoo/article/details/1172136
http://oldj.net/article/vim-parenthesis/
http://uniharmony.blog.163.com/blog/static/4617437620087310345373/
http://zhidao.baidu.com/link?url=xAq7zwSmSUP0Et0FkvwX0zdQ7Zt-HwsdiCgcX6xWiZEueqkr_S9TA2XGXv8M-Ape6u1M6zVVcqlc4M0W-xVRya
http://www.thegeekstuff.com/2009/01/vi-and-vim-macro-tutorial-how-to-record-and-play/
http://zuyunfei.com/2013/08/26/vim-plugin-ctrlp/
http://blog.csdn.net/leaf5022/article/details/21290509
http://www.cnblogs.com/zhongcq/p/3630047.html
http://blog.csdn.net/leaf5022/article/details/21290509
http://unix.stackexchange.com/questions/92942/gvim-nerdtree-and-tagbar-above-each-other-left-to-edited-file
http://www.sontek.net/blog/#id1

你可能感兴趣的:(VIM)