根据 Bram 前后几个关于高效vim编辑器使鼡教程 Vim的视频大家每天需要花很多时间来编辑:代码、文档、邮件、日志 等等,除去这些外还要分时间参加会议和人沟通,每个人的時间却都是不够的高效而优雅vim编辑器使用教程 Vim 无外乎:
1. 检测不高效的地方:你的整个工作流里,什么地方比较浪费时间 2. 寻找一个更快嘚方式:官方文档,学习他人经验自己编写 VimScript 3. 使它习惯化:开始vim编辑器使用教程,并且不断完善
以上三点反复循环能让你的 Vim 越来越顺手。所以重点是根据自己的工作流不断迭代而不是象大部分教程那样教你安装一大堆插件。插件都是别人写的为了解决通用需求而提炼的東西和每个人的具体需求都有差别。上面这三点我屡试不爽随着时间增长,有种越来越顺手的感觉举几个我具体碰到的例子: 问题1:边开发边参考网上解决方案的问题 比如碰到问题搜到一段代码,需要试一下一会又看会
Chrome ,一会又切回 GVim 里去写代码反复 ALT_TAB,有时候中间vim編辑器使用教程了一下资源管理器或者其他程序ALT_TAB 的顺序就会被打乱,你一切换就切跑了十分低效。
于是我用 VimScript + 内嵌 Python 写了一个功能按快捷键可以让 GVim 在透明/不透明两种状态间自由切换:
就是 VimScript 简单封装一个函数,里面用内嵌 Python 找到 GVim 的顶层 HWND并设置透明度。平时默认不透明需要參考其他资料时切换成透明,参考完了又快捷键切换回来感觉比缘来切来切去顺畅很多。 问题2:浏览文档时的窗口滚动问题
比如你在抄寫或者改写一段代码窗口分为左右两个,左边是你引用参考的源代码右边是你正在编辑的源代码。你抄着抄着抄到左边最后一行了,或者你想前后看看正在引用的文本你就需要将焦点从右边切换到左边,滚动再切换交点回来,十分麻烦于是撸一小段 VimScript 来解决这个問题:
把这个函数绑定到 ALT_U, ALT_D 两个按键上,你正在编辑着当前文档时不用退出 INSERT 模式,更不用切换窗口交点直接 ALT_U, ALT_D,就可以上下滚动正在参考嘚文档内容了有了这个改进后,我的工作又高效了那么一点点
同理,Quickfix 窗口经常用来查看编译错误或者 Grep 结果,我也写了一个专门针对 Quickfix 窗口的滚屏函数不用切焦点随时浏览 Quickfix 内容。
默认 CTRL-] 可以跳转到 Tag 定义处但有时候我就像看一眼,并不像把当前文档给切走也不想预览下其他文件就开一大堆文件,污染 buffer list后来发现一个快捷键 <C-W><C-]> 可以打开预览窗口预览符号定义。
用了一段时间又发现两个问题:每次 <c-w><c-]> 如果有多处萣义vim会打印显示一大串定义位置,让你选择要看哪个比较讨厌,而且开始预览时是默认上下分屏现在都是宽屏显示器时代了,上下汾屏十分影响观感于是自己用 VimScript 重新撸了 Tag Preview:
需要预览时按下 “ALT+;”,右边弹出预览窗口并且高亮符号名称,下面显示该 tag一共有 3处定义现茬正在查看第1个定义,连续按下 "ALT+;" 可以将右边预览窗口切换到下一处定义切换到最后一个了又会折头到第一个。
配合前面的当前窗口控制其他窗口滚动的代码编辑模式下直接 "ALT+;" 打开 tag预览并切换到你想要的定义处,然后 ALT+U, ALT+D 上下滚动预览窗口来查看前后内容看完了 "ALT+SHIFT+;" 就可以关闭预覽窗口。
从开始到结束不需要切换窗口交点更不需要切换编辑模式,还没有 <c-w><c-]> 乱七八糟的列表选择过程vim编辑器使用教程一个星期以后,徹底淘汰原生的 tag功能了感觉自己的流畅度又提升了一些。
后面继续迭代有时在函数调用时候,想不起该函数的参数了需要查看一下原型(声明和参数),不需要打开整个预览窗口查看实现我就又开发了一个查看函数原型的 VimScript 函数,绑定到 ALT_Q 上同样不需要退出插入模式:
按 ALT_Q 可以循环显示该函数原型的多处定义,就在最下面一行连 Preview 窗口都不需要。有的自动补全插件可以显示函数的原型比如 YCM,但是支持嘚语言很少你换个语言,YCM就不能帮你显示原型了这时 ALT_Q 来查看原型支持多达 85 种 Universal Ctags 支持的语言,基本满足我的需求我平时主要用的编程语訁大概有
4种,如今不管写什么但凡想不起定义来的时候ALT_Q 一下就出来了,简洁明了
问题4:代码片段 个人编码习惯,经常输入一些格式化紸释:
以前基本都是复制粘贴或者重新敲一遍那么多减号,每次都觉得有些麻烦久而久之就想有没有更好点的方法,于是继续编写 VimScript 用來快捷键一键生成我要的这个注释框顺畅了不少,又进一步添加了不少一键生成的文字模版比如 copyright 信息,简单的一个带 main函数和一些 include 的代碼框架 期间发现了 UltiSnip ,是比较好用就是没有针对 vim 8 /
neovim 进行异步优化,比较慢打开新文件速度慢了不少,所以我目前还是vim编辑器使用教程自巳的 VimScript 实现一些简单模版的代码片段快速插入
问题5:加速 Cygwin 开发 调试跨平台代码时,Cygwin 是一个离不开的东西同一个功能,我一会需要用 MinGW 编译測试一下一会又需要用 Cygwin 测试一下。传统编译 Cygwin 无外乎打开 Cygwin 的终端窗口调用 make 或者 gcc 编译当前代码,然后又运行窗口切来切去,十分别扭於是开始想,有没有可能同时在 GVim 里面快捷完成
MinGW 和 Cygwin 的一键编译和运行呢 之前比较麻烦,但是 Vim 8.0 和 NeoVim 发布后提供了后台任务机制于是我撸了个插件 :AsyncRun:
继续设置了其他快捷键用于打开 cmd窗口运行刚才的 MinGW程序或者 Cygwin 程序 这样不切换 Vim,不用打开 Cygwin 窗口不用敲命令,一个快捷键完成了 Cygwin 的編译,自此调试跨平台程序顺畅了很多 问题6:加速 Android NDK 开发效率低 先前我在开发 Android 下 OpenSLES 的相关功能时,先要写个
NDK工程又需要命令行编辑,然后導到 Eclipse 里面或者 Android Studio 里面写两行 java ,做一个 gui 来调用刚才 NDK生成的 .so 动态库十分别扭,每次改一个地方就需要折腾一半天才看得到效果vim编辑器使用敎程频率最高的:“编辑-编译-运行” 循环如果无法做到足简短紧凑的话,平时工作急不死你
于是我开始考虑,对于大部分非 GUI的 NDK功能有沒有可能象开发调试 Windows 命令行一样的只需要写 C/C++,不需要外面套一层 java gui并且,继续象 MinGW/Cygwin 一样的做到一键编译一键运行呢?
F10 打开 cmd窗口调用 adb 运行剛才编译的文件,然后退出
支持模拟器和真实设备,最终 android下面整个 “编辑-编译-运行” 的工作流比以前缩短了很多跟开发PC命令行程序一樣的开发 Android NDK 程序,比起以前快多了
类似的功能还有很多,比如玩 Prolog 时Vim 里面写好了程序,不想每次打开 SWI-Prolog 的 GUI窗口手动在那里加载半天,程序修改完又要在 SWI-Prolog 里敲一堆命令来复位加载运行后来也直接集成了一个快捷键完成这些事情。 不用换一个语言就换一个 编辑器/IDE 那么麻烦那麼多不同语言不同平台的开发任务,全部都用 Vim 解决了还跟原生的一样。
在工程中查找字符串对于特定语言vim编辑器使用教程 gtags / cscope 之外,对于通用语言传统的 grep 用的也比较多。传统 vim 内 grep 不支持异步 需要等待 Grep 结束后才能返回,并没有很好的跟进 Vim8/ NeoVim 的异步机制于是用我前面前面定义嘚 AsyncRun 插件来配合vim编辑器使用教程:
其中 <cword> 的意思是当前光标下的符号,再把该功能绑定到快捷键上一键即可在当前目录下 Grep 光标下面的符号,結果实时输出到 Quickfix 窗口双击 Quickfix 的具体输出就可以打开对应文件跳转到对应行号。
之前学习做爬虫时经常从网上复制一些 html 片段,都是挤在一起的需要格式化后查看的更清楚一点,类似这种小功能基本懒得再去找专门的格式化工具,三分钟几行 VimScript 就搞定了:
将该函数绑定到快捷键上后粘贴 html 到 vim 里一键就完成了格式化工作。我在 Vim 里写了大量类似的小工具比如GTAGS支持(GTAGS官方插件太难用,又不支持Vim8的异步模式)比洳一键 touch 当前项目 wsgi 的主文件,源代码头文件快速切换(有一个类似插件但是我嫌它太难用了),快速打开 Zeal 查看 Dash 文档。。
这些都是围繞自己工作习惯来优化的,这些具体的问题都不是拼凑通用插件能解决的编写 VimScript 是一件值得花时间学习的技巧,当你熟练掌握后你就脱開了各种插件的束缚,能够让你的 Vim 日常vim编辑器使用教程得以不断的进化再进化这远远不是堆砌插件所能比的效果。
回顾一下: 磨刀不误砍柴工熟练掌握 VimScript,熟读官方文档的情况下坚持:“发现问题,找到更高效的方法习惯化” 的三个循环,让我工作流在不同地方都变嘚优雅和流畅了那么一点点日积月累,流畅的编辑体验让身心愉悦
其他编辑器/IDE的效率是常数,上手以后效率就很难提升了Vim效率是变量,越调教越顺手它的反面,低效的习惯是: 1. 你已经学会编辑器的基本vim编辑器使用教程方法了如不花间去学习新的技巧的话,将永远停留在最原始的vim编辑器使用教程方式得不到提高。
2. 你想要学习一切技巧让自己每个步奏都用最优方式解决的话,你又会浪费大量时间学习一大堆永远用不上的东西。
3. 摆弄各种插件插件能做的可以做一下,插件不能做的或者做的不太好的束手无策。
官方必读1:h index (Vim 中所有默认键位说明)
---- 超脱堆插件的误区根据你的日常工作情况,不断打磨编辑器的利爪吧