VIME: 在 VIM 中实现输入法
花了几天晩饭后的时间用 vimscript 写了一个流畅的输入法。可以反查,可以拼音。
2020-02-23

需求

我对输入法有特殊的要求。在 Linux 中,Fcitx 可以满足我的要求,随着 Wayland 的普及,不知其发展方向。 而在 Windows 下,十年前写过一个外挂式输入法。 其间用 Windows 时尝试过 Rime 等开源方案,并不满意,遂又回到自己写的输入法上来。

十年前以 32 位元的程序为主,今 32 与 64 位的程序共存。为了不同的应用临时换个 32/64 位的 dll 作为外挂的输入法还能免强使用。但是随着 Text Service Framework 逐渐成为主流,实再没时间再做此复杂的实现。 所幸由于智能手机的发展,这几年对于 PC 中汉字输入需求不再像十年前那样频繁,偶尔有输入也是在 vim 中记一点什么。

另一方面,vim 输入中文需要在几个模式之前来回切换输入法,写惯了拉丁字母的肌肉记忆不适应再插入一歩换输入法的中间歩骤。

Vim 中虽然已经有了例如 vimim 这样的输入法插件,但是在我的笔记本上无法流畅打字。于是试一试能否高效地实现输入汉字功能,遂成此文。

该输入法由于不需要重新造 GUI 的轮子,实现起来十分简单。估计又可以用上十年。

特性

附两张使用截图:第一张是用郑码输入文字,可以看到,只要有字体的支持,大字集是可以使用的;第二张是反查其中的“查”字。

用法

若用 vim 的插件管理器 vim-plug ,在 .vimrc 的
call plug#begin(...)
中加入
    Plug 'jagd/vime'
再绑定快捷键,比如,绑定 Ctrl+_
imap <silent><C-S-_> <C-_>
inoremap <silent><C-_> <C-R>=VimeSwitch()<CR>
inoremap <silent><C-_>. <C-R>=VimeToggleFullPunct()<CR>
nnoremap <silent><C-_> :call VimeInverseLookup()<CR>
在插入模式下,<Ctrl+_> 切换中/英文输入,<Ctrl+_>. 切换全半角;普通模式下 <Ctrl+_> 反查光标所指的汉字。

自定义码表

默认附帯了我自己用的郑码单字码表。

若要挂上自己的码表,在 .vim 或其它 runtime 目录下(runtime 依序寻找文件,故不须放在此插件目录)的 vime-table.txt 为自定义的码表。这是一个从小到大有序的大数组(二分查找),越靠前的字词候选也越排前。例如:

let g:vimeTable = [
  \'a','啊',
  \'a','阿',
  \'ba','吧',
  \'ba','把',
  \'ba','八',
  \'zun','尊',
  \'zun','遵',
  \'zun','樽',
\]
拼音码表亦是如是,只需将文件命名为 vim-table-pinyin.txt

从 Rime 码表转换成所需的格式请参考:

awk '{printf("%s %08d %08d %s\n",$2,99999999-$3,n++,$1)}' | sort | awk "{printf(\"\\\\'%s','%s',\\n\",\$1,\$4)}"