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

:grinning: 同感,我看了几次那个图都没看懂。

我建议直接上视频或者动图,这样更直接更简单,理解起来更容易。

在Evil insert模式下,按M-f,M-b移动光标时,反馈不是太及时,按键后大概要0.5秒左右才会移动。另一台机器没装sis,没有这一问题。Profile了下,没看出哪的问题,就这样用吧。很好的package,不用换输入法就能流畅地用evil啦,谢谢。

晕了,我另一台window 7机器上, im-select中英文输入法输出的数字都是一样的。

我在windows上试了下用im-select.exe切换日语输入法和英语。 切换可以正常工作,但是日语(全角状态,日语输入状态)–> 英语 --> 日语切换后, 日语输入法变为半角输入状态(英语输入状态),能让切换回日语后还保持日语输入状态吗? 谁有这方面的经验?

报个bug

这个bug很奇怪. 和evil-mode有联动. 可能单独使用两者, 都不会出现这个问题.

sis的配置:

(use-package sis
  :ensure nil ; sis.el  存放在site-lisp
  :hook (evil-local-mode . sis-global-respect-mode)
  :config
  ; windows平台需要命令行程序im-select 1033 英文2052 中文
  ; lazyman-config语句应在第一行
  (if *is-windows* (sis-ism-lazyman-config "1033" "2052" 'im-select))
  (if *is-linux* (sis-ism-lazyman-config nil "pyim" 'native))
  (sis-global-respect-mode t)
  ;; (sis-global-inline-mode t)
  ;; (sis-global-follow-context-mode t)
  (sis-global-cursor-color-mode t)
  )

一开始注释掉 evil的配置, 不会出问题, 以为是 evil 的 bug. 后来写 issues 时, 单独加载了 evil , 没有问题.

一个个测试, 发现 evil 和 sis 同时加载时, 会有这个问题.

启动emacs后, M-x sis-global-respect-mode 临时关掉 sis-global-respect-mode , 打开 outline-minor-mode, 快捷键显示正常:

M-x sis-global-respect-mode 打开 sis-global-respect-mode , 快捷键就不显示了:

这个不是bug,是预期的行为。

因为C-c和C-x被respect-mode截取了。
(这个叫prefix key,sis支持用户自己配置)
快捷键还是能调用相关的功能
但是,
respect-mode会先拿过去做一些预处理:
比如:你在中文状态下C-c b a,
如果没有respect mode
那么输入法会输入ba的汉字,让你选。
但repsect mode会在你C-c之后,
自动切到英文输入法,
完了再调用原本的C-c快捷键。

原来如此。那为什么有的菜单,还是有部分快捷键能显示出来,不受respect-mode 影响呢?比如 C-c C-r

Snipaste_2020-08-31_11-25-23

快捷键映射表有优先级。
可能他这个放在比较高的优先级上。

在win7 GUI下,emacs --daemon运行,DOOM中用SPC q K退出时,会出现“device 1 is not a termcap terminal device”的问题,导致无法退出emacs。非daemon可以退出。请问大佬知道什么原因吗?我用二分法排查跟sis包有关,配置如下:

(use-package! sis
  :init
  ;; `C-s/r' 默认优先使用英文 必须在 sis-global-respect-mode 前配置
  (setq sis-respect-go-english-triggers
        (list 'isearch-forward 'isearch-backward) ; isearch-forward 命令时默认进入en
        sis-respect-restore-triggers
        (list 'isearch-exit 'isearch-abort)) ; isearch-forward 恢复, isearch-exit `<Enter>', isearch-abor `C-g'
  (setq sis-prefix-override-keys '("C-c" "C-x" "C-h" "M-SPC"))

  :config
  (sis-ism-lazyman-config "1033" "2052" 'im-select) ; 输入码 1033/英文,2052/中文小狼毫
  ;; enable the /cursor color/ mode 中英文光标颜色模式
  ;; (sis-global-cursor-color-mode t)
  ;; enable the /respect/ mode buffer 输入法状态记忆模式
  (sis-global-respect-mode t)
  ;; enable the /follow context/ mode for all buffers
  (sis-global-follow-context-mode t)
  ;; enable the /inline english/ mode for all buffers
  (sis-global-inline-mode t)         ; 中文输入法状态下,中文后<spc>自动切换英文,结束后自动切回中文
  ;; (global-set-key (kbd "<f9>") 'sis-log-mode) ; 开启日志
  ;; 特殊定制
  (setq sis-default-cursor-color "green yellow" ; 英文光标色
        sis-other-cursor-color "#FF2121"        ; 中文光标色
        ;; sis-inline-tighten-head-rule 'all ; 删除头部空格,默认1,删除一个空格,1/0/'all
        sis-inline-tighten-tail-rule 'all ; 删除尾部空格,默认1,删除一个空格,1/0/'all
        sis-inline-with-english t         ; 默认是t, 中文context下输入<spc>进入内联英文
        ;; sis-inline-with-other t
        )              ; 默认是nil,而且prog-mode不建议开启, 英文context下输入<spc><spc>进行内联中文
  ;; 特殊buffer禁用sis前缀,使用Emacs原生快捷键  setqsis-prefix-override-buffer-disable-predicates
  (setq sis-prefix-override-buffer-disable-predicates
        (list 'minibufferp
              (lambda (buffer) ; magit revision magit的keymap是基于text property的,优先级比sis更高。进入 magit 后,disable sis的映射
                (sis--string-match-p "^magit-revision:" (buffer-name buffer)))
              (lambda (buffer) ; special buffer,所有*打头的buffer,但是不包括*Scratch* *New, *About GNU等buffer
                (and (sis--string-match-p "^\*" (buffer-name buffer))
                     (not (sis--string-match-p "^\*About GNU Emacs" (buffer-name buffer))) ; *About GNU Emacs" 仍可使用 C-h/C-x/C-c 前缀
                     (not (sis--string-match-p "^\*New" (buffer-name buffer)))
                     (not (sis--string-match-p "^\*Scratch" (buffer-name buffer)))
                     (not (sis--string-match-p "^\*doom:scra" (buffer-name buffer))))))) ; *Scratch*  仍可使用 C-h/C-x/C-c 前缀
  )

我把TUI相关的那两句注释,可以正常关闭了。能不能麻烦看下当在daemon下使用GUI时,判断条件怎么写。

;; for TUI
(unless (display-graphic-p)
    (pcase sis--current
      ('english
       (send-string-to-terminal
        (format "\e]12;%s\a" sis-default-cursor-color)))
      ('other
       (send-string-to-terminal
        (format "\e]12;%s\a" sis-other-cursor-color)))))
;;;;;;;;;;;;;;;
       ;; enable terminal focus event
       (unless (display-graphic-p)
         (require 'terminal-focus-reporting)
         (terminal-focus-reporting-mode t))

Mac默认的拼音输入法是什么?

找到了,是 "com.apple.inputmethod.SCIM.ITABC"

Hi, 请问能把sis-external-ism设成某个快捷键吗?我现在考虑在rime中将Control+Alt+F2映射到切换英文,Control+Alt+F3映射到切换中文,有没有办法在sis中设成类似(sis-ism-lazyman-config F2 F3 Ctrl+Alt) ?

定制 sis-do-get和sis-do-set函数,
lazyman-config实际上最终落脚也是实现这两个函数。

我在windows 10上使用sis时,会使一些别的程序也被切换成英文输入法了,比如notepad3。搞了快一天可算解决了,有遇到同样问题的可以参考下我的方案。

推测原因:im-select每次切换输入法时,调用GetForegroundWindow函数来确定当前窗口,似乎会将当前活动窗口当作当前窗口,所以切到别的程序时sis如果活动了,就有可能改掉那个程序的输入法。

所以修改了下原im-select,改成3个功能:无参数时获取当前窗口ID;一个参数时输入ID,判断该窗口的输入法,相当于原im-select的无参数情况;同理2个参数时相当于原im-select的1个参数情况。有需要的可至https://gitee.com/retaw/im-select-win下载。

搭配该im-select时,sis可如此设置:

(use-package sis
  :config
  (defun sis--set-winID ()
    (interactive)
    (setq sis-winID (shell-command-to-string sis--ism))
    
  )
  (setq sis-external-ism "im-select.exe")
  (setq sis--ism (executable-find sis-external-ism))
  (sis--set-winID)
  (setq sis-do-get
      (lambda()
      (sis--ensure-dir
       (string-trim (shell-command-to-string (concat sis--ism " " sis-winID))))))
  (setq sis-do-set
    (lambda(source)
    (sis--ensure-dir
    (start-process "set-input-source" nil sis--ism sis-winID source))))
  (sis-ism-lazyman-config "1033" "2052")
  ...
)

需要emacs在启动时保持活动状态以使im-select获取窗口ID。如果窗口ID有误,可M-x sis–set-winID重新获取。

代码比较渣,不过我这测试似乎是没问题的 :sweat_smile:

现在的版本怎么关闭空格后inline的特性啊?我在配置里设了(sis-global-inline-mode nil),但是C-h v查询时发现是t了

感谢大佬。evil-mode用户,装sis之前需要频繁切换,烦死。装了sis后,极端好用。

1 个赞

告诉你一个你----一定—要掌握的基础知识:
在emacs中,对于所有的mode来说:
(sis-global-inline-mode nil)(sis-global-inline-mode t) 是一样的。 :joy:
你要想关闭的话,可以这样 (sis-global-inline-mode -1)

你把这行删掉也可以啊。
sis中所有的mode,默认都是关闭的。
你不显式启用,就不会起作用。

1 个赞

可以试试 evil-pinyin,你会爱上的。
GitHub - laishulu/evil-pinyin: Evil search Chinese characters by pinyin
可以直接用拼音首字母搜索汉字~~~

多少emacs native键位用户,
哭着喊着让我移植到原生的emacs上。。
但是我没有去做