From 13bbcd5a5feffa4a91f4e4068e68e9baf2f90223 Mon Sep 17 00:00:00 2001 From: Minijackson Date: Wed, 12 May 2021 20:54:32 +0200 Subject: vim: better config with lua, with some dev config --- dotfiles/vim-dev.lua | 61 ++++++++++++++ dotfiles/vim.lua | 223 +++++++++++++++++++++++++++++++++++++++++++++++++++ dotfiles/vimrc.vim | 139 -------------------------------- 3 files changed, 284 insertions(+), 139 deletions(-) create mode 100644 dotfiles/vim-dev.lua create mode 100644 dotfiles/vim.lua delete mode 100644 dotfiles/vimrc.vim (limited to 'dotfiles') diff --git a/dotfiles/vim-dev.lua b/dotfiles/vim-dev.lua new file mode 100644 index 0000000..6b78022 --- /dev/null +++ b/dotfiles/vim-dev.lua @@ -0,0 +1,61 @@ +local lspconfig = require("lspconfig") + +function on_attach(client, bufnr) + local function buf_set_keymap(...) + vim.api.nvim_buf_set_keymap(bufnr, ...) + end + + local opts = { noremap = true, silent = true } + + 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', 'gr', 'lua vim.lsp.buf.references()', opts) + + buf_set_keymap('n', 'sa', 'lua vim.lsp.buf.code_action()', opts) + buf_set_keymap('n', 'se', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) + buf_set_keymap('n', 'sl', 'lua vim.lsp.diagnostic.set_loclist()', opts) + buf_set_keymap('n', 'sr', 'lua vim.lsp.buf.rename()', 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) + + -- Capability specific + + -- print(vim.inspect(client.resolved_capabilities)) + + if client.resolved_capabilities.document_formatting then + buf_set_keymap("n", "sf", "lua vim.lsp.buf.formatting()", opts) + end + if client.resolved_capabilities.document_range_formatting then + buf_set_keymap("v", "sf", "lua vim.lsp.buf.range_formatting()", opts) + end + + -- Rust specific + buf_set_keymap("n", "sh", "RustToggleInlayHints", opts) + + require("completion").on_attach() +end + +function setup_lsp_with(servers) + for _, server in ipairs(servers) do + lspconfig[server].setup { + cmd = { vim.g[server .. "_path"] }, + on_attach = on_attach, + } + end +end + +setup_lsp_with { + "clangd", + "elixirls", + "pyls", +} + +require("rust-tools").setup { + server = { + cmd = { vim.g.rust_analyzer_path }, + on_attach = on_attach, + } +} diff --git a/dotfiles/vim.lua b/dotfiles/vim.lua new file mode 100644 index 0000000..1acff0d --- /dev/null +++ b/dotfiles/vim.lua @@ -0,0 +1,223 @@ +-- Options +---------- + +vim.o.undofile = true +vim.o.backup = true +vim.cmd "set backupdir-=." + +vim.o.mouse = "a" + +vim.o.ignorecase = true +vim.o.smartcase = true + +vim.o.smartindent = true + +vim.o.tabstop = 4 +vim.o.shiftwidth = 4 + +vim.o.inccommand = "split" + +vim.o.scrolloff = 1 +vim.o.sidescrolloff = 5 + +vim.o.colorcolumn = "80" +vim.o.cursorline = true + +vim.o.title = true + +vim.o.wildmode = "longest:full,full" +vim.o.completeopt = "menu,menuone,preview,noinsert,noselect" + +-- Use ripgrep +vim.o.grepprg = vim.g.ripgrep_path .. " --vimgrep --smart-case" +vim.o.grepformat = "%f:%l:%c:%m" .. vim.o.grepformat + +vim.o.termguicolors = true +vim.o.background = "dark" + +-- Mode already shown by the status line +vim.o.showmode = false + +-- Do not set "trail:-" because it messes up the highlighting +vim.o.listchars = "tab:│ ,extends:>,precedes:<,nbsp:+" +vim.wo.list = true +vim.o.fillchars = "fold:─,vert:│" + +-- Leaders +---------- + +vim.g.maplocalleader = "," +vim.g.mapleader = ";" + +-- Misc +------- + +-- From neovim#14420 +-- Restores the position of previously opened files +vim.cmd [[ + augroup LastCursorPos + autocmd! + autocmd BufReadPost * if @% !~# "\.git[\/\\]COMMIT_EDITMSG$" && line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif + augroup end +]] + +-- Highlight yanked text +vim.cmd "autocmd TextYankPost * silent! lua vim.highlight.on_yank()" + +vim.g.tex_flavor = "latex" + +vim.cmd "colorscheme gruvbox" + +-- Mappings +----------- + +local map = vim.api.nvim_set_keymap +local mapopts = { noremap = true, silent = true } + +vim.fn["camelcasemotion#CreateMotionMappings"] "" + +map("n", "=of", [[:set =(&formatoptions =~ "a") ? 'formatoptions-=a' : 'formatoptions+=a']], mapopts) + +-- Plugins +---------- + +-- Gitsigns + +require('gitsigns').setup { + keymaps = { + noremap = true, + buffer = true, + silent = true, + + ['n ]c'] = { expr = true, "&diff ? ']c' : 'lua require\"gitsigns\".next_hunk()'"}, + ['n [c'] = { expr = true, "&diff ? '[c' : 'lua require\"gitsigns\".prev_hunk()'"}, + + ['n hs'] = 'lua require"gitsigns".stage_hunk()', + ['n hu'] = 'lua require"gitsigns".undo_stage_hunk()', + ['n hr'] = 'lua require"gitsigns".reset_hunk()', + ['n hR'] = 'lua require"gitsigns".reset_buffer()', + ['n hp'] = 'lua require"gitsigns".preview_hunk()', + ['n hb'] = 'lua require"gitsigns".blame_line()', + + -- Text objects + ['o ih'] = ':lua require"gitsigns".select_hunk()', + ['x ih'] = ':lua require"gitsigns".select_hunk()', + } +} + +-- Treesitter + +require('nvim-treesitter.configs').setup { + highlight = { + enable = true, + }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = "gnn", + node_incremental = "grn", + scope_incremental = "grc", + node_decremental = "grm", + }, + }, + indent = { + enable = true, + }, + matchup = { + enable = true, + }, + textobjects = { + select = { + enable = true, + 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, + 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.foldmethod = 'expr' +vim.o.foldexpr = 'nvim_treesitter#foldexpr()' + +-- Completion-nvim + +vim.g.completion_chain_complete_list = { + default = { + { + complete_items = { 'lsp', 'ts', 'path', 'snippet', 'buffers', 'tmux', }, + } + }, +} + +vim.cmd [[autocmd BufEnter * lua require'completion'.on_attach()]] + +local map = vim.api.nvim_set_keymap + +vim.g.completion_enable_snippet = "snippets.nvim" + +-- Telescope + +map("n", "fb", "Telescope buffers", mapopts) +map("n", "ff", "Telescope find_files", mapopts) +map("n", "fg", "Telescope live_grep", mapopts) +map("n", "fh", "Telescope help_tags", mapopts) +map("n", "ft", "Telescope treesitter", mapopts) + +-- Lualine + +local lsp_status = require('lsp-status') +lsp_status.config { + indicator_errors = "err:", + indicator_hint = "hint:", + indicator_info = "info:", + indicator_ok = "ok", + indicator_warnings = "warn:", + spinner_frames = {""}, + status_symbol = "lsp:", +} +lsp_status.register_progress() + +function LspStatus() + if #vim.lsp.buf_get_clients() < 1 then return "" end + + return lsp_status.status() +end + +require("lualine").setup { + options = { + component_separators = "", + icons_enabled = false, + section_separators = "", + }, + sections = { + lualine_c = {'filename', LspStatus}, + }, +} + +-- Snippets.nvim + +require("snippets").use_suggested_mappings() diff --git a/dotfiles/vimrc.vim b/dotfiles/vimrc.vim deleted file mode 100644 index a0451c6..0000000 --- a/dotfiles/vimrc.vim +++ /dev/null @@ -1,139 +0,0 @@ -" Some global variables are defined in ../vim.nix - -" Better default options {{{ - -set undofile -set backup -set backupdir-=. - -set mouse=a - -set ignorecase -set smartcase - -set smartindent -set tabstop=4 -set shiftwidth=4 - -set inccommand=split - -set scrolloff=1 -set sidescrolloff=5 - -set colorcolumn=80 -set cursorline - -set modeline - -set title - -set wildmode=longest:full,full - -let g:maplocalleader = ',' -let g:mapleader = ';' - -" If previously opened jump to the last position in the file -au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif - -let &grepprg = g:ripgrep_path . ' --vimgrep $*' -let &grepformat = '%f:%l:%c:%m,' . &grepformat - -let g:tex_flavor = 'latex' - -" }}} - -" Colors, Statusline, Tabline, Code display {{{ - -set termguicolors -let g:gruvbox_contrast_dark = 'soft' -let g:gruvbox_italic = 1 -set background=dark -colorscheme gruvbox - -" Doesn't do anything because the tabline gets overwritten by lightline -"exe 'hi! TabLineSel guifg=' . g:dominant_color - -let g:lightline = { - \ 'colorscheme': 'gruvbox', - \ 'subseparator': { 'left': '|', 'right': '|' }, - \ 'tab_linesubseparator': { 'left': '|', 'right': '|' }, - \ } - -set noshowmode - -" Do not set "trail:-" because it messes up the highlighting -set listchars=tab:│\ ,extends:>,precedes:<,nbsp:+ -set list - -set fillchars=fold:─,vert:│ - -highlight ExtraWhitespace term=inverse cterm=inverse gui=inverse -" Show trailing whitespace and spaces before tabs: -autocmd Syntax * syn match ExtraWhitespace /\s\+$\| \+\ze\t/ containedin=ALL - -" }}} - -" Mappings {{{ - -call camelcasemotion#CreateMotionMappings(g:maplocalleader) - -nmap =of :set =(&formatoptions =~ "a") ? 'formatoptions-=a' : 'formatoptions+=a' - -" }}} - -set completefunc=syntaxcomplete#Complete -set completeopt+=noinsert,noselect - -" Deoplete {{{ - -let g:deoplete#enable_at_startup = 1 - -" }}} - -" Neosnippets {{{ - -imap (neosnippet_expand_or_jump) -smap (neosnippet_expand_or_jump) -xmap (neosnippet_expand_target) - -set conceallevel=2 -set concealcursor=nv - -" }}} - -" CtrlP {{{ -let g:ctrlp_user_command = g:fd_path . ' --type f --color never "" %s' -let g:ctrlp_use_caching = 0 -" }}} - -" LanguageClient {{{ -let g:LanguageClient_loggingFile = stdpath('data') . '/LanguageClient.log' -let g:LanguageClient_serverStderr = stdpath('data') . '/LanguageServer.log' -" }}} - -" VimWiki {{{ - " {'path': '~/Documents/Wiki', 'path_html': '~/Documents/Wiki/html'} \ -let g:vimwiki_list = [ - \ {'path': '~/Documents/Wiki/personal', - \ 'path_html': '~/Documents/Wiki/personal/html', - \ 'auto_tags': 1}, - \ {'path': '~/Documents/Wiki/science', 'path_html': '~/Documents/Wiki/science/html', 'auto_tags': 1}, - \ {'path': '~/Documents/Wiki/work', 'path_html': '~/Documents/Wiki/work/html', 'auto_tags': 1}, -\ ] - -let g:vimwiki_global_ext = 0 - -let g:vimwiki_auto_header = 1 -let g:vimwiki_hl_headers = 1 -let g:vimwiki_hl_cb_checked = 1 -let g:vimwiki_html_header_numbering = 2 -let g:vimwiki_html_header_numbering_sym = '.' - -let g:vimwiki_links_header_level = 2 -let g:vimwiki_tags_header_level = 2 -let g:vimwiki_toc_header_level = 2 - -call deoplete#custom#var('omni', 'input_patterns', { 'vimwiki': '\[\[\w*|\:\w+' }) -" }}} - -" vim: fdm=marker -- cgit v1.2.3