🔮

NixOSでPlasma5からHyprlandに移行した話

2024/12/02に公開

はじめに

今年3月にNixOSに移行した時からPlasma5を使用していたが、元の環境の不満ポイント[1]が我慢ならなくなってきたのと、unixpornとかを眺めててタイル型WMを使いたい欲が溢れて止まらなくなったので、移行したときの話を適当に書く

先に現状を出しておくとこんな感じ

https://x.com/turtton/status/1855981495934132466

参考にしたプロジェクト

現状の問題とかはここでまとめている
https://github.com/turtton/dotnix/issues/1

StatusBar

Ewwによる完全自作→Waybar→Hyprpanelという流れで、Hyprpanelに落ち着いた

カスタマイズ性で言えばEwwが最強ではあるが、全部作るのはあまりにもつらいのと、システムトレイがうまく動かなくて断念した後、Waybarを試したがこちらもカスタマイズが思ったようにできなかったので、Hyprpanelで一旦ヨシとした

設定はこれ
https://github.com/turtton/dotnix/blob/main/home-manager/wm/hyprland/hyprpanel.nix

現環境はメインモニターのIDが2としてHyprlandに認識されているので、他環境との互換性も考えて0と2の両方にステータスバーを配置している
そこまでカスタマイズの自由度もないので言うことは無いが、日時の表示を良い感じに直しているのと、アップデート表示をいじって使用しているパッケージの深刻(レベル5以上)な脆弱性の数を表示するようにしている
https://github.com/turtton/dotnix/blob/d4a4b792bd2b576e156a5bd9155da07ecb29752e/home-manager/wm/hyprland/hyprpanel.nix#L74-L75

見た目はこんな感じ

本当は何のパッケージに何の脆弱性があるのか表示するウィジェットも作りたかったが、まあそれはまたの機会に(誰かEwwで作ってくれないかな)

Launcher

Rofiがメジャーっぽかったのでこれにした

テーマはNeshHari/XMonadから拝借してる
https://github.com/turtton/dotnix/blob/main/home-manager/wm/hyprland/rofi/default.nix

ちなみにrofi-emojiはwayland環境では動作しなかったので代わりにbemojiを使用している。そのまま起動するだけでrofiを使ってくれて楽
https://github.com/turtton/dotnix/blob/d4a4b792bd2b576e156a5bd9155da07ecb29752e/home-manager/wm/hyprland/key-bindings.nix#L111

clipboardの履歴はcliphistを採用した。こちらもrofiに対応したワンライナーが書いてあるので楽に導入できる
https://github.com/turtton/dotnix/blob/d4a4b792bd2b576e156a5bd9155da07ecb29752e/home-manager/wm/hyprland/key-bindings.nix#L14

Terminal

本当はWeztermを使いたかったが、現行の最新版では全体がモザイクになってしまうバグがあったのでAlacrittyに落ち着いた。Nvidiaゆるせねえ

どうやら最新コミットでは直ってるらしい。ビルドキャッシュをちゃんと保存できるようにして自前ビルドするか、次のリリースが出るかしたらまた試してみる

Plasmaで使ってたテーマに合わせようかとも思ったけど完全再現は無理そうなので無難にtokyo-nightテーマをもとにhome-managerで設定した
https://github.com/turtton/dotnix/blob/main/home-manager/gui/term/alacritty.nix

Lockscreen

display-managerとかのやつを使ってもよかったが、せっかくHyprlockなんてものがあるのと、参考元がめっちゃかっこいいロック画面を作ってたのでそれを使うことにした

曜日とかを日本語設定で出すと非常にダサくなったのでちょっと調整した。ちなみに下の電源ボタンとかは完全な飾りで機能しない。これが実装されたら機能させられるかもしれない。
実はアイコンがバグってるけど謎なので放置してる。
https://github.com/turtton/dotnix/blob/main/home-manager/wm/hyprland/hyprlock.nix

ちなみにこれはただのソフトウェアなのでログイン時はgreetdで自動ログインしてHyprlandが起動した後に呼び出してる。

できればpamの設定をいじって入力したパスワード情報をログイン後のあれこれに使いたいが、あんまり情報がなさそうなので放置してる(そのせいでログイン後の1passwordの認証時にもう一度パスワードを入力させられててちょっと微妙。多分libsecretとかの関係?)

pamの設定いじってhyprlockとloginの項目にGnomeKeyring/Kwallet有効化を追加したところ無事に1Passwordからの余計なパスワード入力が省略された。本当はhyprlockの項目だけで良いような気もするが、動いてるからヨシッ!
https://github.com/turtton/dotnix/commit/0a8d7d9d47ac6e10994b18b92fd7b759cbadb559

https://github.com/turtton/dotnix/blob/d4a4b792bd2b576e156a5bd9155da07ecb29752e/os/wm/hyprland.nix#L7
https://github.com/turtton/dotnix/blob/d4a4b792bd2b576e156a5bd9155da07ecb29752e/hosts/default.nix#L155-L169
https://github.com/turtton/dotnix/blob/d4a4b792bd2b576e156a5bd9155da07ecb29752e/home-manager/wm/hyprland/settings.nix#L14-L15

ScreenShot

元々Plasma時代はSpectacleに大変お世話になっていたので、その時の体験を再現するべく色々やった結果、Grimblast+Swappy+zenityで良い感じにした
https://github.com/turtton/dotnix/blob/d4a4b792bd2b576e156a5bd9155da07ecb29752e/home-manager/wm/hyprland/key-bindings.nix#L102-L107
スクリーンショットを取る→Swappyで編集→zenityで保存or破棄、という流れ
保存時にGwenviewを開くようにしても良いかもしれない

FileManager

thunar→Nautilus→Dolphinの流れで落ち着いた。元々thunarは利用している人が多かったため試していたが、テーマの適用が上手くいかなかったためNautilusに移行したものの、元々Dolphinを使っていたので機能不足に感じてしまい、結局Dolphinに戻った。
後述するテーマの設定がうまくいっていなかったらNautilusの可能性も全然あった。ちなみにNautilusはプラグイン系を適用するためにhome-managerではなくos側の設定として登録する必要があるので使いたい人は注意。自分も完全に動いたわけではないが、こんなぐらいの設定は最低限必要になる
Dolphinの方は以下の通り
https://github.com/turtton/dotnix/blob/main/home-manager/gui/filemanager/dolphin/default.nix
自分で登録しているjetbrains-dolphin-qt5(表示しているフォルダをJetbrains製品で開くやつ)が便利すぎて手放せなくなってる。そのうちnixpkgsにPR出すかも

その他

GTK/QTのテーマ適用

今回の以降で一番苦戦した要素。多くの非Nix環境のDotfilesでは色々な設定ファイルを直接配置して設定しているが、それをNixでやってもうまくいったりいかなかったりする。自身の環境でもテーマが適用されてもアイコンが適用されないとかが頻発した。

結論から言うとGTKはhome-managerの設定に則りつつ、QTも+αで設定ファイルを配置すると良い
https://github.com/turtton/dotnix/blob/main/home-manager/wm/hyprland/gtk.nix
https://github.com/turtton/dotnix/blob/main/home-manager/wm/hyprland/qt/default.nix
そして何よりも大事なのがHyprlandに直接Qtの環境変数を設定すること。これがないとHyprland経由で起動したrofi経由だとテーマが適用されない(ターミナルから起動するといける)みたいなことが起きる(これのせいでめちゃくちゃ苦労した)
https://github.com/turtton/dotnix/blob/d4a4b792bd2b576e156a5bd9155da07ecb29752e/home-manager/wm/hyprland/settings.nix#L8-L11
あとはQt5製品(NixだとlibsForQt5から始まるやつ)を使用すること。Qt6製品はKvantumが対応してないとか諸々の問題でテーマが適用されない(これもクソ罠なので注意)

Chromium系ソフトウェアのIME入力対応

Chromium系ソフトウェアはデフォルトではネイティブWayland環境で実行されず、IMEがおかしくなる問題がある。前者は環境変数NIXOS_OZONE_WLを1にすることで多くのアプリケーションで解決できるが、後者のIME問題が残る。
といっても先駆者によって解決方法は示されている(ありがとうございます)
https://qiita.com/Meatwo310/items/947d26adbbddb9a7d098#chromiumelectron周りの調整
あとはこれらのオプションを各パッケージへ適用すればよい。が、パッケージによって最適な設定方法が異なる。

具体的にはパッケージの定義されたnixファイルの引数にcommandLineArgsがあるものと無いものがある。
あるものは以下のように設定する

pkg.override { commandLineArgs = [ "--enable-wayland-ime" "--enable-features=UseOzonePlatform" "--ozone-platform=wayland" ]; };

無いとかなりやっかいで、私の環境ではpkgs.symlinkJoinを利用して実行ファイルと.desktopファイルを上書きしている。といってもこの辺はパッケージによって色々と違いがあるので個別の説明は省略する。
上の例と合わせてoverlayの機能を使って対象のパッケージを書き換えた結果は以下に示すので、コード読んでみてほしい。
https://github.com/turtton/dotnix/blob/main/overlay/force-wayland.nix

ちょっとした悩みたち

導入して数週間経った今でも解決できてない微妙な悩みも一応書き連ねておく(解決策があれば教えてください)

  • Chromium系ソフトウェアのIME入力時や頻繁に画面更新されるページ(動画など)で画面がちらつく(Nvidiaのせい?)
  • NetworkManagerのVPNなどの接続をグラフィカルに切り替えられない(良い感じのGUIが見つけられず、nmcli con up id <name>で接続するしかない。networkmanager_dmenuを試したがrofi-waylandでは動かない?)

私のdotfileに興味のある方へ

issueにて試そうとされていた方がいたため、READMEでも簡単には書いていますがこちらでも記載しておきます。

基本的にはvirtboxプロファイルから試すことをおすすめします。無駄なアプリケーションが少なく、比較的少ないストレージ容量(75GB程度)で試せるものです。実践導入前に仮想環境で試していたものですが、設定の参照先は同じであるため実機で使用しているmaindeskと同じHyprland環境を試すことができます。
導入時はhardware-configuration.nixをご自身のものと置き換えることと、ユーザー名をturttonにしてOSをインストールするか、ここを変更して今のユーザー名に合わせるようにしてください。
あとは記載しているコマンドを叩くだけで、Nixの高い再現性によってスクリーンショットのままの環境が手に入ります。

よいNixOSライフを!

脚注
  1. plasma-managerを使っていたが使っていたテーマの完全再現ができない(ウィンドウボタンのテーマが指定できなくてグローバルテーマに持ってかれる)とか、latteの設定をうまく固定できない、単純にplasma5環境だと新規ウィンドウの生成が遅い、通知が表示されると全体のフレームレーットが一瞬落ちる、など ↩︎

GitHubで編集を提案

Discussion