From 5c1e228a94abf042b693ba99e2f10a9ecb43fd7a Mon Sep 17 00:00:00 2001 From: D4VID0x2 Date: Fri, 20 May 2022 17:10:56 +0200 Subject: [PATCH] LSP config --- nvim/.config/nvim/init.vim | 596 +++++++++---------------------------- 1 file changed, 133 insertions(+), 463 deletions(-) diff --git a/nvim/.config/nvim/init.vim b/nvim/.config/nvim/init.vim index 8180e53..ed645c9 100644 --- a/nvim/.config/nvim/init.vim +++ b/nvim/.config/nvim/init.vim @@ -4,11 +4,13 @@ set timeout timeoutlen=3000 set mouse= syntax on +set nocompatible set noerrorbells set number set relativenumber set incsearch set ignorecase +set smartcase set ruler set splitright set splitbelow @@ -26,115 +28,67 @@ set scrolloff=4 set inccommand=nosplit " highlight substitude - " PLUGINS: - call plug#begin('~/.config/nvim/autoload/plugged') Plug 'scrooloose/nerdcommenter' Plug 'preservim/nerdtree' + Plug 'zhimsel/vim-stay' " Stay at my cursor - Plug 'zhimsel/vim-stay' - - Plug 'morhetz/gruvbox' " themes + " Colorthemes + Plug 'morhetz/gruvbox' Plug 'navarasu/onedark.nvim' " Fuzzy file search Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } " fuzzy file finder Plug 'junegunn/fzf.vim' - Plug 'chengzeyi/fzf-preview.vim' + Plug 'chengzeyi/fzf-preview.vim' " fzf preview for more things Plug 'airblade/vim-rooter' " addon for fzf, for git projects - " Plug 'ycm-core/YouCompleteMe' - Plug 'neoclide/coc.nvim', {'branch': 'release'} - - " Better syntax highlighting - " Python: - " Plug 'numirias/semshi', {'do': ':UpdateRemotePlugins'} - " Plug 'davidhalter/jedi-vim' - - " C++: - Plug 'octol/vim-cpp-enhanced-highlight' - " Snippets - Plug 'sirver/ultisnips' - Plug 'honza/vim-snippets' - Plug 'ervandew/supertab' + " Plug 'sirver/ultisnips' + " Plug 'honza/vim-snippets' + " Plug 'ervandew/supertab' " Show git modifications to file -""Plug 'vim-scripts/vim-gitgutter' - - Plug 'jremmen/vim-ripgrep' " Rg uses word under cursor - - " run current file - Plug 'sbdchd/vim-run' - - " HTTP - Plug 'nicwest/vim-http' - - - " .NET C# - Plug 'OmniSharp/omnisharp-vim' - Plug 'dense-analysis/ale' - - - " Markdown - " Plug 'plasticboy/vim-markdown' - " Plug 'kamikat/vim-markdown' - Plug 'tpope/vim-markdown' - - - + Plug 'vim-scripts/vim-gitgutter' + Plug 'sbdchd/vim-run' " run current file + Plug 'octol/vim-cpp-enhanced-highlight' + Plug 'nicwest/vim-http' " Simple wrapper over curl and http syntax highlighting. + Plug 'tpope/vim-markdown' " Markdown syntax highlighting " LSP: - " Collection of common configurations for the Nvim LSP client Plug 'neovim/nvim-lspconfig' - - " Autocompletion framework - Plug 'hrsh7th/nvim-cmp' - " cmp LSP completion - Plug 'hrsh7th/cmp-nvim-lsp' - " cmp Snippet completion - Plug 'hrsh7th/cmp-vsnip' - " cmp Path completion - Plug 'hrsh7th/cmp-path' - Plug 'hrsh7th/cmp-buffer' - " See hrsh7th other plugins for more great completion sources! - - " Adds extra functionality over rust analyzer - Plug 'simrat39/rust-tools.nvim' - - " Snippet engine - Plug 'hrsh7th/vim-vsnip' - + Plug 'williamboman/nvim-lsp-installer' " Automaticlly install language server " Optional Plug 'nvim-lua/popup.nvim' Plug 'nvim-lua/plenary.nvim' Plug 'nvim-telescope/telescope.nvim' - " Some color scheme other then default - Plug 'arcticicestudio/nord-vim' + Plug 'hrsh7th/nvim-cmp' " Autocompletion framework + Plug 'hrsh7th/cmp-nvim-lsp' " cmp LSP completion + Plug 'hrsh7th/cmp-vsnip' " cmp Snippet completion + Plug 'hrsh7th/vim-vsnip' " Snippet engine + Plug 'hrsh7th/cmp-path' " cmp Path completion + Plug 'hrsh7th/cmp-buffer' + " Adds extra functionality over rust analyzer + Plug 'simrat39/rust-tools.nvim' call plug#end() - " COLORSCHEME: - colorscheme gruvbox -"colorscheme onehalfdark let g:airline_theme='onehalfdark' set background=dark - - -"let g:rooter_manual_only = 1 +" PLUGIN CONFIGURATION: " run current file plugin let g:run_cmd_python = ['python3'] @@ -143,367 +97,119 @@ let g:run_split = 'right' " HTTP let g:vim_http_split_vertically = 1 - " Markdown - let g:markdown_fenced_languages = ['html', 'python', 'bash=sh', 'xml', 'javascript', 'json', 'asm', 'cs'] let g:markdown_minlines = 100 - -" YouCompleteMe: -fun! SetupYCM() - nnoremap gd :YcmCompleter GoTo - nnoremap gr :YcmCompleter GoToReferences - nnoremap rr :YcmCompleter RefactorRename - nnoremap fx :YcmCompleter FixIt - - " make YCM compatible with UltiSnips (using supertab) - let g:ycm_key_list_select_completion = ['', ''] - let g:ycm_key_list_previous_completion = ['', ''] - let g:SuperTabDefaultCompletionType = '' - - " better key bindings for UltiSnipsExpandTrigger - let g:UltiSnipsExpandTrigger = "" - let g:UltiSnipsJumpForwardTrigger = "" - let g:UltiSnipsJumpBackwardTrigger = "" - - let g:ycm_global_ycm_extra_conf = '/home/david/.config/nvim/autoload/plugged/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py' -endfun - - - - - - - - - -" CoC: -function! s:check_back_space() abort - let col = col('.') - 1 - return !col || getline('.')[col - 1] =~# '\s' -endfunction - -fun! SetupCoC() - inoremap - \ pumvisible() ? "\" : - \ check_back_space() ? "\" : - \ coc#refresh() - inoremap pumvisible() ? "\" : "\" - inoremap coc#refresh() - - nmap gd (coc-definition) - nmap gr (coc-references) - nmap gy (coc-type-definition) - nmap gi (coc-implementation) - nmap rn (coc-rename) - - " CoC snippet tab completion - inoremap - \ pumvisible() ? coc#_select_confirm() : - \ coc#expandableOrJumpable() ? "\=coc#rpc#request('doKeymap', ['snippets-expand-jump',''])\" : - \ check_back_space() ? "\" : - \ coc#refresh() - - function! s:check_back_space() abort - let col = col('.') - 1 - return !col || getline('.')[col - 1] =~# '\s' - endfunction - - let g:coc_snippet_next = '' - "let g:UltiSnipsExpandTrigger="" - "let g:UltiSnipsJumpForwardTrigger=">" - "let g:UltiSnipsJumpBackwardTrigger="" - - let g:coc_global_extensions = [ - \ 'coc-snippets', - \ 'coc-pairs', - \ 'coc-prettier', - \ 'coc-json', - \ 'coc-pyright', - \ 'coc-html', - \ 'coc-css', - \ 'coc-xml', - \ 'coc-yaml', - \ ] -endfun - - - - - - - - - - - -" DOTNET: -fun! SetupDotnet() - " .NET C# - " Don't autoselect first omnicomplete option, show options even if there is only - " one (so the preview documentation is accessible). Remove 'preview', 'popup' - " and 'popuphidden' if you don't want to see any documentation whatsoever. - " Note that neovim does not support `popuphidden` or `popup` yet: - " https://github.com/neovim/neovim/issues/10996 - if has('patch-8.1.1880') - set completeopt=longest,menuone,popuphidden - " Highlight the completion documentation popup background/foreground the same as - " the completion menu itself, for better readability with highlighted - " documentation. - set completepopup=highlight:Pmenu,border:off - else - set completeopt=longest,menuone,preview - " Set desired preview window height for viewing documentation. - set previewheight=5 - endif - - " Tell ALE to use OmniSharp for linting C# files, and no other linters. - "let g:ale_linters = { 'cs': ['OmniSharp'] } - - "augroup omnisharp_commands - "autocmd! - - " Show type information automatically when the cursor stops moving. - " Note that the type is echoed to the Vim command line, and will overwrite - " any other messages in this space including e.g. ALE linting messages. - autocmd CursorHold *.cs OmniSharpTypeLookup - - " The following commands are contextual, based on the cursor position. - nmap gd (omnisharp_go_to_definition) - nmap gu (omnisharp_find_usages) - nmap gi (omnisharp_find_implementations) - nmap ospd (omnisharp_preview_definition) - nmap ospi (omnisharp_preview_implementations) - nmap ost (omnisharp_type_lookup) - nmap osd (omnisharp_documentation) - nmap osfs (omnisharp_find_symbol) - nmap osfx (omnisharp_fix_usings) - nmap (omnisharp_signature_help) - imap (omnisharp_signature_help) - - " Navigate up and down by method/property/field - nmap [[ (omnisharp_navigate_up) - nmap ]] (omnisharp_navigate_down) - " Find all code errors/warnings for the current solution and populate the quickfix window - nmap oscc (omnisharp_global_code_check) - " Contextual code actions (uses fzf, vim-clap, CtrlP or unite.vim selector when available) - nmap osca (omnisharp_code_actions) - xmap osca (omnisharp_code_actions) - " Repeat the last code action performed (does not use a selector) - nmap os. (omnisharp_code_action_repeat) - xmap os. (omnisharp_code_action_repeat) - - nmap os= (omnisharp_code_format) - - nmap rn (omnisharp_rename) - - nmap osre (omnisharp_restart_server) - nmap osst (omnisharp_start_server) - nmap ossp (omnisharp_stop_server) - - "nmap :vs | term dotnet run - nmap run :vs:w:term dotnet run - - "augroup END - - let g:OmniSharp_selector_ui = 'fzf' " Use fzf - let g:OmniSharp_selector_findusages = 'fzf' - - let g:OmniSharp_highlighting = 3 " Highlight in insert mode - - let g:OmniSharp_highlight_groups = { - \ 'Comment': 'NonText', - \ 'XmlDocCommentName': 'Identifier', - \ 'XmlDocCommentText': 'NonText' - \} - - let g:OmniSharp_popup_options = { - \ 'winblend': 30, - \ 'winhl': 'Normal:Normal' - \} - - " Enable snippet completion, using the ultisnips plugin - let g:OmniSharp_want_snippet=1 -endfun - - - - - - - - - - - - - - - -" RUST: -" This is an example on how rust-analyzer can be configure using rust-tools -" https://sharksforarms.dev/posts/neovim-rust/ - -" Prerequisites: -" - neovim >= 0.5 -" - rust-analyzer: https://rust-analyzer.github.io/manual.html#rust-analyzer-language-server-binary - -" Steps: -" - :PlugInstall -" - Restart -" - -function! SetupLSP() - " Set completeopt to have a better completion experience - " :help completeopt - " menuone: popup even when there's only one match - " noinsert: Do not insert text until a selection is made - " noselect: Do not select, force user to select one from the menu - set completeopt=menuone,noinsert,noselect,preview - - " Avoid showing extra messages when using completion - "set shortmess+=c - - " Configure LSP through rust-tools.nvim plugin. - " rust-tools will configure and enable certain LSP features for us. - " See https://github.com/simrat39/rust-tools.nvim#configuration - lua < rn lua vim.lsp.buf.rename() - nnoremap gi lua vim.lsp.buf.implementation() - nnoremap lua vim.lsp.buf.signature_help() - " nnoremap 1gD lua vim.lsp.buf.type_definition() - nnoremap gr lua vim.lsp.buf.references() - nnoremap g0 lua vim.lsp.buf.document_symbol() - nnoremap gW lua vim.lsp.buf.workspace_symbol() - nnoremap gd lua vim.lsp.buf.definition() - - " Quick-fix - nnoremap ga lua vim.lsp.buf.code_action() - - " Setup Completion - " See https://github.com/hrsh7th/nvim-cmp#basic-configuration - lua <'] = 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 = 'nvim_lsp' }, - { name = 'vsnip' }, - { name = 'path' }, - { name = 'buffer' }, - }, +" LSP: + +" Set completeopt to have a better completion experience +" :help completeopt +" menuone: popup even when there's only one match +" noinsert: Do not insert text until a selection is made +" noselect: Do not select, force user to select one from the menu +set completeopt=menuone,noinsert,noselect,preview + +" Avoid showing extra messages when using completion +"set shortmess+=c + +lua <e', 'lua vim.diagnostic.open_float()', opts) +vim.api.nvim_set_keymap('n', '[d', 'lua vim.diagnostic.goto_prev()', opts) +vim.api.nvim_set_keymap('n', ']d', 'lua vim.diagnostic.goto_next()', opts) +vim.api.nvim_set_keymap('n', 'q', 'lua vim.diagnostic.setloclist()', opts) + +-- 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', 'vlua.vim.lsp.omnifunc') + + -- Mappings. + -- 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', 'ca', 'lua vim.lsp.buf.code_action()', opts) + buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) + buf_set_keymap('n', 'f', 'lua vim.lsp.buf.formatting()', opts) + +end + +require("nvim-lsp-installer").setup { + automatic_installation = true +} + +require('rust-tools').setup({}) + +-- Add additional capabilities supported by nvim-cmp +local capabilities = vim.lsp.protocol.make_client_capabilities() +capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) + +-- Setup language servers +local nvim_lsp = require('lspconfig') +local servers = { 'clangd', 'rust_analyzer', 'pyright', 'csharp_ls', 'html' } +for _, lsp in ipairs(servers) do + nvim_lsp[lsp].setup { + on_attach = on_attach, + capabilities = capabilities, + } +end + +-- Setup Completion +-- See https://github.com/hrsh7th/nvim-cmp#basic-configuration +local cmp = require'cmp' +cmp.setup({ + snippet = { + expand = function(args) + vim.fn["vsnip#anonymous"](args.body) + end, + }, + mapping = { + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.select_prev_item(), + -- Add tab support + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.select_prev_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 = 'nvim_lsp' }, + { name = 'vsnip' }, + { name = 'path' }, + { name = 'buffer' }, + }, +}) EOF - " have a fixed column for the diagnostics to appear in - " this removes the jitter when warnings/errors flow in - set signcolumn=yes - - " Set updatetime for CursorHold - " 300ms of no cursor movement to trigger CursorHold - set updatetime=300 - " Show diagnostic popup on cursor hover - - " TODO: bug, focuses popup window - "autocmd CursorHold * lua vim.lsp.diagnostic.show_line_diagnostics() - - " Goto previous/next diagnostic warning/error - nnoremap g[ lua vim.lsp.diagnostic.goto_prev() - nnoremap g] lua vim.lsp.diagnostic.goto_next() - - "colorscheme nord -endfunction - - - - - - - +" have a fixed column for the diagnostics to appear in +" this removes the jitter when warnings/errors flow in +set signcolumn=yes @@ -522,7 +228,7 @@ function! Hashbang(portable, permission, RemExt) \ 'm': "octave", \ 'pl': "perl", \ 'php': "php", - \ 'py': "python", + \ 'py': "python3", \ 'r': "Rscript", \ 'rb': "ruby", \ 'scala': "scala", @@ -535,9 +241,9 @@ function! Hashbang(portable, permission, RemExt) let fileshell = shells[extension] if a:portable - let line = "#! /usr/bin/env " . fileshell + let line = "#!/usr/bin/env " . fileshell else - let line = "#! " . system("which " . fileshell) + let line = "#!" . system("which " . fileshell) endif 0put = line @@ -555,7 +261,6 @@ endfunction - " Automaticly trim all trailing whitespace on save(write) function! StripTrailingWhitespaces() let l = line(".") @@ -563,17 +268,12 @@ function! StripTrailingWhitespaces() %s/\s\+$//e call cursor(l, c) endfun - autocmd BufWritePre * :call StripTrailingWhitespaces() - - - - " AUTOCMD: autocmd BufNewFile,BufRead *.pde set syntax=java @@ -583,25 +283,11 @@ autocmd BufNewFile,BufRead *.ino set filetype=arduino autocmd BufNewFile *.* :call Hashbang(1,1,0) -" run python script -" autocmd BufNewFile,BufRead *.py nnoremap :vs :term python % - -nnoremap rr :Run - -autocmd FileType java,typescript,go,cpp,h,c,pde :call SetupYCM() - -autocmd FileType html,css,js,djangohtml,py,sh,lua,php :call SetupCoC() - -autocmd FileType cs :call SetupDotnet() - -":call SetupLSP() - - - " REMAPPING: +nnoremap rr :Run " disable spacebar (don't move forward) nnoremap @@ -623,22 +309,13 @@ nnoremap ff :Files vnoremap p "_dP -inoremap :call NERDComment(0,"toggle") -nnoremap :call NERDComment(0,"toggle") - - - - - - - - +inoremap :call NERDComment(0,"toggle") +nnoremap :call NERDComment(0,"toggle") " MUST HAVE VIM REMAPS: -" https://youtu.be/hSHATqh8svM " Number 5: Behave Vim nnoremap Y y$ @@ -664,15 +341,8 @@ nnoremap j (v:count > 5 ? "m'" . v:count : "") . 'j' " Number 1: Moving text vnoremap J :m '>+1gv=gv vnoremap K :m '<-2gv=gv -inoremap :m .+1== -inoremap :m .-2== nnoremap j :m .+1== nnoremap k :m .-2== - - vnoremap < >gv -" vnoremap >gv -