Emacs-rime 是 Emacs 里面很好用的 Rime 输入法前端,之前的文章已经介绍过如何安装和配置,但是由于这个输入法的外部依赖较多,在 Windows 10 上的安装稍微有点麻烦。

下面介绍一下如何基于 msys2 来安装,使得重新编译 emacs-rime.dll 的时候更加方便。

安装 msys2

直接通过 scoop 安装即可。

1
  scoop install msys2

mingw64 中安装 librime 以及相关依赖

由于我安装了 Windows TerminalPowerShell ,直接在 PowerShell 中输入 mingw64 即可进入 msys2 的终端环境,执行下面的命令即可升级系统和安装依赖。

1
2
3
4
  pacman -Syu # update msys2
  pacman -S pactoys base-devel # 安装依赖
  pacboy -S librime:x librime-data:x emacs:x toolchain:x
  ln -s /mingw64/share/opencc/* /mingw64/share/rime-data/opencc

由于我的我使用的是自己通过 msys2 编译的 Emacs native compile 版本,并不能直接在 mingw64 中启动,需要在 HOME 目录下的 .bashrc 文件中加入一下内容才行:

1
export PATH="/D/Dev_Tools/emacs28-nativecomp/bin:$PATH"

然后在 mingw64 环境中启动 emacs 就能够获取正确的 SHELL 环境变量,在 Emacs 内构建 librime-emacs.dll 以及使用 MSYSTEM_PREFIX 环境变量来设置 rime-share-data-dir 变量。

正常使用 Emacs 时,不需要从 mingw64 启动 Emacs,只有需要执行 M-x, rime-compile-module 生成 librime-emacs.dll 时才需要。

我目前使用的 Emacs-rime 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(defconst rime-usr-data-exists-p
  (file-exists-p "~/emacs-data/rime")
  "For checking if there is a rime user data.")

(when rime-usr-data-exists-p
  (require-package 'rime)

  (when (eq system-type 'windows-nt)
    (setq rime-share-data-dir
          "~/scoop/apps/msys2/current/mingw64/share/rime-data"))
  (when (eq system-type 'darwin)
    (setq rime-librime-root  "~/emacs-data/librime/dist"))

  (setq
   rime-inline-predicates '(rime-predicate-space-after-cc-p
                            rime-predicate-current-uppercase-letter-p)
   rime-translate-keybindings '("C-f" "C-b" "C-n" "C-p" "C-g")
   rime-inline-ascii-holder ?a
   default-input-method "rime"
   rime-cursor "|"
   rime-show-candidate nil
   window-min-height 1
   rime-user-data-dir "~/emacs-data/rime"
   rime-title "")

  (setq rime-inline-ascii-trigger 'shift-r)
  
  (defun rime-toggle-show-candidate ()
    "Use minibuffer for candidate if current is nil."
    (interactive)
    (if (equal rime-show-candidate nil)
        (setq rime-show-candidate 'minibuffer)
      (setq rime-show-candidate nil)))

  (global-set-key (kbd "C-\\") 'toggle-input-method)
  (global-set-key (kbd "s-m") 'rime-force-enable)
  (global-set-key (kbd "C-`") 'rime-send-keybinding)

  (with-eval-after-load 'rime
    (require 'im-cursor-chg)
    (cursor-chg-mode 1)))