vim 进阶 – 自动化指令autocmd

vim 拥有高度灵活的脚本体系。脚本体系包括众多基础指令和各种控制结构,合理组合使用可以极大的延拓 vim 的能力。在常用的基础指令中,映射指令 (map) 指令实现了快捷键自定义的功能,自动化指令 (autocmd) 则实现了自动化执行的能力。

autocmd 指令设计

自动化指令,即 autocmd,可以让 vim 在特定的事件发生时自动化的执行某些特定的指令

autocmd 指令的基本形式如下:

20200131-1

指令结构主要由三个部分组成:

  1. 监控事件类型

    指出 autocmd 指令所监控的事件类型。vim 提供多种可以监控的事件类型。常用事件类型有:

    • vim 读写一个文件
    • vim buffer 中的文件类型变更
    • 键盘按键与否及按键时长
    • vim 编辑模式的切换

    全面的具体事件类型可参见 vim 中 :help autocmd 的帮助信息。

  2. 事件过滤器

    在事件类型的基础上,利用 pattern “过滤”出更具体的指令操作对象。vim 的操作对象是文件,所以事件过滤器也是通过 pattern 指出特定路径下的特定文件类型。

  3. 指令序列

    给出符合前述特定条件下,需要自动执行的指令集合。

    指令集合主要由 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 编辑环境。

  1. 首先,定义人工锚点,用人工锚点代表需要进行内容编辑的区域;
    // 定义人工锚点 
    autocmd Filetype markdown inoremap <buffer> <silent> ,, <++>
    // 切换到下一个锚点  
    autocmd Filetype markdown inoremap <buffer> <silent> ,f <Esc>/<++><CR>:nohlsearch<CR>c4l
    

    示例中,利用 <++> 来做为人工锚点,代表内容编辑区域,当然也可以选取别的字符串,要与既有含义字符串能够明显区别开来。锚点定义完成后,需要进一步定义锚点的快捷切换方式,方便未来的编辑操作。

  2. 将人工锚点与格式语法相结合,构成各种复杂格式的“书写模板”,利用 map 指令将这些“书写模板”映射到简单指令;

  3. 利用 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

  1. 《Learn Vimscript the Hard Way》.
  2. 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

发表评论

电子邮件地址不会被公开。 必填项已用*标注