用习惯了 vim 的人都更习惯直接 operator 操作 motion 或 textobjects 而不是先选中再操作 【ya) 而不是 Va)y 的区别】。
今天把 python-shell-send-region
这个函数从先选中再操作的方式改成直接用operator来操作,竟然总共只用了3行完成:
(evil-define-operator my-send-region-to-python (beg end)
"This operator sends the region (either motion or text objects) to python REPL"
(python-shell-send-region beg end))
(evil-define-key 'normal python-mode-map (kbd "SPC SPC r") #'my-send-region-to-python)
作为对比,同样是在已经实现了核心功能,只需要设置一下范围的情况下,可以看下在vim里面要实现一个operator就要拐弯抹角很多
这还没完,在定义快捷键的时候,operator也不能像普通的快捷键那样直接定义:
nnoremap <space><space>r :set opfunc=SendMotionToR<CR>g@
此外,在vim里面,只针对当前行的操作和 operator 通常需要 map 两次,(例如 yy 和 y 本质上是两个命令),但是evil 在定义完一个operator以后,只针对当前行的操作就自动给你定义好了 (比如 SPC SPC r r 就自动变成了 send 当前行到 python)