😎

LinuxユーザーがMacを使うためのコツ

2024/12/21に公開

LinuxユーザーがMacを使うためのコツ

この記事は Kyash Advent Calendar 2024 21日目の記事です。

この記事で、macOSをどうlinuxに近い体験にしてきたのかの話をしたいと思います。
背景としては、普段使っているパソコンでlinux (NixOSかつHyprland)入れていて幸せな生活を送ってるんですが、仕事で仕方なくMacBookを開く時がほぼ毎日あって、悲しいです。
なぜMacよりLinuxの方がいいのかという話は長くなるからとりあえずおいといて、macOSをできるだけ自分のLinux環境っぽくにするためにどんな手を使ったかについて書こうと思います。

WM

最初はGUIの話です。Linux環境ではi3やhyprlandと言った、いわゆるtiling windows managerを使ってます。マウスを使わない前提な環境で複数のアプリケーションウィンドウが被ってしまうと見づらいので、window managerが常に全部のアプリケーションを見えている状態を保ってくれています。
例えば、ブラウザーと端末とPDFリーダーなどを同時に開くと、自動でこう並びます↓

ご覧の通りmacOSでもこの挙動ができているのですが、これはamethystのおかげです! 普通のmacOSの環境上で動かしているためLinuxでのWMみたいにスムーズな体験ではありませんが、割と使える状態です。
また、i3などでしたら基本的に10個(自分の環境が20個)のワークスペースを入れていますから、macOSにも10個入れて、キーボードの数字で移動できるようにしました。
(0だけが何故か移動してくれないが)

Amethystを入れると、アプリケーションの移動とか、フォカースの動きなどをキーボードでできるようになりますが、linuxで使っているwmみたいにマウスの移動でアプリケーションのフォーカスが切り替える(クリックなし)ことができないので、autoraiseも入れています。

Brewで入れるならこんな風に

brew tap dimentium/autoraise
brew install autoraise
brew services start autoraise

ちなみに、AmethystよりYabaiWMの方がいろいろできるようですが、Yabaiの場合は、ちゃんと動かせるためにmacOSの安全機能を一部無効化しないといけないらしく、仕事で使うパソコンなのでやめておきました。
これでOSの基本操作がなんとなく耐えられるようになりました。次はパッケージのインストールについて話します!。

Nix

nixというのは、OSに入れているパッケージ(アプリ、ライブラリなど)やいろんな設定を定義できる言語かつツールです。なので、その定義を書けばlinuxにもmacOSにも同じものを使えるというのもあって、一回だけ全部の定義を書けば、新しいMacBookでもLinux laptopでも手に入れても設定やインストールの作業をやらなくてもいいということに魅力を感じています。また、一時的な環境を立ち上げたり、プロジェクトごとのパッケージや設定を定義できるのはすごい。
といっても、それを読んでもnixってなんなの分からないと思います。次に導入の仕方を軽く説明しますので、それを読んでなんとなくイメージをもっていただけたらと思います。

MacOSでNixの導入

macOSにnixを導入する方法ですが、このスクリプトが現時点で一番安心できる方法です↓
DeterminateSystems/nix-installer

具体的に、このコマンドで必要なものを全部入れます。
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install

インストールが終わったら、shellに入って修正したらnixを使えるようになります。
次のステップとして好きなところにdirectoryを作って、nix flake init -t nix-darwinを実行すると flake.nixというファイルができます。本当は、flake使わなくても、nixだけで色々できますが、自分はlinuxでflakeを使って全部定義しているので、macOSでも同じやり方をしたいです。flakesを使うとその定義が若干難しくなりますが、バージョンコントロールもできるようになるし、いろんなところからパッケージを取得できるようになります。

上のコマンドでできたファイルに定義を入れることで、インストールして欲しいアプリやシステム設定などを定義します。

Nixの使い方

一番シンプルなflakeファイルが↓のようになってます。文字沢山入ってますが、基本的に、environment.systemPackagesにインストールして欲しいパッケージの一覧を入れて、それを含めているconfigurationを渡してdarwin-rebuild走らせるだけです。

入れたいパッケージの名前が分からない時は、NixOS Searchを使ってます!

ということで、自分のflake.nixがこんな感じになってます。

{
  description = "nix-darwin system flake";

 inputs = {
  nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  nix-darwin.url = "github:LnL7/nix-darwin";
  nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
 };

 outputs = inputs@{ self, nix-darwin, nixpkgs }:
 let
configuration = { pkgs, ... }: {
  nixpkgs.config.allowUnfree = true;
  environment.systemPackages = with pkgs;
  [
    # cli
    neovim yazi
    ack ripgrep ripgrep-all fzf fd duf
    peco progress jq
    bat eza rsync
    wget curl

    # archives
    unzip zip gzip xz unar

    # tools
    asciidoctor pandoc pdftk
    imagemagick ffmpeg
    ledger taskwarrior3
  ];

  nix.settings.experimental-features = "nix-command flakes";
  programs.zsh.enable = true;
  system.configurationRevision = self.rev or self.dirtyRev or null;
  system.stateVersion = 5;
  nixpkgs.hostPlatform = "aarch64-darwin";
 in
 {
# $ nix flake update
# $ nix run nix-darwin -- switch --flake .#shigoto
darwinConfigurations."shigoto" = nix-darwin.lib.darwinSystem {
  modules = [
    configuration
    ./dev.nix
  ];
};};}

ちなみに、fontsをこんなふうに入れます

fonts.packages = with pkgs; [
  monaspace nerdfonts font-awesome
];

ご覧の通り、全部の設定を同じファイルに入れる必要がなく、パッケージの定義をトピックなどによって分担させることもできます。例としては、dev.nixがこんな感じになってます

{config, pkgs, ...}:

{
  environment.systemPackages = with pkgs;
  [
go rustup nodejs

(pkgs.python3.withPackages (
  python-pkgs: with python-pkgs; [
    mypy pylint
    jedi jedi-language-server
  ]))

  gopls sqlc ccls ctags gnumake
  minio-client tenv
  ];
}

最後に、MacOSの設定の定義もできます↓

  system.defaults = {
    dock.autohide = true;
    NSGlobalDomain.AppleICUForce24HourTime = true;
    NSGlobalDomain.AppleShowAllExtensions = true;
    NSGlobalDomain.AppleInterfaceStyle = "Dark";
  };

どんな設定ができるのか調べたいときは、nix-darwinのdocsで探せます!

それ以外にもApp StoreやHomebrewのアプリも定義してインストールできますが、自分はこれまだやってないので次の機会に話します。

本当はhome-managerを使って.zshrcや.gitconfigなどのドットファイルの管理についても話したかったけど、すでに長くなっているので別の機会にします!

終わり

こんな感じで、軽く自分のMacOSの設定の話でした。チュートリアルではなく、あくまで紹介なので、詳細のことは何も話せないですが、もっと知りたい方にnixの公式docsお勧めします。また、ググってみるといろんな人の定義がでますので、参考になります。
ちなみに、自分の現状の定義がgitlab.com/utzuro/dotsに乗ってますから、参考になれると嬉しいです!

Discussion