vim和neovim中自动切换Fcitx5输入法
在使用vim或neovim编辑文件时,需要经常在插入模式和编辑模式来回切换,之前已经记录了方法,但本文作为一个正式的版本记录一下,并随ArchLinux的更新相应改变。
源自Fcitx5-ArchWiki的方法
1 | let fcitx5state=system("fcitx5-remote") |
注意:vim将上述代码添加到~/.vimrc
,
neovim将上述代码添加到~/.config/nvim/init.vim
使用插件fcitx.vim
由于不同的插件管理器多少有差异,此处不记录详细配置,请将lilydjwg/fcitx.vim
放入到配置文件对应位置即可。插件和官方的脚本区别在于:
ArchLinux
官方脚本可以实现在一个文件中输入法的切换,即按Esc
后切换为英文输入法,再切换到插入模式后Fcitx5
自动切换为刚才输入时的输入法。这个功能基本满足大家的要求。插件fcitx.vim
的优势在于可以记录不同文件的输入法状态,例如有两个文件A和B,
编辑文件A时插入模式使用中文输入,编辑文件B时插入模式使用英文输入,在A或B按Esc
后统一转换成了英文输入法,但是在A文件中插入时Fcitx5
就切换到中文输入法,在B文件中插入时Fcitx5
就切换到英文输入法。
由于ArchLinux
脚本仅是一段简单代码,基本上不占用启动时间,所以vim或nvim都启动的很快,而插件fcitx.vim
虽然功能强大,但是需要借助于python3
和python-dbus
,所以启动会慢一些,使用Lazy
插件管理器,在nvim
启动时发现插件fcitx.vim
占用了90ms
左右的时间,它是所有插件中占用时间最多的,其他的插件最多也就几秒.
由于同时编辑两种文本一个为中文另一个为英文的概率很小,从性能和实现简易程度上讲优先考虑使用Fcitx5-ArchWiki
所提供的脚本,如果您在工作中经常处理多个文件,且这多个文件分别使用不同语言,需要分别记录不同的输入状态,那请使用插件fcitx.vim
.
Keep and restore fcitx state for each buffer separately when leaving/re-entering insert mode or search mode. Like always typing English in normal mode, but Chinese in insert mode.
D-Bus only works with the same user so this won't work with
sudo vim
. See the fcitx5-server
branch for an
experimental implementation that supports sudo vim
.
By default, it use python3 and D-Bus to toggle IME state. If you set
g:fcitx5_remote
to the executable path of
fcitx5-remote
BEFORE loading the plugin,
it will use fcitx5-remote
instead of python and D-Bus. In
this case, python3 support is optional.
Usually fcitx5-remote
mode is way faster to start up
since Python script need quite some time for the initial load if you
don't use any other plugins that load Python. The Python version will be
faster while switching.
Base requirements:
- fcitx 5
Requirements for Python mode (g:fcitx5_remote
is not
set):
- Vim with Python 3 compiled in
- The python-dbus package
Requirements for fcitx5-remote
mode
(g:fcitx5_remote
is set):
- fcitx5-remote
If you are using fcitx5-rime
(which has its own state),
let g:fcitx5_rime = 1
in your .vimrc
.
The FcitxCurrentIM()
function can be used to get current
IM's name.
Links:
Warning:
- If you use Vim in terminal, to avoid the Esc delay, please set
'ttimeoutlen'
to 100 or some other value. And check screen'smaptimeout
or tmux'sescape-time
option if you use it too.
在离开或重新进入插入模式或搜索模式时自动记录和恢复每个缓冲区各自的输入法状态,以便在普通模式下始终是英文输入模式,切换回插入模式时恢复离开前的输入法输入模式。
D-Bus 只在同一用户时有效,所以使用 sudo vim
时本代码就失效了。在 fcitx5-server
分支有一个实验性的版本支持 sudo vim
的用法。
本插件默认会使用 Python 3 并通过 D-Bus 来切换输入法状态。
但如果你在加载插件之前设置了
g:fcitx5_remote
为你已安装的 fcitx5-remote
可执行文件的路径,那么本插件会使用它来切换输入法状态;此模式下本插件并不需要
Python。
如果你没有其他使用 Python 的 Vim 插件,本插件的 Python
模式初始化可能会显著拖慢启动时间;而 fcitx5-remote
模式则没有这个问题。Python 模式会在切换时更快。
基本要求:
- fcitx 5
使用 Python 模式的要求(未设置 g:fcitx5_remote
):
- 带有 Python 3 支持的 Vim
- python-dbus 包
使用 fcitx5-remote
模式的要求(需设置
g:fcitx5_remote
):
- fcitx5-remote
如果使用 fcitx5-rime
(它自己有输入状态),在
.vimrc
中设置 let g:fcitx5_rime = 1
。
FcitxCurrentIM()
函数可以用于获取当前输入法的名字。
链接:
注意事项:
- 终端下请设置 Vim
'ttimeoutlen'
选项为较小值(如100),否则退出插入模式时会有较严重的延迟。同样会造成延迟的还有 screen 的maptimeout
选项以及 tmux 的escape-time
选项。 - 请在 fcitx5-configtool
中确认英语是第一个输入法,中文是第二个输入法,rime 用户可能需要设置
g:fcitx5_rime = 1
。
其他插件替代方案
- alohaia/Fcitx.nvim :
纯
Lua
编写的插件 - h-hg/fcitx.nvim:
纯
Lua
编写的插件 - rlue/vim-brabraic:
纯
vim script
编写的插件
注意:由于这些插件我并没有一一测试,所以请大家自行决定如何选择使用。