caio.co/de/dotfiles


Adjust rust-analyzer checkOnSave settings by Caio 11 months ago (log)

Blob config/nvim/lua/config/lsp.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
vim.api.nvim_create_autocmd('LspAttach', {
    group = vim.api.nvim_create_augroup('my.lsp', {}),
    callback = function(args)
        -- Run cursor+timer triggers faster
        vim.o.updatetime = 300
        -- So that the window doesn't shift around in the presence of diagnostics
        vim.wo.signcolumn = "yes"

        -- ^]: definition (^T: jump back)
        -- gri: implementation
        -- grr: references
        -- grn: rename
        -- gra: code_action
        local function nmap(seq, action)
            local opts = { silent = true, noremap = true}
            vim.api.nvim_buf_set_keymap(args.buf, 'n', seq, string.format("<cmd>%s<CR>", action), opts)
        end
        nmap('gy', 'lua vim.lsp.buf.type_definition()')
        nmap('<leader>s', 'Telescope lsp_document_symbols')
        nmap('<leader>S', 'Telescope lsp_dynamic_workspace_symbols')

        local client = assert(vim.lsp.get_client_by_id(args.data.client_id))

        if client:supports_method('textDocument/completion') then
            vim.lsp.completion.enable(true, client.id, args.buf, {
                autotrigger = true
            })
        end

        if client:supports_method('textDocument/foldingRange') then
            vim.o.foldlevel = 99
            vim.o.foldmethod = "expr"
            vim.o.foldexpr = "v:lua.vim.lsp.foldexpr()"
        end

        local group = vim.api.nvim_create_augroup('my.lsp', {clear=false})

        local setup_handler = function(event, callback)
            vim.api.nvim_create_autocmd(event, {
                group = group,
                buffer = args.buf,
                callback = callback
            })
        end

        if not client:supports_method('textDocument/willSaveWaitUntil')
            and client:supports_method('textDocument/formatting') then
            setup_handler('BufWritePre', function()
                vim.lsp.buf.format({ bufnr = args.buf, id = client.id, timeout_ms = 1000 })
            end)
        end

        if client:supports_method('textDocument/documentHighlight') then
            setup_handler('CursorHold', function()
                    vim.lsp.buf.document_highlight()
            end)
            setup_handler('CursorMoved', function()
                    vim.lsp.buf.clear_references()
            end)
        end

    end,
})

vim.lsp.config('*', {
    root_markers = { ".git" },
    capabilities = {
        textDocument = {
            completion = {
                completionItem = {
                    snippetSupport = false
                }
            }
        }
    }
})

vim.lsp.config("rust_analyzer", {
    cmd = {"rustup", "run", "stable", "rust-analyzer"},
    filetypes = { "rust" },
    settings = {
        ["rust-analyzer"] = {
            checkOnSave = true,
            check = {
                command = "clippy",
            },
            cargo = {
                allFeatures = true,
            },
        },
    }
})

vim.lsp.config("gopls", {
    cmd = {
        "gopls",
        "-remote=auto",
    },
    root_markers = { "go.mod" },
    filetypes = { "go" },
    settings = {
        gopls = {
            analyses = {
                unusedparams = true,
                nilness = true,
                shadow = true,
                unusedwrite = true,
            },
            staticcheck = true,
        },
    }
})

vim.lsp.config("ccls", {
    cmd = { "ccls" },
    filetypes = { "c", "cpp", "objc", "objcpp", "cuda" },
    root_markers = { "compile_commands.json" },
    init_options = {
        cache = {
            directory = require("custom").home_cache_dir('ccls'),
        },
    },
})

vim.api.nvim_create_user_command("LspStart", function()
    vim.lsp.enable({"rust_analyzer", "gopls", "ccls"})
    vim.cmd("edit") -- reload buffer
end, {})