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

刚刚尝试了最新版本,C-x,b的问题还是是一样。

最新版 smart-input-source-global-respect-mode 会得到 funcall-interactively: Symbol’s value as variable is void: global-respect-mode

配置:

(use-package smart-input-source
  :quelpa (smart-input-source :fetcher github :repo "laishulu/emacs-smart-input-source")
  :hook ((after-init . smart-input-source-global-respect-mode)
         (org-mode . smart-input-source-follow-context-mode)
         (org-mode . smart-input-source-inline-english-mode))
  :init
  (setq smart-input-source-english "com.apple.keylayout.US")
  (setq-default smart-input-source-other-input-source
                "im.rime.inputmethod.Squirrel.Rime"))

这个应该是namespace的兼容性问题。 可能是和你用的一些加速手段不兼容? 我这边再看看

另外,我原来用的是ivy,所以不能复现你们的问题。 我一会改成ido试试。

我用的也是 ivy,尝试 (require 'smart-input-source) 后还是一样

请更新到最新的github版,看是否解决了问题。

ivy 那个,我是指 C-x b 的问题,你也是用的ivy?
namespace的问题,我是指

这个我复现了!
这下好调试了。

之前我测试用的C-x C-g,没有出现问题。
都是靠脑调~~~

这块我最近没有动过。
你以前没问题的话,现在不应该有问题啊

(after-init . smart-input-source-global-respect-mode)
这个确定这样用么?

你放到 :config 里面去呢?

这样也不行,感觉应该也不是 quelpa 装的问题 Version: 20200623.1027

(require 'smart-input-source)
(smart-input-source-global-respect-mode)

试了下 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用户希望的是什么时机,我一无所知。希望你们能给一些线索。