laishulu/emacs-smart-input-source

性能问题

dian-yu-luo opened this issue · 14 comments

环境 : Windows + imselect
配置 (use-package sis
:config
(sis-ism-lazyman-config "1033" "2052" 'im-select)
(sis-global-respect-mode t)
(sis-global-context-mode t)
)
问题描述
当敲前置键的时候例如 C-x 或者C- c
会 卡顿一下 如果立马后续点击,会识别不到 .例如
比如 连续快捷键 (("C-c n f" . org-roam-node-find)
因为C-c之后没有立刻切换英文,n 会识别不到

这个没有办法,调用外置的切换工具,开销就是大。
什么时候windows上的emacs内置了输入法切换API,
那就OK了。

MacOS上的Emacs Mac Port,就是这样,
内置了输入法切换API。

https://emacs-china.org/t/emacs-28-0-windows/12350
28准备内置IME模块进行 输入法切换,请问 您有接下来适配的计划吗

如果windows上的emacs内置了输入法切换API,
可以内置到sis里面自动适配,
用户也可以通过配置自己去适配。

(defun emacs-ime-disable ()
  (interactive)
  (w32-set-ime-open-status nil))

(defun emacs-ime-enable ()
  (interactive)
  (w32-set-ime-open-status t))

现在window能够内置这些功能了,但是原谅我能力不够,请问我需要做哪些更改才能把我定义的上面两个函数应用进 sis ,谢谢

@dian-yu-luo 我看到你在emacs china上也问了。

我晚上给你写一个吧,就几句话的事。
但是我没有你这个环境,没法测试。

这个windows ime api是官方的,
还是民间自己做的?

w32-set-ime-open-status 这个api 是官方的,但是现在只在28及以上版本有,从源码层次直接调用了ime.dll
我写的这个是用于测试,简单的几个函数,(我还以为大佬嫌我烦了,好久没理我)

十分感谢

缺一个获取当前ime的api
盲猜是w32-get-ime-open-status
返回值是什么?
nilt?

w32-get-ime-open-status is a built-in function in ‘C source code’.

(w32-get-ime-open-status)

Return non-nil if IME is active, otherwise return nil.

IME, the MS-Windows Input Method Editor, can be active or inactive.
This function returns non-nil if the IME is active, otherwise nil.

Probably introduced at or before Emacs version 28.1.

在配置里加上:

(setq sis-english-source nil)
(setq sis-other-source t)
(setq sis-do-get #'w32-get-ime-open-status)
(setq sis-do-set #'w32-set-ime-open-status)

其实这里还有个不确定,
中文输入法状态下:w32-get-ime-open-status 返回的non-nil值是什么?
如果不是t的话,倒数第二句需要改成:

(setq sis-do-get (lambda ()
                    (if (w32-get-ime-open-status)
                        t
                        nil)))

丝滑的感受,没有问题的 ,再次感谢

啥?你这么快就用上了?

刚才那个问题你还没有回答我呢:

中文输入法状态下:w32-get-ime-open-status 返回的non-nil值是什么?

抄好了代码就能用上了,根据测试效果来看,应该返回值就是t
https://emacs-china.org/t/emacs-28-0-windows/12350 这个论坛里面的讨论,而且他的测试代码也给是写成t

有空我把他内置到lazyman config中。