背景

最近刚入门vim。
这篇文章,记录对 vim 切换输入法进行了解的一个过程,以及在了解 vim 插件过程中的一些心路历程。

历程

  1. 最开始了解 vim 插件是有这么一个需求:

每次 Vim 编辑从 insert mode 切换到 normal mode 的时候,若在输入模式中是中文,切回到普通模式的时候,仍旧是中文,这个时候总是需要切换一下输入法到英文,才可以在普通模式下快速输入命令,每次都这么搞的话,非常不方面,那么有没有一个插件可以解决这个问题呢?

  1. 然后我在 Github 上搜 vim输入法切换,搜到一个仓库lipingcoding/autoim.vim

看到仓库的 star 少,源码也不多,于是我就想那我为什么不自己在本地先去实现一下呢?

  1. vim插件开发第一次接触

于是先去搜插件开发入门版,看到了这篇文章:Vim 如何编写插件:Hello World
这篇文章学到的内容是:

  • source引入vim文件
  • 在~/.vim/plugin下的.vim文件会自动查找,不用source声明
  • 函数名和执行命令首字母必须大写

最后照着这篇文章几分钟后在本地就实现了一个 Hello World的入门级插件体验。

  1. 然后我又回来看vim输入法切换的这个仓库,核心代码就四个文件:
    autoim

仓库 fork、clone到本地,查看源代码。
发现cmd_space.scptctrl_space.scpt这两个文件打不开,也没接触过。且这个仓库只提供了command+spacectrl + space两种输入法方式切换,而我本地用的是caps lock键。

  1. 然后看仓库说明文档,文档最后给出思路来源为涛叔的博客
    接着看涛叔的博客内容,明白了仓库中 autoim.vim 的代码实现思路,以及为什么不能用caps lock切换。
    这篇文章主要学到的点有:
  • AppleScript
  • 键盘编码参考
  • scpt文件打开、编辑方式(Mac 自带的脚本编辑器编辑)
  • vim 提供的 InsertEnter 和 InsertLeave 两个事件
  1. 回到仓库以cmd_space.scpt为例,Mac自带脚本编辑器打开后长这个样子:

接着看ctrl_space.scpt,发现和cmd_space.scpt一样,于是将command修改为control后提交 pull request。

  1. 然后使用我自己 fork 的仓库,在.vimrc中添加配置:

插件的状态、安装、更新、删除命令(PlugStatus PlugInstall [name] PlugUpdate [name] PlugClean(.vimrc中去掉插件说明执行))
插件源码路径~/.vim/plugged/autoim.vim
这么搞了一波后进行测试,发现第一次从 inset 模式切换到 normal 模式有一定概率可以实现输入法切换,但是第二次就开始快速闪烁,切换不过来了。。。
接着把代码在本地进行修改只监听进入普通模式,试了一下也是不太可以。

  1. 这条路走不通,回到5,完全以涛叔的博客 在本地实现。
  • 如6中所示,当点击小三角形进行测试的时候,依然出现的是第二次就不可以正常切换了。
  • 在终端中使用osascript ~/.vim/liugezhou/ctrlspace.scpt测试,依然是第二次不能切换问题,
  • 目前到这来看,自动切换输入法是失败了。