[ANN] fcitx-remote-for-windows 发布

代码写好一段时间了,但最近我没有太多时间可以用在这个 project 上,看到 这个帖子,于是先把这个版本发布,有需要的同学可以拿去使用。

构建环境: VS 2013

使用: fcitx-remote 实现了 fcitx-remote -cfcitx-remote -o。其他的选项都相当于 fcitx-remote,即打印出当前的输入法状态。用 VS 打开编译即可。在 Emacs 中做少量配置 fcitx.el 即可使用。见工程主页。

实现:用 SendInput 模拟 win + space 来激活/关闭输入法,打字速度很快的话,有些时候输入法关闭并不及时。有 SSD 的话会好一些。大部分情况下应该都还是比较可用的。

目前状态:接近 60 行 C++ 代码,实现很简单。主力用 Windows 且有兴趣的同学可以考虑一下提高代码。我平时很少用 Windows 写 Windows Desktop 的代码,API 并不非常熟悉。代码有问题到 GitHub 上提 issue。

5 个赞

感谢分享,对于我来说是目前最好的方案,真的解决了中英输入法智能切换的老问题。 按我的使用经验,切换键改成 Alt + Shift 更好,而 Win + Space 在有两个及以上中文输入法就不太好用了,所以可以在项目下载页提供两个版本的二进制文件

让用户自己编译,是不是有点不方便呀,毕竟 window 用户一般习惯用现成的exe

@maoyan 我觉得你的建议是对的,用 Alt+shift 好一些,已经改为默认。

@tumashu 是的,我刚刚发布了两个二进制的文件,可以下载了。

cutejumper,你好,感谢你制作的这个工具! 我刚刚装上了它,但是有些功能还没实现。

我在init.el文件里面加入了下面这段

(add-to-list 'load-path "C:/Users/Administrator/AppData/Roaming/.emacs.d/fcitx.el-master")
(require 'fcitx)


(let ((fcitx-path "C:/Users/Administrator/AppData/Roaming/.emacs.d/fcitx-remote"))
  (setenv "PATH" (concat fcitx-path ";" (getenv "PATH")))
  (add-to-list 'exec-path fcitx-path))


(setq fcitx-active-evil-states '(insert emacs hybrid))

保存,启动emacs并不能自动切换输入法。于是我手动执行mx M-x fcitx-evil-turn-on,这时候从evil的插入模式切换到移动模式输入法可以自动切换到英文。但是再切换到插入模式时,不能自动切换回中文输入法。

请问

  1. 在init.el文件里面如何配置才能让它自动切换?
  2. 从移动模式切换到插入模式,如何能能自动切换回中文输入法?

我的操作系统是windows 7,使用的中文输入法是搜狗拼音。

把这个命令放到你的 init.el 中,在上面那些配置之后放就行。详细的配置参见 GitHub - cute-jumper/fcitx.el: Better fcitx integration for Emacs.

你用什么快捷键切换的输入法?有几个输入法?按两次快捷键能返回原来的状态吗?

没测试 Win 7,也没测试过搜狗,不排除程序本身有问题的可能。

请问这条命令写到init.el文件里应该怎么写?初学EMACS不是很懂。这种m-x执行的命令写到init.el里有固定的转换格式吗?

我平常用Ctrl加空格 但Alt+shift也有效 两次快捷键能返回原来的状态

(fcitx-evil-turn-on)

里面有一个使用 Alt+Shift 的版本。

谢谢回复!

我使用的就是这个版本,只能从搜狗拼音切换到英文,但是不能切换回来。

不错不错,不过fcitx-remote-for-osx已经走入困境了:expressionless:

我没有 Win 7,也不用搜狗,所以没法测试你说的是否是 bug。

GitHub 上有人提过 issue,Rime 输入法只能开启,不能关闭。虽然看上去和你的问题相反,我猜想有可能是类似的问题,是 GetKeyboardLayout(0) 引起的。看其他人是否能够重现这个问题并帮忙解决吧。

Issue 地址: 不能支持 Rime 输入法切换 · Issue #1 · cute-jumper/fcitx-remote-for-windows · GitHub

win8上可以,win7不行,你可以试试cmd直接运行fcitx-remote.exe:

|                      | win8.1           | win7             |
|----------------------+------------------+------------------|
| fcitx-remote.exe     | 返回1或2         | 只有1            |
| fcitx-remote.exe -o  | 打开中文键盘     | 只能中英互相切换 |
| fcitex-remote.exe -c | 打开英文键盘     | 无效             |

然后查看源码 fcitx-remote-for-windows/fcitx-remote.cpp at master · cute-jumper/fcitx-remote-for-windows · GitHub , 发现GetKeyboardLayout 在win7下无效,网上也有讨论 vc判断输入法是中文输入状态还是英文输入状态?-CSDN论坛 ,不是很懂代码,我也就止步在此了

但这样还是能配置可以切换输入法,最后效果也是和win8系统差不多

(defun evil-toggle-input-method-1 ()
  ;; (interactive)
  (shell-command "fcitx-remote -o"))

(defun my/toggle-fcitx (&optional arg)
  (interactive "P")
  (cond
   ((equal arg '(4))
    (remove-hook 'evil-insert-state-exit-hook 'evil-toggle-input-method-1)
    (remove-hook 'evil-insert-state-entry-hook 'evil-toggle-input-method-1))
   (t
    (add-hook 'evil-insert-state-exit-hook 'evil-toggle-input-method-1)
    (add-hook 'evil-insert-state-entry-hook 'evil-toggle-input-method-1))
   ))

(spacemacs/set-leader-keys "oz" 'my/toggle-fcitx)

我把你提供的代码插入到init.el里了,按i、a进入编辑模式依然不能自动从英文切换到中文。 另外我注意到了代码的最后一行和spacemacs有关(不懂代码,我理解是在spacemacs里为fcitx设置的开关)。我没有使用spacemacs,但启用了evil,使用了插件hydra,该如何设置?