diff --git a/completion.lua b/completion.lua index d5c3351..afd08e3 100644 --- a/completion.lua +++ b/completion.lua @@ -1,52 +1,79 @@ +-- Set completeopt to have a better completion experience +-- :help completeopt +-- menuone: popup even when there's only one match +-- noinsert: Do not insert text until a selection is made +-- noselect: Do not select, force to select one from the menu +-- shortness: avoid showing extra messages when using completion +-- updatetime: set updatetime for CursorHold +vim.opt.completeopt = {'menuone', 'noselect', 'noinsert'} +vim.opt.shortmess = vim.opt.shortmess + {c = true} +vim.api.nvim_set_option('updatetime', 300) + +-- Fixed column for diagnostics to appear +-- Show autodiagnostic popup on cursor hover_range +-- Goto previous / next diagnostic warning / error +-- Show inlay_hints more frequently +vim.cmd([[ +set signcolumn=yes +autocmd CursorHold * lua vim.diagnostic.open_float(nil, { focusable = false }) +]]) + +vim.opt.spell = true +vim.opt.spelllang = {'en_us'} -- Completion Plugin Setup -local cmp = require'cmp' +local cmp = require 'cmp' cmp.setup({ - -- Enable LSP snippets - snippet = { - expand = function(args) - vim.fn["vsnip#anonymous"](args.body) - end, - }, - mapping = { - [''] = cmp.mapping.select_prev_item(), - [''] = cmp.mapping.select_next_item(), - -- Add tab support - [''] = cmp.mapping.select_prev_item(), - [''] = cmp.mapping.select_next_item(), - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - [''] = cmp.mapping.complete(), - [''] = cmp.mapping.close(), - [''] = cmp.mapping.confirm({ - behavior = cmp.ConfirmBehavior.Insert, - select = true, - }) - }, - -- Installed sources: - sources = { - { name = 'path' }, -- file paths - { name = 'nvim_lsp', keyword_length = 3 }, -- from language server - { name = 'nvim_lsp_signature_help'}, -- display function signatures with current parameter emphasized - { name = 'nvim_lua', keyword_length = 2}, -- complete neovim's Lua runtime API such vim.lsp.* - { name = 'buffer', keyword_length = 2 }, -- source current buffer - { name = 'vsnip', keyword_length = 2 }, -- nvim-cmp source for vim-vsnip - { name = 'calc'}, -- source for math calculation - }, - window = { - completion = cmp.config.window.bordered(), - documentation = cmp.config.window.bordered(), - }, - formatting = { - fields = {'menu', 'abbr', 'kind'}, - format = function(entry, item) - local menu_icon ={ - nvim_lsp = 'λ', - vsnip = '⋗', - buffer = 'Ω', - path = '🖫', - } - item.menu = menu_icon[entry.source.name] - return item - end, - }, + -- Enable LSP snippets + snippet = {expand = function(args) vim.fn["vsnip#anonymous"](args.body) end}, + -- = CTRL + -- = SHIFT + mapping = { + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.select_next_item(), + -- Add tab support + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.close(), + [''] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Insert, + select = true + }) + }, + -- Installed sources: + sources = { + {name = 'path'}, -- file paths + {name = 'nvim_lsp', keyword_length = 3}, -- from language server + {name = 'nvim_lsp_signature_help'}, -- display function signatures with current parameter emphasized + {name = 'nvim_lua', keyword_length = 2}, -- complete neovim's Lua runtime API such vim.lsp.* + {name = 'buffer', keyword_length = 2}, -- source current buffer + {name = 'vsnip', keyword_length = 2}, -- nvim-cmp source for vim-vsnip + {name = 'calc'}, -- source for math calculation + { + name = 'spell', + option = { + keep_all_entries = false, + enable_in_context = function() return true end + } + }, {name = 'conventionalcommits'} + }, + window = { + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered() + }, + formatting = { + fields = {'menu', 'abbr', 'kind'}, + format = function(entry, item) + local menu_icon = { + nvim_lsp = 'λ', + vsnip = '⋗', + buffer = 'Ω', + path = '🖫' + } + item.menu = menu_icon[entry.source.name] + return item + end + } }) diff --git a/init.lua b/init.lua index 07a51b2..2546c17 100644 --- a/init.lua +++ b/init.lua @@ -109,7 +109,6 @@ dap.listeners.before.event_exited["dapui_config"] = function() dapui.close() end -- Setup language servers. local lspconfig = require('lspconfig') - -- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions vim.keymap.set('n', 'e', vim.diagnostic.open_float) @@ -120,32 +119,33 @@ vim.keymap.set('n', 'q', vim.diagnostic.setloclist) -- Use LspAttach autocommand to only map the following keys -- after the language server attaches to the current buffer vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), - callback = function(ev) - -- Enable completion triggered by - vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + -- Enable completion triggered by + vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' - -- Buffer local mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - local opts = { buffer = ev.buf } - vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) - vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) - vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) - vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) - vim.keymap.set('n', '', vim.lsp.buf.signature_help, opts) - vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, opts) - vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, opts) - vim.keymap.set('n', 'wl', function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end, opts) - vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, opts) - vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) - vim.keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) - vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) - vim.keymap.set('n', 'f', function() - vim.lsp.buf.format { async = true } - end, opts) - end, + -- Buffer local mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local opts = {buffer = ev.buf} + vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) + vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) + vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) + vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) + vim.keymap.set('n', '', vim.lsp.buf.signature_help, opts) + vim.keymap + .set('n', 'wa', vim.lsp.buf.add_workspace_folder, opts) + vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, + opts) + vim.keymap.set('n', 'wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, opts) + vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, opts) + vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) + vim.keymap.set({'n', 'v'}, 'ca', vim.lsp.buf.code_action, opts) + vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) + vim.keymap.set('n', 'f', + function() vim.lsp.buf.format {async = true} end, opts) + end }) - +require("completion") require("rust") diff --git a/rust.lua b/rust.lua index c55be41..a3b04b3 100644 --- a/rust.lua +++ b/rust.lua @@ -1,180 +1,153 @@ local rt = require("rust-tools") +local nvim_lsp = require 'lspconfig' +local c = vim.lsp.protocol.make_client_capabilities() local deps = require("nvim-deps") -rt.setup( -{ - tools = { -- rust-tools options +rt.setup({ + tools = { -- rust-tools options + -- how to execute terminal commands + -- options right now: termopen / quickfix / toggleterm / vimux + executor = require("rust-tools.executors").termopen, - -- how to execute terminal commands - -- options right now: termopen / quickfix / toggleterm / vimux - executor = require("rust-tools.executors").termopen, + -- callback to execute once rust-analyzer is done initializing the workspace + -- The callback receives one parameter indicating the `health` of the server: "ok" | "warning" | "error" + on_initialized = nil, - -- callback to execute once rust-analyzer is done initializing the workspace - -- The callback receives one parameter indicating the `health` of the server: "ok" | "warning" | "error" - on_initialized = nil, + -- automatically call RustReloadWorkspace when writing to a Cargo.toml file. + reload_workspace_from_cargo_toml = true, - -- automatically call RustReloadWorkspace when writing to a Cargo.toml file. - reload_workspace_from_cargo_toml = true, + -- These apply to the default RustSetInlayHints command + inlay_hints = { + -- automatically set inlay hints (type hints) + -- default: true + auto = true, - -- These apply to the default RustSetInlayHints command - inlay_hints = { - -- automatically set inlay hints (type hints) - -- default: true - auto = true, + -- Only show inlay hints for the current line + only_current_line = false, - -- Only show inlay hints for the current line - only_current_line = false, + -- whether to show parameter hints with the inlay hints or not + -- default: true + show_parameter_hints = true, - -- whether to show parameter hints with the inlay hints or not - -- default: true - show_parameter_hints = true, + -- prefix for parameter hints + -- default: "<-" + parameter_hints_prefix = "<- ", - -- prefix for parameter hints - -- default: "<-" - parameter_hints_prefix = "<- ", + -- prefix for all the other hints (type, chaining) + -- default: "=>" + other_hints_prefix = "=> ", - -- prefix for all the other hints (type, chaining) - -- default: "=>" - other_hints_prefix = "=> ", + -- whether to align to the length of the longest line in the file + max_len_align = false, - -- whether to align to the length of the longest line in the file - max_len_align = false, + -- padding from the left if max_len_align is true + max_len_align_padding = 1, - -- padding from the left if max_len_align is true - max_len_align_padding = 1, + -- whether to align to the extreme right or not + right_align = false, - -- whether to align to the extreme right or not - right_align = false, + -- padding from the right if right_align is true + right_align_padding = 7, - -- padding from the right if right_align is true - right_align_padding = 7, + -- The color of the hints + highlight = "Comment" + }, - -- The color of the hints - highlight = "Comment", + -- options same as lsp hover / vim.lsp.util.open_floating_preview() + hover_actions = { + + -- the border that is used for the hover window + -- see vim.api.nvim_open_win() + border = { + {"╭", "FloatBorder"}, {"─", "FloatBorder"}, + {"╮", "FloatBorder"}, {"│", "FloatBorder"}, + {"╯", "FloatBorder"}, {"─", "FloatBorder"}, + {"╰", "FloatBorder"}, {"│", "FloatBorder"} + }, + + -- Maximal width of the hover window. Nil means no max. + max_width = nil, + + -- Maximal height of the hover window. Nil means no max. + max_height = nil, + + -- whether the hover action window gets automatically focused + -- default: false + auto_focus = false + }, + + -- settings for showing the crate graph based on graphviz and the dot + -- command + crate_graph = { + -- Backend used for displaying the graph + -- see: https://graphviz.org/docs/outputs/ + -- default: x11 + backend = "x11", + -- where to store the output, nil for no output stored (relative + -- path from pwd) + -- default: nil + output = nil, + -- true for all crates.io and external crates, false only the local + -- crates + -- default: true + full = true, + + -- List of backends found on: https://graphviz.org/docs/outputs/ + -- Is used for input validation and autocompletion + -- Last updated: 2021-08-26 + enabled_graphviz_backends = { + "bmp", "cgimage", "canon", "dot", "gv", "xdot", "xdot1.2", + "xdot1.4", "eps", "exr", "fig", "gd", "gd2", "gif", "gtk", + "ico", "cmap", "ismap", "imap", "cmapx", "imap_np", "cmapx_np", + "jpg", "jpeg", "jpe", "jp2", "json", "json0", "dot_json", + "xdot_json", "pdf", "pic", "pct", "pict", "plain", "plain-ext", + "png", "pov", "ps", "ps2", "psd", "sgi", "svg", "svgz", "tga", + "tiff", "tif", "tk", "vml", "vmlz", "wbmp", "webp", "xlib", + "x11" + } + } }, - -- options same as lsp hover / vim.lsp.util.open_floating_preview() - hover_actions = { + -- all the opts to send to nvim-lspconfig + -- these override the defaults set by rust-tools.nvim + -- see https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#rust_analyzer + server = { + -- standalone file support + -- setting it to false may improve startup time + standalone = true, + cmd = {(deps.rust_analyzer_path .. "/bin/rust-analyzer")}, + capabilities = require("cmp_nvim_lsp").default_capabilities(c), + on_attach = function(_, bufnr) + local keymap_opts = {buffer = bufnr} + -- Hover actions + vim.keymap.set("n", "h", rt.hover_actions.hover_actions, + keymap_opts) + -- Code action groups + vim.keymap.set("n", "as", + rt.code_action_group.code_action_group, keymap_opts) + vim.keymap.set('n', 'c', rt.open_cargo_toml.open_cargo_toml) + vim.keymap.set("n", "g0", vim.lsp.buf.document_symbol, keymap_opts) + local diag_float_grp = vim.api.nvim_create_augroup( + "DiagnosticFloat", {clear = true}) + vim.api.nvim_create_autocmd("CursorHold", { + callback = function() + vim.diagnostic.open_float(nil, {focusable = false}) + end, + group = diag_float_grp + }) - -- the border that is used for the hover window - -- see vim.api.nvim_open_win() - border = { - { "╭", "FloatBorder" }, - { "─", "FloatBorder" }, - { "╮", "FloatBorder" }, - { "│", "FloatBorder" }, - { "╯", "FloatBorder" }, - { "─", "FloatBorder" }, - { "╰", "FloatBorder" }, - { "│", "FloatBorder" }, - }, + -- Goto previous/next diagnostic warning/error + vim.keymap.set("n", "g[", vim.diagnostic.goto_prev, keymap_opts) + vim.keymap.set("n", "g]", vim.diagnostic.goto_next, keymap_opts) + end + }, -- rust-analyzer options - -- Maximal width of the hover window. Nil means no max. - max_width = nil, - - -- Maximal height of the hover window. Nil means no max. - max_height = nil, - - -- whether the hover action window gets automatically focused - -- default: false - auto_focus = false, - }, - - -- settings for showing the crate graph based on graphviz and the dot - -- command - crate_graph = { - -- Backend used for displaying the graph - -- see: https://graphviz.org/docs/outputs/ - -- default: x11 - backend = "x11", - -- where to store the output, nil for no output stored (relative - -- path from pwd) - -- default: nil - output = nil, - -- true for all crates.io and external crates, false only the local - -- crates - -- default: true - full = true, - - -- List of backends found on: https://graphviz.org/docs/outputs/ - -- Is used for input validation and autocompletion - -- Last updated: 2021-08-26 - enabled_graphviz_backends = { - "bmp", - "cgimage", - "canon", - "dot", - "gv", - "xdot", - "xdot1.2", - "xdot1.4", - "eps", - "exr", - "fig", - "gd", - "gd2", - "gif", - "gtk", - "ico", - "cmap", - "ismap", - "imap", - "cmapx", - "imap_np", - "cmapx_np", - "jpg", - "jpeg", - "jpe", - "jp2", - "json", - "json0", - "dot_json", - "xdot_json", - "pdf", - "pic", - "pct", - "pict", - "plain", - "plain-ext", - "png", - "pov", - "ps", - "ps2", - "psd", - "sgi", - "svg", - "svgz", - "tga", - "tiff", - "tif", - "tk", - "vml", - "vmlz", - "wbmp", - "webp", - "xlib", - "x11", - }, - }, - }, - - -- all the opts to send to nvim-lspconfig - -- these override the defaults set by rust-tools.nvim - -- see https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#rust_analyzer - server = { - -- standalone file support - -- setting it to false may improve startup time - standalone = true, - cmd = { (deps.rust_analyzer_path .. "/bin/rust-analyzer") }, - }, -- rust-analyzer options - - -- debugging stuff - dap = { - adapter = { - type = "executable", - command = deps.lldb_path .. "lldb-vscode", - name = "rt_lldb", - }, - }, -} -) + -- debugging stuff + dap = { + adapter = { + type = "executable", + command = deps.lldb_path .. "/bin/lldb-vscode", + name = "rt_lldb" + } + } +})