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

试了下 melpa 版 Version: 20200623.304 的没有这个问题,但是没法切换, 在 eshell 中执行 macism 可以

  1. 不放到初始化脚本里面,而是手工运行 smart-input-source-global-respect-mode 能不能正常?
  2. emacs --debug-init 能给出什么信息?

也不行,

Debugger entered--Lisp error: (void-variable global-respect-mode)
  smart-input-source-global-respect-mode()
  (progn (smart-input-source-global-respect-mode))
  eval((progn (smart-input-source-global-respect-mode)) t)
  elisp--eval-last-sexp(nil)
  #f(compiled-function (eval-last-sexp-arg-internal) "Evaluate sexp before point; print value in the echo area.\nInteractively, with a non `-' prefix argument, print output into\ncurrent buffer.\n\nNormally, this function truncates long output according to the\nvalue of the variables `eval-expression-print-length' and\n`eval-expression-print-level'.  With a prefix argument of zero,\nhowever, there is no such truncation.\nInteger values are printed in several formats (decimal, octal,\nand hexadecimal).  When the prefix argument is -1 or the value\ndoesn't exceed `eval-expression-print-maximum-character', an\ninteger value is also printed as a character of that codepoint.\n\nIf `eval-expression-debug-on-error' is non-nil, which is the default,\nthis command arranges for all errors to enter the debugger." (interactive "P") #<bytecode 0x427bc439>)(nil)
  #f(compiled-function (&rest _it) #<bytecode 0x1fff396991d1>)()
  eval-sexp-fu-flash-doit-simple(#f(compiled-function (&rest _it) #<bytecode 0x1fff396991d1>) #f(compiled-function (&rest args2) #<bytecode 0x1fff37a3a0b5>) #f(compiled-function (&rest args2) #<bytecode 0x1fff37a39fd1>))
  eval-sexp-fu-flash-doit(#f(compiled-function (&rest _it) #<bytecode 0x1fff396991d1>) #f(compiled-function (&rest args2) #<bytecode 0x1fff37a3a0b5>) #f(compiled-function (&rest args2) #<bytecode 0x1fff37a39fd1>))
  esf-flash-doit(#f(compiled-function (&rest _it) #<bytecode 0x1fff396991d1>) #f(compiled-function (&rest args2) #<bytecode 0x1fff37a3a0b5>) #f(compiled-function (&rest args2) #<bytecode 0x1fff37a39fd1>) #f(compiled-function (&rest args2) #<bytecode 0x1fff37a3c74d>))
  ad-Advice-eval-last-sexp(#f(compiled-function (eval-last-sexp-arg-internal) "Evaluate sexp before point; print value in the echo area.\nInteractively, with a non `-' prefix argument, print output into\ncurrent buffer.\n\nNormally, this function truncates long output according to the\nvalue of the variables `eval-expression-print-length' and\n`eval-expression-print-level'.  With a prefix argument of zero,\nhowever, there is no such truncation.\nInteger values are printed in several formats (decimal, octal,\nand hexadecimal).  When the prefix argument is -1 or the value\ndoesn't exceed `eval-expression-print-maximum-character', an\ninteger value is also printed as a character of that codepoint.\n\nIf `eval-expression-debug-on-error' is non-nil, which is the default,\nthis command arranges for all errors to enter the debugger." (interactive "P") #<bytecode 0x427bc439>) nil)
  apply(ad-Advice-eval-last-sexp #f(compiled-function (eval-last-sexp-arg-internal) "Evaluate sexp before point; print value in the echo area.\nInteractively, with a non `-' prefix argument, print output into\ncurrent buffer.\n\nNormally, this function truncates long output according to the\nvalue of the variables `eval-expression-print-length' and\n`eval-expression-print-level'.  With a prefix argument of zero,\nhowever, there is no such truncation.\nInteger values are printed in several formats (decimal, octal,\nand hexadecimal).  When the prefix argument is -1 or the value\ndoesn't exceed `eval-expression-print-maximum-character', an\ninteger value is also printed as a character of that codepoint.\n\nIf `eval-expression-debug-on-error' is non-nil, which is the default,\nthis command arranges for all errors to enter the debugger." (interactive "P") #<bytecode 0x427bc439>) nil)
  eval-last-sexp(nil)
  funcall-interactively(eval-last-sexp nil)
  call-interactively(eval-last-sexp nil nil)
  command-execute(eval-last-sexp)

回复错了

最新的git 还是不会恢复输入法状态,加油 感觉 就差临门那么一脚了 :+1: :+1: :+1:

other

@emacle @aqua0210

C-x, b C-g 这个问题解决了

请用最新的git版

@goumao 遇到了个奇怪的 bug,同时使用 yasnippet,eaf,和 smart-input-source,开启 eaf 后,eaf 会把自己的按键绑定到所有 mode 上,按绝大部分按键都会提示 command can only be called in an EAF buffer!
这个是我在 emacs -q 下可以复现的配置。

(package-initialize)
(package-refresh-contents)
(package-install 'use-package)

(use-package yasnippet
  :ensure t
  :config
  (yas-global-mode))

(use-package eaf
  :load-path "/eaf/path")

(use-package smart-input-source
  :ensure t
  :init
  (setq smart-input-source-external-ism "fcitx5-remote")
  :config
  (smart-input-source-global-respect-mode t)
  (smart-input-source-global-inline-english-mode t))

执行 M-x eaf-open-browser 随便打开个网页之后,再切换回别的 buffer,会发现 C-n C-p 什么的都不能用了,提示 command can only be called in an EAF buffer!

这三个包任意两个配合使用都没问题,三个一起开就出事儿了😂️,最近 eaf 和 smart-input-source 都有更新,之前是好好的,我一时半会儿排查不出来是哪里的问题。

如果谁也碰巧用了这三个包,暂时办法就是不开 global mode:

:hook
(((text-mode prog-mode) . smart-input-source-inline-english-mode))

经过测试,有新的问题:

  1. 光标颜色在用过C-x,b后就没法自动显示为黄色了。需要手动执行一些输入法切换(我这里是shift)
  2. C-x,b 会把当前buffer的输入法状态带到目标输入法。

操作步骤如下:

开始之前,确认buffer A 和 B 都是英文输入法,这时 C-x,b 随便切换,不改边输入法状态。正常。

  1. Buffer A ,切换为中文输入法 ,光标为黄颜色。正常
  2. C-x, 光标变为红色, 按b 进行切换到 Buffer B,这时的buffer B 是中文输入法,但是光标为红色。
  3. 在buffer B 手动切换为英文,再切回中文,光标才变回黄色。 4 再重复 第一步的操作,结果同上,这样循环。

smart-input-source会把自己的前缀键绑定放到最前面,
毕竟它只是个前处理,最后的绑定执行还是交给别的包处理的。

这些包都会写这个变量:emulation-mode-map-alists
下面这个变量配置何时触发把smart-input-source提到前面:
smart-input-source-prefix-override-recap-triggers

哦哦哦,
我只测了 C-x, b C-g
以为完美了。 :joy:

那我再继续完善

请求协助:

  • 对象:非 evil 用户
  • 内容:follow-context 的意思是,当你把光标挪到一个新的地方时,根据上下文自动判断输入法。比如:你原来是在英文状态,但你把光标插入到两个汉字之间时,自动转换成中文状态。本package提供了一个变量 smart-input-source-follow-context-hooks ,如果开启了smart-input-source-follow-context-mode,就会在相应的时机触发。对于evil用户,很简单,那个变量预置了evil-insert-state-entry-hook,当进入插入模式时,就follow context一下。但是native emacs用户希望的是什么时机,我一无所知。希望你们能给一些线索。

尝试这样使用,不行。这个应该是怎么配置呢?

(push 'eaf-mode smart-input-source-prefix-override-recap-triggers)
(add-to-list 'smart-input-source-prefix-override-recap-triggers 'eaf-mode)

我这里也发现了,输入法是对的,但是光标颜色不对,是吧?

这和 push 也没啥区别啊

是的。一样的。
你把 respect-mode关掉。其它能正常工作么?

将 'eaf-mode 加入这个列表中还是出问题 :joy:
关掉 respect-mode 可以正常工作

好像解决了,感谢!

对,中文书法对应到了红色。

我的理解是这样的:buffer B 的中文输入法是被buffer C-x,b 后强制改成的中文,所以buffer B的的光标并没有启动设置输入法颜色的hook。

补充:你们都用什么动图软件?我用QQ录屏保存的动图太大了,25M 没法上传。

那我再研究一下。。。。
有点奇怪。

你用doom还是什么的?
如果是doom,配置我拿过来,更容易重现问题。

gif brewery