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

smart-input-source 很好用,但是在我的 Mac 上有个奇怪的问题,就是每次从 emacs 切换到其它应用,再切换回来时,emacs 总是会自动将输入法变成搜狗输入法,即便是切换之前的输入法是英文输入法。我用的是 emacs-mac-port 版本的 emacs,已经安装了 macism,设置里面授权也都打开了。

@nujabse

  1. 优先使用emacs-mac-port,没有必要装macism,装了也不会被用到。不过,你用TUI的时候,就会自动使用macism。EMP的API只支持GUI。
  2. 你说的这种情况,那就是bug了。我瞧瞧~~~

感谢作者深夜回复,我试试卸载 macism 重装下 smart-input-source 试试。非常感谢您对改善 emacs 中英混输体验所做的贡献!

跟macism没有关系,你留着也没什么不好,万一TUI用呢?
你反应的,应该是个bug。
我还没去试~~~

==== 更新 ====

我复现了你的问题:
如果这个选项enable了, 就会出现你所说的问题。
我看看怎么解决~~~

==== 更新 ====
有办法了,等我消息~~~
明天我实现一下
问题不大

1 个赞

再提个问题,原生emacs,当前buffer输入法为中文,使用 C-s isearch-forward 或 C-r isearch-backward 的时候,进入minibuffer后,能否先自动转换成英文状态?

我这边现在也有同样的问题,好像以前的版本这个是没问题的,没怎么留意。不是Minibuffer 一直都是自动切换为英文的吗?

难道现在不是么?我看看。
如果不是的话,那就是有bug。

=== 更新 ===
复现了。我来查查~~~

我想起来了,以前我就在别的现象时检查过。
屏幕底下显示的那个,其实不是minibuffer :joy:
其实一直是在主buffer中,没有离开过
进入和退出minibufer的hook都不进。

仅仅就这一种情况来讲,
你在中文输入法中,最自然的方式当然还是搜索中文啊,
不切换输入法是对的。

当然
如果你用evil-pinyin这样的包,用汉语拼音搜索汉字,
这个时候,你确实想自动切换成英文输入法
但是,这个是比较私人的用法,不应该内置在sis中

我会做一个机制,可以方便的配置这一块
但是配置本身,还是用户来做,不默认在sis中

不确定我理解的用法是不是和你们的一致
还请你们反馈一下。

确实有些道理,但是 C-s这些还是搜索英文多一些,代码毕竟是英文的多一些。

这样能做个开关是最好了,自己需要就自己配置。这种边缘情况还是挺多的,以前版本的 smart-input-source-preserve-save-triggers 这样的就挺好的

i-search 搜索我一般都是搜索英文的,没用过pinyin搜索,请问下像evil-pinyin这样的包是输入中文进行搜索,还是输入拼音进行搜索?。

输入拼音首字母,搜索汉字
比如:输入sr,搜索输入.

而且,支持不同的码表,可以动态加载。
小鹤双拼啥的,社区都给做进去了。

搜索定位超方便。
但是,只有evil用户可以用啊。。
原生用户,其实可以移植,
但没有人做这个事

我看了下 lazyman-config 的实现:

  1. 这里应该有个 bug,当 do-set函数中 source 状态为 1 的时候应该对应输入法状态为英文,因此这个时候应该是要切换输入法吧,那么相应应该执行 fcitx -o 吧。
  2. 我不是很明白 start-process 函数的第三个参数设置,这里应该是指定调用的外部程序,按照前面的定义,这里不应该为 external-ism 吗,为什么直接就是 -ism?
  3. source 这个变量从哪定义呢?

最后,在 config 中加入 (setenv “LC_CTYPE” “zh_CN.UTF-8”) 的话,在 emacs 里执行 locale 命令确实可以发现 LC_CTYPE 的值发生了变化,但是 fcitx 并不能被调用,也就是说必须在 emacs 启动的时候就给他传递 LC_CTYPE=zh_CN.UTF-8。

感谢回复,解开了不少的疑惑。问题解决了。 这个包是好包,但是不同的人用会遇到不同的问题。 说明文档最好是加个常见的FAQ

@emacle @aqua0210

经实现了。config里面加入这两行:

  (setq smart-input-source-preserve-go-english-triggers
        (list 'isearch-forward 'isearch-backward))
  (setq smart-input-source-preserve-restore-triggers
        (list 'isearch-exit 'isearch-abort))

是的,文档是个大工程,慢慢来。

你可能理解错了。 source是切换的目标输入法。这里的source是input source的意思。不是source/destination的source的意思。为"1"的时候,是关闭输入法。所以是-c.

你理解的没错,-ism其实就是external-ism,只不过是完整路径。

这个变量是package里面调用的时候传进去的。是切换的目标输入法。

那你就在emacs启动的时候把这个值传进去。

我建议的配置不行?
我再研究研究
不过,这块跟本package的实现是没有关系的。
完全是用户边的因素。

==== 更新 ====
@Sollovin

经过实验,
setenv 传递的环境变量可以正常被start-process的子进程使用。
所以,你那边还是需要仔细检查一下,
到底是什么问题。

==== 更新 ====
我在准备一个英文locale的linux环境
完了我看一下我这边setenv使用fcitx行不行。

==== 更新 ====
fcitx-remoteLC_CTYPE 等等locale有关的环境变量都是无关的。
我在命令行和emacs里面在英文locale里面,都可以正常切换,无需设置环境变量
所以,你的问题不是出在这儿。
你自己在命令行用 fcitx-remote -cfcitx-remote -o 试一试。

另:你不会fcitx没开吧???
这个package只会帮你操作fcitx-remote
fcitx-remote 再控制fcitx的。
正常的话,linux早就把fcitx以daemon方式起来了

isearch 可以正常自动切换到英文了 :+1:

我先测试了下 start-process,这个是可以用的,然后我的 fcitx 也是启动了的:

然后说一下 setenv 的问题,我这边我试了三种情况:

  1. 不传递 LC_CTYPE=zh_CN.UTF-8 启动 emacs,同时不设置 (setenv “LC_CTYPE” “zh_CN.UTF-8”) ,这样的话在 emacs 中运行图片上那四条命令返回 0 0;
  2. 不传递 LC_CTYPE=zh_CN.UTF-8 启动 emacs,但是设置 (setenv “LC_CTYPE” “zh_CN.UTF-8”) ,执行四条命令同样返回 0 0;
  3. 传递 LC_CTYPE=zh_CN.UTF-8 启动 emacs,显然不论是否设置 (setenv “LC_CTYPE” “zh_CN.UTF-8”),有返回结果 1 2。

另外,我测试发现 -set-english 函数是有效果的,也即可以将 fcitx 状态由 2 切换至 1 。但是为什么其他功能有问题我可能还要再看看。

注:我现在在用 spacemacs,会与这个有关吗?

多谢,顺道请教一下 isearch-exit ,isearch-abort 这两到底有啥区别,为什么两个都写,跟C-g有关系吗?看函数说明看不懂。。。

用spacemacs的人挺多的,
用linux的人也挺多的,
并且linux的人主要是fcitx和fcitx5,
用ibus的少,
都没人报过类似的问题。

我对fcitx不熟悉,不太清楚LC_CTYPE对他的影响。 但是,

  • 我这边测试时,emacs里面的环境变量可以传到start-process启动的进程里面去。
  • 在emacs外面的终端中,我把LC_CTYPE设成en_US.UTF-8fcitx-remote仍旧可以正常操控输入法。

你的反馈中信息很多,贴图中的那个terminal,

  • 是emacs自带的,还是emacs之外的?
  • LC_CTYPE默认是en_US.UTF-8么?

我觉得你的这个问题,
是在emacs中启用fcitx的问题,
还没到跟本package产生关系这一步
你手工用OS的快捷键来切换是什么结果?

我猜测,
如果emacs启动时不加环境变量,OS快捷键也是不行的。

exit是正常退出吧。abort是被取消了,比如c-g。