📚

nixでubuntu向けのdotfilesを書く

2024/12/22に公開

この記事は Nix Advent Calendar 2024 の22日目の記事です。

ごあいさつ

はじめまして、Comaviusです。最近はC++で競プロをしつつNixやRustを書いています。本日はUbuntuにhome-managerを導入した際に詰まった点の解決策などについて見ていこうと思います。

作ったもの

今回主に導入したのはswaywmとzshです。

https://github.com/comavius/dotfiles
├── flake.lock
├── flake.nix
├── home.nix
├── install-ubuntu.sh
├── LICENSE
├── modules
│   ├── home-manager
│   │   └── default.nix
│   ├── i18n
│   │   └── default.nix
│   ├── shell
│   │   └── default.nix
│   ├── sway
│   │   ├── desktop-entry.nix
│   │   ├── mako.nix
│   │   ├── rofi.nix
│   │   ├── swayidle.nix
│   │   ├── sway.nix
│   │   └── waybar.nix
│   ├── terminal
│   │   └── default.nix
│   └── utils
│       └── default.nix
├── README.md
└── update.sh

後述するようにhome-managerだけだとうまくいかない部分があるため、install-ubuntu.shでそのあたりの処理をしています。

swaywm

ウィンドウマネージャ関連の設定は./modules/swayに入っています。非NixOS環境では、ウィンドウマネージャをはじめとしたGUIアプリを動かすためにNixOSがよしなに設定しているOpenGLまわりの環境変数を別途渡す必要があるため、NixGLというラッパーを使う必要があります。

# 通常
sway
# NixGL (NixGLMesa)
nixGLmesa sway

diff <(env) <(nixGLMesa env) # nixGLMesaが書き換えている環境変数の一覧を表示

また、Desktop Entryも自分で配置しなければならないので、必要なものをhome-managerで生成してinstall-ubuntu.shで配置するようにしました。

# ./modules/sway/desktop-entry.nix
{
  username,
  pkgs,
  ...
}:
{
  home.file = {
    ".home-manager/sway/sway.desktop".text = ''
      [Desktop Entry]
      Name=Sway
      Comment=An cd-compatible Wayland compositor
      Exec=/home/${username}/.home-manager/sway/entry.sh
      Type=Application
      DesktopNames=sway
    '';
    ".home-manager/sway/entry.sh" = {
      text = ''
        #!${pkgs.zsh}/bin/zsh
        source /home/${username}/.zshenv
        source /home/${username}/.zshrc
        ${pkgs.nixgl.nixGLMesa}/bin/nixGLMesa ${pkgs.sway}/bin/sway
      '';
      executable = true;
    };
  };
}

zsh

zsh自体の設定についてはmynixos.comを睨みながら書くだけなので良いのですが、デフォルトのシェルを変更するのはhome-managerではできないため、その部分はDesktop Entry同様install-ubuntu.shに記述しました。

ターミナルとしてkittyを入れたほかは、細々としたユーティリティやフォントなどを管理しています。また、変わったところでは、Ubuntuのhardy heronの壁紙が好きなので、アーカイブのtarballをflakesのinputsに入れました。

まとめと反省

まず、私は今回初めてdotfilesを作ったので、ひとまず実用に耐えるものができて良かったと思います。しかし問題点も多く、

  • swayの設定をnix式として書いたため移植性が低い
  • デスクトップ環境のグラボとswayやnixGLの相性が悪い
  • ~/.zshrcの編集にroot権限で、rustupなどの導入が少し面倒
  • デスクトップのスタイルの盆栽が甘くmanjaro-swayに勝てそうにない

などが今後の課題となっています。Ubuntu + home-managerという構成のなかでは改善することが難しそうなものもありますが、home-managerの移植性の高さやUbuntuの手軽さは依然として魅力的で、うまいこと折り合いをつけていけたらと思います。

Discussion