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

又碰到一个新问题,请教下 在调用helm-org-agenda-files-headings来在agend files的headline之间进行跳转的时候,sis似乎导致了问题,举例如下,有三个headline分别为

  • test a 测试

  • test b 测试

  • test c 测试

如果我调用helm-org-agenda-files-headings来进行跳转的时候,在minibuffer输入的时候

  • 如果通过英文搜索,我输入 test和空格键 再加上 a或b或c的时候,可以顺利的搜索到相关条目,然后按enter就跳转到相关条目上去

  • 但如果通过中文搜索, 我输入“测试”和空格键的时候 再加上 a或b或c的时候

它会搜索到相关条目,但是当我按enter键的时候,它的反应是把中间的空格键删除,然后停在那里没有进行跳转,这个时候我再来一次,也可以跳转了。

  • 当我把sis插件关闭的时候,也没有这个问题

是sis-inline-mode的原因,而且是期望中的行为。
这个mode是为了中英文混合输入的自动切换。
你中文后面加空格,就触发了inline mode,
输入完英文,回车或者双空格,关闭inline mode,并删除头尾的一个空格。
其中,回车和双空格的效果不一样,并且是否删除头尾空格等很多方面,都可以配置。
默认配置下,你可以通过在测试后面输入两个空格来自动切换到英文,
这样关闭inline mode时,测试后面还有一个空格。

默认配置下的行为,readme中有详细的图解。

另外,你可以只在prog mode和text mode中启用inline mode
见readme中的范例config: GitHub - laishulu/emacs-smart-input-source: Less manual switch for native or OS input source (input method).

看到我修改后的回复了么?

收到 配置就不改了 直接回车解决了

有考虑适配 GitHub - meow-edit/meow: Yet another modal editing on Emacs / 猫态编辑

https://github.com/DogLooksGood/emacs.d/blob/master/elisp/init-input-method.el#L13

也许这段代码有帮助。

狗哥的meow啊,我没有用过呢。
不清楚:
哪里需要适配呢?
直接用这个package不行么?

像对Evil一样。比如,从 insert 退回到 normal 的时候,把输入法换到英文。

meow自己做了个类似evil的模式编辑么?

我研究一下,应该是用户可以通过配置解决的。

退出 insert 状态时把输入法换到英文下面几行就够了。但是回到 insert 状态时恢复先前的输入法状态就不会弄了。

(defun xx|sis-respect-meow ()
       "Respect meow."
       (when (featurep 'meow)
         (add-hook 'meow-insert-mode-hook
                   (lambda ()
                     (unless meow-insert-mode
                       (sis-set-english))))))

其实也不是恢复先前的输入法,而是触发根据上下文自动设置输入法
可以通过设置这个变量实现:

可以这么设置:

(add-to-list 'sis-context-hooks 'meow-exit-insert-mode-hook)

其中:
meow-exit-insert-mode-hook,
因为meow没有自带,
你需要自己写一下,
挂到meow-insert-mode-hook

(defvar meow-exit-insert-mode-hook nil
  "Hook to run when exit meow insert mode.")

(add-hook 'meow-insert-mode-hook 
          (lambda ()
               (unless meow-insert-mode 
                  (run-hooks 'meow-exit-insert-mode-hook))))

@gyren 看我更新的解决办法,请测试反馈。
@DogLooksGood 可以参照evil,内置这一类的hook
这样用户配置起来要方便很多。

谢谢,基本可以实现。

  (defvar meow-leaving-insert-mode-hook nil
    "Hook to run when leaving meow insert mode.")
  (defvar meow-entering-insert-mode-hook nil
    "Hook to run when entering meow insert mode.")
  (add-hook 'meow-insert-mode-hook
            (lambda ()
              (unless meow-insert-mode 
                (run-hooks 'meow-leaving-insert-mode-hook))))
  (add-hook 'meow-insert-mode-hook
            (lambda ()
              (if meow-insert-mode 
                  (run-hooks 'meow-entering-insert-mode-hook))))
  (with-eval-after-load 'sis
    (add-hook 'meow-leaving-insert-mode-hook #'sis-set-english)
    (add-to-list 'sis-context-hooks 'meow-entering-insert-mode-hook))
1 个赞
  1. 你这里的if meow-insert-mode, 一般写成when meow-insert-mode
  2. 这两个lambda函数可以合并到一个if
(if meow-insert-mode 
    (run-hooks 'meow-entering-insert-mode-hook)
  (run-hooks 'meow-leaving-insert-mode-hook))
1 个赞

已经切换到 sis+emscs-rime 了, 很不错. 比用 Enter 键英文上屏舒服多了. 唯一有点遗憾的是我不知道如何实现 “点石成金” 的功能. 简单来说就是比如我在某个状态下想输入中文的 “我是”, 等输入了 “woshi” 拼音以后发现是英文状态, 这时候输入一个按键 “M-i”, 把已经输入的 “woshi” 传给输入法, 转换成中文的 “我是”, buffer 的输入法转换成英文状态. 同样, 如果是在某个状态下想输入英文的 “we are”, 发现是在中文状态, 这时用 “M-i” 直接把输入的英文上屏, 并且输入法状态切换成英文. 这就要求至少有两个 mode 来表示当前的输入状态, 我看了下文档, 好像没有.

(defun +translate-symbol-to-rime ()
  (interactive)
  (let* ((input (thing-at-point 'symbol))
         (beg (car (bounds-of-thing-at-point 'symbol)))
         (end (point)))
    (delete-region beg end)
    (toggle-input-method)
    (dolist (c (string-to-list input))
      (rime-lib-process-key c 0))
    (rime--redisplay)))

试下这个,这个是转当前的 symbol 的内容到 emacs-rime

多谢大神, pinyin 到 中文好了, 有没有输入法输入的拼音字母串直接上屏的函数? 不懂 ELISP, 只能无耻得当伸手党了.

这个比较简单吧,大多数输入法直接回车就行了。 我用的搜狗拼音,经常这么干。

就是不想用回车, 统一用空格.

换输入法,学个顶功输入法,空格都不用敲。