From 1d654ef9fce90dc06b181f96507357fbc6912622 Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Mon, 5 May 2025 15:05:59 +0200 Subject: [PATCH] Lua config for nvim --- nvim.lua | 190 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 nvim.lua diff --git a/nvim.lua b/nvim.lua new file mode 100644 index 0000000..adae7f0 --- /dev/null +++ b/nvim.lua @@ -0,0 +1,190 @@ +local Plug = vim.fn['plug#'] + +-- PLUGINS +vim.call('plug#begin') + +-- General plugins +Plug('vim-airline/vim-airline') +Plug('vim-airline/vim-airline-themes') +Plug('tpope/vim-abolish') +Plug('lambdalisue/suda.vim') +Plug('https://gitea.tforgione.fr/tforgione/peach.git') + +-- Language specific plugins +Plug('rust-lang/rust.vim') +Plug('ElmCast/elm-vim') +Plug('cespare/vim-toml') +Plug('kaarmu/typst.vim') + +vim.call('plug#end') + +-- INDENTATION +vim.opt.expandtab = true +vim.opt.tabstop = 4 +vim.opt.shiftwidth = 4 +vim.opt.autoindent = true +vim.opt.textwidth = 120 + +-- UI +vim.opt.number = true +vim.opt.showcmd = true +vim.opt.wildmenu = true +vim.opt.lazyredraw = true +vim.opt.encoding = 'utf8' +vim.opt.clipboard = 'unnamedplus' +vim.opt.updatecount = 50 +vim.opt.mouse = 'a' +vim.opt.guicursor = nil +vim.opt.updatetime = 300 + +vim.opt.list = true +vim.opt.listchars:append({ trail = '·' }) + +-- Auto remove trailing spaces +vim.api.nvim_create_autocmd({'BufWritePre'}, { + pattern = {'*'}, + callback = function(ev) + vim.cmd('%s/\\s\\+$//e') + end +}) + +-- COLOR -- +pcall(vim.cmd.colorscheme, 'peach') +vim.cmd.highlight({'BadWhitespace', 'ctermbg=red', 'guibg=red'}) +vim.g.airline_powerline_fonts = 1 +vim.g.airline_theme = 'dark' + +-- SEARCHING +vim.opt.title = true +vim.opt.showmatch = true +vim.opt.hlsearch = true +vim.opt.incsearch = true + +-- BACKUPS +vim.opt.undofile = true +vim.opt.undolevels = 1000 +vim.opt.undoreload = 10000 +vim.opt.undodir = os.getenv('HOME') .. '/.nvim/undo' + +vim.g.backup_dir = os.getenv('HOME') .. '/.nvim/backups' + +vim.api.nvim_create_autocmd({'BufWritePost'}, { + pattern = {'*'}, + callback = function(ev) + local backup_path = vim.g.backup_dir .. '/' .. vim.api.nvim_buf_get_name(0):gsub('/', '\\%%') + vim.cmd('silent w! ' .. backup_path) + end +}) + +-- LSPs +-- Config +vim.opt.completeopt = { 'menuone', 'noselect' } + +vim.diagnostic.config { + signs = { + text = { + [vim.diagnostic.severity.ERROR] = '', + [vim.diagnostic.severity.WARN] = '', + [vim.diagnostic.severity.HINT] = '', + }, + color = {}, + }, + float = { + header = false, + border = 'rounded', + } +} + +-- Show diagnostics on hover +vim.api.nvim_create_autocmd({'CursorHold'}, { + pattern = {'*'}, + callback = function(ev) + vim.diagnostic.open_float() + end +}) + + + +-- Shortcuts for mapping shortcuts +local map = function(type, key, value) + vim.api.nvim_buf_set_keymap(0, type, key, value, { noremap = true, silent = true }); +end + +vim.api.nvim_create_autocmd("LspAttach", { + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + + -- Enable auto-completion. Note: Use CTRL-Y to select an item. + if client:supports_method('textDocument/completion') then + + -- Trigger autocompletion on EVERY keypress. May be slow! + local chars = {}; for i = 32, 126 do table.insert(chars, string.char(i)) end + client.server_capabilities.completionProvider.triggerCharacters = chars + + vim.lsp.completion.enable(true, client.id, args.buf, { + autotrigger = true, + convert = function(item) + return { abbr = item.label:gsub('%b()', '') } + end, + }) + end + + -- Auto-format on save. + if not client:supports_method('textDocument/willSaveWaitUntil') and client:supports_method('textDocument/formatting') then + vim.api.nvim_create_autocmd('BufWritePre', { + group = vim.api.nvim_create_augroup('my.lsp', {clear=false}), + buffer = args.buf, + callback = function() + vim.lsp.buf.format({ bufnr = args.buf, id = client.id, timeout_ms = 1000 }) + end, + }) + end + + -- Don't use lsp to manage colorscheme + client.server_capabilities.semanticTokensProvider = nil + + -- Some nice shortcuts + map('n','gD','lua vim.lsp.buf.declaration()') + map('n','gd','lua vim.lsp.buf.definition()') + map('n','K','lua vim.lsp.buf.hover()') + map('n','gr','lua vim.lsp.buf.references()') + map('n','gs','lua vim.lsp.buf.signature_help()') + map('n','gi','lua vim.lsp.buf.implementation()') + map('n','gt','lua vim.lsp.buf.type_definition()') + map('n','gw','lua vim.lsp.buf.document_symbol()') + map('n','gW','lua vim.lsp.buf.workspace_symbol()') + map('n','ah','lua vim.lsp.buf.hover()') + map('n','af','lua vim.lsp.buf.code_action()') + map('n','ee','lua vim.lsp.util.show_line_diagnostics()') + map('n','rn','lua vim.lsp.buf.rename()') + map('n','=', 'lua vim.lsp.buf.formatting()') + map('n','ai','lua vim.lsp.buf.incoming_calls()') + map('n','ao','lua vim.lsp.buf.outgoing_calls()') + end, +}); + +-- Rust +vim.lsp.config['rust'] = { + cmd = { 'rustup', 'run', 'stable', 'rust-analyzer' }, + filetypes = { 'rust' }, + root_markers = { 'Cargo.toml' }, +} + +vim.lsp.enable('rust') + +-- Elm +vim.lsp.config['elm'] = { + cmd = { 'elm-language-server' }, + filetypes = { 'elm' }, + root_markers = { 'elm.json' }, +} + +vim.lsp.enable('elm') + +-- Python +vim.lsp.config['python'] = { + cmd = { 'pylsp' }, + filetypes = { 'python' }, +} + +vim.lsp.enable('python')