🦁

nix環境下のEmacs.appでwomanを引けるようにする

2022/10/11に公開

問題と解決策

nixでbuildしたEmacs.appのwomanでnixでインストールしたパッケージのmanが読めない。

結論からいうとNIX_PROFILESが設定されてないため。
以下を実行して対処した。

cat <<EOF > ~/Library/LaunchAgents/nix-profile.setenv.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>nix-profile.SetEnv</string>
    <key>ProgramArguments</key>
    <array>
      <string>/bin/launchctl</string>
      <string>setenv</string>
      <string>NIX_PROFILES</string>
      <string>$NIX_PROFILES</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>
EOF

もっと詳しく

nixのemacsにはsite-lispが配置されている。.emacs.d/init.elより先に読まれるファイルである。
そこにwoman-manpathを設定する処理が入っている。
nix--profile-pathsを元にwoman-manpathに追加していることがわかる。

https://github.com/NixOS/nixpkgs/blob/7f02ff006eacd54566d39b2498cf9a3df7ddb292/pkgs/applications/editors/emacs/site-start.el#L58-L62

nix--profile-pathsは環境変数 NIX_PROFILESを見ているだけである。

https://github.com/NixOS/nixpkgs/blob/7f02ff006eacd54566d39b2498cf9a3df7ddb292/pkgs/applications/editors/emacs/site-start.el#L2-L6

Emacs.appで実行する際にNIX_PROFILESが設定されていないためwomanが期待どおり動作しない。
ここに環境変数を設定する方法としては、launchctl setenvがある。つまり、launchctl setenv NIX_PROFILES $NIX_PROFILESすれば解決する。これをログイン時に自動実行したいので、launch agentを設定するのが、先に書いた解決策である。作成する際に$NIX_PROFILESを展開することで、ユーザ固有になる部分を解決している。

なおshellで使えるNIX_PROFILESについて調べたたころ、/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.shに以下のような定義があった。

export NIX_PROFILES="/nix/var/nix/profiles/default $HOME/.nix-profile"

今設定されているNIX_PROFILESをそのまま展開しても問題がないと判断し、上記の手段をとった。

Discussion