Last active
September 15, 2023 08:39
-
-
Save DirectXMan12/23f47fb6558459dbdf092a56d2497c01 to your computer and use it in GitHub Desktop.
neovim rust important bits
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- I use packer to manage my plugins | |
require('packer').startup(function() { | |
-- treesitter configs (treesitter enables neovim to parse buffers into ASTs. | |
-- it's built in, but there's an official helper library to help set it up) | |
use { | |
'nvim-treesitter/nvim-treesitter', | |
run = function() require('nvim-treesitter.install').update{ with_sync = true } end, | |
} | |
-- treesitter --> text objects | |
-- (e.g. cia --> change inside argument) | |
use 'nvim-treesitter/nvim-treesitter-textobjects' | |
-- lsp goodness (manage lanuage server setup) | |
use 'neovim/nvim-lspconfig' -- helpers to set up different language servers | |
use 'mfussenegger/nvim-dap' -- debugger support | |
-- telescope is a *really* nice framework for doing fuzzy finders | |
-- (text search, AST search with treesitter, symbol search with LSP, files & open buffers, etc) | |
use { | |
'nvim-telescope/telescope.nvim', | |
requires = {{'nvim-lua/popup.nvim'}, {'nvim-lua/plenary.nvim'}} | |
} | |
}) | |
-- turn on treesitter | |
require('nvim-treesitter.configs').setup { | |
highlight = { | |
enable = true, | |
}, | |
textobjects = { | |
-- select by parameter | |
select = { | |
enable = true, | |
keymaps = { | |
["ia"] = "@parameter.inner", | |
["aa"] = "@parameter.outer", | |
["if"] = "@function.inner", | |
}, | |
}, | |
-- move between parameters and such | |
move = { | |
enable = true, | |
set_jumps = true, | |
goto_next_start = { | |
["]m"] = "@function.outer", | |
["]a"] = "@parameter.inner", | |
}, | |
goto_next_end = { | |
["]M"] = "@function.outer", | |
["]A"] = "@parameter.outer", | |
}, | |
goto_previous_start = { | |
["[m"] = "@function.outer", | |
["[a"] = "@parameter.inner", | |
}, | |
goto_previous_end = { | |
["[M"] = "@function.outer", | |
["[A"] = "@parameter.outer", | |
}, | |
}, | |
}, | |
} | |
-- enable telescope | |
require('telescope').setup() | |
-- lsp stuff | |
local lspconfigs = require('lspconfig.configs') | |
local lspconfig = require('lspconfig') | |
local lsp_attach_advanced = function(client, bufnum, skip_rust_specials) | |
local opts = { noremap = true, silent = true, buffer=bufnum } | |
-- real basic autocomplete (you probably want a better setup -- see the nvim-lspconfigs repo for more details) | |
vim.api.nvim_buf_set_option(bufnum, 'omnifunc', 'v:lua.vim.lsp.omnifunc') | |
-- definition & hover via normal keybinds... | |
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) | |
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) | |
if not skip_rust_specials then | |
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) | |
end | |
vim.keymap.set('n', '<leader>gi', vim.lsp.buf.implementation, opts) | |
-- TODO: these are default bindings, they need some tweaking | |
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts) | |
vim.keymap.set('n', '<leader>D', vim.lsp.buf.type_definition, opts) | |
-- ... and refs & symbols via telescope | |
vim.keymap.set('n', 'gr', require('telescope.builtin').lsp_references, opts) | |
vim.keymap.set('n', '<space>fs', require('telescope.builtin').lsp_document_symbols, opts) | |
vim.keymap.set('n', '<space>fws', require('telescope.builtin').lsp_dynamic_workspace_symbols, opts) | |
vim.keymap.set('n', '<leader>=', function() vim.lsp.buf.format { async = true } end, opts) | |
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, opts) -- TODO: unify with treesitter rename? | |
vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, opts) | |
-- diagnostics | |
vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float, opts) | |
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) | |
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) | |
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts) | |
end | |
-- sets up rust LSP itself | |
require('rust-tools').setup{ | |
server = { -- would be passed to LSP config | |
cmd = {"rustup", "run", "nightly", "rust-analyzer"}, | |
on_attach = function(client, buffnum) | |
lsp_attach_advanced(client, buffnum, true) | |
local opts = { noremap = true, silent = true, buffer=bufnum } | |
vim.keymap.set('n', '<leader>cga', require'rust-tools'.code_action_group.code_action_group, opts) | |
vim.keymap.set('n', 'K', require'rust-tools'.hover_actions.hover_actions, opts) | |
vim.keymap.set('n', '<leader>s', require'rust-tools'.ssr.ssr, opts) | |
vim.keymap.set('n', '<leader>do', require'rust-tools'.external_docs.open_external_docs, opts) | |
end, | |
settings = { | |
["rust-analyzer"] = { | |
assist = { | |
importGranularity = "module", | |
importPrefix = "by_self", | |
}, | |
cargo = { | |
loadOutDirsFromCheck = true, | |
}, | |
procMacro = { | |
enable = true, | |
}, | |
checkOnSave = { | |
command = "clippy", | |
}, | |
} | |
}, | |
}, | |
dap = { | |
adapter = { | |
command = '/path/to/lldb-vscode', | |
}, | |
}, | |
} | |
---- keymapings ---- | |
vim.g.mapleader = " " -- <Space> | |
-- telescope shortcuts for fuzzy-finding | |
function ivy() | |
return require('telescope.themes').get_ivy({}) | |
end | |
local telescope = function() return require('telescope.builtin') end | |
map_key('n', '<leader>ff', '', { noremap = true, callback = function() telescope().find_files(ivy()) end }) | |
map_key('n', '<leader>fg', '', { noremap = true, callback = function() telescope().live_grep(ivy()) end }) | |
map_key('n', '<leader>fb', '', { noremap = true, callback = function() telescope().buffers(ivy()) end }) | |
map_key('n', '<leader>fh', '', { noremap = true, callback = function() telescope().help_tags() end }) | |
map_key('n', '<leader>ft', '', { noremap = true, callback = function() telescope().treesitter(ivy()) end }) | |
-- debug adapter | |
map_key('n', '<leader>db', [[<cmd>lua require'dap'.toggle_breakpoint()<CR>]], { noremap = true }) | |
map_key('n', '<leader>dc', [[<cmd>lua require'dap'.continue()<CR>]], { noremap = true }) | |
map_key('n', '<leader>dso', [[<cmd>lua require'dap'.step_over()<CR>]], { noremap = true }) | |
map_key('n', '<leader>dr', [[<cmd>lua require'dap'.repl.open()<CR>]], { noremap = true }) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment