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

我刚开始是直接复制了你的配置。
后来发现,你的配置是windows的
就把那些删了,用了默认值。
完了就复现了。

能复现就好,肯定能搞定的。
看起来也不是特别难的问题。

我也一直有这个问题,还以为是 magit 的行为。。。

@emacle @BlindingDark

找到原因了。。。

magit的keymap是基于text property的,
优先级比 smart-input-source (简称sis) 更高。

有两种解决:

  1. 进入 magit 后,disable sis的映射
  2. 提升sis的优先级,到更高一级。

咳咳。。。。 后者,2一直没敢做~~~

我还是想想1吧。。

magit的keymap是基于text property的, 优先级比 smart-input-source (简称sis) 更高。

如果magit的优先级高,没有道理 C-x 0 不能使用啊?是因为两者冲突吗?

如果可以进入 magit-revision: 这种 buffer后,只禁用C-x 那些前缀快捷键就好了,进入magit-revision: buffer时自动进入EN状态还是需要保留的,进入其他magit-的其他buffer(比如COMMIT_EDITMSG 这种需要输入信息的) 还是需要sis的

我这里还有一个问题, 比如我桌面上有一个文件夹 aaa/ , 里面有 aaa.txt,Emacs打开aaa.txt后,sis 可以正常使用,然后我用外部程序把aaa/ 目录重命名 bbb/ ,Emacs 会一直提示下面错误,直到kill aaa.txt buffer, 频率挺高,能否判断一下如果buffer没有关联目录文件,取消定时器?

Error running timer ‘smart-input-source--auto-refresh-timer-restart’: (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/aaa/")

如果强制 kill aaa.txt buffer, sis 貌似还失效了 需要重新加载一下配置???

不是的,比方说,他有类似这样的快捷键:C-x k
C-x的时候,因为他优先级更高,sis就捕捉不到。
完了呢,用户输入b
这时候他处理不了,往下传 C-x b
但是,下面实际上没有 C-x b
因为只有被sis截取的C-x

sis每次是截取到C-x,进行预处理之后,
才重新交还到原来的C-x, b

magit那个问题找到后,我就睡觉去了。
很好解决的~~

我看看。。。

@emacle @BlindingDark

magit 的问题,完成了。
可以通过定制 smart-input-source-prefix-override-buffer-disable-predicates 在更多的buffer中禁用prefix key overriding。

fix了。如果关联目录不存在,自动设成 ~ 。并提示。

我试了下 好像还是会一直弹出错信息,除非把对应buffer给kill掉,不过kill 掉后sis 还是失效

Error running timer ‘smart-input-source--auto-refresh-timer-function’: (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/aa/")
apply: Setting current directory: No error, c:/Users/John/Desktop/aa/
Error running timer ‘smart-input-source--auto-refresh-timer-restart’: (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/aa/") [3 times]
Error in pre-command-hook (smart-input-source--preserve-pre-command-handler): (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/aa/")

@emacle

是不是自己配置了do-get了嗯?
之前我复现了那个现象,其实不是sis的问题
是emacs调用外部程序的时候,会默认设置work directory
我这里做了错误处理,
完了之后,那个现象就没有了。
你如果用的im-select,按理说,就用上了这个设置。
但是你如果定制了do-get,你也要按下列方式,做相应的改动。

(lambda ()
      (condition-case err
          (string-trim (shell-command-to-string -ism))
        (file-missing
         (when (equal (car (cdr err))
                      "Setting current directory")
           (message
            "Default directory for buffer <%s> is missing, now set to '~'"
            (current-buffer))
           (setq default-directory "~")))))

没有定制do-get

当我用外部程序删除或重命名aaa目录的时候 ,我这里也没有出现 Default directory for buffer <%s> is missing, now set to '~' 这种类似的信息 感觉改动没有启作用?

看下面的信息 是没有权限??

apply: Setting current directory: Permission denied, c:/Users/John/Desktop/aaa/
Error running timer ‘smart-input-source--auto-refresh-timer-restart’: (file-error "Setting current directory" "Permission denied" "c:/Users/John/Desktop/aaa/") [2 times]
Error in pre-command-hook (smart-input-source--preserve-pre-command-handler): (file-error "Setting current directory" "Permission denied" "c:/Users/John/Desktop/aaa/")
Error running timer ‘smart-input-source--auto-refresh-timer-restart’: (file-error "Setting current directory" "Permission denied" "c:/Users/John/Desktop/aaa/")

下面是我的配置

(use-package smart-input-source
  :init
  (setq smart-input-source-external-ism "im-select.exe") ; for windows 命令行切换输入法工具
  (setq smart-input-source-english "1033")
  (setq-default smart-input-source-other "2052")
  (setq smart-input-source-default-cursor-color "green yellow")
  (setq smart-input-source-other-cursor-color "magenta")
  :config
  ;;  (add-to-list 'smart-input-source-preserve-save-triggers 'smex)
  ;; (global-set-key (kbd "<f9>") 'smart-input-source-log-mode)
  
  ;; enable the /cursor color/ mode 中英文光标颜色模式
  (smart-input-source-global-cursor-color-mode t)
  ;; enable the /respect/ mode buffer 输入法状态记录模式
  (smart-input-source-global-respect-mode t)

  ;; enable the /follow context/ and /inline english/ mode for all buffers
  (smart-input-source-global-follow-context-mode t)
  (smart-input-source-global-inline-mode t)


  ;; (setq-default smart-input-source-inline-tighten-head-rule 1) ; 删除头部空格,默认1,删除一个空格,1/0/'all
  (setq-default smart-input-source-inline-tighten-tail-rule 'all) ; 删除尾部空格,默认1,删除一个空格,1/0/'all
  (setq-default smart-input-source-inline-with-english t) ; 默认是t, 中文context下输入<spc>进入内联英文
  (setq-default smart-input-source-inline-with-other t) ; 默认是nil,而且prog-mode不建议开启, 英文context下输入<spc> <spc> 进行内联中文

)

错误处理主要是捕捉这个的。
我看是一样的啊。

  1. 桌面上有文件夹 b/, b/a.txt
  2. Emacs 打开 b/a.txt, 随便写保存
  3. 在桌面将 b/ 文件夹重命名 bbbb/
  4. Emacs 弹出以下警告消息
Saving file c:/Users/John/Desktop/b/a.txt...
Wrote c:/Users/John/Desktop/b/a.txt
Error running timer ‘smart-input-source--auto-refresh-timer-function’: (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/b/")
apply: Setting current directory: No error, c:/Users/John/Desktop/b/
Error running timer ‘smart-input-source--auto-refresh-timer-restart’: (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/b/")
Error in pre-command-hook (smart-input-source--preserve-pre-command-handler): (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/b/")
Error running timer ‘smart-input-source--auto-refresh-timer-restart’: (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/b/")
Error in post-command-hook (smart-input-source--preserve-post-command-handler): (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/b/")
Error running timer ‘smart-input-source--auto-refresh-timer-restart’: (file-error "Setting current directory" "No error" "c:/Users/John/Desktop/b/") [2 times]

你确实最新版么?

(print smart-input-source-do-get)看看。

是最新版

(closure (t) nil (condition-case err (string-trim (shell-command-to-string smart-input-source--ism)) (file-missing (if (equal (car (cdr err)) "Setting current directory") (progn ((message "Default directory for buffer <%s> is missing, now set to '~'" (current-buffer)) (setq default-directory "~")))))))
(closure (t) nil (condition-case err (string-trim (shell-command-to-string smart-input-source--ism)) (file-missing (if ... ...))))

不是Emacs 调用外部程序,是 我直接在桌面上对 文件夹重命名

我知道的,我也是复现的。

我指的是,emacs调用im-select,查询输入法状态。

@emacle

等下,发现问题了。

我捕捉的是file-missing
你那个是file-error

@emacle

新fix提交了。请git pull,测试反馈。

@emacle

还有,那个magit的,也请测试反馈一下。