(重新设计)中英文混打:OS输入法管理包 smart-input-source

:+1:厉害啊,发给我测试一下

还没写完。昨天只是验证了可行性。

思路是这样的:

  1. 系统的Win-{SOMEKEY},无惧输入法。
  2. AutoHotKey(AHK),将系统的Win-{SOMEKEY},转换成C-x @S SOMEKEY,其中@s可以通过命令行传递。
  3. 其中C-x之后要sleep 200毫秒,等smart-input-source切换到英文输入法。
  4. 经过3之后,@s {SOMEKEY}都可以英文方式从AHK发到Emacs
  5. Emacs里面:C-x @s 映射成Super键。

下面是Win-i分别在英文和中文输入法下的效果。

2020-06-27 10-20-41.2020-06-27 10_34_01

看起来可行,等你正式版出来我再试试。

:+1: :+1: :+1: :+1: :+1: :+1: 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))
  )

你那边有 C-x C-gC-c C-g 之后不能正常复原的问题么?

@aqua0210 那边遇到的问题是:开log一切正常,不开log就有问题。

我这里死活找不到问题。一直悬着。

刚才试了试 跟 @aqua0210 说的一样, C-x C-gC-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模式,原来的输入法保持不变。

这个都是期待中的行为。

@emacle

你说的情况,我再来检查。
不过随着刚才的更新,
一些问题应该已经没有了。

我这里没有这种区别。
可否把你的配置给我一份?
我这里一直不能重现这些问题。
目前最让我迷惑的就是
你们两位都遇到开关log-mode的不同表现了。

刚才使用最新的github测试 C-x C-g C-c C-g 功能均正常了 :+1: :+1: :+1:

还是有个小问题。

按下 C-x 后快速按 b 有时b还是会被输入法截获,弹出输入法选词窗口

好像是输入法没有及时切换成英文状态

按下 C-x 后,待minibuffer 出现 C-x- 提示时或者看输入法状态切成EN时,再按 b , 则正常。

other

最近更新 (push 'smex+ smart-input-source-preserve-M-x-commands) 这条不工作了,直接提示没这个变量。 M-x, C-g 没法恢复中文。
另外C-x,C-g 和 C-c,C-g 正常了。

@aqua0210
哎呀呀,你没注意看我前两条帖子。

那个变量不需要了,删掉就行了。

删除了以后并不支持我的M-x ,C-g 没法恢复了。原来用那条命令的时候是好的。

不需要等待minibuffer出现,
但是,需要你在按b键之前,
im-select就已经完成了输入法的切换。

但由于im-select是外置工具,
如果他的执行比你的b键出来的慢,
那么b就还是被输入法捕获了。

只是我很疑惑啊,
如果im-select这么小的工具,
怎么都要快过你手输入吧,