根据 Bram 前后几个关于高效使用 Vim的视频,大家每天需要花很多时间来编辑:代码、文档、邮件、日志 等等,除去这些外,还要分时间参加会议和人沟通,每个人的时间却都是不够的,优雅使用 Vim 无外乎:
- 检测不高效的地方:你的整个工作流里,什么地方比较浪费时间?
- 寻找一个更快的方式:官方文档,学习他人经验,自己编写 VimScript
- 使它习惯化:开始使用,并且不断完善
以上三点反复循环,能让你的 Vim 越来越顺手。所以重点是根据自己的工作流不断迭代。而不是象大部分教程那样教你安装一大堆插件。插件都是别人写的为了解决通用需求而提炼的东西,和每个人的具体需求都有差别。上面这三点我屡试不爽,随着时间增长,有种越来越顺手的感觉,举几个我具体碰到的例子:
问题1:边开发边参考网上解决方案的问题
比如碰到问题搜到一段代码,需要试一下,一会又看会 Chrome ,一会又切回 GVim 里去写代码,反复 ALT_TAB,有时候中间使用了一下资源管理器或者其他程序,ALT_TAB 的顺序就会被打乱,你一切换就切跑了,十分低效。
于是我用 VimScript + 内嵌 Python 写了一个功能,按快捷键可以让 GVim 在透明/不透明两种状态间自由切换:
就是 VimScript 简单封装一个函数,里面用内嵌 Python 找到 GVim 的顶层 HWND,并设置透明度。平时默认不透明,需要参考其他资料时切换成透明,参考完了又快捷键切换回来,感觉比缘来切来切去顺畅很多。
问题2:浏览文档时的窗口滚动问题
比如你在抄写或者改写一段代码,窗口分为左右两个,左边是你引用参考的源代码,右边是你正在编辑的源代码。你抄着抄着,抄到左边最后一行了,或者你想前后看看正在引用的文本,你就需要将焦点从右边切换到左边,滚动,再切换交点回来,十分麻烦,于是撸一小段 VimScript 来解决这个问题:
" 0:up, 1:down, 2:pgup, 3:pgdown, 4:top, 5:bottom
function! Tools_PreviousCursor(mode)
if winnr('$') <= 1
return
endif
noautocmd silent! wincmd p
if a:mode == 0
exec "normal! \<c-y>"
elseif a:mode == 1
exec "normal! \<c-e>"
elseif a:mode == 2
exec "normal! ".winheight('.')."\<c-y>"
elseif a:mode == 3
exec "normal! ".winheight('.')."\<c-e>"
elseif a:mode == 4
normal! gg
elseif a:mode == 5
normal! G
elseif a:mode == 6
exec "normal! \<c-u>"
elseif a:mode == 7
exec "normal! \<c-d>"
elseif a:mode == 8
exec "normal! k"
elseif a:mode == 9
exec "normal! j"
endif
noautocmd silent! wincmd p
endfunc
把这个函数绑定到 ALT_U, ALT_D 两个按键上,你正在编辑着当前文档时,不用退出 INSERT 模式,更不用切换窗口交点,直接 ALT_U, ALT_D,就可以上下滚动正在参考的文档内容了,有了这个改进后,我的工作又高效了那么一点点。
同理,Quickfix 窗口经常用来查看编译错误,或者 Grep 结果,我也写了一个专门针对 Quickfix 窗口的滚屏函数,不用切焦点随时浏览 Quickfix 内容。