厉害啊,发给我测试一下
还没写完。昨天只是验证了可行性。
思路是这样的:
- 系统的Win-{SOMEKEY},无惧输入法。
- 用
AutoHotKey(AHK)
,将系统的Win-{SOMEKEY},转换成C-x @S SOMEKEY,其中@s可以通过命令行传递。 - 其中C-x之后要sleep 200毫秒,等
smart-input-source
切换到英文输入法。 - 经过3之后,@s {SOMEKEY}都可以英文方式从
AHK
发到Emacs
。 - Emacs里面:C-x @s 映射成Super键。
下面是Win-i分别在英文和中文输入法下的效果。
看起来可行,等你正式版出来我再试试。
Perfect!!! windows 7 + emacs 26.3 + 外部输入法RIme
感觉做到了 manateelazycat 提到的三个核心功能
其实,我觉得做到三点就足够了:
1. 配置好 smart-input-source 后,用户可以通过 toggle-input-method 命令手动切换输入法状态
2. 自动记住Buffer的输入法local状态
3. 激活输入法,但是不输入中文时,用户可以使用任何Emacs快捷键而不被输入法吃掉
这三个核心功能实现,既能利用系统默认输入法,又能实现pyim/emacs-rime这些包的优点。
除了楼主 todo计划里的的同buffer不同window切换时输入法状态记录
(use-package smart-input-source
:init
(setq smart-input-source-external-ism "im-select.exe") ; for windows 命令行切换输入法工具
(setq smart-input-source-english "1033")
(setq-default smart-input-source-other "2052")
:config
;; M-x 绑定命令为smex时
(add-to-list 'smart-input-source-preserve-save-triggers 'smex)
(add-to-list 'smart-input-source-preserve-M-x-commands 'smex)
;; enable the /respect/ mode
(smart-input-source-global-respect-mode t)
;; enable the /follow context/ and /inline english/ mode for all buffers
(smart-input-source-global-follow-context-mode t)
(smart-input-source-global-inline-english-mode t)
;; enable the /follow context/ and /inline english/ mode for specific buffers
;; :hook
;; (((text-mode prog-mode) . smart-input-source-follow-context-mode)
;; ((text-mode prog-mode) . smart-input-source-inline-english-mode))
)
刚才试了试 跟 @aqua0210 说的一样, C-x C-g
及 C-c C-g
开log一切正常,不开log就有问题, 我感觉是有一条 log 语句输出后对程序有影响,回头我逐条log输出语句试一下
还有一个中文状态下 C-x h
全选后,再 C-g
也是不能恢复状态
"pre@[normal]: []@key [smart-input-source--prefix-override-handler]@cmd [*scratch*]@buf [t]@override"
"Input source: [2052] => [1033]"
"post@[prefix]: []@key [smart-input-source--prefix-override-handler]@cmd [*scratch*]@buf [nil]@override"
"pre@[sequence]: [h]@key [mark-whole-buffer]@cmd [*scratch*]@buf [nil]@override"
Mark set [2 times]
"post@[sequence]: [h]@key [mark-whole-buffer]@cmd [*scratch*]@buf [nil]@override"
"Key sequence ended"
"pre@[normal]: [a]@key [keyboard-quit]@cmd [*scratch*]@buf [t]@override"
Quit
"post@[normal]: []@key [keyboard-quit]@cmd [*scratch*]@buf [t]@override"
这个我能复现。应该很快解决。
C-x h
全选后 再 M-w
复制后,也不能恢复,这种特殊情况应该还有挺多的太复杂了
C-x C-g
有时是会恢复状态的 此时
minibuffer 会出现 C-x C-g is undefined
这条信息,应该是smart-input-source包引起的 C-h C-g
也是一样
正常情况下,按下 C-x C-g
是 出现 Quit
这个信息的
就是这样子,中文状态下 按下 C-x C-g
出现 Quit
时不会恢复状态,出现C-x C-g is undefined
时会恢复状态
哇靠,我 emacs -Q
C-x
立刻按下 C-g
, minibuffer 出现 C-x C-g is undefined
C-x
停顿一下直到 minibuffer出现C-x-
,后 再按 C-g
此时出现 Quit
这是什么情况???
=======
刚才试了下 应该是这种情况,按下 C-x
停顿一下minibuffer出现 C-x-
后,
此时再按下 C-g
则不会恢复输入法状态
按下 C-x
立刻 按 C-g
会恢复输入法状态
当开启 log-mode 时,按下 C-x
后,无论停顿不停顿,message buffer 记录都是 C-x C-g is undefined
,所以开启log后,完全没有问题
============
C-x C-g
是组合键
C-x
停顿后再C-g
,这两个不是组合键,所以没恢复?
C-g
感觉这个东西还是比较特殊的,不知道该怎么理解
刚才又更新了一下,修复了一些问题。
smart-input-source-preserve-M-x-commands
这个彻底不用了。删掉就行。
=====
我刚才查出来了我这边的情况,并没有出错,是期待中的行为:
C-x C-g 这个没问题,会自动恢复。
因为这个组合键是一个整体,被映射到一个函数上。
C-x h C-g这个,有时候是中文,有时候会切换到英文
因为 C-x h已经是一个映射到函数上的组合键了。
到此 C-x前缀已经结束。
后面的C-g跟它无关了,是一个新的命令
我这里是绑定到了evil-escape
。
如果C-x h前是insert模式,这里就会切换到英文。
如果C-x h前是normal模式,原来的输入法保持不变。
这个都是期待中的行为。
我这里没有这种区别。
可否把你的配置给我一份?
我这里一直不能重现这些问题。
目前最让我迷惑的就是
你们两位都遇到开关log-mode的不同表现了。
刚才使用最新的github测试 C-x C-g
C-c C-g
功能均正常了
还是有个小问题。
按下 C-x 后快速按 b 有时b还是会被输入法截获,弹出输入法选词窗口
好像是输入法没有及时切换成英文状态
按下 C-x 后,待minibuffer 出现 C-x- 提示时或者看输入法状态切成EN时,再按 b , 则正常。
最近更新 (push 'smex+ smart-input-source-preserve-M-x-commands)
这条不工作了,直接提示没这个变量。 M-x, C-g 没法恢复中文。
另外C-x,C-g 和 C-c,C-g 正常了。
删除了以后并不支持我的M-x ,C-g 没法恢复了。原来用那条命令的时候是好的。