本文来自依云's Blog,转载请注明。
Fcitx 输入法自动切换
在离开/重新进入插入模式时自动切换输入法状态,以便在普通模式下始终是英文输入模式,切换回插入模式时恢复离开时的输入法输入模式。状态为每个缓冲区单独保存,所以在中文文档和英文代码间交叉跳转编辑也得心应手!
无需任何配置!
要求:
fcitx 版本 3.6 以上,建议 fcitx 4.0 以上。建议关闭 fcitx 的预编辑输入功能,否则在 GVim 中可能会有问题(见评论;最新 git 版 fcitx 已经能够在 GVim 中自动禁用预编辑输入)。
注意事项:
1. Python 3 或者 Python 支持以获得更快更好的效果。注意对于 vim 版本<7.3.288,如果同时编译了 Python 2 & 3 支持,因为此 vim 不能同时运行两个版本的 Python,而本脚本首先检查 Python3,所以会导致出错或者 Python 2 不可用。
2. 终端下请设置 Vim ttimeoutlen
选项为较小值(如100),否则退出插入模式时会有较严重的延迟。同样会造成延迟的还有 screen 的 maptimeout
选项以及 tmux 的 escape-time
选项。
如果你需要跨主机使用 fcitx.vim,请参考此文。
开发:
https://github.com/lilydjwg/fcitx.vim
安装:
解压到 ~/.vim 下即可。如果没有并且不准备使用 Python 接口,可只将 so/fcitx.vim 放到 ~/.vim/plugin 目录下。
Oct 08, 2011 12:50:37 AM
多谢..!!
Oct 08, 2011 01:18:01 AM
这个好哇,一直在用呢。fcitx 4.1.2的fcitx-remote也有所改变,以前是变英文,现在是直接关闭输入法。
Oct 08, 2011 01:24:35 AM
搞错了,它是把界面隐藏了。。。不是关闭。
Oct 08, 2011 07:33:03 PM
我现在用的是小小输入法,就是yong。有没有可能也做到这种切换?
Oct 08, 2011 08:41:19 PM
这取决于 yong 有没有提供相应的接口了。
Oct 09, 2011 03:09:39 PM
Great! 这个插件也是我离不开fcitx的原因之一。。
Oct 10, 2011 07:25:01 PM
一个小问题,在输入的时候中文输入,可是ESC之后再成为命令模式之后可是还是出先中文,
fcitx版本,4.1.2
vim版本 7.3
谢谢
Oct 10, 2011 07:53:04 PM
我猜想你说的“命令模式”是指“插入模式”?
fcitx.vim 的设计是这样子的,在某个 buffer 离开插入模式时是什么输入法状态,回到插入模式时就是什么输入法状态。
如果你只要离开插入模式时关闭输入法的话:
au InsertLeave * silent !fcitx-remote -c
Oct 10, 2011 09:30:06 PM
就是比如说按i进入输入模式,此时用fcitx输入中文,再ESC键回到命令模式,也就是hjkl移动在的那个模式,ps:也称正常模式吗?
我希望此时命令模式完全就是英文的,应该就是lz的插件的作用吧,不知道是不是我配置有问题
Oct 10, 2011 09:32:40 PM
额,貌似是可以了,等等一下,速度太快,貌似需要反映时间,谢谢
Oct 10, 2011 09:54:59 PM
呃,那个模式叫“普通模式”,你没看过中文的vimtutor或是文档吗?”命令模式“难道是vi时代的称呼?
Oct 10, 2011 09:56:28 PM
你的没 Python 支持吗?为加快反应速度,我才弄的 Python 版本呢。
Oct 11, 2011 06:48:32 PM
爽的一塌糊涂!非常感谢!
Oct 11, 2011 11:53:13 PM
我还没顶啊
顶起!顶起!
凡是需要处理中文的地方,这个插件是对我影响最大的一个。
Oct 12, 2011 11:14:53 PM
把小小改成fcitx试用下。
提个问题:没有独立的github repo吗? 那似乎就不能用vundle更新最新版了。
Oct 12, 2011 11:31:34 PM
所有发布到 vim.org 的脚本都自动拥有 github repo 的哦 ;-)
https://github.com/vim-scripts/fcitx.vim
Oct 13, 2011 12:46:47 AM
那个我是知道的,但是我想要dev channel的啊。。。
Oct 13, 2011 10:35:12 AM
独立的话太麻烦了。。。而且这个插件估计再有什么变化也是因为 fcitx 的接口发生了变化,那时我会第一时间更新到 vim.org 的。
Oct 24, 2011 10:05:24 AM
非常感谢!我有个小问题,当我用Ctrl+c离开插入模式时,不会自动切换输入法,而按Esc可以切换,为什么会这样呢
Oct 24, 2011 11:34:15 AM
因为Ctrl+c跟Esc本来就不是等价的。fcitx.vim是依靠InsertLeave 和 InsertEnter两个事件的自动命令来进行自动切换,而insert模式下的Ctrl_C是quit insert mode, 不是Leave. 你:help i_Ctrl_c看下就知道了。
Oct 24, 2011 11:49:35 AM
明白了。看帮助文档之后才知道原来可以用Ctrl_[代替Esc,谢谢Fermat:)
Dec 17, 2011 11:37:50 PM
vim 要编译有python支持才能使用此插件吗?
因为启动时出现如下提示:
fcitx.vim: 没有 Python 支持,尝试使用旧版本。
系统中已经安装有python2/3。
Dec 17, 2011 11:49:16 PM
要编译有 python 支持才能使用更好的 Python 接口版本,否则只好用 VimScript 调用数次 fcitx-remote 命令了。
Feb 10, 2012 10:15:20 PM
还是继续用小小,
这里有小小的作者的vim 输入法切换配置。你可以放到你的插件里。
http://yong.dgod.net/read.php?tid=64
Feb 10, 2012 10:26:48 PM
不加。检测用的是什么输入法太费时了。而且,我做这个插件的目的在于「高效」,但是它这个用的是 system() 调用。
唉,我真想直接调用 Xtest 来取代 im* 选项算了。。。
Feb 10, 2012 11:47:12 PM
也好,而且这个输入法目前的vim切换还存在问题。
Apr 13, 2012 02:10:39 PM
gvim fcitx 在启动嵌入预编辑字符的时候,这个插件不起作用。当离开插入模式时,输入法自动就关掉了,以后也不能恢复过来。
Apr 13, 2012 02:32:35 PM
我这里正常。你可能需要去除 GVim 对输入法的 hack——https://github.com/lilydjwg/myvimsrc/commit/87e01b99f43b081610f7e89e6640054b6926165c
May 05, 2012 09:27:19 AM
可以的.见小小官方论坛说明,不过只能在*nix系统下使用
Jun 03, 2012 03:01:12 PM
请教下,我用的ubuntu12.04源里面的vim-gnome包,安装好后vim版本是7.3.429。无法使用这个插件的python接口功能,只能用里面so文件夹附带的脚本。用这个脚本在推出插入模式的时候非常的卡,有时要有时按两三次ESC才有作用。
请问该怎么解决阿?
Jun 03, 2012 04:24:41 PM
Esc 的延时问题是在终端里才有的吧?你回头再去看看下载页的说明,需要设置下 'ttm' 的值的。
你从源里安装的 Vim 的 :ver 输出中关于 Python 的部分是怎样的?
Jun 03, 2012 11:59:23 PM
在gvim中按 Esc 也会有延迟,有时要按几下才有用。python版本的就是为了使这 个过程更快而编写?我不能用也。。。。
源里的没有加入python3,输出如下:
:ver
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 4 2012 04:22:36)
包含补丁: 1-429
修改者 pkg-vim-maintainers@lists.alioth.debian.org
编译者 buildd@
巨型版本 带 GTK2-GNOME 图形界面。
可使用(+)与不可使用(-)的功能:
+python -python3
Jun 04, 2012 12:36:23 AM
这样应该能用啊,你 :echo has('python') 的结果是 1 么?
如果 gvim 中也有延迟的话,是不是你映射了 Esc 开头的键?
Python 版本主要是为了:
1. 更智能地找到通信用的 socket;
2. 减去创建进程等的开销。
Jun 04, 2012 12:55:37 AM
是1阿,有的。
哦,下的是1.1那版本。
你写的“解压到 ~/.vim 下即可。”。
解压后的目录结构:
fcitx
----plugin
---------fcitx.py
---------fcitx.vim
----so
---------fcitx.vim
我老实的解压哦。这哈才发现要将fcitx-->plugin-->fcitx.py和fcitx.vim都丢在.vim-->plugin下才可以用。
安装过的vim插件都是解压后自动丢进合适的目录中。。...
Jun 04, 2012 01:10:46 AM
我刚刚试过了,没有最上层的 fcitx 的呀,是不是你的解压软件自动创建的?
Jun 04, 2012 01:22:27 AM
我用的tar -xzvf阿。。。。难道我是点的坛子里的链接下的。。。。。
哇,你也喜欢熬夜阿。。。打扰你了哦。。。我真笨。。
Jun 04, 2012 01:52:46 AM
不是「喜欢」,是「习惯」……
Jul 19, 2012 08:03:47 PM
这两天debian unstable下的vim再也启动不起来了,无论终端还是gui,终端报错symbol lookup error:init_ssl。网上找了一圈,老外的论坛说是vim和python2.7.3-2有冲突,降级回去2.7.2-10也不行,尝试发现vim启动有-V选项可以逐一加载插件,结果发现到fcitx.vim就悲剧了,vim.org上的最新版也不行
系统是debian unstable amd64,kde 4.8.4-1,vim 7.3.547-3
version内容
+arabic +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent +clientserver +clipboard +cmdline_compl +cmdline_hist
+cmdline_info +comments +conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con_gui +diff +digraphs +dnd -ebcdic +emacs_tags +eval
+ex_extra +extra_search +farsi +file_in_path +find_in_path +float +folding -footer +fork() +gettext -hangul_input +iconv +insert_expand
+jumplist +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap +lua +menu +mksession +modify_fname +mouse +mouseshape
+mouse_dec +mouse_gpm -mouse_jsbterm +mouse_netterm -mouse_sysmouse +mouse_xterm +mouse_urxvt +multi_byte +multi_lang -mzscheme
+netbeans_intg +path_extra +perl +persistent_undo +postscript +printer +profile +python -python3 +quickfix +reltime +rightleft +ruby
+scrollbind +signs +smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary +tag_old_static -tag_any_white +tcl
+terminfo +termresponse +textobjects +title +toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace
+wildignore +wildmenu +windows +writebackup +X11 -xfontset +xim +xsmp_interact +xterm_clipboard -xterm_save
系统 vimrc 文件: "$VIM/vimrc"
用户 vimrc 文件: "$HOME/.vimrc"
用户 exrc 文件: "$HOME/.exrc"
系统 gvimrc 文件: "$VIM/gvimrc"
用户 gvimrc 文件: "$HOME/.gvimrc"
系统菜单文件: "$VIMRUNTIME/menu.vim"
$VIM 预设值: "/usr/share/vim"
编译方式: gcc-4.6 -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include
-I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/includ
e/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -g -O2 -
fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -I/usr/include/tcl8.5
-D_REENTRANT=1 -D_THREAD_SAFE=1 -D_LARGEFILE64_SOURCE=1
链接方式: gcc-4.6 -L. -Wl,-z,relro -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-z,relro -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0
-latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0
-lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -L/usr/lib -llua5.1 -Wl,-E -fstack-protect
or -L/usr/local/lib -L/usr/lib/perl/5.14/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python2.7/config -lpython2.7 -lpthread -ldl -luti
l -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions -L/usr/lib -ltcl8.5 -ldl -lpthread -lieee -lm -lruby-1.9.1 -lpthread -lrt -l
dl -lcrypt -lm -L/usr/lib
Jul 19, 2012 09:52:01 PM
请运行 gdb vim,然后输入 r 并回车。Vim 应当会异常退出。请把退出后 gdb 给出的消息以及输入 bt 并回车后的消息贴上来看看。
Jul 20, 2012 10:03:39 AM
删掉fcitx.vim就好了,安装这个插件就不行
按你说的输入r后的信息
/usr/bin/vim: symbol lookup error: /usr/bin/vim: undefined symbol: init_ssl
[Thread 0x7fffeef5b700 (LWP 3599) exited]
[Inferior 1 (process 3598) exited with code 0177]
bt在哪里输入?gdb么?输入后信息
No stack.
Jul 20, 2012 02:19:09 PM
你在 Python 中输入 import ssl 以及 import _ssl 呢?
Jul 20, 2012 02:20:35 PM
嗯,import _ssl 能成功不?我发现在 import socket 时会 import 这个。
Jul 20, 2012 02:45:40 PM
ssl _ssl socket三个import都成功,没有错误提示
Jul 20, 2012 04:54:58 PM
在 Vim 里 :py import _ssl 呢?
你的 Vim 是自己编译的还是官方仓库里的?如果是仓库里的,都是最新的吗?试试在当前 Python 版本下(不要升级或者降级)重新编译 Vim?
Jul 20, 2012 09:46:42 PM
vim里:py import _ssl也出问题了,奇怪的退出,还影响终端稳定性,最后连终端都要退
vim是debian仓库中最新的,源是163的debian sid和unstable。安装的vim-gtk和依赖的包,没有安装vim,但是终端里可以用vim,也有gvim。
我没用apt编译过源码,回头用空试试吧~
Jul 26, 2012 09:24:10 PM
今天升级更新了vim就好了
Jul 28, 2012 05:40:01 PM
不好意思啊,又发现个问题,下载的最新的1.2版来用,发现在终端的vim中有效,vim-gtk中无效~请问依云用的vim-gtk还是vim-gnome啊?
Jul 28, 2012 08:33:37 PM
我用的是我自己编译的 gvim,「陈列室」里有一些编译好的 Arch 包。
你是不是开启了预编辑功能(默认开启,输入时编码会带下划线地出现在客户端窗口)?如果开了的话,按快捷键 Ctrl-Alt-P(默认)关掉之再试。或者到 vim_dev 邮件列表找补丁。
Jul 29, 2012 12:45:05 AM
还真是这个原因,不过为什么终端里没问题呢~预编辑这功能挺好用的~fcitx现在也越来越强了(只是奇怪的找不到shift快速切换中英文状态功能了)~vim_dev邮件列表找补丁这种东西完全不会搞,太复杂了,以后用不同的系统迁移也困难……
Jul 29, 2012 12:12:33 PM
因为终端里的输入法归终端管呗。
要用 Shift 键切换的话,在「全局配置」->「快捷键」里设置「额外的激活输入法快捷键」即可。相关改变参见 fcitx 的邮件列表。
Jul 29, 2012 02:28:19 PM
只能这样啊,不能变绿还是有些不习惯~邮件列表真心不会搞
Sep 02, 2012 04:31:01 PM
沒搞明白怎麼使用……支持fcitx-rime?
Sep 02, 2012 05:16:39 PM
放到指定的位置就可以了,支持 fcitx,当然包括了 fcitx-rime 啦。PS: 最新版打包时把 so/fcitx.vim 忘记了……
Sep 10, 2012 01:28:27 PM
是不是因为忘了 so/fcitx.vim 就导致失效了?
Sep 10, 2012 02:18:42 PM
可能是吧,如果 vim 没有 Python 支持的话。
Sep 10, 2012 02:22:42 PM
我也是刚发现我的 Vim Python 支持没正确安装,正在重新编译,问题出在「configure.in 中 vi_cv_path_python」上。
May 29, 2013 10:33:34 PM
你好,我用这个插件的时候的怎么没有效果
我在终端输入fcitx-remote 结果返回Not get reply
May 29, 2013 10:37:34 PM
请贴 fcitx-diagnose 结果。
PS: 不要贴这里。找个专用网站,比如 http://paste.ubuntu.org.cn/
May 30, 2013 10:42:35 PM
!..囧..!我把系统更新了下,然后重装了fcitx 又好了 ,问题无法复原了
Sep 03, 2013 09:56:25 PM
依云你好,你写的插件很好用,非常感谢!不过如果你不介意的话,我有一条建议和一个疑问。
我用openSUSE 12.3和从官方源下载的gVim 7.3时发现,当gVim退出输入模式后,fcitx输入法会自动关闭,再次输入时需要重新开启。我看了你的博客评论,发现第27楼和第40楼的讨论里有解决办法——只要按<alt-ctrl-p>关闭预编辑功能就行。或许可以把这条提示加入博客和GitHub的说明里?
另外,我发现fcitx输入法的图形设置界面里包含大量选项,但是我只能看懂很少的一部分,你知道哪里有更详细的说明吗?我根据ArchWiki提供的链接找到三个网页,但是帮助不大。先谢谢了!
https://wiki.archlinux.org/index.php/Fcitx
Sep 03, 2013 10:28:11 PM
更新啦。github 上的得等那脚本什么时候去重新抓了。
fcitx 的选项看名字差不多知道是干什么的啦,如果还是不清楚就找人问好了。XMPP/gtalk 群、IRC、相关邮件列表、论坛都可以的。
哦对了,还有 fcitx-im.org 官方 wiki,不过编辑太少了。
Sep 05, 2013 09:01:44 PM
感谢回复!我调整了一些能看懂功能的fcitx选项,目前用起来没什么问题~
Oct 12, 2013 11:24:57 AM
我使用的是 ibus google pinyin,可以使用你这个脚本么
Oct 12, 2013 11:47:12 AM
不行。ibus 也有 dbus 接口,你可以照着写一个类似的脚本。或者你换用 fcitx 的 googlepinyin ;-)
Oct 12, 2013 03:22:37 PM
谢谢回复了,我还是使用ibus google 拼音吧。fcitx 的 googlepinyin 这个我之前安装一直有问题。目前我还是个小白,关于写脚本我还要慢慢学习
Feb 12, 2014 03:39:44 PM
不知道为什么之前使用mint的时候设置了ttimeoutlen之后终端下就可以退出了,而gvim不用设置就可以正常工作了。但是现在换成了opensuse,不管怎样退出插入模式总是有很大的延时,连gvim也一样
Feb 14, 2014 08:21:23 PM
我刚测试过 opensuse 的 gvim-7.4.169-1.1.x86_64.rpm 了,没有复现这个情况呢。
你的 gvim 版本是?使用 gvim -N -u NONE 命令启动,然后 :runtime plugin/fcitx.vim 试试呢?
Feb 18, 2014 09:39:18 AM
感谢回复。我的是opensuse 13.1,vim版本是7.4.052-1.1-x86_64。这个问题已经解决了。是/etc/vimrc这个文件有问题,我直接sudo mv /etc/vimrc /etc/vimrc.bak就解决掉了。
Feb 18, 2014 09:41:35 AM
感谢回复。我的是opensuse 13.1。这个问题已经解决了。是/etc/vimrc这个文件有问题,我直接sudo mv /etc/vimrc /etc/vimrc.bak就解决掉了。
Jan 04, 2017 01:47:30 PM
非常感谢你的插件!
我第一次装上后发现不能使用.. 折腾了一下找到的问题是我把拼音作为 fcitx config 里的第一序位, 而你的插件做的输入法切换似乎是切换为第一序位而非判断哪一个是英文. (很抱歉我还没有能力读具体的实现代码), 不知道算不算设计思路上的一个 bug
Jan 04, 2017 02:17:47 PM
这是 fcitx 的设计。从某个版本开始,fcitx 会要求第一个输入法为键盘输入法,并且切换键会在第一输入法和另一你选定的输入法之间切换。
如果你运行 fcitx-diagnose,它会检查你的第一个输入法是不是键盘输入法,并且在不是的时候警告你。
Jan 18, 2017 08:06:19 PM
超级好用啊!!!
May 24, 2017 04:54:55 AM
您好,不知道为什么不起下载了以后不起作用
Ubuntu 16.04
fcitx version: 4.2.9.1
vim version 7.4.1689
ttimeoutlen = 10
解压到 ~/.vim 后打开运行 Vim, 插入模式用中文输入后,切回普通模式还是中文。
fcitx-diagnose 输出在这里:
https://bpaste.net/show/258a4f3151a1
May 24, 2017 10:51:46 AM
你的 vim --version 输出呢?
你用的 GUI 版本 gvim 还是终端版本?如果是终端版本,那么终端里的 env 输出是怎样的呢?
May 24, 2017 10:59:52 AM
刚去 vim.org 上发了个新版。如果你用的是 vim.org 上的版本可以更新一下。
May 24, 2017 01:09:06 PM
啊搞定了,输vim发现没装vim...
可是好奇怪,vi 打开显示的是 Vi Improved,版本号也一样,但居然没有安装Vim?
总之谢谢大佬了!插件好好用!
May 24, 2017 01:49:02 PM
因为 vim 在编译时有很多可选特性。一般发行版会带一个叫 vim-tiny 或者 vim-minimal 的精简版,就像 vi 一样。而我们一般使用会用 huge 版本。你可以在 Vim 里输入「:help :ver」来看详细介绍。
May 24, 2017 04:10:12 PM
谢谢!
Oct 12, 2017 08:24:51 PM
能支持neovim吗?
Oct 12, 2017 09:25:24 PM
它不支持 neovim 吗?我上次尝试 neovim 的时候没遇到问题呀。
Oct 12, 2017 11:06:22 PM
之前用vim好好的,今天刚换到neovim,然后就没有效果了。。
Oct 12, 2017 11:11:00 PM
啊,我错了XD。。之前测试的时候用sudo nvim了,现在可以了。。