;;; lsp.fnl - lsp configurations (import-macros {: bind! : setup!} :macros) (fn on-attach [client buf] ((. (. (require :cmp) :setup) :buffer) { :sources [{ :name "nvim_lsp" :priority 1 :group 1 } { :name "snippy" :priority 1 :group 2 } { :name "buffer" :priority 0 :group 3 } { :name "path" :priority 0 :group 4 }]}) (bind! :n :gD vim.lsp.buf.declaration buf) ; (bind! :n :gd vim.lsp.buf.definition buf) (bind! :n :K vim.lsp.buf.hover buf) ; (bind! :n :gI vim.lsp.buf.implementation buf) (bind! :n : vim.lsp.buf.signature_help buf) (bind! :n :wa vim.lsp.buf.add_workspace_folder buf) (bind! :n :wr vim.lsp.buf.remove_workspace_folder buf) (bind! :n :wl #(print (vim.inspect (vim.lsp.buf.list_workspace_folders))) buf) ; (bind! :n :D vim.lsp.buf.type_definition buf) (bind! :n :rn vim.lsp.buf.rename buf) (bind! :n :cn vim.lsp.buf.code_action buf) ; (bind! :n :gr vim.lsp.buf.references buf) (when (= client.name :rust_analyzer) (bind! [ :n :v ] :o #(vim.lsp.buf.format {:async true}))) ;; Use builtin formatexpr (vim.api.nvim_buf_set_option buf :formatexpr "") ;; Some telescope commands (bind! :n :s "Telescope lsp_dynamic_workspace_symbols" buf) (bind! :n :fs "Telescope lsp_dynamic_workspace_symbols" buf) (bind! :n :fS "Telescope lsp_workspace_symbols" buf) ;(print (vim.inspect client.server_capabilities)) (when client.server_capabilities.documentSymbolProvider (bind! :n :d "Telescope lsp_document_symbols" buf) (bind! :n :fd "Telescope lsp_document_symbols" buf)) (bind! :n :gr "Telescope lsp_references" buf) (bind! :n :gd "Telescope lsp_definitions" buf) (bind! :n :gI "Telescope lsp_implementations" buf) (bind! :n :D "Telescope lsp_type_definitions" buf) ;; Some trouble commands (bind! :n :q "TroubleToggle document_diagnostics") (bind! :n :Q "TroubleToggle workspace_diagnostics")) (fn get-data-dir [server root] (let [resolved_path (vim.fn.resolve root) joined_path (vim.fn.substitute resolved_path "\\/" "@" :g)] (.. (vim.fn.fnamemodify (.. "~/.local/nvim/lsp-cache/" server "/") ":p") joined_path))) (fn configure [] (let [lsp (require :lspconfig) ;configs (require :lspconfig.configs) lsp-cap ((. (require :cmp_nvim_lsp) :default_capabilities)) lsp-utils (require :plugin.lsp)] (macro setup-server! [name ...] (let [opts { :on_attach `lsp-utils.on-attach :capabilities `lsp-cap }] (var last-key nil) (each [_ val (ipairs [...])] (if last-key (do (tset opts last-key val) (set last-key nil)) (set last-key val))) `((. (. lsp ,name) :setup) ,opts))) (setup-server! :clangd :on_attach (fn [client buf] (lsp-utils.on-attach client buf) (bind! :n :go :ClangdSwitchSourceHeader buf)) :cmd [ "clangd" "--header-insertion-decorators=0" "--background-index" "--clang-tidy" "--completion-style=bundled" "--function-arg-placeholders" "--header-insertion=never" "--malloc-trim" "--pch-storage=memory" "--offset-encoding=utf-16" ]) (setup-server! :cmake) (setup-server! :gopls) (setup-server! :rust_analyzer) (setup-server! :texlab) (setup-server! :pylsp) (setup-server! :lua_ls :settings { :Lua { :runtime { :version "LuaJIT" } :diagnostics { :globals [ "vim" ] } :workspace { :checkThirdParty false :library (vim.api.nvim_get_runtime_file "" true) } :telemetry { :enable false }}}) (setup-server! :fennel_language_server :settings { :fennel { :workspace { :library (vim.api.nvim_list_runtime_paths) } :diagnostics { :globals [ "vim" ] }}}))) {: configure : on-attach : get-data-dir }