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

M-S-RETC-S-RET 分别映射到了什么函数?

C-S-<return> runs the command
org-insert-todo-heading-respect-content (found in
org-mode-map), which is an interactive byte-compiled Lisp
function in ‘org.el’.

It is bound to C-S-<return>.
M-S-<return> runs the command org-insert-todo-heading (found
in org-mode-map), which is an interactive byte-compiled Lisp
function in ‘org.el’.

It is bound to M-S-<return> and M-S-RET.

我观察到按M-S-RET的时候执行的是切换而不是切换至英文,可能和输入法的shift切换有关。

你要有需求的话,就自定义 sis-context-triggers这个变量。

('+org/insert-item-below 'sis--context-line nil)

意思是,在'+org/insert-item-below函数执行前后,分别用你指定的函数来检测上下文,nil的话让检测链上后面的函数去决定,非nil的话就确定你想切换到什么输入法。本例中,在函数'+org/insert-item-below 执行前用'sis--context-line 检测上下文,'+org/insert-item-below 执行后不检测。

1 个赞

找到问题所在了,可能是输入法为了适配C-S-<tab>的快捷键,对于C-S一律忽略掉其中的Shift,而没有对M-S进行同样的处理,导致当我按下M-S-<return>的时候,先触发emacs内置函数,松开Shift之后输入法识别为一次长按Shift的过程,触发输入法内置的中英文状态切换快捷键。

解决方法也很简单,关掉输入法内置的Shift,改用Windows内置的Ctrl+Space切换中英文状态。

更新了新版的 Squirrel 也就是 Mac 上的 rime,现在有个问题必现,在我设定的 mode 中进入 meow 的 insert-mode 自动切换到中文,在一个 buffer 中,第一次切换是成功的,然后退出到 meow 的 normal-mode 再次进入 insert-mode 后就会还是英文输入法,但是 menu-bar 上的图标是 Squirrel。

macism 偶尔切换失败的问题,就是 menu bar 上输入法 icon 在中英文间反复横跳的问题。我改了一个版本,感觉没啥问题了。

func select() {
        let currentSource = InputSourceManager.getCurrentSource()
        if currentSource.id == self.id {
            return
        }
        
        TISSelectInputSource(tisInputSource)
        usleep(InputSourceManager.uSeconds)
        
        if self.isCJKV {
            if let nonCJKV = InputSourceManager.nonCJKVSource() {
                TISSelectInputSource(nonCJKV.tisInputSource)
                usleep(InputSourceManager.uSeconds)
                
                let newCurrentSource = InputSourceManager.getCurrentSource()
                if newCurrentSource.id == nonCJKV.id {
                    InputSourceManager.selectPrevious()
                } else {
                    TISSelectInputSource(tisInputSource)
                }
            }
        }
    }

我也提了 pr 了 Fix issue where the intended switch to Chinese input method defaults to English after multiple toggles by LuciusChen · Pull Request #17 · laishulu/macism · GitHub 用了两天没有失误的情况出现。

merge 了

[update]
brew也更新了,可以直接装。

1 个赞

很奇怪,我装了 sis 之后重启 emacs,返回报错:

Debugger entered–Lisp error: (void-function sis-ism-lazyman-config) (sis-ism-lazyman-config “com.apple.keylayout.ABC” “im.rime.inputmethod.Squirrel.Hans”)

但是我通过 C-h a 查询,是能找到 sis-ism-lazyman-config 的

是不是你调用sis-ism-lazyman-config函数的语句,放置的位置不对?就是说,package载入之前你就调用了?

没事,解决了,群组里的 taka 提示我,配置要这么写:

(use-package sis :ensure t
  :init
  (sis-ism-lazyman-config
         "com.apple.keylayout.ABC"
         "im.rime.inputmethod.Squirrel.Hans")
  :config
  (setq sis-default-cursor-color "#cf7fa7"
       sis-other-cursor-color "orange")
  ;; enable the /cursor color/ mode
  (sis-global-cursor-color-mode t)
  ;; enable the /respect/ mode
  (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
  (sis-global-inline-mode t)
)

又发现一个小问题想请教:

sis 我设置这里差不多成功了,有一个问题是,evil-mode 模式下,按下 i 或 o,切换到 insert 状态时,输入法没法跳回中文。我看了一下配置,就是按照官方的方式配的。没改动

(use-package sis :ensure t
  :config
  (sis-ism-lazyman-config
         "com.apple.keylayout.ABC"
         "im.rime.inputmethod.Squirrel.Hans")
  (setq sis-default-cursor-color "#cf7fa7"
       sis-other-cursor-color "orange")
  ;; enable the /cursor color/ mode
  (sis-global-cursor-color-mode t)
  ;; enable the /respect/ mode
  (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
  (sis-global-inline-mode t)
)

跳英文没问题,跳中文不行是吧?
这种一般是你的输入法切换工具有问题。

你是苹果系统,并且emcas不是用的emacs mac port的话,
你要安装macism,并且注意在macos弹窗中授权辅助功能。

可能第一次用,一开始配置好 sis 之后,还需要 sis-swtich 来切换一下在不懂模式下的输入法,这样子就能保证 sis 记得在什么模式下用什么输入法。

另外一个导致这个现象的原因是输入法本身的设置:经过我的观察,输入法实际上可以对应 evil 的不同模式进行切换,但问题是在 Insert 模式下,Rime 会自己切换到英文输入法。然后我发现这锅不应该让 sis 背,在 Rime 的设置里,发现开发者为它设计了一个特别的模式,检测到当前光标在 Emacs,会自动切换成英文。

我把这个设置注释掉之后,就正常了。

这个是不需要的。sis默认是在进入insert模式时,检测光标位置的上下文,自动切换输入法。比如: 在中文句子中,切到中文输入法;在英文句子中,切到英文输入法。

不过你已经解决了就好。

对,第一次用不熟悉,不小心执行了命令 sis-set 之类的,导致之前在不同模式下的输入法乱套了。

我用的 port install emacs-app ,29.4,今天装了 sis 后,按照提示授权后,通过 gui 启动 emacs (在 Application 目录点击 emacs 图标启动),sis 似乎不生生效,执行 M-x sis-get
返回为空,sis-switch 也没有切换输入法。但是我切换到 /Applications/MacPorts/Emacs.app/Contents/MacOS 目录下,在终端启动 ./Emacs,就没有问题,sis 都正常。

困扰好久了,有没朋友清楚这个问题是啥原因,怎么解决。

问题找到了,是 mac 上 emacs 的环境变量的原因,macsim 所在的目录是在我加载 sis 后再加入到 PATH 和 exec-path 里的,结果就出现我上面描述的现象了。这个 sis 能否做一个提示,第一时间没从这方面想,胡乱定位了好久。

想到一个问题啊:可能99%的人,都是用brew来安装macism,完了是装在/usr/local/bin下,应该是不存在这个问题的。

你用port的话,macism是手工下载到本地,才有这个问题。这也是从没有人遇到过这个的原因。不过我还是加到注意事项里为好。

不过既然用了 port,应该也不需要 macism 吧,port 那边的 emacs-mac 本来也不需要。

port那边的emacs-mac是emacs mac port (EMP)?