emacs 28.0 windows版原生支持输入法的中英文切换

唉,不知道怎么改帖子的标题,可能是没权限。

你要改成啥标题?我帮你改

请帮忙改为 “emacs 28.0 windows版原生支持输入法的中英文切换”,谢谢!

win10下测试可以,用的第三方五笔输入法,会在中英文状态切换。

这么说 macos 版本下的 gvim 也没有这个功能? :grinning:

macos的vim我用的是macvim。输入法是rime,从insert mode按esc切换到normal mode时,会切换到英文状态。再按i或a进入insert mode就不行,也可能是rime的功能。macvim用得少。

mac下切换中英文状态不如win下方便,只能是rime和英文输入法之间的切换,不知道怎么做到在rime中切换中英文状态。

照着emacs mac port的代码在master分支上稍微改了一下,像windows版一样增加2个系统函数,切换输入法。测试下来不如windows版好用,无法做到rime中切换中英文状态。我的代码写得太垃圾,没commit,自用吧。可以看看论坛里的 smart-input-source 或者用 macism 。

原生输入法切换:smart-input-source

BTW:apple的输入法api的文档极其垃圾,在官网上几年前是有的,后来又取消了,没法查了。无力吐槽水果。对系统开发人员太不友好。

在Windows11的emacs上面试了下(编译版本:https://github.com/kiennq/emacs-build)

$ emacs-version
GNU Emacs 29.0.50 (build 1, x86_64-w64-mingw32)

结果是(w32-set-ime-open-status nil)可以正常将自带的微软拼音切换到英文状态,但是无法通过(w32-set-ime-open-status t)来切换回中文状态。

我之前也尝试过,确实有这个问题。

换成mac后,好久没用windows了,有时间我看看。

不知道这种方法能不能再Linux上实现,即自动切换一种输入法的中文输入和英文输入!!!

十分感谢!不仅可以自动切换Windows10自带的中文输入法,日语输入法也可以切换。

Linux 上直接用 D-Bus 给对应的输入法实现 (fcitx,ibus)发送信息就能切换了,不用内置进 Emacs.

image

为什么我这个一直返回nil,,语言也没有切换过去。

还有想请教一下为什么我用 ImmGetContext ImmSetOpenStatus 一直返回0,,有没有其它api切换中英文。

意思是如果想做一个通过命令行切换中英文的程序是不可能了吗。有没有可能用其它的windowsThread调用(

  1. emacs的版本是28.0.50以后的吗?从官网上下载的应该已经有这个函数了。win10上是ok的。其他版本的windows没测试过。我现在没怎么用windows了。。。

  2. windows的win32 gui编程中,一个程序的输入法是由程序的图形线程来管理的。就是说不能随便在一个线程中调用windows的输入法函数就能控制输入法。emacs主要有2个线程,一个是windows thread,处理gui相关的,如各种自定义的window message。另外一个是lisp thead,也叫main thread,lisp在这个线程执行。所以lisp执行只是发一个自定义的window message,window thread接受到这个message后做相应处理。

1 个赞

@georgealbert 请问一下有没有这样一个命令行工具,可以通过命令行切换输入法的中英文状态?(不是在 Emacs中使用)

另外请教下在哪里可以看到相关的开发文档?

不好意思,不知道windows下有没有这样的命令行工具。

多谢。目前我在Emacs 是用的这个 GitHub - daipeihust/im-select: 📟 Switch your input method through terminal 工具,也是可以在命令行切换。但是这个工具需要安装多种语言,只能用来切换中文输入法和英文,没法切换中文输入法的中英文状态。

似乎没有这种api,我也想弄一个来着,,,, ImmSetOpenStatus 似乎只能在某个窗口进程内使用,,

1 个赞

多谢提供文档,有空去研究一下看看。