vim.opt.ignorecase = true -- search case insensitive vim.opt.smartcase = true -- search matters if capital letter vim.opt.inccommand = "split" -- "for incsearch while sub vim.g.mapleader = "," vim.opt.ruler = true -- cursor position all the time vim.opt.autowrite = true -- save before commands -- softtabs, 2 spaces vim.opt.tabstop = 2 vim.opt.shiftwidth = 2 vim.opt.shiftround = true vim.optexpandtab = true -- listchars (show tabs and trailing whitespace) vim.opt.list = true vim.opt.listchars.tab = "»·" vim.opt.listchars.trail= "·" vim.opt.listchars.nbsp = "·" -- width and height indications vim.opt.textwidth = 80 vim.opt.colorcolumn = "+1" vim.opt.number = true vim.opt.numberwidth = 5 -- textwidth but don't wrap vim.opt.formatoptions:remove { "t" } -- telescope setup local tbuiltin = require('telescope.builtin') vim.keymap.set('n', 'fg', tbuiltin.live_grep, {}) vim.keymap.set('n', 'ff', tbuiltin.find_files, {}) vim.keymap.set('n', 'fo', tbuiltin.oldfiles, {}) vim.keymap.set('n', 'fb', tbuiltin.buffers, {}) vim.keymap.set('n', 'fh', tbuiltin.help_tags, {}) vim.keymap.set('n', 'fs', tbuiltin.spell_suggest, {}) -- Mason (tool manager) setup -- we want rust-analyzer and codelldb require("mason").setup({ ui = { icons = { package_installed = "✔️", package_pending = "🔄", package_uninstalled = "🌐" } } }) require("mason-lspconfig").setup() -- General LSP settings -- from https://rsdlt.github.io/posts/rust-nvim-ide-guide-walkthrough-development-debug/ local sign = function(opts) vim.fn.sign_define(opts.name, { texthl = opts.name, text = opts.text, numhl = '' }) end sign({name = 'DiagnosticSignError', text = '🛑'}) sign({name = 'DiagnosticSignWarn', text = '⚠️'}) sign({name = 'DiagnosticSignHint', text = '💭'}) sign({name = 'DiagnosticSignInfo', text = '🗒️'}) vim.diagnostic.config({ virtual_text = false, signs = true, update_in_insert = true, underline = true, severity_sort = false, float = { border = 'rounded', source = 'always', header = '', prefix = '', }, }) vim.cmd([[ set signcolumn=yes autocmd CursorHold * lua vim.diagnostic.open_float(nil, { focusable = false }) ]]) -- Rust tools for Rust-specific LSP local rt = require("rust-tools") rt.setup({ server = { on_attach = function(_, bufnr) -- ctrl + space for hover actions vim.keymap.set("n", "", rt.hover_actions.hover_actions, { buffer = bufnr }) -- ,a for code actions vim.keymap.set("n", "a", rt.code_action_group.code_action_group, { buffer = bufnr }) end, } }) -- set up treesitter require('nvim-treesitter.configs').setup { auto_install = false, ident = { enable = true }, rainbow = { enable = true, extended_mode = true, max_file_lines = nil, } } -- completion setup 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, }, }) -- set terminal title function _G.current_tab() local curr_buf = vim.fn.bufnr() local total = 0 local curr_tab for i = 1, vim.fn.tabpagenr('$') do total = total + 1 for _, bufnr in ipairs(vim.fn.tabpagebuflist(i)) do if bufnr == curr_buf then curr_tab = i end end end return string.format('(%d of %d)', curr_tab, total) end vim.opt.title = true vim.opt.titlestring = [[%f %h%m%r%w - %{v:progname} %{luaeval('current_tab()')}]] -- vimsense (rich presence) options vim.g.vimsense_small_text = "NeoVim" vim.g.vimsense_small_image = "neovim" vim.g.vimsense_editing_details = "Editing: {}" vim.g.vimsense_editing_state = "Working on: {}" vim.g.vimsense_file_explorer_text = "In file manager" vim.g.vimsense_file_explorer_details = "Looking for files"