diff --git a/modules/programs/cudatext.nix b/modules/programs/cudatext.nix new file mode 100644 index 000000000..69697e694 --- /dev/null +++ b/modules/programs/cudatext.nix @@ -0,0 +1,163 @@ +{ + lib, + pkgs, + config, + ... +}: +let + inherit (lib) + types + mkIf + mkEnableOption + mkPackageOption + mkOption + nameValuePair + mapAttrs' + ; + + cfg = config.programs.cudatext; + + jsonFormat = pkgs.formats.json { }; +in +{ + meta.maintainers = with lib.hm.maintainers; [ aguirre-matteo ]; + options.programs.cudatext = { + enable = mkEnableOption "cudatext"; + package = mkPackageOption pkgs "cudatext" { nullable = true; }; + hotkeys = mkOption { + inherit (jsonFormat) type; + default = { }; + example = { + "2823" = { + name = "code tree: clear filter"; + s1 = [ "Home" ]; + }; + + "153" = { + name = "delete char right (delete)"; + s1 = [ "End" ]; + }; + + "655465" = { + name = "caret to line end"; + s1 = [ ]; + }; + + "116" = { + name = "column select: page up"; + s1 = [ ]; + }; + + "655464" = { + name = "caret to line begin"; + s1 = [ ]; + }; + }; + description = '' + Hotkeys for Cudatext. To see the available options, change + the settings in the dialog "Help | Command palette" and + look at the changes in `settings/keys.json`. + ''; + }; + + userSettings = mkOption { + inherit (jsonFormat) type; + default = { }; + example = { + numbers_style = 2; + numbers_center = false; + numbers_for_carets = true; + }; + description = '' + User configuration for Cudatext. + ''; + }; + + lexerSettings = mkOption { + type = types.attrsOf jsonFormat.type; + default = { }; + example = { + C = { + numbers_style = 2; + }; + Python = { + numbers_style = 1; + numbers_center = false; + }; + Rust = { + numbers_style = 2; + numbers_center = false; + numbers_for_carets = true; + }; + }; + description = '' + User configuration settings specific to each lexer. + ''; + }; + + lexerHotkeys = mkOption { + type = types.attrsOf jsonFormat.type; + default = { }; + example = { + C = { + "153" = { + name = "delete char right (delete)"; + s1 = [ "End" ]; + }; + + "655465" = { + name = "caret to line end"; + s1 = [ ]; + }; + }; + + Python = { + "2823" = { + name = "code tree: clear filter"; + s1 = [ "Home" ]; + }; + + "655464" = { + name = "caret to line begin"; + s1 = [ ]; + }; + }; + }; + description = '' + Hotkeys settings specific to each lexer. + ''; + }; + }; + + config = + let + settingsPath = + if pkgs.stdenv.isDarwin then + "Library/Application Support/CudaText/settings" + else + "${lib.removePrefix config.home.homeDirectory config.xdg.configHome}/cudatext/settings"; + in + mkIf cfg.enable { + home.packages = mkIf (cfg.package != null) [ cfg.package ]; + home.file = { + "${settingsPath}/keys.json" = mkIf (cfg.hotkeys != { }) { + source = jsonFormat.generate "cudatext-keys.json" cfg.hotkeys; + }; + "${settingsPath}/user.json" = mkIf (cfg.userSettings != { }) { + source = jsonFormat.generate "cudatext-user.json" cfg.userSettings; + }; + } + // (mapAttrs' ( + k: v: + nameValuePair "${settingsPath}/lexer ${k}.json" { + source = jsonFormat.generate "cudatext-lexer-${k}" v; + } + ) cfg.lexerSettings) + // (mapAttrs' ( + k: v: + nameValuePair "${settingsPath}/keys lexer ${k}.json" { + source = jsonFormat.generate "cudatext-lexer-keys-${k}" v; + } + ) cfg.lexerHotkeys); + }; +} diff --git a/tests/darwinScrublist.nix b/tests/darwinScrublist.nix index 5f65894b9..3b282ab9d 100644 --- a/tests/darwinScrublist.nix +++ b/tests/darwinScrublist.nix @@ -32,6 +32,7 @@ let "cmus" "codex" "comodoro" + "cudatext" "darcs" "delta" "dircolors" diff --git a/tests/modules/programs/cudatext/default.nix b/tests/modules/programs/cudatext/default.nix new file mode 100644 index 000000000..fa78b5cc2 --- /dev/null +++ b/tests/modules/programs/cudatext/default.nix @@ -0,0 +1 @@ +{ cudatext-example-config = ./example-config.nix; } diff --git a/tests/modules/programs/cudatext/example-config.nix b/tests/modules/programs/cudatext/example-config.nix new file mode 100644 index 000000000..8a52554d7 --- /dev/null +++ b/tests/modules/programs/cudatext/example-config.nix @@ -0,0 +1,112 @@ +{ pkgs, ... }: + +{ + programs.cudatext = { + enable = true; + userSettings = { + numbers_style = 2; + numbers_center = false; + numbers_for_carets = true; + }; + + hotkeys = { + "2823" = { + name = "code tree: clear filter"; + s1 = [ "Home" ]; + }; + + "153" = { + name = "delete char right (delete)"; + s1 = [ "End" ]; + }; + + "655465" = { + name = "caret to line end"; + s1 = [ ]; + }; + + "116" = { + name = "column select: page up"; + s1 = [ ]; + }; + + "655464" = { + name = "caret to line begin"; + s1 = [ ]; + }; + }; + + lexerSettings = { + C = { + numbers_style = 2; + }; + Python = { + numbers_style = 1; + numbers_center = false; + }; + Rust = { + numbers_style = 2; + numbers_center = false; + numbers_for_carets = true; + }; + }; + + lexerHotkeys = { + C = { + "153" = { + name = "delete char right (delete)"; + s1 = [ "End" ]; + }; + + "655465" = { + name = "caret to line end"; + s1 = [ ]; + }; + }; + + Python = { + "2823" = { + name = "code tree: clear filter"; + s1 = [ "Home" ]; + }; + + "655464" = { + name = "caret to line begin"; + s1 = [ ]; + }; + }; + }; + }; + + nmt.script = + let + settingsPath = + if pkgs.stdenv.isDarwin then + "home-files/Library/Application Support/CudaText/settings" + else + "home-files/.config/cudatext/settings"; + in + '' + assertFileExists "${settingsPath}/user.json" + assertFileExists "${settingsPath}/keys.json" + + assertFileExists "${settingsPath}/lexer C.json" + assertFileExists "${settingsPath}/lexer Python.json" + assertFileExists "${settingsPath}/lexer Rust.json" + + assertFileExists "${settingsPath}/keys lexer C.json" + assertFileExists "${settingsPath}/keys lexer Python.json" + + + + assertFileContent "${settingsPath}/user.json" ${./user.json} + assertFileContent "${settingsPath}/keys.json" ${./keys.json} + + assertFileContent "${settingsPath}/lexer C.json" ${./lexerC.json} + assertFileContent "${settingsPath}/lexer Python.json" ${./lexerPython.json} + assertFileContent "${settingsPath}/lexer Rust.json" ${./lexerRust.json} + + assertFileContent "${settingsPath}/keys lexer C.json" ${./keysLexerC.json} + assertFileContent "${settingsPath}/keys lexer Python.json" ${./keysLexerPython.json} + ''; +} diff --git a/tests/modules/programs/cudatext/keys.json b/tests/modules/programs/cudatext/keys.json new file mode 100644 index 000000000..e44046410 --- /dev/null +++ b/tests/modules/programs/cudatext/keys.json @@ -0,0 +1,26 @@ +{ + "116": { + "name": "column select: page up", + "s1": [] + }, + "153": { + "name": "delete char right (delete)", + "s1": [ + "End" + ] + }, + "2823": { + "name": "code tree: clear filter", + "s1": [ + "Home" + ] + }, + "655464": { + "name": "caret to line begin", + "s1": [] + }, + "655465": { + "name": "caret to line end", + "s1": [] + } +} diff --git a/tests/modules/programs/cudatext/keysLexerC.json b/tests/modules/programs/cudatext/keysLexerC.json new file mode 100644 index 000000000..87caac2d9 --- /dev/null +++ b/tests/modules/programs/cudatext/keysLexerC.json @@ -0,0 +1,12 @@ +{ + "153": { + "name": "delete char right (delete)", + "s1": [ + "End" + ] + }, + "655465": { + "name": "caret to line end", + "s1": [] + } +} diff --git a/tests/modules/programs/cudatext/keysLexerPython.json b/tests/modules/programs/cudatext/keysLexerPython.json new file mode 100644 index 000000000..0b7cb0f41 --- /dev/null +++ b/tests/modules/programs/cudatext/keysLexerPython.json @@ -0,0 +1,12 @@ +{ + "2823": { + "name": "code tree: clear filter", + "s1": [ + "Home" + ] + }, + "655464": { + "name": "caret to line begin", + "s1": [] + } +} diff --git a/tests/modules/programs/cudatext/lexerC.json b/tests/modules/programs/cudatext/lexerC.json new file mode 100644 index 000000000..3ada19dfa --- /dev/null +++ b/tests/modules/programs/cudatext/lexerC.json @@ -0,0 +1,3 @@ +{ + "numbers_style": 2 +} diff --git a/tests/modules/programs/cudatext/lexerPython.json b/tests/modules/programs/cudatext/lexerPython.json new file mode 100644 index 000000000..4d20ca2de --- /dev/null +++ b/tests/modules/programs/cudatext/lexerPython.json @@ -0,0 +1,4 @@ +{ + "numbers_center": false, + "numbers_style": 1 +} diff --git a/tests/modules/programs/cudatext/lexerRust.json b/tests/modules/programs/cudatext/lexerRust.json new file mode 100644 index 000000000..329c39384 --- /dev/null +++ b/tests/modules/programs/cudatext/lexerRust.json @@ -0,0 +1,5 @@ +{ + "numbers_center": false, + "numbers_for_carets": true, + "numbers_style": 2 +} diff --git a/tests/modules/programs/cudatext/user.json b/tests/modules/programs/cudatext/user.json new file mode 100644 index 000000000..329c39384 --- /dev/null +++ b/tests/modules/programs/cudatext/user.json @@ -0,0 +1,5 @@ +{ + "numbers_center": false, + "numbers_for_carets": true, + "numbers_style": 2 +}