Native & OS 输入法管理包『sis』使用交流

使用github官网的配置

       (sis-ism-lazyman-config "1033" "2052" 'im-select)) 
       (sis-global-cursor-color-mode t) ; 不同语言输入法下光标颜色
	    ;; enable the /respect/ mode
		(setq sis-respect-evil-normal-escape t)
	    (sis-global-respect-mode t)
	    ;; enable the /context/ mode for all buffers
	    (sis-global-context-mode t)
	    ;; enable the /inline english/ mode for all buffers

和Evil配合时发现个问题:

1、在insert-state是中文输入状态,按ESC进入normal-state自动切换到英文正常,按i返回insert-state也被切换为英文了,而不是恢复先前的中文;

2、从emacs-state按C-z进入normal-state,没有自动切换到英文,是只识别ESC键吗?

3、Evil配置中增加 (defalias 'evil-insert-state 'evil-emacs-state) ,将insert-state替换为emacs-state后,要按2次ESC进入normal-state才会自动切英文。

环境:Windows 10, 原生GNU Emacs 28.2,无配置框架。

我们来排除一下
A. 首先,排除这种情况:

Tips:

  1. For spacemacs, if it works in the hybrid mode, some of the evil related features may not work. Change to vim mode instead.

B. 进入insert mode是会自动根据上下文判断语言并自动切换的。如果你是在英文字母中按i,确实不会自动切换到中文。

跟按键无关。是由evil状态变化的hook启动的。见:

sis中只处理了evil-insert-stateevil-normal-state,由evil自带的hook启动sis相关功能,见上文的代码链接。你用的这个evil-emacs-state并没有牵涉到。

我抄官网的配置,和你这个差不多,发现从中文切到英文很容易,返回却不行。比如文本内容是“中文”,在后面输入空格,会自动切到英文,回删空格会自动切到英文,但如果不回删,只是移动光标,又不会自动切换了。

刚才验证了一下,确实是B这种情况。

那这条,从emacs-state按C-z进入normal-state,没有自动切换到英文,可能是什么原因造成?还需要在配置中再写一遍 (add-hook 'evil-insert-state-exit-hook #'sis-set-english)吗?

我已经切换到了librime 配合rime 输入法了,macos 切换速度快有那种同步延迟。

evil-insert-state和evil-emacs-state是两个不同的state啊,你在evil-emacs-state相关的hook里加就行了

不清楚有哪些hook,示例一下?

在这里提的需求,sis中是否有实现?readme文档未提及。环境:Windows 10,GNU Emacs 28.2。

B这种情况,根据字符中英文状态自动切换输入法,设置(sis-global-inline-mode -1) 也不能禁用。

比如文本内容是“中文”,在后面输入空格,会自动切到英文

这个是inline mode,在中文中在线输入英文,完了再回到中文,整个过程不需要手工切换输入法。不少用户特别喜欢这个功能。你要是不喜欢的话,不开inline mode就行了。

其实英文中在线输入中文也可以,有相关的变量可以控制。

你如果不希望根据上下文自动切换人相应的输入法, 可以自己定制:

  1. sis-context-fixed:指定切换到某个固定的输入法,见 https://github.com/laishulu/emacs-smart-input-source/blob/fa795514cdeff7e3ab054fa8977997d99d49b1a5/sis.el#L126

2.sis-context-detectors:用自己的上下文检测子,见

嗯,设置了(sis-global-inline-mode -1)中英文输入中切换是禁用了,因为我在用的过程中发现是输完英文,移动光标到中文字符,它不会自动切到中文,就是变回英文很容易、变回中文难,不太适应。

从normal回到insert,有变量能控制不根据光标处字符直接恢复输入法吗?

如果你用GUI的话,可以用emacs mac-port,自带原生的输入法相关的api,不需要外部的切换工具,那个就很丝滑了。

brew tap railwaycat/emacsmacport
brew install emacs-mac --with-modules --with-rsvg --with-imagemagick --with-natural-title-bar
1 个赞

在实际用的时候,由insert-state回到normal-state就是正常的,由emacs-state回到normal-state不是马上自动切到英文,要在normal-state下多按一次esc才切换,奇怪。

这是你不会用哈。。。

中文 English之后,你输入两个空格,或者回车,再看看。
这个是默认的设计,但是每个人的习惯不一样,
你可以通过变量控制前后空格,几个空格触发切换等等
当时一边写这个包,一边在这里收集用户反馈,
这块的变量极其多和灵活,没有发现覆盖不了的使用习惯。

有啊,我之前回复过了,下面这个回复里面的第一条

我前面说了,代码里面没有处理过emacs-state(这个是啥东西?我不知道啊,是evil里面的么?),你可以参照代码自己重新定义一下相关的变量和函数。