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 = { trail = '·', tab = ' ' } -- 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 -- Compile on F12 vim.keymap.set('n', '', function(e) vim.cmd('wa') vim.cmd('!mars -p %:p') end, { silent = true, expr = true }) vim.keymap.set('i', '', function(e) vim.cmd('wa') vim.cmd('!mars -p %:p') end, { silent = true, expr = true }) vim.keymap.set('i', '', function(e) vim.cmd('wa') vim.cmd('!mars -p %:p') end, { silent = true, expr = true }) -- Autocomplete with tab vim.keymap.set('v', '', function() if vim.fn.pumvisible() == 1 then return '' else return '' end end, { silent = true, expr = true }) 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')