Vim编辑器的使用在非windows系统上非常广泛,这个不多说。在windows中有像vs这样强大功能的代码编辑环境让使用vim在windows上写代码的coder就非常少。使用vim这种编辑文本方式和体验与传统方式有很大的不同,熟练之后编辑代码更有效率也是一种享受。如果能在vs上使用vim的编辑功能,将vs和vim优势结合起来会提升更多效率。
在vs2010之前比如vs2005和vs2008可以使用viemu这个收费插件,在用vs2005开发时我一直使用的是viemu。当开发环境换到vs2010后我又了解到有一个免费并且强大的vim插件 vsvim。
下载地址:
http://visualstudiogallery.msdn.microsoft.com/59ca71b3-a4a3-46ca-8fe1-0e90e3f79329
vsvim安装到vs2010后可以使用绝大部分原生vim的编辑功能,包括宏录制,也可以通过配置设置键盘映射,关于支持的编辑功能等可以参考上面链接去查看相关文档。
Vim通过使用前置键来扩展键盘映射,vsvim也支持前置键来做vim键盘命令扩展。Vsvim的好处是跟vs2010的功能结合起来,通过键盘映射可以直接通过命令来调用vs的功能。
最简单的比如保存文件,在vsvim的配置文件中加上:
nmap <Leader>w :w<CR>
当用vim模式编辑好代码文件时,(我使用分号做为Leader键盘)在normal模式下直接键入 ;w 就可以保存文件,非常方便和快速,这个比使用ctrl+s要优雅得多。
还有例如关闭文件等:
nmap <Leader>q :q<CR>
以上列出的功能原生vim本身也同样支持。在vs中这个功能得到扩展,例如我还可以通过命令启动编译,启动调试这样的功能。
在vsvim的配置文件中添加:
nmap <Leader>vb :vscBuild.BuildOnlyProject<CR>
nmap <Leader>vc :vscBuild.Compile<CR>
以上命令是在normal下直接键入 ;vb(分号+vb字母)就可以调用编译生成命令,
直接键入 ;vc 可以启动编译
在上面的配置中以 :vsc 开头的命令可以调用vs键盘方案中设置的功能,在vs的tool->environment->KeyBoard中:
Vs这个选项也是非常强大的,几乎把所以在vs上可视化操作都列在表里,包括vs和其插件的各种功能,并且可以自定义各种键盘快捷键。这个功能被vsvim插件应用到,并且可以很自由的通过上面那种:vsc 的格式通过vsvim的键盘命令来调用。
例如我们常用的va插件的功能,在键盘快捷键列表中也能找到:
这个是va插件常用的在导航栏列出(搜索)函数的功能,正常情况操作一般是用鼠标去点导航栏的下拉列表或用鼠标激活列表编辑窗口再输入关键来过滤函数列表,使用以下添加到配置文件中的命令:
nmap <Leader>l :vscVAssistX.ListMethodsInCurrentFile<CR>
即在 normal下直接键入 ;l 就可以直接列出函数列表并激活函数列表过江编辑框,这个比使用鼠标操作就要流畅得多。
从以上演示看出,只要在vs键盘列表中能找到的各种操作的键盘方案,都可以映射成vsvim的命令,对于在windows上使用vim插件如虎添翼。
以下是我常用的一些vsvim配置(_vsvimrc):
let mapleader = ";"
" 定义快捷键到行首和行尾
nmap <Leader>v <C-Q>
" 定义快捷键保存当前窗口内容
nmap <Leader>w :w<CR>
imap <Leader>w<ESC>:w<CR>
nmap <Leader>q :q<CR>
imap <Leader>d <ESC>
vmap <Leader>d <ESC>
nmap <Leader>d <ESC>
nmap <Leader>s zz
vmap <Leader>s zz
imap <Leader>s<ESC>zz<Insert><Right>
set vsvim_useeditordefaults
set backspace=indent,eol,start
nmap <C-O> :vscView.NavigateBackward<CR>
nmap <C-I> :vscView.NavigateForward<CR>
"nmap <C-]> :vscEdit.GoToDefinition<CR>
nmap <C-]> :vscVAssistX.GotoImplementation<CR>
imap <C-]> :vscVAssistX.GotoImplementation<CR>
nmap <Leader>t :vscVAssistX.GotoImplementation<CR>
imap <Leader>t :vscVAssistX.GotoImplementation<CR>
nmap <Leader>t :vscVAssistX.GotoImplementation<CR>
imap <Leader>t :vscVAssistX.GotoImplementation<CR>
map<Space> 5j
map<S-Space> 5k
map<S-Enter> -
map<Leader><Enter> ^
nmap<Leader>y yiw
nmap<Leader>p diw<ESC>"0P
set so=3
set hi
set hls
nmap<Leader>xh :noh<CR>
nmap <Leader>vb :vscBuild.BuildOnlyProject<CR>
nmap <Leader>vc :vscBuild.Compile<CR>
nmap <Leader>vf :vscEdit.FindinFiles<CR>
nmap <Leader>vr :vscEdit.ReplaceinFiles<CR>
nmap <Leader>vp :vscFile.OpenContainingFolder<CR>
nmap <Leader>vws :vscWindow.NewVerticalTabGroup<CR>
nmap <Leader>vwh :vsc Window.NewHorizontalTabGroup<CR>
nmap <Leader>l :vscVAssistX.ListMethodsInCurrentFile<CR>
nmap <Leader>o :vscVAssistX.OpenFileInSolutionDialog<CR>
imap <Leader>l <ESC>:vscVAssistX.ListMethodsInCurrentFile<CR>
imap <Leader>o <ESC>:vscVAssistX.OpenFileInSolutionDialog<CR>
nmap <Leader>a :vscVAssistX.OpenCorrespondingFile<CR>
imap <Leader>a :vscVAssistX.OpenCorrespondingFile<CR>
" 使用 va 查找符号
nmap <Leader>vs :vscVAssistX.FindSymbolDialog<CR>
" ve 查找所有引用位置
nmap <Leader>ve :vscVAssistX.FindReferences<CR>