有人有经验在 FreeBSD 里运用 Emacs Rime 吗?

在 FreeBSD 里我有 install gcc, gmake

也在 rime.el 里把 (if (zerop (shell-command “make lib”)) 改成了 (if (zerop (shell-command “gmake lib”))

可是还是不能 Build
https://imgur.com/a/Fsux77z

后来我又在 ~/.emacs.d/elpa/rime/ 里试了 manual run ‘gmake lib’

rue@freebsd:~/.emacs.d/elpa/rime-20230212.1425 $ gmake lib
gcc lib.c -o librime-emacs.so -fPIC -O2 -Wall -shared -lrime

经过这个方法, 按 \ 就有问我要不要制造一个 rime 的 文件夹
可是按了 yes 也没用, 给了我这个 error:
https://imgur.com/a/TSKvTJP

:frowning:

可以开 debug 模式看一看 error 时的调用栈。

Debugger entered–Lisp error: (wrong-type-argument stringp nil)

expand-file-name(nil)
rime–load-dynamic-module()
rime-activate(“rime”)
apply(rime-activate “rime” nil)
activate-input-method(“rime”)
toggle-input-method(nil 1)
funcall-interactively(toggle-input-method nil 1)
call-interactively(toggle-input-method nil nil)
command-execute(toggle-input-method)

你看你这种情况,最后出错的是 expand-file-name 这个内置函数的参数是 nil,说明它的上一层传参出了问题。所以可以 C-h f rime--load-dynamic-module RET 找到 rime--load-dynamic-module 这个函数的说明,在 help buffer 里 rime.el 这个链接上回车跳转进去,可以看到它的定义和实现。然后你就会发现应该是 rime-share-data-dirrime-user-data-dir 至少有一个是 nil。然后再 C-h v rime-share-data-dir RET 再看变量的帮助,同样转到定义,你可以看到它是用 case 根据 system-type 的值去设置默认值,但是 case 里没有 FreeBSD。这时候你就可以 C-h v system-type RET 看一下你的 FreeBSD 上 system-type 这个变量的值是什么,然后参照别的 case 加入新的 case,去设置你的 rime share data 存放的目录。最后,把你的改动发一个 PR 给 emacs-rime,一次轻松愉快的 Emacs debug 就完成了。

2 个赞