diff --git a/lib/helpers.nix b/lib/helpers.nix index 05347234..7e8b44a0 100644 --- a/lib/helpers.nix +++ b/lib/helpers.nix @@ -73,6 +73,8 @@ rec { description = desc; }; + mkIfNonNull = c: mkIf (!isNull c) c; + defaultNullOpts = rec { mkNullable = type: default: desc: mkNullOrOption type ( let @@ -87,7 +89,7 @@ rec { mkInt = default: mkNullable lib.types.int (toString default); mkBool = default: mkNullable lib.types.bool (if default then "true" else "false"); - mkStr = default: mkNullable lib.types.str ''"${default}"''; + mkStr = default: mkNullable lib.types.str ''${builtins.toString default}''; mkEnum = enum: default: mkNullable (lib.types.enum enum) ''"${default}"''; mkEnumFirstDefault = enum: mkEnum enum (head enum); }; diff --git a/modules/autocmd.nix b/modules/autocmd.nix index 2502ebd3..8a7ebc3e 100644 --- a/modules/autocmd.nix +++ b/modules/autocmd.nix @@ -1,93 +1,99 @@ { config, lib, ... }: with lib; let - helpers = import ../plugins/helpers.nix { inherit lib; }; + helpers = import ../lib/helpers.nix { inherit lib; }; - autoCmdOption = types.submodule { + autoGroupOption = types.submodule { options = { - event = mkOption { - type = types.oneOf [ - types.str - (types.listOf types.str) - ]; - description = "The event or events to register this autocommand."; - }; - - group = mkOption { - type = types.nullOr (types.oneOf [ - types.str - types.int - ]); - description = "The autocommand group name or id to match against."; - default = null; - }; - - pattern = mkOption { - type = types.nullOr (types.oneOf [ - types.str - (types.listOf types.str) - ]); - description = "Pattern or patterns to match literally against."; - default = null; - }; - - buffer = mkOption { - type = types.nullOr types.int; - description = "Buffer number for buffer local autocommands |autocmd-buflocal|. Cannot be used with ."; - default = null; - }; - - description = mkOption { - type = types.nullOr types.str; - description = "A textual description of this autocommand."; - default = null; - }; - - callback = mkOption { - type = types.nullOr types.str; - description = "The name of a Vimscript function to call when this autocommand is triggered. Cannot be used with ."; - default = null; - }; - - command = mkOption { - type = types.nullOr types.str; - description = "Vim command to execute on event. Cannot be used with "; - default = null; - }; - - once = mkOption { - type = types.nullOr types.bool; - description = "Run the autocommand only once"; - default = null; - }; - - nested = mkOption { - type = types.nullOr types.bool; - description = "Run nested autocommands."; - default = null; + clear = mkOption { + type = types.bool; + description = "Clear existing commands if the group already exists."; + default = true; }; }; }; -in -{ - options.autoCmd = mkOption { - type = types.listOf autoCmdOption; - default = [ ]; - description = "autocmd definitions"; - example = '' - autoCmd = [ - { - event = [ "BufEnter" "BufWinEnter" ]; - pattern = [ "*.c" "*.h" ]; - command = "echo 'Entering a C or C++ file'"; - } - ]; - ''; + + autoCmdOption = types.submodule { + options = { + event = helpers.mkNullOrOption (types.either types.str (types.listOf types.str)) '' + The event or events to register this autocommand. + ''; + + group = helpers.mkNullOrOption (types.either types.str types.int) '' + The autocommand group name or id to match against. + ''; + + pattern = helpers.mkNullOrOption (types.either types.str (types.listOf types.str)) '' + Pattern or patterns to match literally against. + ''; + + buffer = helpers.defaultNullOpts.mkInt "" '' + Buffer number for buffer local autocommands |autocmd-buflocal|. + Cannot be used with . + ''; + + description = helpers.defaultNullOpts.mkStr "" "A textual description of this autocommand."; + + callback = helpers.defaultNullOpts.mkStr "" '' + The name of a Vimscript function to call when this autocommand is triggered. Cannot be used with . + ''; + + command = helpers.defaultNullOpts.mkStr "" '' + Vim command to execute on event. Cannot be used with + ''; + + once = helpers.defaultNullOpts.mkBool false "Run the autocommand only once"; + + nested = helpers.defaultNullOpts.mkBool false "Run nested autocommands."; + }; }; - config = { - extraConfigLua = optionalString (config.autoCmd != [ ]) '' - -- Set up autocommands {{{ +in +{ + options = { + autoGroups = mkOption { + type = types.attrsOf autoGroupOption; + default = { }; + description = "augroup definitions"; + example = '' + autoGroups = { + my_augroup = { + clear = true; + } + }; + ''; + }; + + autoCmd = mkOption { + type = types.listOf autoCmdOption; + default = [ ]; + description = "autocmd definitions"; + example = '' + autoCmd = [ + { + event = [ "BufEnter" "BufWinEnter" ]; + pattern = [ "*.c" "*.h" ]; + command = "echo 'Entering a C or C++ file'"; + } + ]; + ''; + }; + }; + + config = mkIf (config.autoGroups != { } || config.autoCmd != { }) { + extraConfigLuaPost = (optionalString (config.autoGroups != { }) '' + -- Set up autogroups {{ + do + local __nixvim_autogroups = ${helpers.toLuaObject config.autoGroups} + + for group_name, options in pairs(__nixvim_autogroups) do + vim.api.nvim_create_augroup(group_name, options) + end + end + -- }} + '') + + (optionalString (config.autoCmd != [ ]) '' + -- Set up autocommands {{ do local __nixvim_autocommands = ${helpers.toLuaObject config.autoCmd} @@ -107,7 +113,7 @@ in ) end end - -- }}} - ''; + -- }} + ''); }; } diff --git a/modules/options.nix b/modules/options.nix index 71e5e5d1..e448db17 100644 --- a/modules/options.nix +++ b/modules/options.nix @@ -35,7 +35,7 @@ in local nixvim_options = ${helpers.toLuaObject config.options} for k,v in pairs(nixvim_options) do - vim.o[k] = v + vim.opt[k] = v end end -- }}} diff --git a/plugins/bufferlines/bufferline.nix b/plugins/bufferlines/bufferline.nix index 090a553c..46d065d2 100644 --- a/plugins/bufferlines/bufferline.nix +++ b/plugins/bufferlines/bufferline.nix @@ -263,10 +263,7 @@ in middle_mouse_command = cfg.middleMouseCommand; # deprecated, but might still work indicator_icon = cfg.indicatorIcon; - indicator = { - icon = cfg.indicator.icon; - style = cfg.indicator.style; - }; + indicator = cfg.indicator; buffer_close_icon = cfg.bufferCloseIcon; modified_icon = cfg.modifiedIcon; close_icon = cfg.closeIcon; diff --git a/plugins/colorschemes/tokyonight.nix b/plugins/colorschemes/tokyonight.nix index fba4069f..268b49c4 100644 --- a/plugins/colorschemes/tokyonight.nix +++ b/plugins/colorschemes/tokyonight.nix @@ -1,75 +1,56 @@ -{ pkgs, config, lib, ... }: -with lib; -let +{ pkgs +, config +, lib +, ... +}@args: +with lib; let cfg = config.colorschemes.tokyonight; - style = types.enum [ "storm" "night" "day" ]; - helpers = import ../helpers.nix { inherit lib; }; + helpers = import ../helpers.nix args; in { options = { colorschemes.tokyonight = { enable = mkEnableOption "tokyonight"; package = helpers.mkPackageOption "tokyonight" pkgs.vimPlugins.tokyonight-nvim; - style = mkOption { - type = style; - default = "storm"; - description = "Theme style"; - }; - terminalColors = mkOption { - type = types.bool; - default = true; - description = "Configure the colors used when opening a :terminal in Neovim"; - }; - transparent = mkEnableOption "disable setting the background color"; + style = helpers.defaultNullOpts.mkEnumFirstDefault [ "storm" "night" "day" ] "Theme style"; + terminalColors = + helpers.defaultNullOpts.mkBool true + "Configure the colors used when opening a :terminal in Neovim"; + transparent = helpers.defaultNullOpts.mkBool false "disable setting the background color"; styles = let - mkBackgroundStyle = name: mkOption { - type = types.enum [ "dark" "transparent" "normal" ]; - description = "Background style for ${name}"; - default = "dark"; - }; + mkBackgroundStyle = name: + helpers.defaultNullOpts.mkEnumFirstDefault [ "dark" "transparent" "normal" ] + "Background style for ${name}"; in { - comments = mkOption { - type = types.attrsOf types.anything; - description = "Define comments highlight properties"; - default = { italic = true; }; - }; - keywords = mkOption { - type = types.attrsOf types.anything; - description = "Define keywords highlight properties"; - default = { italic = true; }; - }; - functions = mkOption { - type = types.attrsOf types.anything; - description = "Define functions highlight properties"; - default = { }; - }; - variables = mkOption { - type = types.attrsOf types.anything; - description = "Define variables highlight properties"; - default = { }; - }; + comments = + helpers.defaultNullOpts.mkNullable (types.attrsOf types.anything) "{italic = true;}" + "Define comments highlight properties"; + keywords = + helpers.defaultNullOpts.mkNullable (types.attrsOf types.anything) "{italic = true;}" + "Define keywords highlight properties"; + functions = + helpers.defaultNullOpts.mkNullable (types.attrsOf types.anything) "{}" + "Define functions highlight properties"; + variables = + helpers.defaultNullOpts.mkNullable (types.attrsOf types.anything) "{}" + "Define variables highlight properties"; sidebars = mkBackgroundStyle "sidebars"; floats = mkBackgroundStyle "floats"; }; - sidebars = mkOption { - type = types.listOf types.str; - default = [ "qf" "help" ]; - description = "Set a darker background on sidebar-like windows"; - example = ''["qf" "vista_kind" "terminal" "packer"]''; - }; - dayBrightness = mkOption { - type = types.numbers.between 0.0 1.0; - default = 0.3; - description = "Adjusts the brightness of the colors of the **Day** style"; - }; + sidebars = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) ''["qf" "help"]'' + "Set a darker background on sidebar-like windows"; + dayBrightness = + helpers.defaultNullOpts.mkNullable (types.numbers.between 0.0 1.0) "0.3" + "Adjusts the brightness of the colors of the **Day** style"; hideInactiveStatusline = - mkEnableOption + helpers.defaultNullOpts.mkBool false "Enabling this option will hide inactive statuslines and replace them with a thin border"; - dimInactive = mkEnableOption "dims inactive windows"; + dimInactive = helpers.defaultNullOpts.mkBool false "dims inactive windows"; lualineBold = - mkEnableOption + helpers.defaultNullOpts.mkBool false "When true, section headers in the lualine theme will be bold"; }; }; diff --git a/plugins/default.nix b/plugins/default.nix index a6f950ec..254cea00 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -18,10 +18,13 @@ ./git/fugitive.nix ./git/gitgutter.nix + ./git/gitmessenger.nix ./git/gitsigns.nix ./git/neogit.nix + ./languages/clangd-extensions.nix ./languages/ledger.nix + ./languages/markdown-preview.nix ./languages/nix.nix ./languages/plantuml-syntax.nix ./languages/rust.nix @@ -55,6 +58,7 @@ ./utils/floaterm.nix ./utils/goyo.nix ./utils/harpoon.nix + ./utils/indent-blankline.nix ./utils/intellitab.nix ./utils/mark-radar.nix ./utils/notify.nix diff --git a/plugins/git/gitmessenger.nix b/plugins/git/gitmessenger.nix new file mode 100644 index 00000000..ee9b6751 --- /dev/null +++ b/plugins/git/gitmessenger.nix @@ -0,0 +1,117 @@ +{ pkgs +, lib +, config +, ... +} @ args: +with lib; let + helpers = import ../helpers.nix args; +in +{ + options.plugins.gitmessenger = { + enable = mkEnableOption "Enable the gitmessenger plugin"; + + package = helpers.mkPackageOption "git-messenger" pkgs.vimPlugins.git-messenger-vim; + + closeOnCursorMoved = helpers.defaultNullOpts.mkBool true '' + A popup window is no longer closed automatically when moving a cursor after the window is + shown up. + ''; + includeDiff = helpers.defaultNullOpts.mkEnumFirstDefault [ "none" "current" "all" ] '' + When this value is not set to "none", a popup window includes diff hunks of the commit at + showing up. "current" includes diff hunks of only current file in the commit. "all" includes + all diff hunks in the commit. + + Please note that typing d/D or r/R in popup window toggle showing diff hunks even if this + value is set to "none". + ''; + gitCommand = + helpers.defaultNullOpts.mkStr "git" + "git command to retrieve commit messages."; + noDefaultMappings = + helpers.defaultNullOpts.mkBool false + "When this value is set, it does not define any key mappings"; + intoPopupAfterShow = helpers.defaultNullOpts.mkBool true '' + When this value is set to v:false, running :GitMessenger or (git-messenger) again after + showing a popup does not move the cursor in the window. + ''; + alwaysIntoPopup = helpers.defaultNullOpts.mkBool false '' + When this value is set to v:true, the cursor goes into a popup window when running + :GitMessenger or (git-messenger). + ''; + extraBlameArgs = helpers.defaultNullOpts.mkStr "" '' + When this variable is set the contents will be appended to the git blame command. Use it to + add options (like -w). + ''; + previewMods = helpers.defaultNullOpts.mkStr "" '' + This variable is effective only when opening preview window (on Neovim (0.3.0 or earlier) + or Vim). + + Command modifiers for opening preview window. The value will be passed as prefix of :pedit + command. For example, setting "botright" to the variable opens a preview window at bottom of + the current window. Please see :help for more details. + ''; + + maxPopupHeight = mkOption { + type = types.nullOr types.int; + default = null; + description = '' + Max lines of popup window in an integer value. Setting null means no limit. + ''; + }; + + maxPopupWidth = mkOption { + type = types.nullOr types.int; + default = null; + description = '' + Max characters of popup window in an integer value. Setting null means no limit. + ''; + }; + + dateFormat = helpers.defaultNullOpts.mkStr "%c" '' + String value to format dates in popup window. Please see :help strftime() to know the details + of the format. + ''; + + concealWordDiffMarker = helpers.defaultNullOpts.mkBool true '' + When this value is set to v:true, markers for word diffs like [-, -], {+, +} are concealed. + Set false when you don't want to hide them. + + Note: Word diff is enabled by typing "r" in a popup window. + ''; + + floatingWinOps = helpers.defaultNullOpts.mkNullable (types.attrsOf types.anything) "{}" '' + Options passed to nvim_open_win() on opening a popup window. This is useful when you want to + override some window options. + ''; + + popupContentMargins = helpers.defaultNullOpts.mkBool true '' + Setting true means adding margins in popup window. Blank lines at the top and bottom of popup + content are inserted. And every line is indented with one whitespace character. Setting false + to this variable removes all the margins. + ''; + }; + + config = + let + cfg = config.plugins.gitmessenger; + in + mkIf cfg.enable { + extraPlugins = [ cfg.package ]; + globals = { + git_messenger_close_on_cursor_moved = cfg.closeOnCursorMoved; + git_messenger_include_diff = cfg.includeDiff; + git_messenger_git_command = cfg.gitCommand; + git_messenger_no_default_mappings = cfg.noDefaultMappings; + git_messenger_into_popup_after_show = cfg.intoPopupAfterShow; + git_messenger_always_into_popup = cfg.alwaysIntoPopup; + git_messenger_extra_blame_args = cfg.extraBlameArgs; + git_messenger_preview_mods = cfg.previewMods; + git_messenger_max_popup_height = cfg.maxPopupHeight; + git_messenger_max_popup_width = cfg.maxPopupWidth; + git_messenger_date_format = cfg.dateFormat; + git_messenger_conceal_word_diff_marker = cfg.concealWordDiffMarker; + git_messenger_floating_win_opts = cfg.floatingWinOps; + git_messenger_popup_content_margins = cfg.popupContentMargins; + }; + }; +} diff --git a/plugins/languages/clangd-extensions.nix b/plugins/languages/clangd-extensions.nix new file mode 100644 index 00000000..1eb9b33a --- /dev/null +++ b/plugins/languages/clangd-extensions.nix @@ -0,0 +1,186 @@ +{ + lib, + pkgs, + config, + ... +}: let + helpers = import ../helpers.nix {inherit lib;}; +in + with lib; let + borderOpt = let + bordersTy = + types.enum ["double" "rounded" "single" "shadow" "none"]; + in + helpers.defaultNullOpts.mkNullable (types.either bordersTy (types.listOf bordersTy)) + ''"none"'' ""; + in { + options.plugins.clangd-extensions = { + enable = mkEnableOption "clangd_extensions, plugin implementing clangd LSP extensions"; + + package = + helpers.mkPackageOption "clangd_extensions.nvim" pkgs.vimPlugins.clangd_extensions-nvim; + + enableOffsetEncodingWorkaround = mkEnableOption '' + utf-16 offset encoding. This is used to work around the warning: + "multiple different client offset_encodings detected for buffer, this is not supported yet" + ''; + + server = { + package = mkOption { + type = types.package; + default = pkgs.clang-tools; + description = "Package to use for clangd"; + }; + + extraOptions = mkOption { + type = types.attrsOf types.anything; + default = {}; + description = "Extra options to pass to nvim-lspconfig. You should not need to use this directly"; + }; + }; + + extensions = { + autoSetHints = helpers.defaultNullOpts.mkBool true "Automatically set inlay hints (type hints)"; + inlayHints = { + onlyCurrentLine = + helpers.defaultNullOpts.mkBool false + "Only show inlay hints for the current line"; + onlyCurrentLineAutocmd = helpers.defaultNullOpts.mkStr "CursorHold" '' + Event which triggers a refersh of the inlay hints. + You can make this "CursorMoved" or "CursorMoved,CursorMovedI" but + not that this may cause higher CPU usage. + This option is only respected when only_current_line and + autoSetHints both are true. + ''; + showParameterHints = + helpers.defaultNullOpts.mkBool true + "whether to show parameter hints with the inlay hints or not"; + parameterHintsPrefix = helpers.defaultNullOpts.mkStr "<- " "prefix for parameter hints"; + otherHintsPrefix = + helpers.defaultNullOpts.mkStr "=> " + "prefix for all the other hints (type, chaining)"; + maxLenAlign = + helpers.defaultNullOpts.mkBool false + "whether to align to the length of the longest line in the file"; + maxLenAlignPadding = + helpers.defaultNullOpts.mkInt 1 + "padding from the left if max_len_align is true"; + rightAlign = + helpers.defaultNullOpts.mkBool false + "whether to align to the extreme right or not"; + rightAlignPadding = + helpers.defaultNullOpts.mkInt 7 + "padding from the right if right_align is true"; + highlight = + helpers.defaultNullOpts.mkStr "Comment" + "The color of the hints"; + priority = helpers.defaultNullOpts.mkInt 100 "The highlight group priority for extmark"; + }; + + ast = { + roleIcons = { + type = helpers.defaultNullOpts.mkStr "🄣" ""; + declaration = helpers.defaultNullOpts.mkStr "🄓" ""; + expression = helpers.defaultNullOpts.mkStr "🄔" ""; + statement = helpers.defaultNullOpts.mkStr ";" ""; + specifier = helpers.defaultNullOpts.mkStr "🄢" ""; + templateArgument = helpers.defaultNullOpts.mkStr "🆃" ""; + }; + + kindIcons = { + compound = helpers.defaultNullOpts.mkStr "🄲" ""; + recovery = helpers.defaultNullOpts.mkStr "🅁" ""; + translationUnit = helpers.defaultNullOpts.mkStr "🅄" ""; + packExpansion = helpers.defaultNullOpts.mkStr "🄿" ""; + templateTypeParm = helpers.defaultNullOpts.mkStr "🅃" ""; + templateTemplateParm = helpers.defaultNullOpts.mkStr "🅃" ""; + templateParamObject = helpers.defaultNullOpts.mkStr "🅃" ""; + }; + + highlights = { + detail = helpers.defaultNullOpts.mkStr "Comment" ""; + }; + }; + + memoryUsage = { + border = borderOpt; + }; + + symbolInfo = { + border = borderOpt; + }; + }; + }; + + config = let + cfg = config.plugins.clangd-extensions; + setupOptions = { + server = cfg.server.extraOptions; + extensions = { + autoSetHints = cfg.extensions.autoSetHints; + inlay_hints = { + only_current_line = cfg.extensions.inlayHints.onlyCurrentLine; + only_current_line_autocmd = cfg.extensions.inlayHints.onlyCurrentLineAutocmd; + show_parameter_hints = cfg.extensions.inlayHints.showParameterHints; + parameter_hints_prefix = cfg.extensions.inlayHints.parameterHintsPrefix; + other_hints_prefix = cfg.extensions.inlayHints.otherHintsPrefix; + max_len_align = cfg.extensions.inlayHints.maxLenAlign; + max_len_align_padding = cfg.extensions.inlayHints.maxLenAlignPadding; + right_align = cfg.extensions.inlayHints.rightAlign; + right_align_padding = cfg.extensions.inlayHints.rightAlignPadding; + highlight = cfg.extensions.inlayHints.highlight; + priority = cfg.extensions.inlayHints.priority; + }; + ast = { + role_icons = { + type = cfg.extensions.ast.roleIcons.type; + declaration = cfg.extensions.ast.roleIcons.declaration; + expression = cfg.extensions.ast.roleIcons.expression; + statement = cfg.extensions.ast.roleIcons.statement; + specifier = cfg.extensions.ast.roleIcons.specifier; + "template argument" = cfg.extensions.ast.roleIcons.templateArgument; + }; + kind_icons = { + Compound = cfg.extensions.ast.kindIcons.compound; + Recovery = cfg.extensions.ast.kindIcons.recovery; + TranslationUnit = cfg.extensions.ast.kindIcons.translationUnit; + PackExpansion = cfg.extensions.ast.kindIcons.packExpansion; + TemplateTypeParm = cfg.extensions.ast.kindIcons.templateTypeParm; + TemplateTemplateParm = cfg.extensions.ast.kindIcons.templateTemplateParm; + TemplateParamObject = cfg.extensions.ast.kindIcons.templateParamObject; + }; + highlights = { + detail = cfg.extensions.ast.highlights.detail; + }; + }; + memory_usage = { + border = cfg.extensions.memoryUsage.border; + }; + symbol_info = { + border = cfg.extensions.symbolInfo.border; + }; + }; + }; + in + mkIf cfg.enable { + extraPackages = [cfg.server.package]; + extraPlugins = [cfg.package]; + + plugins.clangd-extensions.server.extraOptions = mkIf cfg.enableOffsetEncodingWorkaround { + capabilities = {__raw = "__clangdCaps";}; + }; + + plugins.lsp.postConfig = let + extraCaps = + if cfg.enableOffsetEncodingWorkaround + then '' + local __clangdCaps = vim.lsp.protocol.make_client_capabilities() + __clangdCaps.offsetEncoding = { "utf-16" } + '' + else ""; + in '' + ${extraCaps} + require("clangd_extensions").setup(${helpers.toLuaObject setupOptions}) + ''; + }; + } diff --git a/plugins/languages/markdown-preview.nix b/plugins/languages/markdown-preview.nix new file mode 100644 index 00000000..ec60bb67 --- /dev/null +++ b/plugins/languages/markdown-preview.nix @@ -0,0 +1,121 @@ +{ config, pkgs, lib, ... }: +with lib; +let + cfg = config.plugins.markdown-preview; + helpers = import ../helpers.nix { inherit lib; }; +in +{ + options = { + plugins.markdown-preview = { + enable = mkEnableOption "markdown-preview"; + + package = helpers.mkPackageOption "markdown-preview" pkgs.vimPlugins.markdown-preview-nvim; + + autoStart = helpers.defaultNullOpts.mkBool false '' + Open the preview window after entering the markdown buffer + ''; + + autoClose = helpers.defaultNullOpts.mkBool true '' + Auto close current preview window when change from markdown buffer to another buffer + ''; + + refreshSlow = helpers.defaultNullOpts.mkBool false '' + Refresh markdown when save the buffer or leave from insert mode, default false is auto refresh markdown as you edit or move the cursor + ''; + + commandForGlobal = helpers.defaultNullOpts.mkBool false '' + Enable markdown preview for all files (by default, the plugin is only enabled for markdown files) + ''; + + openToTheWorld = helpers.defaultNullOpts.mkBool false '' + Make the preview server available to others in your network. By default, the server listens on localhost (127.0.0.1). + ''; + + openIp = helpers.defaultNullOpts.mkStr "" '' + Custom IP used to open the preview page. This can be useful when you work in remote vim and preview on local browser. + For more detail see: https://github.com/iamcco/markdown-preview.nvim/pull/9. + ''; + + browser = helpers.defaultNullOpts.mkStr "" '' + The browser to open the preview page + ''; + + echoPreviewUrl = helpers.defaultNullOpts.mkBool false '' + Echo preview page url in command line when opening the preview page + ''; + + browserFunc = helpers.defaultNullOpts.mkStr "" '' + A custom vim function name to open preview page. This function will receive url as param. + ''; + + previewOptions = { + mkit = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" "markdown-it options for render"; + katex = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" "katex options for math"; + uml = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" "markdown-it-plantuml options"; + maid = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" "mermaid options"; + disable_sync_scroll = helpers.defaultNullOpts.mkBool false "Disable sync scroll"; + sync_scroll_type = helpers.defaultNullOpts.mkNullable (types.enum [ "middle" "top" "relative" ]) "middle" '' + Scroll type: + - "middle": The cursor position is always shown at the middle of the preview page. + - "top": The vim top viewport is always shown at the top of the preview page. + - "relative": The cursor position is always shown at the relative positon of the preview page. + ''; + hide_yaml_meta = helpers.defaultNullOpts.mkBool true "Hide yaml metadata."; + sequence_diagrams = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" "js-sequence-diagrams options"; + flowchart_diagrams = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" "flowcharts diagrams options"; + content_editable = helpers.defaultNullOpts.mkBool false "Content editable from the preview page"; + disable_filename = helpers.defaultNullOpts.mkBool false "Disable filename header for the preview page"; + toc = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" "Toc options"; + }; + + markdownCss = helpers.defaultNullOpts.mkStr "" '' + Custom markdown style. Must be an absolute path like '/Users/username/markdown.css' or expand('~/markdown.css'). + ''; + + highlightCss = helpers.defaultNullOpts.mkStr "" '' + Custom highlight style. Must be an absolute path like '/Users/username/highlight.css' or expand('~/highlight.css'). + ''; + + port = helpers.defaultNullOpts.mkStr "" "Custom port to start server or empty for random"; + + pageTitle = helpers.defaultNullOpts.mkStr "「\${name}」" '' + preview page title. $${name} will be replaced with the file name. + ''; + + fileTypes = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "['markdown']" '' + Recognized filetypes. These filetypes will have MarkdownPreview... commands. + ''; + + theme = helpers.defaultNullOpts.mkNullable (types.enum [ "dark" "light" ]) "dark" '' + Default theme (dark or light). By default the theme is define according to the preferences of the system. + ''; + }; + }; + + config = + let + previewOptions = mapAttrs (name: value: cfg.previewOptions.${name}) cfg.previewOptions; + in + mkIf cfg.enable { + extraPlugins = [ cfg.package ]; + + globals = { + mkdp_auto_start = mkIf (!isNull cfg.autoStart) cfg.autoStart; + mkdp_auto_close = mkIf (!isNull cfg.autoClose) cfg.autoClose; + mkdp_refresh_slow = mkIf (!isNull cfg.refreshSlow) cfg.refreshSlow; + mkdp_command_for_global = mkIf (!isNull cfg.commandForGlobal) cfg.commandForGlobal; + mkdp_open_to_the_world = mkIf (!isNull cfg.openToTheWorld) cfg.openToTheWorld; + mkdp_open_ip = mkIf (!isNull cfg.openIp) cfg.openIp; + mkdp_browser = mkIf (!isNull cfg.browser) cfg.browser; + mkdp_echo_preview_url = mkIf (!isNull cfg.echoPreviewUrl) cfg.echoPreviewUrl; + mkdp_browserfunc = mkIf (!isNull cfg.browserFunc) cfg.browserFunc; + mkdp_preview_options = mkIf (cfg.previewOptions != { }) previewOptions; + mkdp_markdown_css = mkIf (!isNull cfg.markdownCss) cfg.markdownCss; + mkdp_highlight_css = mkIf (!isNull cfg.highlightCss) cfg.highlightCss; + mkdp_port = mkIf (!isNull cfg.port) cfg.port; + mkdp_page_title = mkIf (!isNull cfg.pageTitle) cfg.pageTitle; + mkdp_filetypes = mkIf (!isNull cfg.fileTypes) cfg.fileTypes; + mkdp_theme = mkIf (!isNull cfg.theme) cfg.theme; + }; + }; +} diff --git a/plugins/nvim-lsp/basic-servers.nix b/plugins/nvim-lsp/basic-servers.nix index 40211dd9..962325a5 100644 --- a/plugins/nvim-lsp/basic-servers.nix +++ b/plugins/nvim-lsp/basic-servers.nix @@ -125,7 +125,7 @@ let name = "eslint"; description = "Enable eslint"; package = pkgs.nodePackages.vscode-langservers-extracted; - cmd = cfg: [ "${cfg.package}/bin/vscode-eslint-langauge-server" "--stdio" ]; + cmd = cfg: [ "${cfg.package}/bin/vscode-eslint-language-server" "--stdio" ]; } { name = "elixirls"; diff --git a/plugins/utils/indent-blankline.nix b/plugins/utils/indent-blankline.nix new file mode 100644 index 00000000..89298b2d --- /dev/null +++ b/plugins/utils/indent-blankline.nix @@ -0,0 +1,297 @@ +{ lib +, pkgs +, config +, ... +} @ args: +with lib; let + helpers = import ../helpers.nix args; +in +{ + options.plugins.indent-blankline = { + enable = mkEnableOption "indent-blankline.nvim"; + + package = helpers.mkPackageOption "indent-blankline" pkgs.vimPlugins.indent-blankline-nvim; + + char = helpers.defaultNullOpts.mkStr "│" '' + Specifies the character to be used as indent line. Not used if charList is not empty. + + When set explicitly to empty string (""), no indentation character is displayed at all, + even when 'charList' is not empty. This can be useful in combination with + spaceCharHighlightList to only rely on different highlighting of different indentation + levels without needing to show a special character. + ''; + + charBlankline = helpers.defaultNullOpts.mkStr "" '' + Specifies the character to be used as indent line for blanklines. Not used if + charListBlankline is not empty. + ''; + + charList = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Specifies a list of characters to be used as indent line for + each indentation level. + Ignored if the value is an empty list. + ''; + + charListBlankline = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Specifies a list of characters to be used as indent line for + each indentation level on blanklines. + Ignored if the value is an empty list. + ''; + + charHighlightList = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Specifies the list of character highlights for each indentation level. + Ignored if the value is an empty list. + ''; + + spaceCharBlankline = helpers.defaultNullOpts.mkStr " " '' + Specifies the character to be used as the space value in between indent + lines when the line is blank. + ''; + + spaceCharHighlightList = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Specifies the list of space character highlights for each indentation + level. + Ignored if the value is an empty list. + ''; + + spaceCharBlanklineHighlightList = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Specifies the list of space character highlights for each indentation + level when the line is empty. + Ignored if the value is an empty list. + ''; + + useTreesitter = + helpers.defaultNullOpts.mkBool false + "Use treesitter to calculate indentation when possible."; + + indentLevel = helpers.defaultNullOpts.mkInt 10 "Specifies the maximum indent level to display."; + + maxIndentIncrease = helpers.defaultNullOpts.mkInt config.plugins.indent-blankline.indentLevel '' + The maximum indent level increase from line to line. + Set this option to 1 to make aligned trailing multiline comments not + create indentation. + ''; + + showFirstIndentLevel = + helpers.defaultNullOpts.mkBool true "Displays indentation in the first column."; + + showTrailingBlanklineIndent = helpers.defaultNullOpts.mkBool true '' + Displays a trailing indentation guide on blank lines, to match the + indentation of surrounding code. + Turn this off if you want to use background highlighting instead of chars. + ''; + + showEndOfLine = helpers.defaultNullOpts.mkBool false '' + Displays the end of line character set by |listchars| instead of the + indent guide on line returns. + ''; + + showFoldtext = helpers.defaultNullOpts.mkBool true '' + Displays the full fold text instead of the indent guide on folded lines. + + Note: there is no autocommand to subscribe to changes in folding. This + might lead to unexpected results. A possible solution for this is to + remap folding bindings to also call |IndentBlanklineRefresh| + ''; + + disableWithNolist = helpers.defaultNullOpts.mkBool false '' + When true, automatically turns this plugin off when |nolist| is set. + When false, setting |nolist| will keep displaying indentation guides but + removes whitespace characters set by |listchars|. + ''; + + filetype = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Specifies a list of |filetype| values for which this plugin is enabled. + All |filetypes| are enabled if the value is an empty list. + ''; + + filetypeExclude = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''["lspinfo" "packer" "checkhealth" "help" "man" ""]'' '' + Specifies a list of |filetype| values for which this plugin is not enabled. + Ignored if the value is an empty list. + ''; + + buftypeExclude = + helpers.defaultNullOpts.mkNullable (types.listOf types.str) + ''["terminal" "nofile" "quickfix" "prompt"]'' '' + Specifies a list of |buftype| values for which this plugin is not enabled. + Ignored if the value is an empty list. + ''; + + bufnameExclude = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Specifies a list of buffer names (file name with full path) for which + this plugin is not enabled. + A name can be regular expression as well. + ''; + + strictTabs = helpers.defaultNullOpts.mkBool false '' + When on, if there is a single tab in a line, only tabs are used to + calculate the indentation level. + When off, both spaces and tabs are used to calculate the indentation + level. + Only makes a difference if a line has a mix of tabs and spaces for + indentation. + ''; + + showCurrentContext = helpers.defaultNullOpts.mkBool false '' + When on, use treesitter to determine the current context. Then show the + indent character in a different highlight. + + Note: Requires https://github.com/nvim-treesitter/nvim-treesitter to be + installed + + Note: With this option enabled, the plugin refreshes on |CursorMoved|, + which might be slower + ''; + + showCurrentContextStart = helpers.defaultNullOpts.mkBool false '' + Applies the |hl-IndentBlanklineContextStart| highlight group to the first + line of the current context. + By default this will underline. + + Note: Requires https://github.com/nvim-treesitter/nvim-treesitter to be + installed + + Note: You need to have set |gui-colors| and it depends on your terminal + emulator if this works as expected. + If you are using kitty and tmux, take a look at this article to + make it work + http://evantravers.com/articles/2021/02/05/curly-underlines-in-kitty-tmux-neovim/ + ''; + + showCurrentContextStartOnCurrentLine = helpers.defaultNullOpts.mkBool true '' + Shows showCurrentContextStart even when the cursor is on the same line + ''; + + contextChar = helpers.defaultNullOpts.mkStr config.plugins.indent-blankline.char '' + Specifies the character to be used for the current context indent line. + Not used if contextCharList is not empty. + + Useful to have a greater distinction between the current context indent + line and others. + + Also useful in combination with char set to empty string + (""), as this allows only the current context indent line to be shown. + ''; + + contextCharBlankline = helpers.defaultNullOpts.mkStr "" '' + Equivalent of charBlankline for contextChar. + ''; + + contextCharList = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Equivalent of charList for contextChar. + ''; + + contextCharListBlankline = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Equivalent of charListBlankline for contextChar. + ''; + + contextHighlightList = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" '' + Specifies the list of character highlights for the current context at + each indentation level. + Ignored if the value is an empty list. + ''; + + charPriority = helpers.defaultNullOpts.mkInt 1 "Specifies the |extmarks| priority for chars."; + + contextStartPriority = + helpers.defaultNullOpts.mkInt 10000 + "Specifies the |extmarks| priority for the context start."; + + contextPatterns = helpers.defaultNullOpts.mkNullable (types.listOf types.str) '' + [ + "class" + "^func" + "method" + "^if" + "while" + "for" + "with" + "try" + "except" + "arguments" + "argument_list" + "object" + "dictionary" + "element" + "table" + "tuple" + "do_block" + ]'' '' + Specifies a list of lua patterns that are used to match against the + treesitter |tsnode:type()| at the cursor position to find the current + context. + + To learn more about how lua pattern work, see here: + https://www.lua.org/manual/5.1/manual.html#5.4.1 + + ''; + + useTreesitterScope = helpers.defaultNullOpts.mkBool false '' + Instead of using contextPatters use the current scope defined by nvim-treesitter as the + context + ''; + + contextPatternHighlight = helpers.defaultNullOpts.mkNullable (types.attrsOf types.str) "{}" '' + Specifies a map of patterns set in contextPatterns to highlight groups. + When the current matching context pattern is in the map, the context + will be highlighted with the corresponding highlight group. + ''; + + viewportBuffer = helpers.defaultNullOpts.mkInt 10 '' + Sets the buffer of extra lines before and after the current viewport that + are considered when generating indentation and the context. + ''; + + disableWarningMessage = + helpers.defaultNullOpts.mkBool false "Turns deprecation warning messages off."; + }; + + config = + let + cfg = config.plugins.indent-blankline; + in + mkIf cfg.enable { + extraPlugins = [ cfg.package ]; + + globals = { + indent_blankline_char = cfg.char; + indent_blankline_char_blankline = cfg.charBlankline; + indent_blankline_char_list = cfg.charList; + indent_blankline_char_list_blankline = cfg.charListBlankline; + indent_blankline_char_highlight_list = cfg.charHighlightList; + indent_blankline_space_char_blankline = cfg.spaceCharBlankline; + indent_blankline_space_char_highlight_list = cfg.spaceCharHighlightList; + indent_blankline_space_char_blankline_highlight_list = cfg.spaceCharBlanklineHighlightList; + indent_blankline_use_treesitter = cfg.useTreesitter; + indent_blankline_indent_level = cfg.indentLevel; + indent_blankline_max_indent_increase = cfg.maxIndentIncrease; + indent_blankline_show_first_indent_level = cfg.showFirstIndentLevel; + indent_blankline_show_trailing_blankline_indent = cfg.showTrailingBlanklineIndent; + indent_blankline_show_end_of_line = cfg.showEndOfLine; + indent_blankline_show_foldtext = cfg.showFoldtext; + indent_blankline_disable_with_nolist = cfg.disableWithNolist; + indent_blankline_filetype = cfg.filetype; + indent_blankline_filetype_exclude = cfg.filetypeExclude; + indent_blankline_buftype_exclude = cfg.buftypeExclude; + indent_blankline_bufname_exclude = cfg.bufnameExclude; + indent_blankline_strict_tabs = cfg.strictTabs; + indent_blankline_show_current_context = cfg.showCurrentContext; + indent_blankline_show_current_context_start = cfg.showCurrentContextStart; + indent_blankline_show_current_context_start_on_current_line = cfg.showCurrentContextStartOnCurrentLine; + indent_blankline_context_char = cfg.contextChar; + indent_blankline_context_char_blankline = cfg.contextCharBlankline; + indent_blankline_context_char_list = cfg.contextCharList; + indent_blankline_context_char_list_blankline = cfg.contextCharListBlankline; + indent_blankline_context_highlight_list = cfg.contextHighlightList; + indent_blankline_char_priority = cfg.charPriority; + indent_blankline_context_start_priority = cfg.contextStartPriority; + indent_blankline_context_patterns = cfg.contextPatterns; + indent_blankline_use_treesitter_scope = cfg.useTreesitterScope; + indent_blankline_context_pattern_highlight = cfg.contextPatternHighlight; + indent_blankline_viewport_buffer = cfg.viewportBuffer; + indent_blankline_disable_warning_message = cfg.disableWarningMessage; + }; + }; +} diff --git a/plugins/utils/nvim-tree.nix b/plugins/utils/nvim-tree.nix index 23fd3c0e..bbf00019 100644 --- a/plugins/utils/nvim-tree.nix +++ b/plugins/utils/nvim-tree.nix @@ -16,6 +16,14 @@ in option = basePluginPath ++ [ "updateFocusedFile" "updateCwd" ]; newOption = basePluginPath ++ [ "updateFocusedFile" "updateRoot" ]; }) + (optionWarnings.mkDeprecatedOption { + option = basePluginPath ++ [ "openOnSetup" ]; + alternative = []; + }) + (optionWarnings.mkDeprecatedOption { + option = basePluginPath ++ [ "ignoreFtOnSetup" ]; + alternative = []; + }) ]; options.plugins.nvim-tree = { @@ -35,12 +43,14 @@ in description = "Hijack netrw"; }; + # deprecated openOnSetup = mkOption { type = types.nullOr types.bool; default = null; description = "Open on setup"; }; + # deprecated ignoreFtOnSetup = mkOption { type = types.nullOr (types.listOf types.str); default = null;