From: Pass Automated Testing Suite Date: Thu, 14 Oct 2021 16:40:03 +0000 (+0200) Subject: Add nvim configuration; tty friendly X-Git-Url: https://git.beaudet.xyz/?a=commitdiff_plain;h=9bd0d5ba44a3506ff3587804bedfb293ba2db696;p=dot.git Add nvim configuration; tty friendly --- diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua new file mode 100644 index 0000000..a725335 --- /dev/null +++ b/.config/nvim/init.lua @@ -0,0 +1,375 @@ +-- Install packer +local execute = vim.api.nvim_command + +local install_path = vim.fn.stdpath('data') .. '/site/pack/packer/start/packer.nvim' + +if vim.fn.empty(vim.fn.glob(install_path)) > 0 then + execute('!git clone https://github.com/wbthomason/packer.nvim '.. install_path) +end + +vim.api.nvim_exec([[ +augroup Packer +autocmd! +autocmd BufWritePost init.lua PackerCompile +augroup end +]], false) + +local use = require('packer').use +require('packer').startup( function() + use 'wbthomason/packer.nvim' -- Package manager + use 'tpope/vim-fugitive' -- Git commands in nvim + use 'tpope/vim-rhubarb' -- Fugitive-companion to interact with github + use 'tpope/vim-commentary' -- "gc" to comment visual regions/lines + use 'tpope/vim-surround' -- "gc" to comment visual regions/lines + use 'ludovicchabant/vim-gutentags' -- Automatic tags management + use 'tpope/vim-sleuth' + use 'tpope/vim-dispatch' + -- UI to select things (files, grep results, open buffers...) + use { + 'nvim-telescope/telescope.nvim', + requires = { + {'nvim-lua/popup.nvim'}, + {'nvim-lua/plenary.nvim'} + } + } + use 'itchyny/lightline.vim' -- Fancier statusline + -- Add git related info in the signs columns and popups + use {'lewis6991/gitsigns.nvim', requires = {'nvim-lua/plenary.nvim'} } + + use {'nvim-treesitter/nvim-treesitter', run = ':TSUpdate'} + use 'nvim-treesitter/nvim-treesitter-textobjects' + use 'windwp/nvim-autopairs' + use 'windwp/nvim-ts-autotag' + use 'jiangmiao/auto-pairs' + use 'neovim/nvim-lspconfig' -- Collection of configurations for built-in LSP client + use { + 'hrsh7th/nvim-cmp', -- Autocompletion plugin + requires = { + {'hrsh7th/cmp-nvim-lsp'}, + {'hrsh7th/cmp-vsnip'}, + {'hrsh7th/cmp-path'}, + {'hrsh7th/cmp-buffer'}, + {'hrsh7th/vim-vsnip'}, + {'rafamadriz/friendly-snippets'}, + } + } + use 'simrat39/rust-tools.nvim' + use 'mfussenegger/nvim-dap' + +end) + +--Incremental live completion +vim.o.inccommand = "nosplit" + +--Set highlight on search +vim.o.hlsearch = false +vim.o.incsearch = true + +--Make line numbers default +vim.wo.number = true + +--Do not save when switching buffers +vim.o.hidden = true + +--Enable mouse mode +-- vim.o.mouse = "a" + +--Enable break indent +vim.o.breakindent = true + +--Save undo history +vim.cmd[[set undofile]] + +--Case insensitive searching UNLESS /C or capital in search +vim.o.ignorecase = true +vim.o.smartcase = true + +--Decrease update time +vim.o.updatetime = 250 +vim.wo.signcolumn="yes" + +--Set colorscheme (order is important here) +-- vim.o.termguicolors = true +vim.cmd[[colorscheme koehler]] + +--Set statusbar +vim.g.lightline = { + -- colorscheme = 'koehler'; + active = { left = { { 'mode', 'paste' }, { 'gitbranch', 'readonly', 'filename', 'modified' } } }; + component_function = { gitbranch = 'fugitive#head', }; +} + +--Remap space as leader key +vim.api.nvim_set_keymap('', '', '', { noremap = true, silent=true}) +vim.g.mapleader = " " +vim.g.maplocalleader = " " + +--Remap for dealing with word wrap +vim.api.nvim_set_keymap('n', 'k', "v:count == 0 ? 'gk' : 'k'", { noremap=true, expr = true, silent = true}) +vim.api.nvim_set_keymap('n', 'j', "v:count == 0 ? 'gj' : 'j'", {noremap= true, expr = true, silent = true}) + +--Remap escape to leave terminal mode +vim.api.nvim_set_keymap('t', '', [[]], {noremap = true}) + +--Add map to enter paste mode +vim.o.pastetoggle="" + +-- Gitsigns +require('gitsigns').setup { + signs = { + add = { hl = 'GitGutterAdd', text = '+' }, + change = { hl = 'GitGutterChange', text = '~' }, + delete = { hl = 'GitGutterDelete', text = '_' }, + topdelete = { hl = 'GitGutterDelete', text = '-' }, + changedelete = { hl = 'GitGutterChange', text = '~' }, + }, +} + +-- Telescope +require('telescope').setup { + defaults = { + mappings = { + i = { + [""] = false, + [""] = false, + }, + }, + generic_sorter = require'telescope.sorters'.get_fzy_sorter, + file_sorter = require'telescope.sorters'.get_fzy_sorter, + } +} +--Add leader shortcuts +vim.api.nvim_set_keymap('n', 'f', [[lua require('telescope.builtin').git_files()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'F', [[lua require('telescope.builtin').find_files()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', '', [[lua require('telescope.builtin').buffers()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'l', [[lua require('telescope.builtin').current_buffer_fuzzy_find()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 't', [[lua require('telescope.builtin').tags()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', '?', [[lua require('telescope.builtin').oldfiles()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'sd', [[lua require('telescope.builtin').grep_string()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'sp', [[lua require('telescope.builtin').live_grep()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'o', [[lua require('telescope.builtin').tags{ only_current_buffer = true }]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'm', [[lua require('telescope.builtin').keymaps()]], { noremap = true, silent = true}) + +vim.api.nvim_set_keymap('n', 'gc', [[lua require('telescope.builtin').git_commits()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'gb', [[lua require('telescope.builtin').git_branches()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'gt', [[lua require('telescope.builtin').git_status()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'gp', [[lua require('telescope.builtin').git_bcommits()]], { noremap = true, silent = true}) + +vim.api.nvim_set_keymap('n', 'ca', [[lua require('telescope.builtin').lsp_code_actions()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('s', 'ca', [[lua require('telescope.builtin').lsp_range_code_actions()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'gr', [[lua require('telescope.builtin').lsp_references()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'gs', [[lua require('telescope.builtin').lsp_workspace_symbols()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'gS', [[lua require('telescope.builtin').lsp_document_symbols()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'gd', [[lua require('telescope.builtin').lsp_workspace_diagnostics()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'gD', [[lua require('telescope.builtin').lsp_document_diagnostics()]], { noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'gi', [[lua require('telescope.builtin').lsp_definitions()]], { noremap = true, silent = true}) + +-- Change preview window location +vim.g.splitbelow = true + +-- Highlight on yank +vim.api.nvim_exec( + [[ + augroup YankHighlight + autocmd! + autocmd TextYankPost * silent! lua vim.highlight.on_yank() + augroup end + ]], + false +) + +-- LSP settings +local nvim_lsp = require('lspconfig') + +-- Use an on_attach function to only map the following keys +-- after the language server attaches to the current buffer +local on_attach = function(client, bufnr) + local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end + local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end + + --Enable completion triggered by + buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') + + -- Mappings. + local opts = { noremap=true, silent=true } + + -- See `:help vim.lsp.*` for documentation on any of the below functions + -- buf_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) + -- buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) + buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) + -- buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) + buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) + buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) + buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) + buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) + buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) + buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) + buf_set_keymap('n', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) + buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) + buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) + buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts) + buf_set_keymap("n", "f", "lua vim.lsp.buf.formatting()", opts) + buf_set_keymap("n", "dc", "Dispatch cargo clippy", opts) + +end + +-- nvim-cmp supports additional completion capabilities +local capabilities = vim.lsp.protocol.make_client_capabilities() +capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) + + +-- Enable the following language servers +-- local servers = { 'clangd', 'rust_analyzer', 'bashls', 'pyright', 'tsserver', "cssls", "html" } +local servers = { 'clangd', 'pyright', 'bashls', 'tsserver', "cssls", "html" } +for _, lsp in ipairs(servers) do + nvim_lsp[lsp].setup { + on_attach = on_attach, + capabilities = capabilities, + flags = { + debounce_text_changes = 150, + } + } +end + +local rustopts = { + -- see https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md#rust_analyzer + server = { + on_attach = on_attach, + flags = { + debounce_text_changes = 150, + }, + }, +} + +require('rust-tools').setup(rustopts) + +-- Treesitter setup +require('nvim-treesitter.configs').setup { + highlight = { + enable = true, -- false will disable the whole extension + }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = 'gnn', + node_incremental = 'grn', + scope_incremental = 'grc', + node_decremental = 'grm', + }, + }, + indent = { + enable = false, + }, + textobjects = { + select = { + enable = true, + lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim + keymaps = { + -- You can use the capture groups defined in textobjects.scm + ['af'] = '@function.outer', + ['if'] = '@function.inner', + ['ac'] = '@class.outer', + ['ic'] = '@class.inner', + }, + }, + move = { + enable = true, + set_jumps = true, -- whether to set jumps in the jumplist + goto_next_start = { + [']m'] = '@function.outer', + [']]'] = '@class.outer', + }, + goto_next_end = { + [']M'] = '@function.outer', + [']['] = '@class.outer', + }, + goto_previous_start = { + ['[m'] = '@function.outer', + ['[['] = '@class.outer', + }, + goto_previous_end = { + ['[M'] = '@function.outer', + ['[]'] = '@class.outer', + }, + }, + }, +} + +vim.o.completeopt="menuone,noselect" + +local cmp = require'cmp' +cmp.setup({ + 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, + }) + }, + sources = { + { name = 'nvim_lsp' }, + { name = 'vsnip' }, + { name = 'path' }, + { name = 'buffer' }, + }, +}) + +-- autopairs setup +-- require("nvim-autopairs.completion.cmp").setup({ +-- check_ts = true, +-- map_cr = false, -- map on insert mode +-- map_complete = true, -- it will auto insert `(` (map_char) after select function or method item +-- auto_select = true, -- automatically select the first item +-- insert = false, -- use insert confirm behavior instead of replace +-- map_char = { -- modifies the function or method delimiter by filetypes +-- all = '(', +-- tex = '{' +-- } +-- }) + +vim.api.nvim_exec( + [[ + autocmd BufWritePre *.rs lua vim.lsp.buf.formatting() + ]], + true +) + + +vim.api.nvim_exec([[ +" Expand +imap vsnip#expandable() ? '(vsnip-expand)' : '' +smap vsnip#expandable() ? '(vsnip-expand)' : '' + +" Expand or jump +imap vsnip#available(1) ? '(vsnip-expand-or-jump)' : '' +smap vsnip#available(1) ? '(vsnip-expand-or-jump)' : '' + +" Jump forward or backward +imap vsnip#jumpable(1) ? '(vsnip-jump-next)' : '' +smap vsnip#jumpable(1) ? '(vsnip-jump-next)' : '' +imap vsnip#jumpable(-1) ? '(vsnip-jump-prev)' : '' +smap vsnip#jumpable(-1) ? '(vsnip-jump-prev)' : '' + +imap vsnip#jumpable(1) ? '(vsnip-jump-next)' : '' +imap vsnip#jumpable(-1) ? '(vsnip-jump-prev)' : '' + +" Select or cut text to use as $TM_SELECTED_TEXT in the next snippet. +" See https://github.com/hrsh7th/vim-vsnip/pull/50 +nmap s (vsnip-select-text) +xmap s (vsnip-select-text) +nmap S (vsnip-cut-text) +xmap S (vsnip-cut-text) +]], true)