Vim独立插件vimio的全面介绍
这是什么插件?
插件主页:https://github.com/qindapao/vimio
先看两个小动图直观感受下。
demo 1:

demo 2:

简单来说,这是一个使用vim来绘制文本流程图或者架构图的插件。以前也出现过类似的东西,比如:DrawIt sketch ,但是它们的功能都比较简单。绘制起来也不是那么方便。
受到 Nadim Khemir 开发的全功能的文本图绘制软件 asciio 的启发。我开发了简单的 vimio,以方便 vim 用户可以直接通过 vim 在源码中或者是架构文档中直接绘制文本流程图或者架构图。
关于更加强大的 asciio 软件,我会在后面的博文中单独介绍,这里只介绍下它是一个使用 Perl5 语法开发的,基于绘图对象管理的,支持图形对象分组,各种自动链接路由的强大软件。并且可以方便的导出到纯 TXT 文本。
vimio 继承了一部分它的思想,但是本质上这是两个不同的软件。vimio 更加简单,因为没有对象的概念,你使用它和编辑代码编写文档没有区别,画出来是什么就是什么。因为它是基于文本的,所以它的智能化程度和 asciio 比差了很多。所以 vimio 的定位是绘制简单的即时架构图。如果你的文本架构图或者流程图相当复杂,为了节约你的时间,强烈建议你直接使用 asciio !它绝对是你的终极选择,没有之一!
虽然这个插件的说明文档写得相当详细。但是那是纯文本的说明。对于第一次使用的朋友来说可能不够友好,所以我还是在博客中图文并茂的重新介绍下吧!
插件安装完成后,在 vim 的命令行直接:
:h vimio即可。
所有的操作总表
这里先给个操作的总表,当前不用去理解这些操作是什么意思,因为后面会详细解释。放个总表的目的是后面熟悉了后可以直接在这个操作总表来找对应的操作。
注:下面的大部分的映射都是有英文含义的,比如 sm ->
smarts ->start合并后是 sms 表示 智能线开始绘制。
- 绘图前的准备
| 按键映射 | 功能 |
|---|---|
| vea | 进入虚拟文本模式让vim变成一个画布 |
| <Leader>ven | 退出虚拟文本模式 |
| <Leader>scc | 高亮当前列 |
| <Leader>scn | 取消高亮当前列 |
| Shift + R | 在绘图模式下自由输入字符 |
| Ctrl + Shift + J/K/L/H | (绘图模式下)在自由替换模式下的光标自由移动 |
- 绘制
| 按键映射 | 功能 |
|---|---|
| Alt + l/j/h/k | 绘制横向和纵向的直线 |
| sa | 自动绘制箭头 |
| sw | (可视块模式)绘制矩形 |
| slc | 改变绘制上下文的线形 |
| su | 把光标下的线形作为目标线形切换绘制上下文的线形 |
| sls | 显示当前绘制上下文的线形 |
| sxs | 改变交叉类型(比如直线相交是用 + 还是用 )) |
| sxm | 切换拷贝粘贴图形的时候交叉字符是否自动适配 |
| sxh | 切换纵向和横向辅助定位线的显示和隐藏 |
| sxi | 显示当前的设置的预览信息 |
| sxa | 切换交叉算法(复合交叉和单线交叉) |
| sms | 开始绘制智能线 |
| sme | 结束绘制智能线 |
| smas | 智能线打开或者关闭开始箭头 |
| smae | 智能线打开或者关闭结束箭头 |
| smd | 智能线切换斜线或者直线 |
| smaf | 智能线的开头和结尾对调 |
| smx | 智能线开始和关闭交叉模式 |
| smc | 取消当前智能线的绘制(中断智能线绘制上下文) |
| smf | 智能线切换箭头路由方向 |
| smr | 对已经选定的智能线进行长短和方向的调节 |
| s. | 执行一次 a 寄存器中记录的宏 |
| ssb | 绘制一个矩形盒子 |
| ssr | 形状重新调整大小开始 |
| sse | 形状重新调整大小结束 |
| sst | 形状改变边框的类型 |
- 橡皮擦
| 按键映射 | 功能 |
|---|---|
| Ctrl + Alt + l/h/j/k | 小橡皮擦移动删除 |
| r | (可视块)全局替换,如果替换成空格就相当于删除 |
- 拷贝、剪切和粘贴
| 按键映射 | 功能 |
|---|---|
| xy | (可视块)拷贝到剪切板 |
| sy | 拷贝当前光标下的字符到剪切板 |
| xx | (可视块选择) 剪切 |
| xc | (可视块) 替换,需要替换成的字符要求输入 |
| sp | 拷贝剪切板中的一个字符到当前光标位置 |
| sr | (可视块)替换可视块区域的字符为剪切板中拷贝的字符 |
| Ctrl + Shift + Right/Left/Up/Down | 粘贴剪切板的字符到当前光标下然后移动对应方向的光标(主要用来连续绘制同一字符或者连续绘制一系列字符) |
| Ctrl + Shift + Space | 在当前位置粘贴剪切板中的图形 |
- 智能预览
| 按键映射 | 功能 |
|---|---|
| Ctrl + j/k/h/l | 预览显示剪切板中的图形并且移动光标 |
| so | 让预览窗口总是出现 |
| sq | 关闭让预览窗口总是出现的功能 |
| sv | 显示预览窗口但是不要移动光标 |
| st | 切换预览窗口是否要忽略空格(透视或者不透视) |
- 模板操作
| 按键映射 | 功能 |
|---|---|
| sg | 切换模板大类,直接切换到下一个模板文件 |
| sf | 往前切换当前模板文件中的1层大类 |
| sb | 往后切换当前模板文件中的1层大类 |
| Alt + u or Alt + Scroll Down | 往前切换当前模板文件的1层大类的2层小类 |
| Alt + y or Alt + Scroll Up | 往后切换当前模板文件的1层大类的2层小类 |
| Alt + t | 显示当前的模板选择(恢复剪切版到模板模式) |
| sk | 切换要控制2层小类图形的长度或者宽度 |
| sss | 在模板集合中输入关键字搜索模板 |
- 手动操作高亮图形字符标定(图形管理)
| 按键映射 | 功能 |
|---|---|
| Ctrl + Shift + N | 高亮标定光标下的字符并且光标不移动 |
| Ctrl + Shift + J/K/L/H | 高亮标定光标下的字符然后光标往相应的方向移动 |
| si | 自由高亮模式,一旦开启光标路径上所有的字符都会被高亮 |
| si(v block) | (可视块模式)和上面相同,只是这是在可视块模式下 |
| sj | 自由取消高亮模式,路径上遇到的高亮都会被取消 |
| sj(v block) | (可视块模式)和上面相同,只是在是在可视块模式下 |
| sd | 结束自由模式(高亮和取消高亮) |
| Ctrl + Shift + C | 清除屏幕上的所有高亮 |
| Ctrl + x | 拷贝所有的高亮到一个矩形并保存到剪切板 |
| Ctrl + Shift + X | 剪切所有的高亮到一个矩形并保存到剪切板 |
| Ctrl + Shift + G | 替换高亮区域的字符为剪切板中的字符 |
- 基于文本图形算法的高亮图形字符标定(图形管理)
| 按键映射 | 功能 |
|---|---|
| <Leader>s4 | 4个方向的固体选择 |
| <Leader>s8 | 8个方向的固体选择 |
| <Leader>b4 | (最小圆算法)4个方向的边界选择 |
| <Leader>bm4 | (最大圆算法)4个方向的边界选择 |
| <Leader>b8 | (最小圆)8个方向的边界选择 |
| <Leader>bm8 | (最大圆)8个方向的边界选择 |
| <Leader>l4 | 线选择,但是4个方向不能穿透 |
| <Leader>p4 | 线选择,但是4个方向穿透 |
| <Leader>l8 | 线选择,但是8个方向不穿透 |
| <Leader>p8 | 线选择,但是8个方向穿透 |
| <Leader>i4 | (最小圆)4个方向的边框内选择 |
| <Leader>im4 | (最大圆)4个方向的边框内选择 |
| <Leader>i8 | (最小圆)8个方向的边框内选择 |
| <Leader>im8 | (最大圆)8个方向的边框内选择 |
| <Leader>a4 | (最小圆)4个方向的边框+边框内选择 |
| <Leader>am4 | (最大圆)4个方向的边框+边框内选择 |
| <Leader>a8 | (最小圆)8个方向的边框和+边框内选择 |
| <Leader>am8 | (最大圆)8个方向的边框和+边框内选择 |
| <Leader>lbi | 选择最外层最大圆的内部不包括边界 |
| <Leader>lba | 选择最外层最大圆边界和它的内部 |
| <Leader>sos | 思维导图框架4向放射性选择 |
| <Leader>sod | 思维导图框架8向放射性选择 |
| <Leader>r4 | 4向全相关选择 |
| <Leader>r8 | 8向全相关选择 |
| <Leader>t4 | 4向强制选择文本而不是边框 |
| <Leader>t8 | 8向强制选择文本而不是边框 |
- 鼠标的快捷操作
见下面的 <<鼠标快捷操作>> 章节。
绘图前的准备
在绘制文本图以前,我们首先要把vim变成一个画布,而不是普通的编辑模式,在画布的状态下,直接输入一个字符不会顶掉后面的字符的位置。
| 按键映射 | 功能 |
|---|---|
| vea | 进入虚拟文本模式让vim变成一个画布 |
| <Leader>ven | 退出虚拟文本模式 |
| <Leader>scc | 高亮当前列 |
| <Leader>scn | 取消高亮当前列 |
| Shift + R | 在绘图模式下自由输入字符 |
| Ctrl + Shift + J/K/L/H | (绘图模式下)在自由替换模式下的光标自由移动 |
相关的操作可以看下面这个小的 gif 演示:
上面的视频中漏掉了 Ctrl + Shift + J/K/L/H 的操作,这个非常有用,如果你要输入不同位置的字符,这个让你不用频繁的进入和退出全局替换模式。
绘制
这里是基本的绘制功能,可以画线,也可以画框,还可以根据线的方向自动绘制箭头,还有可能根据起点和终点自动路由的智能线。
由于这部分内容有点多,所以分几个部分来说明。
基本的线条和框绘制以及样式控制
| 按键映射 | 功能 |
|---|---|
| Alt + l/j/h/k | 绘制横向和纵向的直线 |
| sa | 自动绘制箭头 |
| sw | (可视块模式)绘制矩形 |
| slc | 改变绘制上下文的线形 |
| su | 把光标下的线形作为目标线形切换绘制上下文的线形 |
| sls | 显示当前绘制上下文的线形 |
| sxs | 改变交叉类型(比如直线相交是用 + 还是用 )) |
| sxh | 切换纵向和横向辅助定位线的显示和隐藏 |
| sxi | 显示当前的设置的预览信息 |
快速画线还有一个十分实用的小技巧,sw 不仅仅是可以画框,其实也可以快速画线的,这样我们就不要慢慢去画。在横向或者纵向的范围内,我们指定起点和终点就可以快速画线,下面的小 gif 说明下这一点。

这个功能在制作表格的时候非常方便!
智能线相关的操作
| 按键映射 | 功能 |
|---|---|
| sms | 开始绘制智能线 |
| sme | 结束绘制智能线 |
| smas | 智能线打开或者关闭开始箭头 |
| smae | 智能线打开或者关闭结束箭头 |
| smd | 智能线切换斜线或者直线 |
| smaf | 智能线的开头和结尾对调 |
| smx | 智能线开始和关闭交叉模式 |
| smc | 取消当前智能线的绘制(中断智能线绘制上下文) |
| smf | 智能线切换箭头路由方向 |
| smr | 对已经选定的智能线进行长短和方向的调节 |
智能线的意思是我们指定开始和结束的位置,然后线条会自动路由,不用我们人为的指定路径。这样绘制的时候更加灵活。同样用一个范例视频来说明下。
smr 的操作涉及到高亮选择的问题,这个会在后面单独说明。然后从视频中也可以看到,如果要绘制连续多段的智能线,只需要在上一条线结尾的地方,继续按 sms 即可,然后上一条线自动绘制到画布中。
这里的控制交叉模式只是控制视觉效果,不影响最后生成的结果。
盒子元素快速绘制和相关操作
| 按键映射 | 功能 |
|---|---|
| s. | 执行一次 a 寄存器中记录的宏 |
| ssb | 绘制一个矩形盒子 |
| ssr | 形状重新调整大小开始 |
| sse | 形状重新调整大小结束 |
| sst | 形状改变边框的类型 |
有时候我们可能需要执行很多重复的操作,s. 主要是方便快速执行一次 a寄存器 中的内容。
关于矩形盒子的操作,也用一个视频来说明下:
对于上面的视频,有个特殊需要说明的地方。
sst 的操作前,你需要先确认你的当前的线形选择,sls 用于显示当前的线形。slc 用于切换当前的线形,当切换到你的目标线形后,把光标放到矩形框的边框上,然后按 sst 就可以改变当前这个矩形框为你想要的线形。
橡皮擦
这里先介绍下基本的橡皮擦,后面还有基于高亮的高级橡皮擦(可以批量删除不规则区域的字符,并且不要求连续)。
| 按键映射 | 功能 |
|---|---|
| Ctrl + Alt + l/h/j/k | 小橡皮擦移动删除 |
| r | (可视块)全局替换,如果替换成空格就相当于删除 |
视频范例:
上面的视频中,块全局替换模式下,要求输入的时候输入一个空格,就是删除,如果要替换成别的字符,输入相应的字符即可。
拷贝、剪切和粘贴
这里的也是先介绍基本的选择操作,后面介绍了高级的高亮选择后,我们可以拷贝、剪切和粘贴不规则的图形,不要求连续,这里先不讲,先讲最基本的操作。
| 按键映射 | 功能 |
|---|---|
| xy | (可视块)拷贝到剪切板 |
| sy | 拷贝当前光标下的字符到剪切板 |
| xx | (可视块选择) 剪切 |
| xc | (可视块) 替换,需要替换成的字符要求输入 |
| sp | 拷贝剪切板中的一个字符到当前光标位置 |
| sr | (可视块)替换可视块区域的字符为剪切板中拷贝的字符 |
| Ctrl + Shift + Right/Left/Up/Down | 粘贴剪切板的字符到当前光标下然后移动对应方向的光标(主要用来连续绘制同一字符或者连续绘制一系列字符) |
| Ctrl + Shift + Space | 在当前位置粘贴剪切板中的图形 |
视频范例:
Ctrl + Shift + Right/Left/Up/Down 的操作除了绘制一个字符以外,还有连续绘制剪切板中的字符的功能。比如你想纵向输出文字,就可以先横向输入文字,然后选择块选择到剪切板中,然后采用这种方法纵向输出。
这里的操作我就不细讲了,如果有什么不同的,欢迎大家在留言板中问我,我再来解释。
智能预览
要知道当前剪切板中的内容和图形的位置信息,打开预览窗口即可。
| 按键映射 | 功能 |
|---|---|
| Ctrl + j/k/h/l | 预览显示剪切板中的图形并且移动光标 |
| so | 让预览窗口总是出现 |
| sq | 关闭让预览窗口总是出现的功能 |
| sv | 显示预览窗口但是不要移动光标 |
| st | 切换预览窗口是否要忽略空格(透视或者不透视) |
还是先个一个视频来直观感受下,然后我们再慢慢解释。
- 特别说明下,st 的效果是切换预览窗口的透明和遮罩
- 透明 - 那么剪切板中的图形中的空格会被忽略,底图中对应的字符会保留。
- 遮罩 - 那么底图中的所有字符都会被剪切板中的矩形图形覆盖
插入模板图形
模板是可以自定义的,关于自定义的方法可以参考帮助文档(vimio.txt)中的相关部分自己开发。这里讲下预设的模板操作。
| 按键映射 | 功能 |
|---|---|
| sg | 切换模板大类,直接切换到下一个模板文件 |
| sf | 往前切换当前模板文件中的1层大类 |
| sb | 往后切换当前模板文件中的1层大类 |
| Alt + u or Alt + Scroll Down | 往前切换当前模板文件的1层大类的2层小类 |
| Alt + y or Alt + Scroll Up | 往后切换当前模板文件的1层大类的2层小类 |
| Alt + t | 显示当前的模板选择(恢复剪切版到模板模式) |
| sk | 切换要控制2层小类图形的长度或者宽度 |
| sss | 在模板集合中输入关键字搜索模板 |
还是看个视频直观感受下先。
在模板的搜索中,对于搜到的内容,按 n 切换到下一个匹配,按 Shift + N 切换到上一个匹配。在匹配中切换2层小类就和普通情况一样。
选择模板小类,对于枚举类的模板(没有图形大小概率的),还有一种通过数字来选择对应的图形的功能。
进入预览界面后:
- 按 1xx 就是选择第一级的图形,其中
xx就是这个第一级图形的数字编号。 - 按 2xx 就是选择第一级的图形对应的第二级的子图形,
xx同样是这个子图形的数字编号。
还是举个视频范例来说明下:
在上面的视频中。我们首先通过 Alt + t 打开模板预览面板,然后通过 113 切换到方块符号大类,然后在这个大类中通过 226 定位到我们的2类方块字符,然后通过 Ctrl + Shift + Space 插入面板。
高亮字符标定
一旦把我们想要的图形字符全部高亮,然后我们就可以独立对它们进行拷贝或者剪切的操作,而不会误操作到它们旁边的字符,实现精确操作。
手动的高亮标定
大部分的情况下,我们通过人为来操作,不会出现误操作,可以精确选取我们想操作的图形字符。
手动高亮一个字符
| 按键映射 | 功能 |
|---|---|
| Ctrl + Shift + N | 高亮标定光标下的字符并且光标不移动 |

高亮一个字符然后光标往相应的方向移动
| 按键映射 | 功能 |
|---|---|
| Ctrl + Shift + J/K/L/H | 高亮标定光标下的字符然后光标往相应的方向移动 |

自由高亮和自由取消高亮模式相关操作
| 按键映射 | 功能 |
|---|---|
| si | 自由高亮模式,一旦开启光标路径上所有的字符都会被高亮 |
| si(v block) | (可视块模式)和上面相同,只是这是在可视块模式下 |
| sj | 自由取消高亮模式,路径上遇到的高亮都会被取消 |
| sj(v block) | (可视块模式)和上面相同,只是在是在可视块模式下 |
| sd | 结束自由模式(高亮和取消高亮) |
处于这种模式下,光标自由移动的时候,对路径中所有的字符进行高亮或者取消高亮的动作,直到按 sd 结束自由模式。

清除屏幕上的所有高亮
这主要是为了一些误操作的清理环境。相当于完全丢弃本轮的所有的高亮操作。
| 按键映射 | 功能 |
|---|---|
| Ctrl + Shift + C | 清除屏幕上的所有高亮 |

高亮字符的拷贝、剪切和粘贴
| 按键映射 | 功能 |
|---|---|
| Ctrl + x | 拷贝所有的高亮到一个矩形并保存到剪切板 |
| Ctrl + Shift + X | 剪切所有的高亮到一个矩形并保存到剪切板 |
| Ctrl + Shift + G | 替换高亮区域的字符为剪切板中的字符 |

基于算法的自动标定
这一块比较绕,并且内容有点多,如果有人感兴趣我再细讲吧。也可以直接参考 vimio.txt 文档中的内容来详细了解。
邻居算法算法
未完待续。
线选择算法算法
未完待续。
最大环最小环选择
未完待续。
未完待续
关于字符交叉效果的专门说明
本插件最大的特色就是可以自动处理框线字符相交的时候的交叉字符替换。无论是直接画线还是画框,都可以自动处理。这里整理几个和交叉相关的操作。
直接绘制的线条默认只支持交叉
如果不想要交叉效果,那么在交叉点的时候不要绘制即可!所有主动权还是完全在用户手里。

注意下,如果不想出现交叉字符,必须要从两个方向逼近,不然还是会出现交叉字符。如果觉得麻烦,其实直接用智能线就行了,如果只想绘制线条不要要箭头,在智能线中关闭首尾的箭头即可,上面都有详细的解释的。
智能线绘制过程中的交叉控制

smx 控制智能线交叉的打开和关闭。
图形的拷贝、剪切和粘贴过程中的交叉控制

| 按键映射 | 功能 |
|---|---|
| sxm | 拷贝、剪切和粘贴的时候时候打开或者关闭交叉 |
| st | 切换预览窗口是否要忽略空格(透视或者不透视),同时切换交叉为覆盖还是穿透 |
切换交叉主题
主题是可以自定义的,具体参考插件的详细说明,这里简单演示下。
| 按键映射 | 功能 |
|---|---|
| sxs | 改变交叉类型(比如直线相交是用 + 还是用 )) |
| sxi | 显示当前的设置的预览信息 |
sxi 用于显示当前的交叉和其它的样式信息。

从上面看到,我们用 sxs 切换到某个主题,本来应该出现 + 的位置现在变成了 ),在某些电路图的绘制中这可能更加自然。
交叉算法
| 按键映射 | 功能 |
|---|---|
| sxa | 切换交叉算法(复合交叉和单线交叉) |
大部分情况下不需要关注和设置,如果感兴趣,可以直接看:vimio.txt 中的详细说明。
特殊字体下的8向交叉
正常情况下,我们的交叉只处理纵向和横向,如果要处理对角线的交叉,那么需要用到特殊的字体 vimiomono,这个字体当前还不够平滑,我还在打磨中,可以先看下效果。
| 按键映射 | 功能 |
|---|---|
| ssg | 打开和关闭 vimiomono 字体特殊8向交叉 |

上面的演示动画中
- 左边的图形是使用正常的字体绘制,可以看到斜向相交的时候交叉点处的字符是不会自动改变的。
- 右边的图形是切换到
vimiomono字体后绘制的,复杂的对角线相交都支持。
目前字体的优化还不是那么好,所以效果看起来不是很完美。
智能拷贝
当交叉模式打开的时候,我们如果拷贝一条已经穿透的线段,最终拷贝出来的图形会自动去掉多余的交叉字符,补齐为平滑的字符。这么说有点抽象,直接用一个小动图说明下:

辅助定位线
任何时候,要操作剪切板中的图形,我们想对齐别的图形,就可以打开辅助定位线。

通过辅助定位线,我们可以横向或者纵向,或者同时对齐横向和纵向的其它图形。
如果移动过程中比较缓慢,可以先移动到临近的位置再用 Ctrl + j/k/h/l 打开预览。
CJK 支持
如果字体支持中文对齐(中文字符宽度严格等于英文字符宽度的2倍),其实也可以支持中文,但是一般情况下不建议在图表中使用中文,不便于国际化。
还是举个例子吧。

鼠标快捷操作
画框使用鼠标是最快的方式,使用鼠标进行可视块选择,然后按 sw。

在当前的配置下,使用键盘进入可视模式可能没有鼠标快速。可以利用鼠标进入可视模式进行快速的高亮和选择。

还有更加高级的用法,si 启动自动高亮后,可以直接使用鼠标左键点击需要选择的字符。这样选择自己需要的字符就会非常快速了。

在上面的操作中,如果你发现自己选择错了某些字符,随时可以使用 sj 进行高亮取消。然后继续切换 si 进行高亮选择。

在 so 打开自由预览的基础上,鼠标移动到的位置可以自由显示图形预览,然后按 Ctrl + 鼠标左键 就可以快速插入图形,和 Ctrl + Shift + Space 的效果完全一样,但是更加快速。要进行其它的操作,需要先用 sq 退出自由预览模式。

结语
谢谢,插件使用过程中的任何问题欢迎留言,直接在这里评论或者去 https://github.com/qindapao/vimio 的 issue 中留言皆可。
✍️ 本文作者:秦大炮 (Qindapao)
欢迎技术交流与转载。转载请注明出处,并保留以下硬核联系方式。
- 🔗 独立博客: qindapao.com
- 💻 GitHub: github.com/qindapao
- 📧 Email: nothisland2017@gmail.com