use built-in nvim diagnostics and lsp for linting
change
commit 07aedad8cbd2210bc5b8c53a26d91f78c75ca151
author Alpha Chen <alpha@kejadlen.dev>
date
parent 0c42a169
diff --git a/.config/nvim/fnl/init.fnl b/.config/nvim/fnl/init.fnl
index 5414d395..66b08956 100644
--- a/.config/nvim/fnl/init.fnl
+++ b/.config/nvim/fnl/init.fnl
@@ -1,43 +1,35 @@
 (vim.cmd "colorscheme paramount")
 
 (set vim.opt.list true)
-(set vim.opt.listchars {:tab "\\u21e5 "
-                        :trail "\\u2423"
-                        :extends "\\u21c9"
+
+;; fnlfmt: skip
+(set vim.opt.listchars {:tab      "\\u21e5 "
+                        :trail    "\\u2423"
+                        :extends  "\\u21c9"
                         :precedes "\\u21c7"
-                        :nbsp "\\u00b7"})
+                        :nbsp     "\\u00b7"})
 
 (set vim.opt.number true)
 
 (set vim.g.mapleader " ")
 
-; (let [{: keymap} vim
-;       nnoremap #(keymap.set :n $1 $2 {:noremap true})
-;       inoremap #(keymap.set :i $1 $2 {:noremap true})]
-
-;   ; clear hl
-;   (nnoremap :<leader>/ ":nohlsearch<cr>")
-
-;   ; quick save
-;   (nnoremap "\\\\" ":write<cr>")
-;   (inoremap "\\\\" "<esc>:write<cr>")
+;; move the cursor to the first non-blank character with H
+(vim.keymap.set :n :H "^" {:noremap true})
 
-;   ; fzf
-;   (nnoremap :<leader>b ":Buffers<cr>")
-;   (nnoremap :<leader>f ":Files<cr>")
-;   (nnoremap :<leader>t ":Tags<cr>"))
+;; quick save
 (vim.keymap.set :n "\\\\" ":write<cr>" {:noremap true})
 (vim.keymap.set :i "\\\\" "<esc>:write<cr>" {:noremap true})
 
+;; clear highlight
 (vim.keymap.set :n :<leader>/ ":nohlsearch<cr>" {:noremap true})
 
-;; restore cursor location
-;;
+;;; restore cursor location
+
 ;; https://github.com/vim/vim/blob/master/runtime/defaults.vim#L108
 (let [{: nvim_command : nvim_create_autocmd : nvim_create_augroup} vim.api
       au-group (nvim_create_augroup :nvim-startup {})
       cb (fn []
-           (when (and (>= (vim.fn.line "'\"") 1)
+           (when (and (< 0 (vim.fn.line "'\""))
                       (<= (vim.fn.line "'\"") (vim.fn.line "$"))
                       (not (string.find vim.bo.filetype :commit)))
              (nvim_command "normal! g`\"")))]
@@ -49,62 +41,74 @@
   (nvim_command "filetype plugin indent on")
   (nvim_create_autocmd :BufReadPost {:callback cb :group au-group}))
 
-;; ftplugins in fennel
-;;
+;;; ftplugins in fennel
+
 ;; https://github.com/rktjmp/hotpot.nvim/discussions/41#discussioncomment-3050564
 (let [{: nvim_create_autocmd : nvim_create_augroup} vim.api
       au-group (nvim_create_augroup :hotpot-ft {})
       cb #(pcall require (.. :ftplugin. (vim.fn.expand :<amatch>)))]
   (nvim_create_autocmd :FileType {:callback cb :group au-group}))
 
-;; ale
-
-(set vim.g.ale_fix_on_save 1)
-(set vim.g.ale_floating_preview 1)
-
-;; fzf
-
-(when (vim.fn.executable :fzf)
-  (when (vim.fn.isdirectory :/opt/homebrew/opt/fzf/plugin)
-    (vim.opt.rtp:append :/opt/homebrew/opt/fzf))
-  (vim.keymap.set :n :<leader>b ":Buffers<cr>" {:noremap true})
-  (vim.keymap.set :n :<leader>f ":Files<cr>" {:noremap true})
-  (vim.keymap.set :n :<leader>t ":Tags<cr>" {:noremap true})
-
-  ; https://coreyja.com/vim-spelling-suggestions-fzf/
-  (let [{: nvim_command : nvim_create_user_command} vim.api
-        {: expand : spellsuggest} vim.fn
-        fzf-run (. vim.fn "fzf#run")
-        sink #(nvim_command (.. "normal! \"_ciw" $1))
-        fzf-spell #(fzf-run {:source (spellsuggest (expand :<cword>))
-                             : sink
-                             :window {:width 0.9 :height 0.6}})]
-    (nvim_create_user_command :FzfSpell fzf-spell {})
-    (vim.keymap.set :n :z= ":FzfSpell<cr>")))
-
-;; lspconfig
-; (let [opts {:noremap true :silent true}]
-;   (vim.keymap.set :n :<leader>e vim.diagnostic.open_float opts)
-;   (vim.keymap.set :n "[d" vim.diagnostic.goto_prev opts)
-;   (vim.keymap.set :n "]d" vim.diagnostic.goto_next opts)
-;   (vim.keymap.set :n :<leader>q vim.diagnostic.setloclist opts))
-
-; (fn on_attach [client bufnr]
-;   (vim.api.nvim_buf_set_option bufnr :omnifunc "v:lua.vim.lsp.omnifunc")
-;   (let [bufopts {:noremap true :silent true :buffer bufnr}]
-;     (vim.keymap.set :n :gD vim.lsp.buf.declaration bufopts)
-;     (vim.keymap.set :n :gd vim.lsp.buf.definition bufopts)
-;     (vim.keymap.set :n :K vim.lsp.buf.hover bufopts)
-;     (vim.keymap.set :n :gi vim.lsp.buf.implementation bufopts)
-;     (vim.keymap.set :n :<C-k> vim.lsp.buf.signature_help bufopts)
-;     (vim.keymap.set :n :<leader>wa vim.lsp.buf.add_workspace_folder bufopts)
-;     (vim.keymap.set :n :<leader>wr vim.lsp.buf.remove_workspace_folder bufopts)
-;     (vim.keymap.set :n :<leader>wl
-;                     (fn []
-;                       (print (vim.inspect (vim.lsp.buf.list_workspace_folders))))
-;                     bufopts)
-;     (vim.keymap.set :n :<leader>D vim.lsp.buf.type_definition bufopts)
-;     (vim.keymap.set :n :<leader>rn vim.lsp.buf.rename bufopts)
-;     (vim.keymap.set :n :<leader>ca vim.lsp.buf.code_action bufopts)
-;     (vim.keymap.set :n :gr vim.lsp.buf.references bufopts)
-;     (vim.keymap.set :n :<leader>f vim.lsp.buf.formatting bufopts)))
+;; (require :ale)
+(require :fzf)
+
+;;; lint
+
+(let [lint (require :lint)
+      {: linters :linters_by_ft linters-by-ft :try_lint try-lint} lint
+      {:fennel fennel-linter} linters
+      {: nvim_create_autocmd} vim.api]
+  (tset linters-by-ft :fennel [:fennel])
+  (tset fennel-linter :globals [:vim]) ; hack
+  (nvim_create_autocmd :BufWritePost {:callback #(try-lint)}))
+
+;;; lspconfig
+
+;; (vim.lsp.set_log_level :debug)
+
+(let [opts {:noremap true :silent true}]
+  (vim.keymap.set :n :<leader>e vim.diagnostic.open_float opts)
+  (vim.keymap.set :n "[d" vim.diagnostic.goto_prev opts)
+  (vim.keymap.set :n "]d" vim.diagnostic.goto_next opts)
+  (vim.keymap.set :n :<leader>q vim.diagnostic.setloclist opts))
+
+(fn on_attach [client bufnr]
+  (vim.api.nvim_buf_set_option bufnr :omnifunc "v:lua.vim.lsp.omnifunc")
+  (let [bufopts {:noremap true :silent true :buffer bufnr}]
+    (vim.keymap.set :n :gD vim.lsp.buf.declaration bufopts)
+    (vim.keymap.set :n :gd vim.lsp.buf.definition bufopts)
+    (vim.keymap.set :n :K vim.lsp.buf.hover bufopts)
+    (vim.keymap.set :n :gi vim.lsp.buf.implementation bufopts)
+    (vim.keymap.set :n :<C-k> vim.lsp.buf.signature_help bufopts)
+    (vim.keymap.set :n :<leader>wa vim.lsp.buf.add_workspace_folder bufopts)
+    (vim.keymap.set :n :<leader>wr vim.lsp.buf.remove_workspace_folder bufopts)
+    (vim.keymap.set :n :<leader>wl
+                    (fn []
+                      (print (vim.inspect (vim.lsp.buf.list_workspace_folders))))
+                    bufopts)
+    (vim.keymap.set :n :<leader>D vim.lsp.buf.type_definition bufopts)
+    (vim.keymap.set :n :<leader>rn vim.lsp.buf.rename bufopts)
+    (vim.keymap.set :n :<leader>ca vim.lsp.buf.code_action bufopts)
+    (vim.keymap.set :n :gr vim.lsp.buf.references bufopts)
+    (vim.keymap.set :n :<leader>f vim.lsp.buf.formatting bufopts)))
+
+(let [{: rust_analyzer} (require :lspconfig)]
+  ((. rust_analyzer :setup) {: on_attach
+                             :settings {:rust-analyzer {:checkOnSave {:command :clippy}}}}))
+
+;;; netrw
+
+(set vim.g.netrw_fastbrowse 0)
+
+; https://github.com/tpope/vim-vinegar/issues/13
+(set vim.g.netrw_home "~/.nvim_tmp")
+
+;;; generate help files
+
+; Load all plugins now.
+; Plugins need to be added to runtimepath before helptags can be generated.
+(vim.api.nvim_command :packloadall)
+
+; Load all of the helptags now, after plugins have been loaded.
+; All messages and errors will be ignored.
+(vim.api.nvim_command "silent! helptags ALL")
diff --git a/.gitmodules b/.gitmodules
index a982a645..86a9c193 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -165,9 +165,6 @@
 [submodule ".local/share/nvim/site/pack/kejadlen/start/surround"]
 	path = .local/share/nvim/site/pack/kejadlen/start/surround
 	url = https://github.com/tpope/vim-surround.git
-[submodule ".local/share/nvim/site/pack/kejadlen/start/ale"]
-	path = .local/share/nvim/site/pack/kejadlen/start/ale
-	url = https://github.com/dense-analysis/ale.git
 [submodule ".local/share/nvim/site/pack/kejadlen/start/fzf"]
 	path = .local/share/nvim/site/pack/kejadlen/start/fzf
 	url = https://github.com/junegunn/fzf.vim.git
@@ -177,3 +174,6 @@
 [submodule ".local/share/nvim/site/pack/kejadlen/start/tabular"]
 	path = .local/share/nvim/site/pack/kejadlen/start/tabular
 	url = https://github.com/godlygeek/tabular.git
+[submodule ".local/share/nvim/site/pack/kejadlen/start/lint"]
+	path = .local/share/nvim/site/pack/kejadlen/start/lint
+	url = https://github.com/mfussenegger/nvim-lint.git
diff --git a/.local/share/nvim/site/pack/kejadlen/start/ale b/.local/share/nvim/site/pack/kejadlen/start/ale
deleted file mode 160000
index 39d1a105..00000000
--- a/.local/share/nvim/site/pack/kejadlen/start/ale
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 39d1a1058908396be61579a13e75a272cc527c57
diff --git a/.local/share/nvim/site/pack/kejadlen/start/lint b/.local/share/nvim/site/pack/kejadlen/start/lint
new file mode 160000
index 00000000..5249977a
--- /dev/null
+++ b/.local/share/nvim/site/pack/kejadlen/start/lint
@@ -0,0 +1 @@
+Subproject commit 5249977a585c3c17d94afdc8f0255a689d3a0057