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

win7 + emacs26.3 + RIME+im-select.exe 表现完美!!!如果各个平台都表现完美,gayhub上怎么也得拿500颗星星吧。等稳定了可以把中文说明也搞一下

感谢大佬 :+1: :+1: :+1:

基本上没有什么大的功能计划了,只是一些小fix了。

@BlindingDark

你自己无需fork以保留这个PR了:

最新版,我加了两个变量。
现在,要啥都有。

1 个赞

报告:

org-capture 写完内容C-c C-c 后。

回到原来的文件,如果原来的文件是汉语,normal模式仍然是汉语。

C-c C-c 之前,是汉语输入法,还是英语输入法?
是根据这个来的。
跟是不是normal 模式没有关系。
然后 exit insert state的时候,会自动切英语。
如果C-c C-c 从insert切换到了normal,
那就是先自动切英语,然后自动恢复C-c C-c前的汉语。

如果是这种情况的话,我想一个办法,可以让你控制。

=====配置不兼容更新=====

配置中
所有的 smart-input-source-inline-english-*
都需要去掉english,变成smart-input-source-inline-*

原因是,
增加了个可选特性(默认关闭):
英文上下文中,SPC SPC 激发在线中文区域。 两者可以同时启用。

;; 默认是t
(setq-default smart-input-source-inline-with-english t)
;; 默认是nil,而且prog-mode不建议开启
(setq-default smart-input-source-inline-with-other t)

evil下,想执行命令,一般需要切为normal模式。

normal模式下,一般不需要中文输入。

如果上面假设成立,可否硬性设置为:只要当前文件是normal模式,一概都改为英文状态?

谢谢!

可以加这个判断。

直接粗暴加判断,可能会使其他操作出现不期望的行为。
因此,我需要更清楚地知道你的操作过程:

  1. 原来的文件(记为a) 进入org-capture之前的:evil state,输入法
  2. 通过什么操作打开 org-capture的
  3. org-capture 通过什么操作退回到a的(C-c C-c)?
  4. 这个时候a是evil normal, 中文输入法

doom evil下正在用汉语编写a文件时,进入nomal模式,按SPC n n,进入org-capture,输入中文内容,完成输入后,C-c C-c,退回a文件。a文件仍是normal模式,输入法继续为中文模式。

在config里面加入下面的语句就行了

(push 'org-capture smart-input-source-preserve-save-triggers)

意思就是spc n n切换了buffer,这个时候,
应该在这命令前记住原来的buffer里面的input source

你要是打开smart-input-source-hint-mode的话,能看到下面的提示:

Loading /Users/mao/.site/init.el (source)...done
Doom loaded 230 packages across 58 modules in 1.761s
Smart-Input-Source-Preserve-Hint mode enabled
Loading /Users/mao/.emacs.d/.local/cache/recentf...done
Starting new Ispell process /usr/local/bin/ispell with default dictionary...
Undo-Fu-Session discarding undo data: file length mismatch
Clipboard pasted as level 4 subtree
!! cmd [org-capture] switched a.txt to CAPTURE-journal.org, add it to ‘save-triggers’?
Wrote /Users/mao/org/journal.org
"journal.org" 16L, 454C written
Smart-Input-Source-Preserve-Hint mode disabled

成功,原来这就是之前说的大杀器。谢谢

@chinhant
刚更新了一版,
hint mode以前会提示三个,
但有两个没有必要,
现在只提示一个。

@chinhant

'org-capture我加到默认值里了,
所以你自己的配置中可以删除了。

以后还有别的命令需要加入的话,
可以报给我。
如果足够通用,我会加到默认值里。

@goumao 如果只是想运行 prefix 命令(如 C-x、M-x 等)的时候,临时切换到英文,其它时候还是系统当前输入法, 可以支持么?

@opsnull

你开respect mode,别的不开。
不过 cusor color mode,我还是建议开的。

这样,C-x, M-x等的时候,自动切到英文。
返回的时候,
原来的buffer是什么输入法,就恢复到什么输入法。

这个包整的太复杂了,我试了第三次还是没搞懂怎么用。

我的用法: 一个快捷键切换local buffer的输入法状态,Emacs内置快捷键切换Buffer后,每个Buffer保持各自的输入法状态

完成这个需求要怎么设置?

自己绑定 smart-input-source-switch 这个command就可以了。

  1. smart-input-source-global-respect-mode
  2. smart-input-source-save-triggers 内置了一些命令。用这些命令切换,每个buffer各自的输入法都是可以记住的。
  3. 如果你有些操作下buffer的输入法没有保持,那么你可以开smart-input-source-hint-mode,重新操作一下,这个mode会提示你,哪些命令可能需要自己通过配置加到smart-input-source-save-triggers 里去。

@manateelazycat 猫哥,你可以参考下我的配置,因为我Emacs就是基本上用的你的emacs配置,我测试过Mac 正常使用,Linux应该没问题。

(when (eq system-type 'darwin)
  (setq smart-input-source-english "com.apple.keylayout.ABC")
  (setq-default smart-input-source-other "im.rime.inputmethod.Squirrel.Rime"))

;; enable the /respect/ mode
(add-to-list 'smart-input-source-prefix-override-keys "C-z")
(add-to-list 'smart-input-source-prefix-override-keys "s-x")
(add-to-list 'smart-input-source-preserve-save-triggers 'awesome-tab-backward-tab)
(add-to-list 'smart-input-source-preserve-save-triggers 'awesome-tab-forward-tab)
(add-to-list 'smart-input-source-preserve-save-triggers 'awesome-tab-backward-group)
(add-to-list 'smart-input-source-preserve-save-triggers 'awesome-tab-forward-group)

(smart-input-source-global-respect-mode t)

(add-to-list 'smart-input-source-preserve-save-triggers 'smex+)

;; 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)

;; Input source specific cursor color
(add-hook 'smart-input-source-set-english-hook
          (lambda ()
            (setq current-input-method nil)
            ))

(add-hook 'smart-input-source-set-other-hook
          (lambda ()
            (setq current-input-method "rime-smart")
            ))

我刚刚把 bury-buffer 和 unbury-buffer 加到 smart-input-source-save-triggers 里面并没有记住buffer的输入法状态。

而且我认为 smart-input-source-save-triggers 的这种实现方式太复杂了,提供一下我的思路:

  1. 每个Buffer默认都是英文输入状态
  2. smart-input-source-switch 命令的时候,给Buffer做一个local variable记住输入法的状态
  3. 只用在Buffer Switch的hook做监控(具体可以参考EAF Hook实现),如果Buffer切换的时候,根据 local variable 的状态调用输入法命令

按照第三步的设计,这样不论什么命令,只要切换了Buffer都会自动切换输入法状态,完全可以去掉 smart-input-source-save-triggers 这种设计了。

2 个赞