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

基本上,所有计划中的事情都做完了,包括文档。
除了以下微调:
当光标处于【英文标点】和【汉字】中间的时候,没有仔细考虑,
目前很多情况下,英文标点都当英文字母来处理。

1 个赞

麻烦再请教一下,我按照文档里设置好了。然后打开emacs的时候,会自动从中文切换到英文,这说明包和输入法的切换都没有问题。但是再编辑文件的时候无法切换成功,比如我在.spacemacs里测试中文后加个空格激活英文 包可以激活英文,但是输入法无法切换过来,这大概是我哪里的配置出了问题呢

你是第一个报这种情况的,不知道什么原因。
你可以自己测试一下:

  1. 在命令行里输入smart-input-source-set-input-source-english,但别按回车
  2. 手工把输入法切换到中文
  3. 在命令行里回车,看一下输入法是否切换回英文。

有两种方案你可以试一下:

  1. 请确保今天早上你升级过。因为直到昨天半夜,我都还在放出新版。
  2. teamviewer,我远程连过去看看。

感谢大佬!经过测试问题已经解决。下面是发现的小问题:

  1. spacemacs下,变量要设置成setq-default,否则无法生效,因为我懂得不多所以不知道是不是特例
  2. spacemacs的editing-style如果设置成hybrid,则在esc退出insert模式时,无法切换成英文。vim模式下工作良好

是的。这个我在老帖子中说过。
我一会给加到 README 中吧~~

是的,多谢提醒,我去改一下文档。
因为一些变量后来改成了buffer local的,
而我自己的话,都是用的默认值,
所以一直没有注意到这个问题

对于那些buffer local的变量,
如果你想在buffer外面给所有的buffer初始化它的值
那就需要用setq-default

head-line 的tab用的什么插件呀?

other

我这里使用了auto-complete补全,inline english里 触发补全后,感觉smart-input-source捕获到了 光标离开区域,导致立即退出了 inline 模式(英文还没有输入完成),能否加个选项禁用光标移动退出inline的行为?

其他的时候非常好用

不知道是哪儿原因,过一段时间后又正常,感觉刚启动Emacs时,inline english 时那个 face特别高和auto-complete候选框一样,不确定到底是不是auto-complete的原因?

centaur-tabs

我这里没有问题啊

Snipaste_2020-06-16_17-53-27

是这样的。

如果实在解决不了,也是个办法。不过最好是直接解决。

你这是刚启动的时候有这个现象,后来就消失了么?
可能有些包还没有载入完全?

你看我这条回复的截屏,并没有这个现象。

如果打算关闭各种规则,搭配evil时只保留2个功能:

  1. 离开insert模式即为英文输入法。
  2. 进入insert模式:插入位置前为中文则为中文输入法,插入位置前为英文则为英文输入法。

从20200415的版本升级到最新的包,新版本使用下面的配置像是没有安装这个包一样,不论是否进出insert模式、插入的位置,原来是什么输入法就是什么输入法。去github的README核对了一下,下面配置里使用的函数的功能相对于旧版本应该是没有改变的。

(use-package smart-input-source
 :config(setq smart-input-source-english-input-source
        "com.apple.keylayout.ABC")
  (setq smart-input-source-other-input-source
        "com.baidu.inputmethod.BaiduIM.wubi")
  
  (setq smart-input-source-english-pattern "a^")
  ; ; (setq smart-input-source-other-pattern "")
  (setq smart-input-source-blank-pattern "a^")
  (add-hook 'text-mode-hook #'smart-input-source-mode)
  (add-hook 'prog-mode-hook #'smart-input-source-mode)
)

替换为github的README里给出的搜狗拼音的示例配置也是没有效果、跟没安装这个包一样。 :sweat_smile:

@Pmacs

你是不是用的spacemacs?
请查看readme中的tips,
一关于spacemacs,二关于 setq-default

另外,你这两个pattern都设置得很奇怪啊。
完全看不懂这么设置的意图。

为什么不用默认的pattern呢?
如果是中英文编辑的话,
这块用默认值就好了,不用改的。

1 个赞

谢谢老哥解惑~

用的不是spacemacs,是从http://github.com/emacs-mirror源码编译的27.0版本。

按你的建议排了一下,果然是需要使用setq-default来设置中文输入法。 :sweat:

旧的版本里的规则切换很不习惯,所以用那两个pattern来关闭各种规则,只保留离开insert模式即为英文输入法。旧版本用这个规则还挺习惯的,哈哈 :upside_down_face:

@Pmacs

新版本把几个功能都做成了独立的mode。
你这种需求的话,只要开两个mode就可以了

(use-package smart-input-source
  :config
  (setq smart-input-source-english-input-source
        "com.apple.keylayout.US")
  (setq-default smart-input-source-other-input-source
        "com.baidu.inputmethod.BaiduIM.wubi")
  (smart-input-source-global-auto-english-mode t)
  (add-hook 'text-mode-hook #'smart-input-source-follow-context-mode)
  (add-hook 'prog-mode-hook #'smart-input-source-follow-context-mode))

新版本的README的usage部分有。

大佬,我在Mac 按你的readme配置,只有中文空格后面自动切换英文生效了,通过buffer记住输入法都没有生效,还是全局统一输入法状态。
另外,请问一下smart-input-source 能否直接切换Rime输入法的中英文状态,而不是切换到另外一个英文输入法,因为我rime中设置了shift切换输入法。

请去github上查看:

  1. 你本地装的是不是最新版?
  2. 有没有按照新版的readme配置:
  (add-hook 'text-mode-hook #'smart-input-source-remember-input-source-mode)
  (add-hook 'prog-mode-hook #'smart-input-source-remember-input-source-mode)

请参照readme上~fcitx~的配置方法: 就是配置smart-input-source-do-get-input-sourcesmart-input-source-do-set-input-source,函数嘛,在里面实现啥都行。当然,前提是rime输入法提供了控制接口。

另外,还有一种方式:如果你用的是macos的话,见这里,禁用rime自己的中英文状态切换,用karabiner,将 单独按下的Left_Shift 映射为 Ctrl+Space,以切换输入法。

1 个赞

我是本地直接从github安装的,配置已经是最新的了。
我用的是macism,原来是rime输入法要用fcitx切换啊?估计是这个问题。

不是不是,你理解错了。

我的啥意思是,你参考fcitx定制那两个函数smart-input-source-do-get-input-sourcesmart-input-source-do-set-input-source的方法。

@aqua0210 另外,上上一条回复,我更新了,不知道你看到了没。

好的,了解了,多谢指点。

问下作者,我是mac,用的是Rime,我离开insert模式可以自动切换成usa输入法,但是重新进入usa无法自动切换回Rime

(use-package smart-input-source
:config
(setq smart-input-source-english-input-source “com.apple.keylayout.USA”)
(setq smart-input-source-other-input-source “im.rime.inputmethod.Squirrel.Rime”)
(smart-input-source-global-auto-english-mode t)
(add-hook 'text-mode-hook 'smart-input-source-remember-input-source-mode)
(add-hook 'prog-mode-hook 'smart-input-source-remember-input-source-mode)
(add-hook 'text-mode-hook 'smart-input-source-follow-context-mode)
(add-hook 'prog-mode-hook 'smart-input-source-follow-context-mode)
(add-hook 'text-mode-hook 'smart-input-source-inline-english-mode)
(add-hook 'prog-mode-hook 'smart-input-source-inline-english-mode))