diff --git a/default.nix b/default.nix index 444db70..9573f50 100644 --- a/default.nix +++ b/default.nix @@ -45,7 +45,6 @@ in fzf-vim coc-sh coc-nvim - coc-rust-analyzer coc-json coc-yaml coc-tsserver @@ -63,6 +62,7 @@ in nvim-dap-ui nvim-notify rust-tools-nvim + plenary-nvim crates-nvim nvim-lspconfig telescope-nvim @@ -76,11 +76,19 @@ in lldb = pkgs.lldb; rust_analyzer = rust-analyzer; }; + pathsLua = pkgs.writeTextFile { + name = "nvim-deps.lua"; + text = '' + return { + ${concatStringsSep ",\n " (mapAttrsToList (name: path: ''${name}_path = "${path}"'') paths)} + } + ''; + }; confDir = lib.sourceFilesBySuffices ./. [ "lua" "vim" ]; in with lib; '' vim.cmd [[source ${confDir}/init.vim]] - ${concatStringsSep "\n" (mapAttrsToList (name: path: ''${name}_path = "${path}"'') paths)} + package.path = package.path .. ";${confDir}/?.lua;${pathsLua};" dofile("${confDir}/init.lua") ''; }; @@ -186,9 +194,9 @@ in sdk = [ rust-sdk ]; }; imports.group.enable = true; - # inlayHints = { - # closureReturnTypeHints.enable = false; - # }; + inlayHints = { + closureReturnTypeHints.enable = false; + }; highlightRelated = { yieldPoints.enable = true; references.enable = true; diff --git a/init.lua b/init.lua index 4fbafb0..110306e 100644 --- a/init.lua +++ b/init.lua @@ -1,3 +1,4 @@ +local deps = require("nvim-deps") vim.opt.termguicolors = true vim.notify = require("notify") vim.notify.setup({background_colour = "#000000"}) @@ -43,9 +44,9 @@ neogit.setup({ }) local dap, dapui = require("dap"), require("dapui") dap.adapters.lldb = { - type = "executable", - command = lldb_path .. "/bin/lldb-vscode", - name = "lldb" + type = "executable", + command = deps.lldb_path .. "/bin/lldb-vscode", + name = "lldb", } local lldb = { name = "Launch lldb", @@ -98,9 +99,65 @@ vim.fn.sign_define("DapBreakpointRejected", dap_breakpoint.rejected) dapui.setup() +<<<<<<< HEAD -- Auto open and close dapUI dap.listeners.after.event_initialized["dapui_config"] = function() dapui.open() end dap.listeners.before.event_terminated["dapui_config"] = function() dapui.close() end dap.listeners.before.event_exited["dapui_config"] = function() dapui.close() end +======= + -- Auto open and close dapUI + dap.listeners.after.event_initialized["dapui_config"] = function() + dapui.open() + end + dap.listeners.before.event_terminated["dapui_config"] = function() + dapui.close() + end + 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) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next) +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' + + -- 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("rust") diff --git a/init.vim b/init.vim index a12f1ae..a17e9ce 100644 --- a/init.vim +++ b/init.vim @@ -95,17 +95,6 @@ let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#show_tab_nr = 1 let g:airline#extensions#tabline#tab_nr_type = 1 -" DAP -nnoremap lua require'dap'.continue() -nnoremap lua require'dap'.step_over() -nnoremap lua require'dap'.step_into() -nnoremap lua require'dap'.step_out() -nnoremap b lua require'dap'.toggle_breakpoint() -nnoremap B lua require'dap'.set_breakpoint(vim.fn.input('Breakpoint condition: ')) -nnoremap lp lua require'dap'.set_breakpoint(nil, nil, vim.fn.input('Log point message: ')) -nnoremap dr lua require'dap'.repl.open() -nnoremap dl lua require'dap'.run_last() - if has("autocmd") au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif diff --git a/rust.lua b/rust.lua new file mode 100644 index 0000000..c55be41 --- /dev/null +++ b/rust.lua @@ -0,0 +1,180 @@ +local rt = require("rust-tools") +local deps = require("nvim-deps") + +rt.setup( +{ + tools = { -- rust-tools options + + -- 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, + + -- 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, + + -- 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, + + -- prefix for parameter hints + -- default: "<-" + parameter_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, + + -- 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, + + -- padding from the right if right_align is true + right_align_padding = 7, + + -- 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", + }, + }, + }, + + -- 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", + }, + }, +} +)