# nixos-config - My current NixOS configuration # # Copyright (C) 2025 Benedikt Peetz # SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of my nixos-config. # # You should have received a copy of the License along with this program. # If not, see . { config, lib, pkgs, ... }: let cfg = config.soispha.programs.fish; sourceFile = path: "source ${path}\n"; extraFiles = builtins.concatStringsSep "\n" ( builtins.map (value: if builtins.isPath value then (sourceFile value) else value) ( builtins.attrValues cfg.integrations ) ); keymappings_raw = import ./keymappings.nix {inherit lib;}; mkBinding = mode: base_key: binding: let sets_mode_to = if binding ? sets_mode_to then "--sets-mode ${binding.sets_mode_to} " else ""; in if binding ? cmd then let mkCmd = cmd: "'${cmd}'"; escaped_key = if base_key == "" then ''""'' else lib.escape [ "\"" "(" ")" "$" ";" "*" "&" "|" "~" "<" ">" "^" "#" ] base_key; escaped_cmd = if builtins.isList binding.cmd then builtins.concatStringsSep " " (builtins.map mkCmd binding.cmd) else mkCmd binding.cmd; in '' bind --mode "${mode}" ${sets_mode_to}--preset ${escaped_key} ${escaped_cmd} '' else builtins.concatStringsSep "" (lib.mapAttrsToList (new_key: value: mkBinding mode "${base_key + "," + new_key}" value) binding); mkMode = mode: attr: builtins.concatStringsSep "" (lib.mapAttrsToList (mkBinding mode) attr); keymappings = '' function fish_my_key_bindings fish_vi_key_bindings bind --erase --all --preset '' + builtins.concatStringsSep "\n" (lib.mapAttrsToList mkMode keymappings_raw) + '' end set -g fish_key_bindings fish_my_key_bindings ''; in { options.soispha.programs.fish = { enable = lib.mkEnableOption "fish"; integrations = lib.mkOption { type = lib.types.attrsOf (lib.types.either lib.types.path lib.types.str); example = '' { atuin = ./integrations/atuin.fish; } ''; default = {}; }; }; config = lib.mkIf cfg.enable { # Ensure that the default shell of the user is actually enabled. programs.fish = { enable = true; package = pkgs.fish-patched; }; users.users.soispha.shell = config.programs.fish.package; home-manager.users.soispha = { home.sessionPath = lib.mkForce []; programs.fish = { enable = true; package = config.programs.fish.package; interactiveShellInit = let start = lib.modules.mkBefore ( sourceFile ./config/01_show-task.fish ); end = lib.modules.mkAfter keymappings; in lib.modules.mkMerge [ start extraFiles end ]; }; }; }; }