目录
vim 拥有高度灵活的脚本体系。脚本体系包括众多基础指令和各种控制结构,合理组合使用可以极大的延拓 vim 的能力。在常用的基础指令中,映射指令 (map) 指令实现了快捷键自定义的功能,自动化指令 (autocmd) 则实现了自动化执行的能力。
autocmd 指令设计
自动化指令,即 autocmd,可以让 vim 在特定的事件发生时自动化的执行某些特定的指令。
autocmd 指令的基本形式如下:
指令结构主要由三个部分组成:
- 监控事件类型
指出 autocmd 指令所监控的事件类型。vim 提供多种可以监控的事件类型。常用事件类型有:
- vim 读写一个文件
- vim buffer 中的文件类型变更
- 键盘按键与否及按键时长
- vim 编辑模式的切换
全面的具体事件类型可参见 vim 中
:help autocmd
的帮助信息。 -
事件过滤器
在事件类型的基础上,利用 pattern “过滤”出更具体的指令操作对象。vim 的操作对象是文件,所以事件过滤器也是通过 pattern 指出特定路径下的特定文件类型。
-
指令序列
给出符合前述特定条件下,需要自动执行的指令集合。
指令集合主要由 vim 的操作指令构成,也可以加入特定的操作字符,如 <ESC>、<CR> 等。
一个典型的自动化指令实例如下:
:autocmd BufWritePre *.html :normal gg=G
// 对 html 文件进行写入操作前,自动对当前文件进行格式缩进
autocmd、map、锚点的混合应用
锚点设计思想 — 通过锚点,快速移动定位
锚点,英文名字 anchor,最初源于航海领域,特指航海中在特定的地点下锚,以方便将船舶停靠在某个特定的位置。计算机领域充分借鉴了这一概念,尤其是在文本编辑领域中 anchor 这个概念非常普遍。众多海量的文本就是“汪洋大海”,在编辑过程中时常有快速找到某个特定的位置的需求。为此,可以采用锚点的设计思想,提前在文本中的某个位置“下锚(定义锚点)”,相当于在文本中放置了一个“停靠点”,文本编辑或文本浏览可以通过“锚点”,进而快速“停靠(定位)”到某个具体的位置,提高编辑或浏览的效率。这种方式在海量文本的编辑或浏览中,效率提升非常明显。文本描述语言中,也往往提供对这一概念的支持,如 html 中,就明确有 anchor 对象。
vim 中编写 markdown 文本的典型应用
markdown 文本编辑中,要输出一些特定的显示效果,需要文本内容与一些特定的格式语法相结合。虽然相较其他重量级格式化标记语言,markdown 已经做出了相当的简化,但是,同时编辑文本内容与格式语法,还是存在效率较低的问题。通过一定的简化设计,精简格式语法的书写方式和流程,尽量减低在格式语法上的消耗,让文本编辑真正聚焦于内容的编写,是真正提高编辑效率的关键,也是各个 markdown 编辑器聚焦的重点之一。
利用 vim 进行 markdown 文本的编写,可以利用 vim 的定制化功能,将自动化指令、映射指令和锚点的思想结合应用,构建一个快捷的 markdown 编辑环境。
- 首先,定义人工锚点,用人工锚点代表需要进行内容编辑的区域;
// 定义人工锚点 autocmd Filetype markdown inoremap <buffer> <silent> ,, <++> // 切换到下一个锚点 autocmd Filetype markdown inoremap <buffer> <silent> ,f <Esc>/<++><CR>:nohlsearch<CR>c4l
示例中,利用
<++>
来做为人工锚点,代表内容编辑区域,当然也可以选取别的字符串,要与既有含义字符串能够明显区别开来。锚点定义完成后,需要进一步定义锚点的快捷切换方式,方便未来的编辑操作。 -
将人工锚点与格式语法相结合,构成各种复杂格式的“书写模板”,利用 map 指令将这些“书写模板”映射到简单指令;
-
利用 autocmd 判断 markdown 文件类型,并将映射指令自动执行
// 加粗 autocmd Filetype markdown inoremap <buffer> <silent> ,b **** <++><Esc>F*hi // 行内代码引用 autocmd Filetype markdown inoremap <buffer> <silent> ,q `` <++><Esc>F`i // 代码块引用 autocmd Filetype markdown inoremap <buffer> <silent> ,c ```<Enter><++><Enter>```<Enter><Enter><++><Esc>4kA // 下划线 autocmd Filetype markdown inoremap <buffer> <silent> ,u <u></u><++><Esc>F/hi // 图片 autocmd Filetype markdown inoremap <buffer> <silent> ,p ![](<++>) <++><Esc>F[a // 链接 autocmd Filetype markdown inoremap <buffer> <silent> ,a [](<++>) <++><Esc>F[a
锚点定义好后,就可以将 “格式语法 + 内容锚点” 进行简化。如果存在多个需要书写内容的区域,就用多个人工锚点填充,利用前述定义的锚点切换方法进行锚点的跳转。
利用锚点和映射指令,提高“内容+格式”的编写效率,不仅针对 markdown 语法,对于其他类似设计语言同样使用。
Reference
- 《Learn Vimscript the Hard Way》.
- https://orxing.top/post/415fb651.html#%E8%AE%BE%E7%BD%AE%E9%94%9A%E7%82%B9%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BF%AB%E6%8D%B7%E9%94%AE