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

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

在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,你会爱上的。
https://github.com/laishulu/evil-pinyin
可以直接用拼音首字母搜索汉字~~~

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

拼音重码太多,在全局搜索需要筛选太多。在minibuffer里面搜索比较好用。如有可能,希望做一个类似avy-goto-char-2支持。在doom中绑定是g s s 不支持拼音

:joy: :joy: :joy: 好的,谢谢

有兴趣可以试试 pyim 自带的这个小功能,有类似效果

为 isearch 相关命令添加拼音搜索支持

pyim 安装后,可以通过下面的设置开启拼音搜索功能:

(pyim-isearch-mode 1)

注意:这个功能有一些限制,搜索字符串中只能出现 “a-z” 和 “’”,如果有其他字符(比如 regexp 操作符),则自动关闭拼音搜索功能。

开启这个功能后,一些 isearch 扩展有可能失效,如果遇到这种问题,只能禁用这个 Minor-mode,然后联系 pyim 的维护者,看有没有法子实现兼容。

用户激活这个 mode 后,可以使用下面的方式 强制关闭 isearch 搜索框中文输入(即使在 pyim 激活的时候)。

(setq-default pyim-english-input-switch-functions
              '(pyim-probe-isearch-mode))
1 个赞

win10只给安装一种语言包的情况怎么破?感觉被判死刑了

Win10 可以再安装一个英文包,中文包下只安装一种中文输入法。这样就可以通过im-select进行中英文切换了

说多了都是泪啊,我还是给你看看我的情况吧:

1 个赞

你的应该是Windows 家庭版吧。果断升级到专业版。

另外:最近微软更新了新版本的输入法,每次从英语切换到输入法的时候,总是默认为英文,而且没法删除输入法中的英文状态。最后还是乖乖用Rime输入法了。

太贵了,升级个专业版还要钱,我还是用emacs-rime试试吧