🦁
nix環境下のEmacs.appでwomanを引けるようにする
問題と解決策
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
に追加していることがわかる。
nix--profile-paths
は環境変数 NIX_PROFILES
を見ているだけである。
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