diff --git a/flake.lock b/flake.lock index 320e6882..b3fb0aa3 100644 --- a/flake.lock +++ b/flake.lock @@ -104,11 +104,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1609079092, - "narHash": "sha256-KhyKfxBHtZlAgudpZ0EJVzeuqROjKfVOwj8j0cuhU50=", + "lastModified": 1612813619, + "narHash": "sha256-8yGqFXo426Vg4u0L8yXfS/WrgDV4ytMGZQb7SopoZCo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2f47650c2f28d87f86ab807b8a339c684d91ec56", + "rev": "8c8731330b53ba0061686f36f10f101e662a4717", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 4e6069c4..e10c5e94 100644 --- a/flake.nix +++ b/flake.nix @@ -35,9 +35,8 @@ programs.nixvim = { enable = true; package = pkgs.neovim-nightly; - colorschemes.base16 = { + colorschemes.gruvbox = { enable = true; - colorscheme = "ocean"; }; options.number = true; @@ -58,6 +57,13 @@ servers.clangd.enable = true; }; + globals = { + vimsyn_embed = "l"; + mapleader = " "; + }; + + plugins.lspsaga.enable = true; + plugins.treesitter.enable = true; }; }) diff --git a/plugins/default.nix b/plugins/default.nix index 1d89f20c..6869f639 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -14,5 +14,6 @@ ./languages/treesitter.nix ./nvim-lsp + ./nvim-lsp/lspsaga.nix ]; } diff --git a/plugins/nvim-lsp/lspsaga.nix b/plugins/nvim-lsp/lspsaga.nix new file mode 100644 index 00000000..5d86a478 --- /dev/null +++ b/plugins/nvim-lsp/lspsaga.nix @@ -0,0 +1,205 @@ +{ pkgs, lib, config, ... }: +with lib; +let + cfg = config.programs.nixvim.plugins.lspsaga; + helpers = import ../helpers.nix { lib = lib; }; +in +{ + options = { + programs.nixvim.plugins.lspsaga = { + enable = mkEnableOption "Enable lspsava.nvim"; + + signs = { + use = mkOption { + default = true; + type = types.bool; + description = "Whether to use diagnostic signs"; + }; + + error = mkOption { + type = types.nullOr types.str; + default = null; + description = "Error diagnostic sign"; + }; + + warning = mkOption { + type = types.nullOr types.str; + default = null; + description = "Warning diagnostic sign"; + }; + + hint = mkOption { + type = types.nullOr types.str; + default = null; + description = "Hint diagnostic sign"; + }; + + info = mkOption { + type = types.nullOr types.str; + default = null; + description = "Info diagnostic sign"; + }; + }; + + headers = { + error = mkOption { + type = types.nullOr types.str; + default = null; + description = "Error diagnostic header"; + }; + + warning = mkOption { + type = types.nullOr types.str; + default = null; + description = "Warning diagnostic header"; + }; + + hint = mkOption { + type = types.nullOr types.str; + default = null; + description = "Hint diagnostic header"; + }; + + info = mkOption { + type = types.nullOr types.str; + default = " Info"; + description = "Info diagnostic header"; + }; + }; + + maxDialogWidth = mkOption { + type = types.nullOr types.int; + default = null; + description = "Maximum dialog width"; + }; + + icons = { + codeAction = mkOption { + type = types.nullOr types.str; + default = null; + description = "Code action icon"; + }; + + findDefinition = mkOption { + type = types.nullOr types.str; + default = null; + description = "Find definition icon"; + }; + + findReference = mkOption { + type = types.nullOr types.str; + default = null; + description = "Find reference icon"; + }; + + definitionPreview = mkOption { + type = types.nullOr types.str; + default = null; + description = "Definition preview icon"; + }; + }; + + maxFinderPreviewLines = mkOption { + type = types.nullOr types.int; + default = null; + description = "Maximum finder preview lines"; + }; + + keys = let + defaultKeyOpt = desc: mkOption { + description = desc; + type = types.nullOr types.str; + default = null; + }; + in { + finderAction = { + open = defaultKeyOpt "Open from finder"; + vsplit = defaultKeyOpt "Vertical split in finder"; + split = defaultKeyOpt "Horizontal split in finder"; + quit = defaultKeyOpt "Quit finder"; + scrollDown = defaultKeyOpt "Scroll down finder"; + scrollUp = defaultKeyOpt "Scroll up finder"; + }; + + codeAction = { + quit = defaultKeyOpt "Quit code actions menu"; + exec = defaultKeyOpt "Execute code action"; + }; + }; + + borderStyle = mkOption { + type = types.nullOr (types.enum [ "thin" "rounded" "thick" ]); + default = null; + description = "Border style"; + }; + + renamePromptPrefix = mkOption { + type = types.nullOr types.str; + default = null; + description = "Rename prompt prefix"; + }; + }; + }; + + config.programs.nixvim = let + notDefault = default: opt: if (opt != default) then opt else null; + notEmpty = opt: if ((filterAttrs (_: v: v != null) opt) != {}) then opt else null; + notNull = opt: opt; + lspsagaConfig = { + use_saga_diagnostic_sign = notDefault true cfg.signs.use; + error_sign = notNull cfg.signs.error; + warn_sign = notNull cfg.signs.warning; + hint_sign = notNull cfg.signs.hint; + infor_sign = notNull cfg.signs.info; + + error_header = notNull cfg.headers.error; + warn_header = notNull cfg.headers.warning; + hint_header = notNull cfg.headers.hint; + infor_header = notNull cfg.headers.info; + + max_diag_msg_width = notNull cfg.maxDialogWidth; + + code_action_icon = notNull cfg.icons.codeAction; + finder_definition_icon = notNull cfg.icons.findDefinition; + finder_reference_icon = notNull cfg.icons.findReference; + definition_preview_icon = notNull cfg.icons.definitionPreview; + + max_finder_preview_lines = notNull cfg.maxFinderPreviewLines; + + rename_prompt_prefix = notNull cfg.renamePromptPrefix; + + border_style = let + borderStyle = if cfg.borderStyle == "thin" then 1 + else if cfg.borderStyle == "rounded" then 2 + else if cfg.borderStyle == "thick" then 3 + else null; + in borderStyle; + + finder_action_keys = let + keys = { + open = notNull cfg.keys.finderAction.open; + vsplit = notNull cfg.keys.finderAction.vsplit; + split = notNull cfg.keys.finderAction.split; + quit = notNull cfg.keys.finderAction.quit; + scroll_down = notNull cfg.keys.finderAction.scrollDown; + scroll_up = notNull cfg.keys.finderAction.scrollUp; + }; + in notEmpty keys; + + code_action_keys = let + keys = { + quit = notNull cfg.keys.codeAction.quit; + exec = notNull cfg.keys.codeAction.exec; + }; + in notEmpty keys; + }; + in mkIf cfg.enable { + extraPlugins = [ pkgs.vimPlugins.lspsaga-nvim ]; + + extraConfigLua = '' + local saga = require 'lspsaga' + + saga.init_lsp_saga(${helpers.toLuaObject lspsagaConfig}) + ''; + }; +}