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

不行,还是复现,insert 状态下手动(C-\)切换,esc 到 normal 状态还是 emacs-rime。 配置:

(use-package sis
  :quelpa (sis :fetcher github :repo "laishulu/emacs-smart-input-source")
  :hook ((after-init . sis-global-respect-mode)
         (text-mode . sis-follow-context-mode)
         (text-mode . sis-inline-mode))
  :config
  (sis-ism-lazyman-config nil "rime" 'native)
  (setq-default sis-inline-tighten-head-rule 0
                sis-inline-tighten-tail-rule 1))

Version: 20200727.2124 不过好像 normal 下 C-\ 切换到 emacs-rime 也不影响光标移动等使用。

ps 我知道了,你是不是又魔改了一种切换方式,貌似是没更新 doom modeline 的状态

并没有。
就是很直观的机制

下面是我的配置

(use-package! sis
  :init
  :config
  (sis-ism-lazyman-config nil "chinese-cns-tsangchi" 'native)
  (sis-global-respect-mode t)
  (sis-global-inline-mode t)
  (sis-global-follow-context-mode t)
  (sis-global-cursor-color-mode t))

(global-set-key (kbd "C-x i") #'toggle-input-method)

对,我去看了下代码也没有,你用 doom modeline 没有这个问题么

我机子上没有emacs-rime, 我用的emacs内置的chinese-cns-tsangchi

不知道这个是啥,我瞧瞧去。
这个冲突?

我看了下 current-input-method 的值,normal 下为 nil,应该是切换过来了。 但是 doom modeline 还是显示的 rime 图标,不知道哪里的问题,睡起来再看了

我看了下,doom 的modeline我开着呢。

  1. 你看下光标颜色改了么?
  2. 你看下如果布偶用rime,用我说的那个内置输入法,有没有这个问题?

==== 更新 ====
@Voleking
重现了,

我想起来了,
我看过evil相关的代码,
是evil做了一些magic

我看我这边能不能解决吧。

=== 更新 2 ===
我把evil这块的功能屏蔽了,
让sis来管
现在我这边测试,这块是没问题的。

进入 *About GNU Emacs* buffer 不是默认英文

没有使用 evil 的 原生 Emacs

  1. 进入 *scratch* buffer里,切换成中文输入法
  2. C-h C-a (对应命令about-emacs),进入 *About GNU Emacs* buffer
  3. *About GNU Emacs* buffer 输入法状态为中文!!!不是默认英文
  4. *About GNU Emacs* buffer 里按 C-h v时 也不正常

这个可能就是 C-h 按下后另一种边缘情况吧,C-h C-aC-h v一样处理了,返回输入法状态了

这个是预期的行为,*开头的buffer,除了*New*Scratch开头的,都不做前缀处理。
当然,这块,用户可以自己定制。

谢谢你的详细步骤,我试试看能不能复现。

我想起来了,多谢多谢

不过我还发现一个很奇怪的 我一会录个屏你看看

可以了,现在没问题了

*About GNU Emacs* buffer

  1. 当窗口高度可以显示Emacs logo(splash)时,不会自动切换英文 error

  2. 当窗口高度小到不能显示 Emacs Logo(splash)时,会自动切换成英文 normal

用的是GUI

GUI下重现了。TUI下没这个问题。我研究一下。

谢谢你的线索。

我刚才看了几个小时emacs自己的fancy-about-screen的代码,也没看出原因。
回头看到这块,稍微不那么盲目了。

我这边也是在不断载入图片

原因找到了没?

我 修改 sis--preserve-post-command-handler 函数强制 about-emacs 命令后设置en成功, 但是if条件结束位置不同,会有不同影响

(defun sis--preserve-post-command-handler ()
  "Handler for `post-command-hook' to preserve input source."
  ;; (setq this-command sis--real-this-command)
  (when sis-log-mode
    (message "post@[%s]: [%s]@key [%s]@cmd [%s]@buf [%s]@override."
             sis--prefix-handle-stage
             (this-command-keys)
             sis--real-this-command
             (current-buffer)
             sis--prefix-override-map-enable))
  (if (string= this-command "about-emacs")
      (sis-set-english) ;; if 若在此处结束,就不能设置成en,貌似与下边代码冲突,会被下边代码覆盖?
    (pcase sis--prefix-handle-stage
      (; current is prefix stage
       'prefix
       (setq sis--prefix-handle-stage 'sequence))
      (; current is sequence stage
       'sequence
       (cond
	(; still in progress
	 (minibufferp)
	 (setq sis--prefix-handle-stage 'sequence))
	(; key sequence is canceled
	 (not sis--real-this-command)
	 (when sis-log-mode (message "Key sequence canceled."))
	 (sis--to-normal-stage t))

	(; end key sequence
	 t
	 (when sis-log-mode (message "Key sequence ended."))
	 (sis--to-normal-stage t))))
      (; current is normal stage
       'normal
       (let ((restore (or (not (eq sis--buffer-before-command (current-buffer)))
			  (memq sis--real-this-command
				sis-preserve-restore-triggers))))
	 (sis--to-normal-stage restore))))))

edit

好像也不行,会不会是因为 C-h C-a 这个序列问题? 在中文状态下,C-h时会进入英文,再按下C-a时 会打开新about Gnu Emacs buffer,这时序列结束,导致在AboutGnu Emacs buffer输入法恢复成中文?

跟这个没关系。
你直接用M-:eval (fancy-about-screen),
问题是一样的。

问题在于这里:
(fancy-about-screen) 命令执行前后,
current-buffer 都是 a.txt
但之后就会变成 About GNU Emacs
我一直没找到什么语句让current buffer变了。
这些代码都和sis无关。

确实很奇怪,按下 C-h C-e 这个序列,结果是正常的

C-h C-a 这个序列确实挺特殊的

不是因为快捷键,你绑定到其它快捷键上也是一样的。 上一条回复我解释了。

M-x 执行 about-emacs,一样有问题。

如果新建一个文件,进入evil的insert模式,输入法此刻是英文的。我看readme中有sis-respect-start的默认值是英文的。如果我想进入insert模式输入法是中文的,需要怎么改啊?

开follow-context-mode,

  • 如果想根据上下文自动判断,这样就够了。

    比如中文^输入 English ^Input

    • 第一个光标^处,会自动切中文
    • 第二个光标处,会自动切英文。
  • 如果想强制中文,在配置中: (setq sis-follow-context-fixed 'other)