From 35e1f5a7c29f2b05e8f53177f6b5c71108c5f4c3 Mon Sep 17 00:00:00 2001 From: Egor Konovalov <73017521+egorkonovalov@users.noreply.github.com> Date: Mon, 9 Jun 2025 16:25:11 +0200 Subject: [PATCH] mc: add midnight commander module (#7225) --- modules/modules.nix | 1 + modules/programs/mc.nix | 119 ++++++++++++++++++ tests/default.nix | 1 + tests/modules/programs/mc/basic-configuration | 2 + .../programs/mc/basic-configuration.nix | 66 ++++++++++ tests/modules/programs/mc/default.nix | 1 + tests/modules/programs/mc/filehighlight.ini | 2 + tests/modules/programs/mc/mc.ext.ini | 3 + tests/modules/programs/mc/mc.keymap | 2 + tests/modules/programs/mc/panels.ini | 3 + 10 files changed, 200 insertions(+) create mode 100644 modules/programs/mc.nix create mode 100644 tests/modules/programs/mc/basic-configuration create mode 100644 tests/modules/programs/mc/basic-configuration.nix create mode 100644 tests/modules/programs/mc/default.nix create mode 100644 tests/modules/programs/mc/filehighlight.ini create mode 100644 tests/modules/programs/mc/mc.ext.ini create mode 100644 tests/modules/programs/mc/mc.keymap create mode 100644 tests/modules/programs/mc/panels.ini diff --git a/modules/modules.nix b/modules/modules.nix index bb1a61a8..436726d1 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -188,6 +188,7 @@ let ./programs/mangohud.nix ./programs/matplotlib.nix ./programs/mbsync.nix + ./programs/mc.nix ./programs/mcfly.nix ./programs/meli.nix ./programs/mercurial.nix diff --git a/modules/programs/mc.nix b/modules/programs/mc.nix new file mode 100644 index 00000000..a91320bb --- /dev/null +++ b/modules/programs/mc.nix @@ -0,0 +1,119 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + cfg = config.programs.mc; + type = (pkgs.formats.ini { }).type; +in +{ + options.programs.mc = { + enable = lib.mkEnableOption "Midnight Commander"; + + package = lib.mkPackageOption pkgs "mc" { nullable = true; }; + + settings = lib.mkOption { + inherit type; + default = { }; + description = '' + Settings for `mc/ini` file. + + Any missing settings will fall back to the system default. + ''; + example = { + Panels = { + show_dot_files = false; + }; + }; + }; + + keymapSettings = lib.mkOption { + inherit type; + default = { }; + description = '' + Settings for `mc/mc.keymap` file. + + Any missing settings will fall back to the system default. + ''; + example = { + panel = { + Up = "up;ctrl-k"; + }; + }; + }; + + extensionSettings = lib.mkOption { + inherit type; + default = { }; + description = '' + Settings for `mc/mc.ext.ini` file. This setting completely replaces the default `/etc/mc/mc.ext.ini`. + + Midnight Commander does not merge this file with the system default, + so you should copy the original if you want to preserve default behavior and add your changes there. + ''; + example = { + EPUB = { + Shell = ".epub"; + Open = "fbreader %f &"; + }; + }; + }; + + panelsSettings = lib.mkOption { + inherit type; + default = { }; + description = '' + Settings for `mc/panels` file. + + Any missing settings will fall back to the system default. + ''; + example = { + Dirs = { + current_is_left = false; + other_dir = "/home"; + }; + }; + }; + + fileHighlightSettings = lib.mkOption { + inherit type; + default = { }; + description = '' + Settings for `mc/filehighlight.ini` file. This setting completely replaces the default `/etc/mc/filehighlight.ini`. + + Midnight Commander does not merge this file with the system default, so you should copy the original if you want to preserve default behavior + and add your changes there. + ''; + example = { + lua = { + extensions = "lua;luac"; + }; + }; + }; + }; + + config = lib.mkIf cfg.enable { + home.packages = lib.mkIf (cfg.package != null) [ cfg.package ]; + + xdg.configFile = { + "mc/ini" = lib.mkIf (cfg.settings != { }) { + text = lib.generators.toINI { } cfg.settings; + }; + "mc/mc.keymap" = lib.mkIf (cfg.keymapSettings != { }) { + text = lib.generators.toINI { } cfg.keymapSettings; + }; + "mc/mc.ext.ini" = lib.mkIf (cfg.extensionSettings != { }) { + text = lib.generators.toINI { } cfg.extensionSettings; + }; + "mc/panels.ini" = lib.mkIf (cfg.panelsSettings != { }) { + text = lib.generators.toINI { } cfg.panelsSettings; + }; + "mc/filehighlight.ini" = lib.mkIf (cfg.fileHighlightSettings != { }) { + text = lib.generators.toINI { } cfg.fileHighlightSettings; + }; + }; + }; +} diff --git a/tests/default.nix b/tests/default.nix index 857a59e3..ffb45294 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -245,6 +245,7 @@ import nmtSrc { ./modules/programs/lsd ./modules/programs/man ./modules/programs/mbsync + ./modules/programs/mc ./modules/programs/meli ./modules/programs/mergiraf ./modules/programs/micro diff --git a/tests/modules/programs/mc/basic-configuration b/tests/modules/programs/mc/basic-configuration new file mode 100644 index 00000000..ace3f7e0 --- /dev/null +++ b/tests/modules/programs/mc/basic-configuration @@ -0,0 +1,2 @@ +[Panels] +show_dot_files=false diff --git a/tests/modules/programs/mc/basic-configuration.nix b/tests/modules/programs/mc/basic-configuration.nix new file mode 100644 index 00000000..e23042f1 --- /dev/null +++ b/tests/modules/programs/mc/basic-configuration.nix @@ -0,0 +1,66 @@ +{ config, lib, ... }: + +{ + programs.mc = { + enable = true; + + settings = { + Panels = { + show_dot_files = false; + }; + }; + + keymapSettings = { + panel = { + Up = "up;ctrl-k"; + }; + }; + + extensionSettings = { + EPUB = { + Shell = ".epub"; + Open = "fbreader %f &"; + }; + }; + + panelsSettings = { + Dirs = { + current_is_left = false; + other_dir = "/home"; + }; + }; + + fileHighlightSettings = { + lua = { + extensions = "lua;luac"; + }; + }; + }; + + nmt.script = '' + + mcFolder="home-files/.config/mc" + + assertFileExists "$mcFolder/ini" + assertFileExists "$mcFolder/mc.keymap" + assertFileExists "$mcFolder/mc.ext.ini" + assertFileExists "$mcFolder/panels.ini" + assertFileExists "$mcFolder/filehighlight.ini" + + assertFileContent \ + "$mcFolder/ini" \ + ${./basic-configuration} + assertFileContent \ + "$mcFolder/mc.keymap" \ + ${./mc.keymap} + assertFileContent \ + "$mcFolder/mc.ext.ini" \ + ${./mc.ext.ini} + assertFileContent \ + "$mcFolder/panels.ini" \ + ${./panels.ini} + assertFileContent \ + "$mcFolder/filehighlight.ini" \ + ${./filehighlight.ini} + ''; +} diff --git a/tests/modules/programs/mc/default.nix b/tests/modules/programs/mc/default.nix new file mode 100644 index 00000000..35829013 --- /dev/null +++ b/tests/modules/programs/mc/default.nix @@ -0,0 +1 @@ +{ mc-basic-configuration = ./basic-configuration.nix; } diff --git a/tests/modules/programs/mc/filehighlight.ini b/tests/modules/programs/mc/filehighlight.ini new file mode 100644 index 00000000..04862517 --- /dev/null +++ b/tests/modules/programs/mc/filehighlight.ini @@ -0,0 +1,2 @@ +[lua] +extensions=lua;luac diff --git a/tests/modules/programs/mc/mc.ext.ini b/tests/modules/programs/mc/mc.ext.ini new file mode 100644 index 00000000..99e8cdb1 --- /dev/null +++ b/tests/modules/programs/mc/mc.ext.ini @@ -0,0 +1,3 @@ +[EPUB] +Open=fbreader %f & +Shell=.epub diff --git a/tests/modules/programs/mc/mc.keymap b/tests/modules/programs/mc/mc.keymap new file mode 100644 index 00000000..68c44334 --- /dev/null +++ b/tests/modules/programs/mc/mc.keymap @@ -0,0 +1,2 @@ +[panel] +Up=up;ctrl-k diff --git a/tests/modules/programs/mc/panels.ini b/tests/modules/programs/mc/panels.ini new file mode 100644 index 00000000..0632b3ba --- /dev/null +++ b/tests/modules/programs/mc/panels.ini @@ -0,0 +1,3 @@ +[Dirs] +current_is_left=false +other_dir=/home