diff --git a/plugins/default.nix b/plugins/default.nix index 90d2a408..deff4a8e 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -28,6 +28,7 @@ ./languages/nix.nix ./languages/plantuml-syntax.nix ./languages/rust.nix + ./languages/sniprun.nix ./languages/tagbar.nix ./languages/treesitter.nix ./languages/treesitter-context.nix diff --git a/plugins/languages/sniprun.nix b/plugins/languages/sniprun.nix new file mode 100644 index 00000000..e6f7f28e --- /dev/null +++ b/plugins/languages/sniprun.nix @@ -0,0 +1,164 @@ +{ + pkgs, + config, + lib, + ... +}: +with lib; let + cfg = config.plugins.sniprun; + helpers = import ../helpers.nix {inherit lib;}; + + mkList = helpers.defaultNullOpts.mkNullable (types.listOf types.str); +in { + options.plugins.sniprun = + helpers.extraOptionsOptions + // { + enable = mkEnableOption "sniprun"; + + package = helpers.mkPackageOption "sniprun" pkgs.vimPlugins.sniprun; + + selectedInterpreters = + mkList "[]" + "use those instead of the default for the current filetype"; + + replEnable = mkList "[]" "Enable REPL-like behavior for the given interpreters"; + + replDisable = mkList "[]" "Disable REPL-like behavior for the given interpreters"; + + interpreterOptions = + helpers.defaultNullOpts.mkNullable types.attrs "{}" + "interpreter-specific options, see docs / :SnipInfo "; + + display = + mkList ''["Classic" "VirtualTextOk"]'' + '' + You can combo different display modes as desired and with the 'Ok' or 'Err' suffix to filter + only sucessful runs (or errored-out runs respectively) + + Example: + ``` + [ + "Classic" # display results in the command-line area + "VirtualTextOk" # display ok results as virtual text (multiline is shortened) + + # "VirtualText" # display results as virtual text + # "TempFloatingWindow" # display results in a floating window + # "LongTempFloatingWindow" # same as above, but only long results. To use with VirtualText[Ok/Err] + # "Terminal" # display results in a vertical split + # "TerminalWithCode" # display results and code history in a vertical split + # "NvimNotify" # display with the nvim-notify plugin + # "Api" # return output to a programming interface + ] + ``` + ''; + + liveDisplay = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) ''["VirtualTextOk"]'' + "Display modes used in live_mode"; + + displayOptions = helpers.mkCompositeOption "Display options" { + terminalWidth = + helpers.defaultNullOpts.mkInt 45 + "Change the terminal display option width."; + + notificationTimeout = + helpers.defaultNullOpts.mkInt 5 + "Timeout for nvim_notify output."; + }; + + showNoOutput = mkList ''["Classic" "TempFloatingWindow"]'' '' + You can use the same keys to customize whether a sniprun producing no output should display + nothing or '(no output)'. + ''; + + snipruncolors = let + colorOption = { + fg ? "", + bg ? "", + ctermbg ? "", + ctermfg ? "", + }: + helpers.mkCompositeOption "" { + bg = helpers.defaultNullOpts.mkStr fg "Background color"; + fg = helpers.defaultNullOpts.mkStr bg "Foreground color"; + ctermbg = helpers.defaultNullOpts.mkStr ctermbg "Foreground color"; + ctermfg = helpers.defaultNullOpts.mkStr ctermfg "Foreground color"; + }; + in + helpers.mkCompositeOption + "Customize highlight groups (setting this overrides colorscheme)" + ( + mapAttrs + (optionName: defaults: colorOption defaults) + { + SniprunVirtualTextOk = { + bg = "#66eeff"; + fg = "#000000"; + ctermbg = "Cyan"; + ctermfg = "Black"; + }; + SniprunFloatingWinOk = { + fg = "#66eeff"; + ctermfg = "Cyan"; + }; + SniprunVirtualTextErr = { + bg = "#881515"; + fg = "#000000"; + ctermbg = "DarkRed"; + ctermfg = "Black"; + }; + SniprunFloatingWinErr = { + fg = "#881515"; + ctermfg = "DarkRed"; + }; + } + ); + + liveModeToggle = + helpers.defaultNullOpts.mkStr "off" + "Live mode toggle, see Usage - Running for more info."; + + borders = + helpers.defaultNullOpts.mkEnum ["none" "single" "double" "shadow"] "single" + "Display borders around floating windows."; + }; + + config = mkIf cfg.enable { + extraPlugins = with pkgs.vimPlugins; + [ + cfg.package + ] + ++ ( + optional + ( + (!isNull cfg.display) + && (any (hasPrefix "NvimNotify") cfg.display) + ) + nvim-notify + ); + + extraConfigLua = let + options = + { + selected_interpreters = cfg.selectedInterpreters; + repl_enable = cfg.replEnable; + repl_disable = cfg.replDisable; + interpreter_options = cfg.interpreterOptions; + inherit (cfg) display; + live_display = cfg.liveDisplay; + display_options = with cfg.displayOptions; + helpers.ifNonNull' cfg.displayOptions { + terminal_width = terminalWidth; + notification_timeout = notificationTimeout; + }; + show_no_output = cfg.showNoOutput; + inherit (cfg) snipruncolors; + live_mode_toggle = cfg.liveModeToggle; + inherit (cfg) borders; + } + // cfg.extraOptions; + in '' + require('sniprun').setup(${helpers.toLuaObject options}) + ''; + }; +} diff --git a/tests/plugins/sniprun.nix b/tests/plugins/sniprun.nix new file mode 100644 index 00000000..6e6da7fb --- /dev/null +++ b/tests/plugins/sniprun.nix @@ -0,0 +1,46 @@ +{ + empty = { + plugins.sniprun.enable = true; + }; + + default = { + plugins.sniprun = { + enable = true; + selectedInterpreters = []; + replEnable = []; + replDisable = []; + interpreterOptions = {}; + display = ["Classic" "VirtualTextOk"]; + liveDisplay = ["VirtualTextOk"]; + displayOptions = { + terminalWidth = 45; + notificationTimeout = 5; + }; + showNoOutput = ["Classic" "TempFloatingWindow"]; + snipruncolors = { + SniprunVirtualTextOk = { + bg = "#66eeff"; + fg = "#000000"; + ctermbg = "Cyan"; + ctermfg = "Black"; + }; + SniprunFloatingWinOk = { + fg = "#66eeff"; + ctermfg = "Cyan"; + }; + SniprunVirtualTextErr = { + bg = "#881515"; + fg = "#000000"; + ctermbg = "DarkRed"; + ctermfg = "Black"; + }; + SniprunFloatingWinErr = { + fg = "#881515"; + ctermfg = "DarkRed"; + }; + }; + liveModeToggle = "off"; + borders = "single"; + }; + }; +}