dotfiles

My configuration files
git clone git://git.finwo.net/misc/dotfiles
Log | Files | Refs

commit 6891cd98d4f56f6235bbf8b90035bedda619ab77
parent 13c857ebd5fdf8541fa214fef13d3766ac7a8ef2
Author: finwo <finwo@pm.me>
Date:   Tue, 31 Oct 2023 01:34:23 +0100

neovim: Replace deoplete/ale by coc

Diffstat:
Mneovim/home/.vimrc | 432++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 305 insertions(+), 127 deletions(-)

diff --git a/neovim/home/.vimrc b/neovim/home/.vimrc @@ -27,7 +27,6 @@ Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } Plug 'junegunn/fzf.vim' Plug 'junegunn/vim-easy-align' Plug 'morhetz/gruvbox' -Plug 'padawan-php/deoplete-padawan', { 'do': 'composer install' } Plug 'qpkorr/vim-bufkill' Plug 'ryym/vim-riot' Plug 'scrooloose/nerdtree' @@ -38,22 +37,26 @@ Plug 'tpope/vim-fugitive' Plug 'tpope/vim-eunuch' Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' -Plug 'w0rp/ale' +" Plug 'w0rp/ale' +Plug 'neoclide/coc.nvim', {'branch': 'master', 'do': 'npm ci'} +Plug 'neoclide/coc.nvim', {'branch': 'master', 'do': 'npm ci'} -if has('nvim') - Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } -else - Plug 'Shougo/deoplete.nvim' - Plug 'roxma/nvim-yarp' - Plug 'roxma/vim-hug-neovim-rpc' -endif +" if has('nvim') +" Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } +" else +" Plug 'Shougo/deoplete.nvim' +" Plug 'roxma/nvim-yarp' +" Plug 'roxma/vim-hug-neovim-rpc' +" endif + +" " PHP-specific +" Plug 'StanAngeloff/php.vim', {'for': 'php'} +" Plug 'padawan-php/deoplete-padawan', { 'do': 'composer install' } -" JS-specific -Plug 'carlitux/deoplete-ternjs' +" " JS-specific +" Plug 'carlitux/deoplete-ternjs' -" PHP-specific -Plug 'StanAngeloff/php.vim', {'for': 'php'} " Initialize plugin system call plug#end() @@ -195,129 +198,304 @@ let g:NERDTreePatternMatchHighlightFullName = 1 " }}} " ALE {{{ -" Don't restrict JSX syntax highlighting to .jsx files -let g:jsx_ext_required = 0 - -" Enable completion where available -let g:ale_sign_error = '✘' -let g:ale_sign_warning = '•' -let g:ale_sign_column_always = 1 - -" What programs handle what -let g:ale_fixers = {} -let g:ale_fixers['javascript'] = ['eslint'] -let g:ale_fixers['typescript'] = ['eslint'] -let g:ale_fixers['vue'] = ['eslint'] -let g:ale_fixers['scss'] = ['stylelint'] - -" Automagically fix -let g:ale_open_list= 0 -let g:ale_fix_on_save = 1 - -" Don't run every keystroke -let g:ale_lint_on_insert_leave = 1 -let g:ale_lint_on_text_changed = 'never' -let g:ale_lint_on_enter = 0 +" " Don't restrict JSX syntax highlighting to .jsx files +" let g:jsx_ext_required = 0 +" +" " Enable completion where available +" let g:ale_sign_error = '✘' +" let g:ale_sign_warning = '•' +" let g:ale_sign_column_always = 1 +" +" " What programs handle what +" let g:ale_fixers = {} +" let g:ale_fixers['javascript'] = ['eslint'] +" let g:ale_fixers['typescript'] = ['eslint'] +" let g:ale_fixers['vue'] = ['eslint'] +" let g:ale_fixers['scss'] = ['stylelint'] +" +" " Automagically fix +" let g:ale_open_list= 0 +" let g:ale_fix_on_save = 1 +" +" " Don't run every keystroke +" let g:ale_lint_on_insert_leave = 1 +" let g:ale_lint_on_text_changed = 'never' +" let g:ale_lint_on_enter = 0 " }}} -" Deoplete {{{ - -" Basics -let g:deoplete#enable_at_startup = 1 -call deoplete#custom#option('auto_complete_delay', 0) -let g:echodoc_enable_at_startup = 1 -set splitbelow -set completeopt+=menuone,noinsert,noselect -autocmd CompleteDone * pclose - -" Define basic sources -function! Multiple_cursors_before() - let b:deoplete_disable_auto_complete=2 -endfunction -function! Multiple_cursors_after() - let b:deoplete_disable_auto_complete=0 +" CoC {{{ + +let g:coc_global_extensions = [ + \ 'coc-clangd', + \ 'coc-css', + \ 'coc-docker', + \ 'coc-eslint', + \ 'coc-gitignore', + \ 'coc-html', + \ 'coc-json', + \ 'coc-sh', + \ 'coc-vetur', + \ 'coc-yaml' + \ ] + +" Having longer updatetime (default is 4000 ms = 4s) leads to noticeable +" delays and poor user experience +set updatetime=300 + +" Always show the signcolumn, otherwise it would shift the text each time +" diagnostics appear/become resolved +set signcolumn=yes + +" Use tab for trigger completion with characters ahead and navigate +" NOTE: There's always complete item selected by default, you may want to enable +" no select by `"suggest.noselect": true` in your configuration file +" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by +" other plugin before putting this into your config +inoremap <silent><expr> <TAB> + \ coc#pum#visible() ? coc#pum#next(1) : + \ CheckBackspace() ? "\<Tab>" : + \ coc#refresh() +inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>" + +" Make <CR> to accept selected completion item or notify coc.nvim to format +" <C-g>u breaks current undo, please make your own choice +inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm() + \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>" + +function! CheckBackspace() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' endfunction -call deoplete#custom#option('enable_buffer_path', 1) -call deoplete#custom#source('buffer', 'mark', 'ℬ') -call deoplete#custom#source('tern', 'mark', '') -call deoplete#custom#source('padawan', 'mark', "\ue608") -call deoplete#custom#source('omni', 'mark', '⌾') -call deoplete#custom#source('file', 'mark', '') -" call deoplete#custom#source('jedi', 'mark', '') -call deoplete#custom#source('neosnippet', 'mark', '') -call deoplete#custom#source('LanguageClient', 'mark', '') -call deoplete#custom#source('typescript', 'rank', 630) -" call deoplete#custom#source('_', 'matchers', ['matcher_cpsm']) -" call deoplete#custom#source('_', 'sorters', []) -let g:deoplete#omni_patterns = { - \ 'html': '', - \ 'css': '', - \ 'scss': '' - \} -function! Preview_func() - if &pvw - setlocal nonumber norelativenumber - endif -endfunction -autocmd WinEnter * call Preview_func() -call deoplete#custom#option('ignore_sources', {'_': ['around', 'buffer' ]}) - -" Whether to include the types of the completions in the result data. Default: 0 -let g:deoplete#sources#ternjs#types = 1 - -" Whether to include the distance (in scopes for variables, in prototypes for -" properties) between the completions and the origin position in the result -" data. Default: 0 -let g:deoplete#sources#ternjs#depths = 1 -" Whether to include documentation strings (if found) in the result data. -" Default: 0 -let g:deoplete#sources#ternjs#docs = 1 - -" When on, only completions that match the current word at the given point will -" be returned. Turn this off to get all results, so that you can filter on the -" client side. Default: 1 -let g:deoplete#sources#ternjs#filter = 0 - -" Whether to use a case-insensitive compare between the current word and -" potential completions. Default 0 -let g:deoplete#sources#ternjs#case_insensitive = 1 - -" When completing a property and no completions are found, Tern will use some -" heuristics to try and return some properties anyway. Set this to 0 to -" turn that off. Default: 1 -let g:deoplete#sources#ternjs#guess = 0 - -" Determines whether the result set will be sorted. Default: 1 -let g:deoplete#sources#ternjs#sort = 1 - -" When disabled, only the text before the given position is considered part of -" the word. When enabled (the default), the whole variable name that the cursor -" is on will be included. Default: 1 -let g:deoplete#sources#ternjs#expand_word_forward = 0 - -" Whether to ignore the properties of Object.prototype unless they have been -" spelled out by at least two characters. Default: 1 -let g:deoplete#sources#ternjs#omit_object_prototype = 0 +" Use <c-space> to trigger completion +if has('nvim') + inoremap <silent><expr> <c-space> coc#refresh() +else + inoremap <silent><expr> <c-@> coc#refresh() +endif -" Whether to include JavaScript keywords when completing something that is not -" a property. Default: 0 -let g:deoplete#sources#ternjs#include_keywords = 1 +" Use `[g` and `]g` to navigate diagnostics +" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list +nmap <silent> [g <Plug>(coc-diagnostic-prev) +nmap <silent> ]g <Plug>(coc-diagnostic-next) + +" GoTo code navigation +nmap <silent> gd <Plug>(coc-definition) +nmap <silent> gy <Plug>(coc-type-definition) +nmap <silent> gi <Plug>(coc-implementation) +nmap <silent> gr <Plug>(coc-references) + +" Use K to show documentation in preview window +nnoremap <silent> K :call ShowDocumentation()<CR> + +function! ShowDocumentation() + if CocAction('hasProvider', 'hover') + call CocActionAsync('doHover') + else + call feedkeys('K', 'in') + endif +endfunction -" If completions should be returned when inside a literal. Default: 1 -let g:deoplete#sources#ternjs#in_literal = 0 +" Highlight the symbol and its references when holding the cursor +autocmd CursorHold * silent call CocActionAsync('highlight') + +" Symbol renaming +nmap <leader>rn <Plug>(coc-rename) + +" Formatting selected code +xmap <leader>f <Plug>(coc-format-selected) +nmap <leader>f <Plug>(coc-format-selected) + +augroup mygroup + autocmd! + " Setup formatexpr specified filetype(s) + autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') + " Update signature help on jump placeholder + autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') +augroup end + +" Applying code actions to the selected code block +" Example: `<leader>aap` for current paragraph +xmap <leader>a <Plug>(coc-codeaction-selected) +nmap <leader>a <Plug>(coc-codeaction-selected) + +" Remap keys for applying code actions at the cursor position +nmap <leader>ac <Plug>(coc-codeaction-cursor) +" Remap keys for apply code actions affect whole buffer +nmap <leader>as <Plug>(coc-codeaction-source) +" Apply the most preferred quickfix action to fix diagnostic on the current line +nmap <leader>qf <Plug>(coc-fix-current) + +" Remap keys for applying refactor code actions +nmap <silent> <leader>re <Plug>(coc-codeaction-refactor) +xmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected) +nmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected) + +" Run the Code Lens action on the current line +nmap <leader>cl <Plug>(coc-codelens-action) + +" Map function and class text objects +" NOTE: Requires 'textDocument.documentSymbol' support from the language server +xmap if <Plug>(coc-funcobj-i) +omap if <Plug>(coc-funcobj-i) +xmap af <Plug>(coc-funcobj-a) +omap af <Plug>(coc-funcobj-a) +xmap ic <Plug>(coc-classobj-i) +omap ic <Plug>(coc-classobj-i) +xmap ac <Plug>(coc-classobj-a) +omap ac <Plug>(coc-classobj-a) + +" Remap <C-f> and <C-b> to scroll float windows/popups +if has('nvim-0.4.0') || has('patch-8.2.0750') + nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>" + nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>" + inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>" + inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>" + vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>" + vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>" +endif +" Use CTRL-S for selections ranges +" Requires 'textDocument/selectionRange' support of language server +nmap <silent> <C-s> <Plug>(coc-range-select) +xmap <silent> <C-s> <Plug>(coc-range-select) + +" Add `:Format` command to format current buffer +command! -nargs=0 Format :call CocActionAsync('format') + +" Add `:Fold` command to fold current buffer +command! -nargs=? Fold :call CocAction('fold', <f-args>) + +" Add `:OR` command for organize imports of the current buffer +command! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport') + +" Add (Neo)Vim's native statusline support +" NOTE: Please see `:h coc-status` for integrations with external plugins that +" provide custom statusline: lightline.vim, vim-airline +set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} + +" " Mappings for CoCList +" " Show all diagnostics +" nnoremap <silent><nowait> <space>a :<C-u>CocList diagnostics<cr> +" " Manage extensions +" nnoremap <silent><nowait> <space>e :<C-u>CocList extensions<cr> +" " Show commands +" nnoremap <silent><nowait> <space>c :<C-u>CocList commands<cr> +" " Find symbol of current document +" nnoremap <silent><nowait> <space>o :<C-u>CocList outline<cr> +" " Search workspace symbols +" nnoremap <silent><nowait> <space>s :<C-u>CocList -I symbols<cr> +" " Do default action for next item +" nnoremap <silent><nowait> <space>j :<C-u>CocNext<CR> +" " Do default action for previous item +" nnoremap <silent><nowait> <space>k :<C-u>CocPrev<CR> +" " Resume latest coc list +" nnoremap <silent><nowait> <space>p :<C-u>CocListResume<CR> -"Add extra filetypes -let g:deoplete#sources#ternjs#filetypes = [ - \ 'tsx', - \ 'tavascript.tsx', - \ 'jsx', - \ 'javascript.jsx', - \ 'vue', - \ '...' - \ ] +" }}} +" Deoplete {{{ +"" Basics +"call deoplete#enable() +"" let g:deoplete#enable_at_startup = 1 +"" call deoplete#custom#option('auto_complete_delay', 0) +"let g:echodoc_enable_at_startup = 1 +"set splitbelow +"set completeopt+=menuone,noinsert,noselect +"autocmd CompleteDone * pclose + +"" Define basic sources +"function! Multiple_cursors_before() +" let b:deoplete_disable_auto_complete=2 +"endfunction +"function! Multiple_cursors_after() +" let b:deoplete_disable_auto_complete=0 +"endfunction +"call deoplete#custom#option('enable_buffer_path', 1) +"call deoplete#custom#source('buffer', 'mark', 'ℬ') +"call deoplete#custom#source('tern', 'mark', '') +"call deoplete#custom#source('padawan', 'mark', "\ue608") +"call deoplete#custom#source('omni', 'mark', '⌾') +"call deoplete#custom#source('file', 'mark', '') +"" call deoplete#custom#source('jedi', 'mark', '') +"call deoplete#custom#source('neosnippet', 'mark', '') +"call deoplete#custom#source('LanguageClient', 'mark', '') +"call deoplete#custom#source('typescript', 'rank', 630) +"" call deoplete#custom#source('_', 'matchers', ['matcher_cpsm']) +"" call deoplete#custom#source('_', 'sorters', []) +"let g:deoplete#omni_patterns = { +" \ 'html': '', +" \ 'css': '', +" \ 'scss': '' +" \} +"function! Preview_func() +" if &pvw +" setlocal nonumber norelativenumber +" endif +"endfunction +"autocmd WinEnter * call Preview_func() +"call deoplete#custom#option('ignore_sources', {'_': ['around', 'buffer' ]}) + +"" Whether to include the types of the completions in the result data. Default: 0 +"let g:deoplete#sources#ternjs#types = 1 + +"" Whether to include the distance (in scopes for variables, in prototypes for +"" properties) between the completions and the origin position in the result +"" data. Default: 0 +"let g:deoplete#sources#ternjs#depths = 1 + +"" Whether to include documentation strings (if found) in the result data. +"" Default: 0 +"let g:deoplete#sources#ternjs#docs = 1 + +"" When on, only completions that match the current word at the given point will +"" be returned. Turn this off to get all results, so that you can filter on the +"" client side. Default: 1 +"let g:deoplete#sources#ternjs#filter = 0 + +"" Whether to use a case-insensitive compare between the current word and +"" potential completions. Default 0 +"let g:deoplete#sources#ternjs#case_insensitive = 1 + +"" When completing a property and no completions are found, Tern will use some +"" heuristics to try and return some properties anyway. Set this to 0 to +"" turn that off. Default: 1 +"let g:deoplete#sources#ternjs#guess = 0 + +"" Determines whether the result set will be sorted. Default: 1 +"let g:deoplete#sources#ternjs#sort = 1 + +"" When disabled, only the text before the given position is considered part of +"" the word. When enabled (the default), the whole variable name that the cursor +"" is on will be included. Default: 1 +"let g:deoplete#sources#ternjs#expand_word_forward = 0 + +"" Whether to ignore the properties of Object.prototype unless they have been +"" spelled out by at least two characters. Default: 1 +"let g:deoplete#sources#ternjs#omit_object_prototype = 0 + +"" Whether to include JavaScript keywords when completing something that is not +"" a property. Default: 0 +"let g:deoplete#sources#ternjs#include_keywords = 1 + +"" If completions should be returned when inside a literal. Default: 1 +"let g:deoplete#sources#ternjs#in_literal = 0 + + +""Add extra filetypes +"let g:deoplete#sources#ternjs#filetypes = [ +" \ 'tsx', +" \ 'tavascript.tsx', +" \ 'jsx', +" \ 'javascript.jsx', +" \ 'vue', +" \ '...' +" \ ] + +"" }}} +" Providers {{{ +let g:loaded_ruby_provider = 0 +let g:loaded_perl_provider = 0 " }}} " Calendar {{{ let g:calendar_google_calendar = 1