分享一下自己使用 emacs-rime 的方法

首先我拥有两个模式,中文模式和英文模式(使用 M-m c 切换)

  • 中文模式中,每行开始默认是中文,中文后面跟中文,英文后面跟英文,空格切换语言.

  • 英文模式中,每行开始默认是英文,中文后面跟中文,英文后面跟英文,空格后面是英文.

但是这样会有一个问题,就是如何英文模式中使用中文, 用的作者提供的 rime-force-enable 可以解决.

后来我发现这样还是不够灵活,如何在中文后面输入一个英文字母呢?

临时切换

使用 M-c 临时切换语言, 通过判断当前应该的输入断言,取反,即如果该输入中文,那么就改成输入英文.再按,再次取反.

代码如下

  (setq rime-disable-predicates
        '(rime-english-mode))

  (defun rime-after-change-function (beg end len)
    (let ((inhibit-modification-hooks nil))
      (makunbound 'rime-manual-lang)))

  (defun rime-start ()
    (interactive)
    (unless (member 'rime-after-change-function after-change-functions)
      (add-hook 'after-change-functions 'rime-after-change-function))
    (unless (string= current-input-method "rime")
      (activate-input-method 'rime)))

  (defun rime-stop ()
    (interactive)
    (when (member 'rime-after-change-function after-change-functions)
      (remove-hook 'after-change-functions 'rime-after-change-function))
    (when (string= current-input-method "rime")
      (rime-mode -1)))

  (defun rime-english-mode ()
    (cond
     ((boundp 'rime-manual-lang) rime-manual-lang)
     (t (not (looking-back "\\cc" 1)))))

  (defun rime-chinese-mode ()
    (cond
     ((boundp 'rime-manual-lang) rime-manual-lang)
     ((and (org-in-src-block-p) (not (looking-back "\\cc" 1))) t)
     ((> (point) (save-excursion (back-to-indentation) (point)))
      (if (looking-back " +" 1)
          (looking-back "\\cc +" 2)
        (not (looking-back "\\cc" 1))))))

  (defun rime-switch-mode ()
    (interactive)
    (rime-start)
    (when (boundp 'rime-manual-lang) (makunbound 'rime-manual-lang))
    (if (member 'rime-chinese-mode rime-disable-predicates)
        (progn (setq rime-disable-predicates '(rime-english-mode)
                     rime-input-mode "English Mode")
               (flycheck-mode 1))
      (progn (setq rime-disable-predicates '(rime-chinese-mode)
                   rime-input-mode "中文模式")
             (flycheck-mode -1)))
    (if (string= current-input-method "rime")
        (message "%s" rime-input-mode)))

  (defun rime-change-state-manually ()
    (interactive)
    (rime-start)
    (setq rime-manual-lang
          (if (boundp 'rime-manual-lang)
              (not rime-manual-lang)
            (not (seq-find 'funcall rime-disable-predicates))))
    (if rime-manual-lang
        (message "临时英文")
      (message "临时中文")))

Elisp 萌新, 希望大佬们提建议

1 个赞

rime-disable-predicates 写的太暴力了。把原有的断言都覆盖了就会出现问题。向我就有

按不了快捷键的问题。在中文模式里面加上相应的断言就没问题了。

因为我就这一个断言,所以无所谓, 目前也没碰到什么问题.

针对自己情况改得,所以有些情况肯定会考虑不到, 想要直接用的话, 出 BUG 也在所难免.

本来想直接改 emacs-rime 的,后来考虑到自己太懒不可能维护下去,就在外边折腾的.