vim 使用点滴记录(转到Markdown版本更新)


(不再更新,最新版本为 http://blog.csdn.net/xzz_hust/article/details/72731307


重新要在linux下学习了,很久没折腾vim了,以前的一些技巧都基本忘了,现在重新学习,一点点折腾,把过程记录下来.打造属于自己的vim. 条目按学习的时间顺序排序.

用了几天终端下的vim, 今天(140412)发现gvim更漂亮而且更好用, 特别是换了 Consolas字体之后, 跟在windows下用vs编程的字体一样了, 瞬间感觉熟悉了好多, 继续折腾!

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


1. 基本设置

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, 设置左右方向键在行头行尾是否转至上/下一行


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 所取代。
cconfirm,每次替换前会询问。
e不显示 error。
gglobe,不询问,整行替换。
iignore 不分大小写。

全局替换

:%s/pattern/string/g

替换单词

:%s/\<word\>/string/g


  • 大小写替换

~          将光标下的字母改变大小写

3~         将光标位置开始的3个字母改变其大小写

g~~        改变当前行字母的大小写

U          将可视模式下选择的字母全改成大写字母

u          将可视模式下选择的字母全改成小写

gUU        将当前行的字母改成大写

3gUU       将从光标开始到下面3行字母改成大写

guu       将当前行的字母全改成小写

gUw       将光标下的单词改成大写。

guw       将光标下的单词改成小写。

vim中大小写转化的命令是

gu或者gU

形象一点的解释就是小u意味着转为小写;大U意味着转为大写.

剩下的就是对这两个命令的限定(限定操作的行,字母,单词)等等

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

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

  • 折叠命令
zc 关闭当前打开的折叠
zo 打开当前的折叠


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


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


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


zn 禁用折叠
zN 启用折叠


3. 代码片段的插件: UltiSnips

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


4. 插件管理插件: pathogen (不用了,使用后面介绍的Vundle插件)

管理插件的插件. 安装其它插件时很方便.


5. 语法检查插件: Syntastic

:w 保存文件后会自动检查语法错误, 并在出错位置给出提出, 很好用.


6. quickfix 内置命令的使用方法

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

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

1 :make

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

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

查看在线帮助,通过命令:

1 :help quickfix

常用的quickfix命令为:

1 :cc     显示详细错误信息
2 :cp     跳到上一个错误
3 :cn     跳到下一个错误
4 :cl     列出所有错误
5 :cw     如果有错误列表,则打开quickfix窗口,没有则什么也不错
6 :copen 打开quickfix窗口,可以在后面添加窗口高度参数,如10行: :copen 10
7 :cclose 关闭quickfix窗口
8 :col     到前一个旧的错误列表
9 :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 tags+=/usr/include/tags

set nocp
filetype plugin on

默认的补全命令为 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++

第7条已经提到了.


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

文档中的<Leader>m  表示 \m.

支持正则式的匹配高亮.

常用命令:

\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 插件:taglist(写C/C++下面的tagbar更好用些,变量之类的显示的更好)

常用命令:

:help taglist.txt
:TlistToggle “ 打开taglist窗口, 不跳转 :TlistOpen " 打开taglist窗口,并跳转到taglist窗口 let Tlist_Auto_Open=1 " .vimrc, 启动vim时自动打开taglist窗口let Tlist_Exit_OnlyWindow " .vimrc, 当仅有taglist窗口时,退出vim
set updatetime=100 " .vimrc, 根据光标位置自动更新高亮tag的间隔时间,单位为毫秒 
:TlistAddFiles /my/project/dir/*.c ” 添加taglist的文件 
:TlistAddFilesRecursive /my/project/dir *.c" 递归添加文件 
let Tlist_Show_One_File=1 " 只显示当前文件的taglist
:TlistUpdate " 更新taglist,当使用 d 删除一个taglist文件后,使用可命令可重新显示该文件
zc / -  " 折叠
zo / + “ 展开
zR / * " 全部展开
zC " 全部折叠
x " 最大 / 最小 taglist窗口
let Tlist_File_Fold_Auto_Close=1 " 自动折叠非当前文件list	


18. tagbar插件:tagbar

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

常用命令:

:TagbarOpen
:TagbarToggle
折叠命令与taglist类似,可以使用vim内置的折叠命令
zR " 全展
zM " 全折

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

:help NERD_commenter.txt

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窗口

具体过程如下:
1. 安装wmctrl:
sudo apt-get install wmctrl


2. 在 ~/.vimrc 中加上:
" 最大化窗口
function Maximize_Window()
  silent !wmctrl -r :ACTIVE: -b add,maximized_vert,maximized_horz
endfunction


3. 在 ~/.bashrc 中加上:
alias gvim='gvim -c "call Maximize_Window()"'


4. 修改 /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 表示将宏存储在寄存器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: 

1. 要新建文件,只需输入文件名,然后按 ctrl - y,支持自动新建目录,非常方便。

2. ctrl - b 和 ctrl - f: 切换搜索文件模式,file,buffer, MRU等

3. ctrl - z: 标记多个文件

4. ctrl - o: 打开标记的文件

5. ctrl - t: 在new tab中打开文件

6. 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

注意:

1. 使用这个插件一定不要用 echofunc 这个插件,两个插件有冲突,会使得vim卡死!

2. 发现一个很奇怪的问题,在设置启动vim时自动打开 Tagbar 和 Nerdtree 时,自动补全功能有时候会失效!


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

安装:

按照作者提供的安装方法,使用quick installation。

1. 先用Vundle安装Youcompleteme

2. 执行下面的命令

sudo apt-get install build-essential cmake
sudo apt-get install python-dev
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer
3. 配置.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  


4. 使其与 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 CtrlSF 和 man 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. Rivision History: 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是一个格式化代码的工具, 支持多种代码风格. 该插件将其集成在了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 配合 YCM 插件使用可以达到非常完美的补全效果.


  1. 安装Eclim来处理java。下载 Eclim ,安装Eclim要求首先安装最新的Eclipse.

  2. 在.vimrc中增加一些配置。

    let g:EclimCompletionMethod = 'omnifunc'


对于类C语言和Python,YCM可以直接使用,对于Java,需要先启动Eclim。

下面主要说说用Eclim+YCM开发Java工程的方式。

  1. 首先启动Eclim服务,执行 /Users/yeolar/.eclipse/org.eclipse.platform_4.2.0_119745494/eclimd 。

    为了方便,可以在~/.bash_profile中添加别名:

    alias eclimd='/Users/yeolar/.eclipse/org.eclipse.platform_4.2.0_119745494/eclimd 2>&1 1>/dev/null &'
    
  2. 可以验证一下Eclim的安装:

    :PingEclim       " 服务是否正常
    :EclimValidate   " 验证vim配置有效
    
  3. 创建Java工程:

    :ProjectCreate /path/to/project -n java
    

    创建工程会自动创建.classpath、.project文件和src目录。可以使用 :ProjectList 查看工程列表。

    添加工程的源代码路径可以在.classpath文件中使用 :NewSrcEntry path/to/new/src 完成。默认在工程创建时已经添加了src目录。

  4. 编写代码。正常编写即可,因为已经在YCM中添加了Eclim的相关配置,所以自动完成功能已经和YCM的一致。更多用法可以参考 http://eclim.org/vim/java/index.html 。



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. Productive shotcuts

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

  • 在任何格式的文本中,想插入一些数据,只需要写一小段代码,然后选中这段代码,执行
!python
Tada! 这段代码的执行结果就被插入在了这段代码所在的位置。连删除这段代码的操作都不需要了。

  • zz 居中

55. 去除Gvim 全屏底部留白

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

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

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


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



57. 修改 sigh area color

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

highlight SignColumn guibg=bg guifg=NONE


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

由于使用 YCM 需要的 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. vim-multiple-cursors

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


60. vim-tags

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


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


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()



================================================================

参考: 

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值