Best practices for shell management

Is there a recommended way to do shell management using nix-darwin/NixOS and Home-Manager?

I like to use the fish shell, but for reasons that I don’t understand, nix-darwin/NixOS don’t support things like shell abbreviations and functions. If I were to set up my login shell using nix-darwin/NixOS and then use Home-Manager to manage my shell configuration, wouldn’t that end up with two separate installations of fish? And would that be a problem?

I use fish shell and it works.

nix-darwin installs fish and sets files for all users in /etc There is a setting programs.fish.shellAliases That will set aliases in a file in /etc,

To set file for the user I use home-mnaager and this does understand shell abbreviations and functions.

You do need to set programs.fish.enable in both nix-darwin and home-manager.

This is not a problem if you set home-manager to use the same nixpkgs as nix-darwin. fish is seen twice but maps to the same place in /nix/store and so you only have one copy.
I think this can be done by setting nixpkgs in your flake to match or use the same channels but the easy way is to use the nix-darwin module in home manager Home Manager Manual and set home-manager.useGlobalPkgs = true;

Thanks. I knew but had forgotten that using fish in both won’t actually install two separate instances of fish. This makes sense. The setup you suggest is exactly what I have.