Skip to content

Instantly share code, notes, and snippets.

@DirectXMan12
Last active September 15, 2023 08:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DirectXMan12/23f47fb6558459dbdf092a56d2497c01 to your computer and use it in GitHub Desktop.
Save DirectXMan12/23f47fb6558459dbdf092a56d2497c01 to your computer and use it in GitHub Desktop.
neovim rust important bits
-- 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