diff --git a/modules/mc.nix b/modules/mc.nix index bbe6989..3d01edd 100644 --- a/modules/mc.nix +++ b/modules/mc.nix @@ -10,23 +10,43 @@ # mutable runtime state (history, cursor positions) in $XDG_DATA_HOME/mc — no # env vars needed. `ini` sets auto_save_setup=false so mc never rewrites these # read-only store symlinks on exit. +# +# The F2 menu is a `types.lines` option, not a baked source file, so consumers +# can extend or replace it. The shipped menu is a `mkBefore` definition (stays +# first, ahead of appended entries), NOT a `default` — a `default` is dropped +# the moment a consumer adds a definition, which would lose the base. As a real +# definition it merges: `local.mc.menu = "…";` appends after the base entries; +# `lib.mkForce "…"` replaces it wholesale. { config, lib, pkgs, ... }: { - options.local.mc.otherDir = lib.mkOption { - type = lib.types.str; - default = config.home.homeDirectory; - defaultText = lib.literalExpression "config.home.homeDirectory"; - description = "Startup directory for mc's other (right) panel."; + options.local.mc = { + otherDir = lib.mkOption { + type = lib.types.str; + default = config.home.homeDirectory; + defaultText = lib.literalExpression "config.home.homeDirectory"; + description = "Startup directory for mc's other (right) panel."; + }; + + menu = lib.mkOption { + type = lib.types.lines; + description = '' + Contents of mc's F2 user menu. The shipped baseline is a mkBefore + definition, so a plain assignment appends entries after it; use + lib.mkForce to replace it entirely. + ''; + }; }; config = { home.packages = [ pkgs.mc pkgs.ouch ]; + local.mc.menu = lib.mkBefore (builtins.readFile ./assets/mc/menu); + xdg.configFile = { "mc/ini".source = ./assets/mc/ini; - "mc/menu".source = ./assets/mc/menu; + "mc/menu".text = config.local.mc.menu; # Generated (not a static asset) so other_dir tracks the option instead of # baking in a personal path.