From 796fd8d12cbed7fcf528f2ea04019a7c66a42f67 Mon Sep 17 00:00:00 2001 From: Daniel Kempkens Date: Tue, 19 Apr 2022 14:56:22 +0200 Subject: [PATCH] nvim: null-ls -> nvim-lint Also use Neoformat as a fallback if no LSP formatter is attached --- config/nvim/after/ftplugin/fennel.fnl | 2 ++ config/nvim/after/ftplugin/fish.fnl | 6 ++++ config/nvim/after/ftplugin/sh.fnl | 3 ++ config/nvim/init.fnl | 6 ++-- config/nvim/nifoc/diagnostic.fnl | 10 +----- config/nvim/nifoc/formatting.fnl | 25 +++++++++++++ config/nvim/nifoc/keymap.fnl | 3 +- config/nvim/nifoc/statusline.fnl | 4 ++- config/nvim/plugins/lsp.fnl | 24 +++++++------ config/nvim/plugins/neoformat.fnl | 3 ++ config/nvim/plugins/null-ls.fnl | 25 ------------- config/nvim/plugins/nvim-lint.fnl | 16 +++++++++ flake.lock | 18 +++++----- programs/nvim/default.nix | 21 ++++++----- programs/nvim/plugins.nix | 52 +++++++++++---------------- programs/nvim/plugins.yaml | 7 ++-- 16 files changed, 120 insertions(+), 105 deletions(-) create mode 100644 config/nvim/after/ftplugin/fennel.fnl create mode 100644 config/nvim/after/ftplugin/fish.fnl create mode 100644 config/nvim/after/ftplugin/sh.fnl create mode 100644 config/nvim/nifoc/formatting.fnl create mode 100644 config/nvim/plugins/neoformat.fnl delete mode 100644 config/nvim/plugins/null-ls.fnl create mode 100644 config/nvim/plugins/nvim-lint.fnl diff --git a/config/nvim/after/ftplugin/fennel.fnl b/config/nvim/after/ftplugin/fennel.fnl new file mode 100644 index 0000000..90d9109 --- /dev/null +++ b/config/nvim/after/ftplugin/fennel.fnl @@ -0,0 +1,2 @@ +(let [lo vim.opt_local] + (set lo.formatprg "fnlfmt -")) diff --git a/config/nvim/after/ftplugin/fish.fnl b/config/nvim/after/ftplugin/fish.fnl new file mode 100644 index 0000000..41c9be5 --- /dev/null +++ b/config/nvim/after/ftplugin/fish.fnl @@ -0,0 +1,6 @@ +(let [lo vim.opt_local] + (set lo.tabstop 4) + (set lo.shiftwidth 4) + (set lo.softtabstop 4) + (set lo.formatprg :fish_indent)) + diff --git a/config/nvim/after/ftplugin/sh.fnl b/config/nvim/after/ftplugin/sh.fnl new file mode 100644 index 0000000..d6d18ae --- /dev/null +++ b/config/nvim/after/ftplugin/sh.fnl @@ -0,0 +1,3 @@ +(let [lo vim.opt_local] + (set lo.formatprg "shfmt -i 2")) + diff --git a/config/nvim/init.fnl b/config/nvim/init.fnl index 31c2b3b..d4ba1f7 100644 --- a/config/nvim/init.fnl +++ b/config/nvim/init.fnl @@ -89,8 +89,10 @@ (set g.loaded_getscriptPlugin 1) (set g.loaded_logipat 1) (set g.loaded_tutor_mode_plugin 1) - (let [diagnostic (require :nifoc.diagnostic)] - (diagnostic.setup)) + (let [diagnostic (require :nifoc.diagnostic) + formatting (require :nifoc.formatting)] + (diagnostic.setup) + (formatting.setup)) (require :configuration.plugins) ;; Keymap (let [keymap (require :nifoc.keymap)] diff --git a/config/nvim/nifoc/diagnostic.fnl b/config/nvim/nifoc/diagnostic.fnl index f08d428..2754e88 100644 --- a/config/nvim/nifoc/diagnostic.fnl +++ b/config/nvim/nifoc/diagnostic.fnl @@ -1,8 +1,7 @@ (let [mod {} cmd vim.cmd api vim.api - keymap (require :nifoc.keymap) - lsp-format (require :lsp-format)] + keymap (require :nifoc.keymap)] (fn mod.setup [] (vim.diagnostic.config {:underline true :virtual_text false @@ -24,11 +23,4 @@ {:focus false}) :buffer bufnr}))) - (fn mod.maybe-enable-fixer [client bufnr] - (when client.server_capabilities.documentRangeFormattingProvider - (api.nvim_buf_set_option bufnr :formatexpr "v:lua.vim.lsp.formatexpr()")) - (when client.server_capabilities.documentFormattingProvider - (api.nvim_buf_set_var bufnr :nifoc_fixer_enabled 1) - (lsp-format.on_attach client bufnr))) - mod) diff --git a/config/nvim/nifoc/formatting.fnl b/config/nvim/nifoc/formatting.fnl new file mode 100644 index 0000000..6eb4f8d --- /dev/null +++ b/config/nvim/nifoc/formatting.fnl @@ -0,0 +1,25 @@ +(let [mod {} + b vim.b + cmd vim.cmd + api vim.api] + (fn mod.setup [] + (let [augroup (vim.api.nvim_create_augroup :NifocFormatting {:clear true}) + aucmd vim.api.nvim_create_autocmd] + (aucmd :BufWritePre {:callback #(mod.maybe-format-buffer) :group augroup}))) + + (fn mod.maybe-enable-lsp [client bufnr] + (when client.server_capabilities.documentRangeFormattingProvider + (api.nvim_buf_set_option bufnr :formatexpr "v:lua.vim.lsp.formatexpr()")) + (when client.server_capabilities.documentFormattingProvider + (api.nvim_buf_set_var bufnr :nifoc_lsp_formatter_enabled 1))) + + (fn mod.maybe-format-buffer [] + (let [formatprg (vim.opt_local.formatprg:get) + formatprg-exe (-> formatprg (vim.split " " {:trimempty true}) (. 1))] + (if (= b.nifoc_lsp_formatter_enabled 1) + (vim.lsp.buf.formatting_sync nil 1000) + (not= formatprg-exe nil) + (cmd (.. "undojoin | Neoformat " formatprg-exe))))) + + mod) + diff --git a/config/nvim/nifoc/keymap.fnl b/config/nvim/nifoc/keymap.fnl index f40369d..575815a 100644 --- a/config/nvim/nifoc/keymap.fnl +++ b/config/nvim/nifoc/keymap.fnl @@ -73,8 +73,6 @@ ;; Debug (map-entry :dli :LspInfo {:description "LSP Info"}) - (map-entry :dln :NullLsInfo - {:description "null-ls Info"}) (map-entry :dlr :LspRestart {:description "LSP Restart"}) (map-entry :dt @@ -141,3 +139,4 @@ :opts {:buffer bufnr}})])) mod) + diff --git a/config/nvim/nifoc/statusline.fnl b/config/nvim/nifoc/statusline.fnl index 95609f9..3dadc30 100644 --- a/config/nvim/nifoc/statusline.fnl +++ b/config/nvim/nifoc/statusline.fnl @@ -49,7 +49,8 @@ (if (and (buffer-not-empty?) vim.wo.spell) "ﮒ" "")) (fn mod.fixer-enabled? [] - (if (buffer-variable-exists? :nifoc_fixer_enabled) "" "")) + (if (or (buffer-variable-exists? :nifoc_lsp_formatter_enabled) + (not= (vim.opt_local.formatprg:get) "")) "" "")) (fn mod.treesitter-enabled? [] (if (buffer-variable-exists? :nifoc_treesitter_enabled) "" "")) @@ -58,3 +59,4 @@ (if (buffer-variable-exists? :nifoc_lsp_enabled) "" "")) mod) + diff --git a/config/nvim/plugins/lsp.fnl b/config/nvim/plugins/lsp.fnl index bc3f2a1..8f80d9d 100644 --- a/config/nvim/plugins/lsp.fnl +++ b/config/nvim/plugins/lsp.fnl @@ -3,7 +3,8 @@ illuminate (require :illuminate) virtual-types (require :virtualtypes) cmp (require :cmp_nvim_lsp) - diagnostic (require :nifoc.diagnostic)] + diagnostic (require :nifoc.diagnostic) + formatting (require :nifoc.formatting)] (fn custom-attach [client bufnr] (when client.server_capabilities.documentSymbolProvider (lsp-status.on_attach client bufnr)) @@ -12,7 +13,7 @@ (when client.server_capabilities.codeLensProvider (virtual-types.on_attach client bufnr)) (diagnostic.maybe-enable-lsp client bufnr) - (diagnostic.maybe-enable-fixer client bufnr)) + (formatting.maybe-enable-lsp client bufnr)) (fn custom-attach-no-format [client bufnr] (set client.server_capabilities.documentFormattingProvider false) @@ -25,8 +26,10 @@ :diagnostics false}) (lsp-status.register_progress) ;; Custom handler - (tset vim.lsp.handlers "textDocument/hover" (vim.lsp.with vim.lsp.handlers.hover {:border "rounded"})) - (tset vim.lsp.handlers "textDocument/signatureHelp" (vim.lsp.with vim.lsp.handlers.signature_help {:border "rounded"})) + (tset vim.lsp.handlers :textDocument/hover + (vim.lsp.with vim.lsp.handlers.hover {:border :rounded})) + (tset vim.lsp.handlers :textDocument/signatureHelp + (vim.lsp.with vim.lsp.handlers.signature_help {:border :rounded})) ;; Servers (let [default-capabilities (vim.lsp.protocol.make_client_capabilities) capabilities (vim.tbl_extend :keep @@ -34,7 +37,9 @@ lsp-status.capabilities) flags {:allow_incremental_sync true :debounce_text_changes 700} default-config {:on_attach custom-attach : capabilities : flags} - default-config-no-format {:on_attach custom-attach-no-format : capabilities : flags} + default-config-no-format {:on_attach custom-attach-no-format + : capabilities + : flags} default-servers [:bashls :cssls :dockerls @@ -50,13 +55,12 @@ ((. lsp name :setup) default-config)) ;; Custom (lsp.elixirls.setup (->> {:cmd [:elixir-ls]} - (vim.tbl_extend :force default-config-no-format))) + (vim.tbl_extend :force default-config))) (lsp.tsserver.setup (->> {:cmd [:typescript-language-server :--stdio :--tsserver-path - :tsserver] - :on_attach custom-attach-no-format} - (vim.tbl_extend :force default-config))) + :tsserver]} + (vim.tbl_extend :force default-config-no-format))) (lsp.jsonls.setup (->> {:cmd [:vscode-json-language-server :--stdio]} (vim.tbl_extend :force default-config))) (lsp.solargraph.setup (->> {:settings {:solargraph {:diagnostics true}}} @@ -70,7 +74,5 @@ :path (vim.split package.path ";")} :diagnostics {:globals [:vim]} - :workspace {:library {(vim.fn.expand "\$VIMRUNTIME/lua") true - (vim.fn.expand "\$VIMRUNTIME/lua/vim/lsp") true}} :telemetry {:enable false}}}} (vim.tbl_extend :force default-config))))) diff --git a/config/nvim/plugins/neoformat.fnl b/config/nvim/plugins/neoformat.fnl new file mode 100644 index 0000000..efc5298 --- /dev/null +++ b/config/nvim/plugins/neoformat.fnl @@ -0,0 +1,3 @@ +(let [g vim.g] + (set g.neoformat_try_formatprg 1) + (set g.neoformat_basic_format_trim 1)) diff --git a/config/nvim/plugins/null-ls.fnl b/config/nvim/plugins/null-ls.fnl deleted file mode 100644 index 9a86283..0000000 --- a/config/nvim/plugins/null-ls.fnl +++ /dev/null @@ -1,25 +0,0 @@ -(let [null-ls (require :null-ls) - builtins null-ls.builtins - diagnostic (require :nifoc.diagnostic)] - (null-ls.setup {:debounce 700 - :sources [; Formatting - builtins.formatting.fish_indent - builtins.formatting.fnlfmt - builtins.formatting.mix - (builtins.formatting.shfmt.with {:extra_args [:-i - :2]}) - ; Diagnostics - builtins.diagnostics.credo - builtins.diagnostics.deadnix - builtins.diagnostics.fish - builtins.diagnostics.hadolint - (builtins.diagnostics.shellcheck.with {:extra_args [:-f - :gcc - :-x]}) - builtins.diagnostics.statix - ; Code Actions - builtins.code_actions.shellcheck - builtins.code_actions.statix] - :on_attach (lambda [client bufnr] - (diagnostic.maybe-enable-lsp client bufnr) - (diagnostic.maybe-enable-fixer client bufnr))})) diff --git a/config/nvim/plugins/nvim-lint.fnl b/config/nvim/plugins/nvim-lint.fnl new file mode 100644 index 0000000..ef32af0 --- /dev/null +++ b/config/nvim/plugins/nvim-lint.fnl @@ -0,0 +1,16 @@ +(let [lint (require :lint) + augroup (vim.api.nvim_create_augroup :NifocLint {:clear true}) + aucmd vim.api.nvim_create_autocmd] + (set lint.linters_by_ft {:dockerfile [:hadolint] + :elixir [:credo] + :fennel [:fennel] + :nix [:nix :statix] + :sh [:shellcheck]}) + + (fn setup-linting [opts] + (aucmd [:BufWritePost :BufWinEnter :InsertLeave] + {:callback #(lint.try_lint) :buffer opts.buf :group augroup})) + + (each [ft _ (pairs lint.linters_by_ft)] + (aucmd :InsertEnter {:pattern ft :callback setup-linting :group augroup}))) + diff --git a/flake.lock b/flake.lock index 98b339f..95791b3 100644 --- a/flake.lock +++ b/flake.lock @@ -96,11 +96,11 @@ }, "locked": { "dir": "contrib", - "lastModified": 1650231013, - "narHash": "sha256-8Eb0+pUhFZpXZsO8wxmdcwJ4K82PBThEarAg7QmN1ic=", + "lastModified": 1650333806, + "narHash": "sha256-ZrnN9ssclGTChvomcqL4Uact8L9+yToywNwrjyUULgI=", "owner": "neovim", "repo": "neovim", - "rev": "1facad23473eb2d045fe77199b3b0b9fd2586895", + "rev": "147cc60d24f093b5154824889f2151489774ef33", "type": "github" }, "original": { @@ -119,11 +119,11 @@ ] }, "locked": { - "lastModified": 1650269777, - "narHash": "sha256-xTHOaVcKotrhhZIXBlI+i+7T/9i9g2IBaJ876ZgKWNQ=", + "lastModified": 1650356316, + "narHash": "sha256-RojfPzSC+veD2SCugaMNJ9c+TzD9hPIToWkC2venhrU=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "bc6898a27fae45321c8ced1c422e07700e2ae451", + "rev": "1c8ffbfa48d212eb806e3ea3eeae4c6c444130d5", "type": "github" }, "original": { @@ -186,11 +186,11 @@ ] }, "locked": { - "lastModified": 1650242648, - "narHash": "sha256-obFzwzRRlQGKhvmGYlZEwqI3bAMxvdNoTmxBmZ+Axao=", + "lastModified": 1650328756, + "narHash": "sha256-rA/Pdrl/vBpl/URdkF03bb7N8fp111OIP7+Aqb+YOKE=", "owner": "arqv", "repo": "zig-overlay", - "rev": "913098cca4e4d8ba68578de9203fe532d0886069", + "rev": "77597e467567b462efce312d1c99b5a6dc24ea92", "type": "github" }, "original": { diff --git a/programs/nvim/default.nix b/programs/nvim/default.nix index 583055e..7deb934 100644 --- a/programs/nvim/default.nix +++ b/programs/nvim/default.nix @@ -127,20 +127,12 @@ in type = "fennel"; } - { - plugin = null-ls-nvim; - config = builtins.readFile ../../config/nvim/plugins/null-ls.fnl; - type = "fennel"; - } - virtual-types-nvim + # Linter { - plugin = lsp-format-nvim; - config = '' - (let [lsp-format (require :lsp-format)] - (lsp-format.setup)) - ''; + plugin = nvim-lint; + config = builtins.readFile ../../config/nvim/plugins/nvim-lint.fnl; type = "fennel"; } @@ -283,6 +275,13 @@ in type = "fennel"; } + # Formatting + { + plugin = neoformat; + config = builtins.readFile ../../config/nvim/plugins/neoformat.fnl; + type = "fennel"; + } + # Comments { plugin = comment-nvim; diff --git a/programs/nvim/plugins.nix b/programs/nvim/plugins.nix index e2a0376..2388919 100644 --- a/programs/nvim/plugins.nix +++ b/programs/nvim/plugins.nix @@ -111,12 +111,12 @@ }; nvim-treesitter = pkgs.vimUtils.buildVimPluginFrom2Nix { pname = "nvim-treesitter"; - version = "1650300646"; + version = "1650354015"; src = pkgs.fetchFromGitHub { owner = "nvim-treesitter"; repo = "nvim-treesitter"; - rev = "a8bce851bf3bde7c9c25b1d504dc25c877d66713"; - sha256 = "dYjGt8x209i/SKtDQLLrJsuEM4L/9tXyTcPsvpILtQw="; + rev = "6f6cb20692049eb610d3210816869da8aba0a6e8"; + sha256 = "aH52YKr57eevBRT6t4pGe9UFIMn9/R2XhEnzKuXDZ3k="; fetchSubmodules = true; }; meta.homepage = "https://github.com/nvim-treesitter/nvim-treesitter"; @@ -200,18 +200,6 @@ }; meta.homepage = "https://github.com/neovim/nvim-lspconfig"; }; - null-ls-nvim = pkgs.vimUtils.buildVimPluginFrom2Nix { - pname = "null-ls.nvim"; - version = "1650144148"; - src = pkgs.fetchFromGitHub { - owner = "jose-elias-alvarez"; - repo = "null-ls.nvim"; - rev = "a887bd6c1bb992ccf48e673b40e061c3e816204f"; - sha256 = "gbo5sMd+mT/U1nQYAci2pdYNEOg/qFrpVfv6gVawLtY="; - fetchSubmodules = true; - }; - meta.homepage = "https://github.com/jose-elias-alvarez/null-ls.nvim"; - }; virtual-types-nvim = pkgs.vimUtils.buildVimPluginFrom2Nix { pname = "virtual-types.nvim"; version = "1647533682"; @@ -224,17 +212,17 @@ }; meta.homepage = "https://github.com/jubnzv/virtual-types.nvim"; }; - lsp-format-nvim = pkgs.vimUtils.buildVimPluginFrom2Nix { - pname = "lsp-format.nvim"; - version = "1650261785"; + nvim-lint = pkgs.vimUtils.buildVimPluginFrom2Nix { + pname = "nvim-lint"; + version = "1650293110"; src = pkgs.fetchFromGitHub { - owner = "lukas-reineke"; - repo = "lsp-format.nvim"; - rev = "454ec5f0ef6c2712da3f3982155f7a992faa8a00"; - sha256 = "gYXv2g4vmx4/bAsU/BUZK04TwHXua6tZ97LBUwGQ/kM="; + owner = "mfussenegger"; + repo = "nvim-lint"; + rev = "e5416bdb27a0e61cd213850646534a18bb2ba61d"; + sha256 = "v4bItOqhrutK7Wr/pM1Pkx+lGFTGrLoZ88esm1K/MuM="; fetchSubmodules = true; }; - meta.homepage = "https://github.com/lukas-reineke/lsp-format.nvim"; + meta.homepage = "https://github.com/mfussenegger/nvim-lint"; }; LuaSnip = pkgs.vimUtils.buildVimPluginFrom2Nix { pname = "LuaSnip"; @@ -250,12 +238,12 @@ }; nvim-cmp = pkgs.vimUtils.buildVimPluginFrom2Nix { pname = "nvim-cmp"; - version = "1650293446"; + version = "1650365016"; src = pkgs.fetchFromGitHub { owner = "hrsh7th"; repo = "nvim-cmp"; - rev = "2aa7eee28b4d49e999c694ca733a393da5808dd6"; - sha256 = "Ws6hjdtOP14hG0BYm88RooZMbIVWAqlyYUOBDoonw3A="; + rev = "07132dc597e94a8b6df75efce9784a581f55742c"; + sha256 = "9wPv8mXax2fr1L6TeiFOSK7ZdXNg1v/1eRj00OFDw1Y="; fetchSubmodules = true; }; meta.homepage = "https://github.com/hrsh7th/nvim-cmp"; @@ -406,12 +394,12 @@ }; vim-matchup = pkgs.vimUtils.buildVimPluginFrom2Nix { pname = "vim-matchup"; - version = "1645154316"; + version = "1650317917"; src = pkgs.fetchFromGitHub { owner = "andymass"; repo = "vim-matchup"; - rev = "7fd8806138f404498db7a3e848d8fa55ad61e7cf"; - sha256 = "94MxL1tajiKfgA8gpu2cO3jQmRj64Kg80efzlgHfMhg="; + rev = "8727de1b4311c0ad62682f724fa19fce6ec4dad3"; + sha256 = "3oKc9M853+KOw3Bc5jOG2SO96B7XKoFENCSPR22yEGs="; fetchSubmodules = true; }; meta.homepage = "https://github.com/andymass/vim-matchup"; @@ -478,12 +466,12 @@ }; gitsigns-nvim = pkgs.vimUtils.buildVimPluginFrom2Nix { pname = "gitsigns.nvim"; - version = "1650291976"; + version = "1650366768"; src = pkgs.fetchFromGitHub { owner = "lewis6991"; repo = "gitsigns.nvim"; - rev = "565b94d79c760b0aa877a6cc28dc04f08c411c8e"; - sha256 = "mwZfQEovDXVS7TlS8UcJVSk4Odmiv1PcQaQumNihcoI="; + rev = "6527d8c847d1cf11bbf646ac00b1cc2c4ac41c74"; + sha256 = "wDTkFVif4cel0zqAYx78pceQYMJMBpBmlT2pGDUvI8o="; fetchSubmodules = true; }; meta.homepage = "https://github.com/lewis6991/gitsigns.nvim"; diff --git a/programs/nvim/plugins.yaml b/programs/nvim/plugins.yaml index 733a71f..cc749cf 100644 --- a/programs/nvim/plugins.yaml +++ b/programs/nvim/plugins.yaml @@ -33,11 +33,12 @@ rm -rf ./xdg_cache - src: nvim-telescope/telescope-ui-select.nvim -# # LSP +# LSP - src: neovim/nvim-lspconfig -- src: jose-elias-alvarez/null-ls.nvim - src: jubnzv/virtual-types.nvim -- src: lukas-reineke/lsp-format.nvim + +# Linter +- src: mfussenegger/nvim-lint # Snippets - src: L3MON4D3/LuaSnip