Patch EasyMotion to easy motion in Chinese text. 基于小鹤双拼让 EasyMotion 识别中文.
Inspired by vim-easymotion-chs.
vim-easymotion-zh-demo.mp4
- 很喜欢 EasyMotion 这个插件, 它让跳转变得更加便捷, 但是它只能以字母为跳转目标, 不能识别中文.
- 我平时中文写得比较多, 经常需要定位到某个文字, 之前我只能通过鼠标单击来完成, 但这样做的话会让打字效率变低, 偶然间看到 EasyMotion 对日语的支持, 后又看到一个插件vim-easymotion-chs实现了对中文的识别, 但这个插件还是没达到我想要的效果, 于是我着手基于小鹤双拼来重新实现一遍, 发现最终做成的插件达到理想的效果, 所以把它共享出来, 希望它能帮助到有类似需求的人.
和 vim-easymotion-chs 的不同之处:
- 基于小鹤双拼编码实现, 而不是全拼实现.
- 去除了大量的生僻字.
- 增加了对中文符号支持, 比如
<Plug>(easymotion-f).
可以识别。
和.
. - 增加了对
<Plug>(easymotion-s2)/<Plug>(easymotion-*-f2)
支持, 比如<Plug>(easymotion-s2)le
会识别拼音为le
的单字(了, 乐, 勒).
- 需要安装 EasyMotion.
- 必须设置
let g:EasyMotion_use_migemo = 1
. - 如果只用到根据单字母跳转, 比如
<Plug>(easymotion-f)
, 则只需要熟悉小鹤双拼的声母是如何分布在 26 个字母按键上的, 大部分都和声母一一对应(声母 m ->按键 M, 声母 n -> 按键 N, ...), 有几个特例:zh
对应按键V
sh
对应按键U
ch
对应按键I
- 如果需要通过声母和韵母定位跳转到单字, 比如
<Plug>(easymotion-s2)de
定位到所有的的, 地, 得
, 则还需要熟悉小鹤双拼的韵母的键位分布, 这个需要花点时间(不超过 1 小时), 举些简单的例子:- 韵母
an
分布在按键J
上 - 韵母
uo
分布在按键O
上 - 韵母
ue
分布在按键T
上
- 韵母
Plug 'zzhirong/vim-easymotion-zh'
Plug 'easymotion/vim-easymotion'
let g:EasyMotion_leader_key=";"
let g:EasyMotion_skipfoldedline=0
let g:EasyMotion_space_jump_first=1
let g:EasyMotion_move_highlight = 0
let g:EasyMotion_use_migemo = 1
noremap s <Plug>(easymotion-overwin-f2)
" `s` 和 surround 冲突, 比如 ds
onoremap z <Plug>(easymotion-f2)
noremap f <Plug>(easymotion-fl)
noremap F <Plug>(easymotion-Fl)
noremap t <Plug>(easymotion-tl)
noremap T <Plug>(easymotion-Tl)
noremap ;. <Plug>(easymotion-repeat)
noremap ;l <Plug>(easymotion-next)
noremap ;h <Plug>(easymotion-prev)
推荐通过vim-plug安装:
Plug 'easymotion/vim-easymotion'
Plug 'zzhirong/vim-easymotion-zh'
.
<Plug>(easymotion-f)
+U
<Plug>(easymotion-s2)
+U
+I
- 相对单字符跳转优势: 重码少, 候选位置更少, 可适用于跨多行跳转.
- 单字编码长度刚好是 2, 满足
<Plug>(easymotion-s2)
要求。 - 最开始, 想尝试使用相邻两个字的声母作为
s2
的参数,但任意两个声母组成的组合长度从几百到几万不等,比如ss
组成的可能就多达几万种,反而由单个声母加韵母组合长度可以控制在一百以内.
- 不熟悉小鹤双拼.
- 生僻字无法定位。
- 使用的是EasyMotion不稳定的接口, 后续该插件升级可能会导致本插件无法使用.