(local lsp (require :lspconfig)) (local {: highlight} (require :nvrc.macro.color)) (local {: merge} (require :nvrc.utils)) (local colors (require :nvrc.colors)) (fn on_attach [client bufnr] (highlight :DiagnosticError {:fg (. colors :red)}) (highlight :DiagnosticWarn {:fg (. colors :yellow)}) (highlight :DiagnosticInformation {:fg (. colors :green)}) (highlight :DiagnosticHint {:fg (. colors :grey)}) (if client.resolved_capabilities.document_highlight (do (highlight :LspReferenceRead {:underline true}) (highlight :LspReferenceText {:underline true}) (highlight :LspReferenceWrite {:underline true}) (vim.api.nvim_exec "augroup lsp_document_highlight autocmd! * autocmd CursorMoved lua vim.lsp.buf.clear_references() augroup END" false)))) (fn better_root_pattern [patterns except-patterns] "match path if one of the given patterns is matched, EXCEPT if one of the except-patterns is matched" (fn [path] (when (not ((lsp.util.root_pattern except-patterns) path)) ((lsp.util.root_pattern patterns) path)))) (local default_capabilities (vim.lsp.protocol.make_client_capabilities)) (fn init_lsp [lsp-name ?opts] "initialize a language server with defaults" (let [merged-opts (merge {: on_attach :capabilities default_capabilities} (or ?opts {}))] ((. lsp lsp-name :setup) merged-opts))) (tset vim.lsp.handlers :textDocument/publishDiagnostics (vim.lsp.with vim.lsp.diagnostic.on_publish_diagnostics {:update_in_insert false :virtual_text {:prefix "-"} :signs false})) (init_lsp :ccls) (init_lsp :hls) (init_lsp :rust_analyzer) (vim.cmd "highlight link LspSemantic_type Include") (vim.cmd "highlight link LspSemantic_function Identifier") (vim.cmd "highlight link LspSemantic_struct Number") (vim.cmd "highlight LspSemantic_variable guifg=gray") (vim.cmd "highlight link LspSemantic_keyword Structure")