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 “向上搜
  • /<word\> “搜索匹配的单词,而不是字符串
  • 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/<word>/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 <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR> "生成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="<C-L>"

本插件也是基于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<CR>
vmap <C-S> <C-C>:update<CR>
imap <C-S> <C-O>:update<CR>

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<C-D> " 列出所有调试命令
: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\<BS>"
            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\<BS>"
    end
endfunction
" 用退格键删除一个左括号时同时删除对应的右括号
inoremap <BS> <ESC>:call RemovePairs()<CR>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 ) <ESC>:call RemoveNextDoubleChar(')')<CR>a
inoremap ] <ESC>:call RemoveNextDoubleChar(']')<CR>a
inoremap } <ESC>:call RemoveNextDoubleChar('}')<CR>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("<cword>")

Cscope文档中推荐的映射:

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

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

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://xuzz@192.168.0.104/

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

$ vim scp://xuzz@192.168.0.104/test/netrw.test

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

:e scp://xuzz@192.168.0.104/test/netrw.test
:tabedit scp://xuzz@192.168.0.104/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 = ['<C-TAB>','<Down>']
let g:ycm_key_list_previous_completion = ['<C-S-TAB>','<Up>']
let g:SuperTabDefaultCompletionType = '<C-Tab>'

这样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 <leader>\ :call ToggleNERDTreeAndTagbar()<CR>

" 打开 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 <C-D> :CtrlSF<space>

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

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 退出. 默认 <leader>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 <c-a><c-k><c-f> :ClangFormat<cr>

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
<Leader>ih switches to file under cursor
<Leader>is switches to the alternate file of file under cursor (e.g. on  <foo.h> switches to foo.cpp)
<Leader>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 <vim5632@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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值