求教如何在nixos下安装emacs rime

折腾了下没能成功,特来请教各位大佬们~

我按照这个贴子配置成功了emacs vterm,但是rime还是不行,尝试了

        ((emacsPackagesNgGen emacs).emacsWithPackages
          (epkgs: [ epkgs.vterm epkgs.rime ]))

加上copy 了nixos安装的librime到~/emacs.d/librime里,cp -r /nix/store/lmyqq18a3ns3gl6pcrjdh3mcpffg5dmc-librime-1.5.3/* ~/.emacs.d/librime/

.emacs.d/librime on  develop [?]
➜ ll
dr-xr-xr-x - ztlevi users 20 Jun 20:28 bin
dr-xr-xr-x - ztlevi users 20 Jun 20:28 include
dr-xr-xr-x - ztlevi users 20 Jun 20:28 lib
dr-xr-xr-x - ztlevi users 20 Jun 20:28 share

但是编译rime还是报错了

gcc lib.c -o librime-emacs.so -fPIC -O2 -Wall -I /home/ztlevi/.emacs.d/librime/include/ -shared -L /home/ztlevi/.emacs.d/librime/lib/ -Wl,-rpath /home/ztlevi/.emacs.d/librime/lib/ -lrime
lib.c:23:10: fatal error: emacs-module.h: No such file or directory
   23 | #include <emacs-module.h>
      |          ^~~~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:40: lib] Error 1
rime-compile-module: Compile Rime dynamic module failed

设置变量

(rime-emacs-module-header-root(concat(shell-command-to-string "nix eval --raw '(let pkgs = import <nixpkgs> {}; in with pkgs; lib.getLib emacs)'") "/include"))
(rime-librime-root (shell-command-to-string "nix eval --raw '(let pkgs = import <nixpkgs> {}; in with pkgs; lib.getLib librime)'"))
(rime-share-data-dir (concat (shell-command-to-string "nix eval --raw '(let pkgs = import <nixpkgs> {}; in with pkgs; lib.getLib brise)'") "/share/rime-data"))
4 个赞

works like a charm!

参考了你的设置,在 Mac 上 使用 Nix 只要设置以下两个变量就可以自动编译 emacs-rime。

(when (eq system-type 'darwin)
    (setq rime-librime-root  "~/emacs-data/librime/dist") ;; 从 librime 仓库下载相应的预编译包
    (setq rime-emacs-module-header-root "~/.nix-profile/include"))

现在 nixpkg 里已经有 emacs-rime 了 , 用 nix-env -iA nixpkgs.emacs26Packages.rime 就能用。(不知道 mac 会不会有问题。(可能会写错,因为我现在不用 nix 了。

现在有 librime,是最新的 1.7.3 版本,但是只支持 Linux,不支持 darwin。 所以在 Mac 平台还是需要到官方仓库下载最新的Release,

rime-with-plugins-1.7.3-osx.zip 这个是带插件的,支持 lua。

通过 nix eval --raw '(let pkgs = import <nixpkgs> {}; in with pkgs; lib.getLib emacs)' 获取路径并不靠谱,当更新过 channel 或者升级过 nix 之后,获得的路径可能就实效了:

⋊> nix eval --raw '(let pkgs = import <nixpkgs> {}; in with pkgs; lib.getLib emacs)'
/nix/store/gkvj9d90wjrp69vbnnqp6496cc996dkf-emacs-27.2

⋊> ls /nix/store/gkvj9d90wjrp69vbnnqp6496cc996dkf-emacs-27.2
ls: cannot access '/nix/store/gkvj9d90wjrp69vbnnqp6496cc996dkf-emacs-27.2': No such file or directory

readlink 获取到的路径才是有效的,也是 wiki 推荐的方法:

⋊> readlink -f ~/.nix-profile/bin/emacs
/nix/store/nycbav7by9ii4l62scwsn952hpxbpak1-emacs-27.2/bin/emacs

⋊> ls /nix/store/nycbav7by9ii4l62scwsn952hpxbpak1-emacs-27.2/
Applications  bin  include  lib  libexec  share

而且 readlink 耗时极少。


EDIT:

更可靠的方法应该是获取当前 Emacs 路径:

(file-truename (concat invocation-directory invocation-name))
;; => "/nix/store/nycbav7by9ii4l62scwsn952hpxbpak1-emacs-27.2/bin/emacs-27.2"
2 个赞

请教下这个命令得到的 Emacs 路径,怎么得到 /nix/store/nycbav7by9ii4l62scwsn952hpxbpak1-emacs-27.2/include 这个路径?

(epkgs.melpaPackages.rime.overrideAttrs (old: {
  recipe = pkgs.writeText "recipe" ''
    (rime :repo "DogLooksGood/emacs-rime"
          :files (:defaults "lib.c" "Makefile" "librime-emacs.so")
          :fetcher github)
  '';
  postPatch = old.postPatch or "" + ''
    emacs --batch -Q -L . \
        --eval "(progn (require 'rime) (rime-compile-module))"
  '';
  buildInputs = old.buildInputs ++ (with pkgs; [ librime ]);
}))