From 6d06a8b78d35bfc36ae91c1b3e05386ac4373a76 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sat, 23 Oct 2021 17:25:25 +0300 Subject: Completely reworked vimrc --- .vimrc | 478 ++++++++++++++++++++--------------------------------------------- 1 file changed, 142 insertions(+), 336 deletions(-) diff --git a/.vimrc b/.vimrc index 883cbab..f8638f8 100644 --- a/.vimrc +++ b/.vimrc @@ -1,65 +1,44 @@ " Plugin Manager {{{ call plug#begin('~/.vim/plugged') + """ Customization Plug 'morhetz/gruvbox', {'rtp': 'vim'} " Color theme - Plug 'junegunn/fzf' " Used for commands like :Commits, :History, :Files - Plug 'junegunn/fzf.vim' - Plug 'preservim/nerdtree' " Browse directories (:NERDTree) - Plug 'Raimondi/delimitMate' " Autocomplete brackets and quotes - Plug 'tomtom/tcomment_vim' " Toggle comments (gc, gcc) - Plug 'godlygeek/tabular' " Line up text by a given character (:Tabularize /CHAR) - Plug 'vim-syntastic/syntastic' " Syntax error checker - Plug 'neoclide/coc.nvim', {'branch': 'release'} " IntelliSense practically - Plug 'itchyny/lightline.vim' " Statusline and tabline for Vim - Plug 'tpope/vim-fugitive' " git integration - Plug 'mbbill/undotree' " Easily interact with undo history - Plug 'OmniSharp/omnisharp-vim' " C# tools (autocompletion, ...) - Plug 'wakatime/vim-wakatime' " Time tracking via wakaime.com - Plug 'dense-analysis/ale' " Syntax checker via LSP - Plug 'ryanoasis/vim-devicons' " Icons on stuff like NERDTree - Plug 'honza/vim-snippets' " Ready snippets for some langauges - Plug 'pseewald/vim-anyfold' " Better folding - Plug 'editorconfig/editorconfig-vim' " Support for EditorConfig - Plug 'tpope/vim-eunuch' " Easy UNIX shell commands - Plug 'mg979/vim-visual-multi' " Multiple line cursor (and other stuff) - Plug 'zivyangll/git-blame.vim' " Show who last edited a line - Plug 'kien/tabman.vim' " Show open buffers - Plug 'alvan/vim-closetag' " Automatically add HTML closing tags - Plug 'OrangeT/vim-csharp' - Plug 'neovimhaskell/haskell-vim' - Plug 'davidhalter/jedi-vim' - Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } - Plug 'digitaltoad/vim-pug' + Plug 'itchyny/lightline.vim' " Statusline and tabline for Vim + Plug 'ryanoasis/vim-devicons' " Icons on stuff like NERDTree + + """ Quality of life + Plug 'tomtom/tcomment_vim' " Toggle comments (gc, gcc) + Plug 'Raimondi/delimitMate' " Autocomplete brackets and quotes + Plug 'preservim/nerdtree' " Browse directories (:NERDTree) + Plug 'mbbill/undotree' " Easily interact with undo history + Plug 'mg979/vim-visual-multi' " Multiple line cursor (and other stuff) + Plug 'godlygeek/tabular' " Line up text by a given character (:Tabularize /CHAR) + Plug 'tpope/vim-eunuch' " Easy UNIX shell commands + Plug 'alvan/vim-closetag' " Automatically add HTML closing tags + Plug 'kien/tabman.vim' " Show open buffers + + """ Software development + Plug 'prabirshrestha/vim-lsp' " LSP servers in Vim + Plug 'prabirshrestha/asyncomplete.vim' " Autocompletion from LSP server + Plug 'prabirshrestha/asyncomplete-lsp.vim' " Integration with vim-lsp + Plug 'mattn/vim-lsp-settings' " Automatic LSP server configuration + Plug 'honza/vim-snippets' " Ready snippets for some languages + Plug 'editorconfig/editorconfig-vim' " Support for EditorConfig + Plug 'zivyangll/git-blame.vim' " Show who last edited a line + Plug 'wakatime/vim-wakatime' " Time tracking via wakatime.com call plug#end() " }}} -" Vim-anyfold + folding {{{ - filetype plugin indent on - syntax on - autocmd Filetype * AnyFoldActivate " activate for all filetypes - autocmd FileType,BufRead vim,text,sh setlocal foldmethod=marker - set foldlevel=99 " Open all folds by default - autocmd FileType,BufRead vim,sh setlocal foldlevel=0 -" }}} - " General {{{ " Color scheme {{{ - let g:gruvbox_contrast_dark = 'hard' colorscheme gruvbox + let g:gruvbox_contrast_dark = 'hard' set background=dark " Setting dark mode " }}} - " Identation {{{ - set tabstop=4 " Show tabs as 4 wide - set shiftwidth=4 " Indent with 4 spaces - - autocmd BufRead,BufNewFile *.component.css set filetype=css - autocmd FileType css,ts setlocal ts=2 sw=2 sts=0 expandtab " Tranform tabs in CSS and TS into 2 spaces - " }}} - " Character visuals {{{ - set list " Enabled customization of whitespace characters, so spaces, tabs, EOL, etc. (:h 'list') + set list " Enabled customization of white space characters, so spaces, tabs, EOL, etc. (:h 'list') " Show tabs as a | with three spaces " DO NOT remove the trailing space in the next line! @@ -67,11 +46,12 @@ " }}} " Backspace and cursor {{{ - autocmd InsertEnter,InsertLeave * set cul! " Highlight current line, when in insert mode - set backspace=indent,eol,start " Better backspace functionality + set cul " Highlight current cursor line + autocmd InsertEnter,InsertLeave * set cul! " Don't highlight current line, when in insert mode + set backspace=indent,eol,start " Better backspace functionality - set scrolloff=0 " Don't keep any screen lines above or below the cursor set number " Show line numbers to the left + set scrolloff=0 " Don't keep any screen lines above or below the cursor set mouse=a " Mouse support " Thin cursor in insert mode in Gnome-Terminal (version >=3.16 ; also works with Terminator) @@ -87,44 +67,80 @@ endif " }}} - " Ctrl bindings {{{ + " Indentation {{{ + set tabstop=4 " Show tabs as 4 wide + set shiftwidth=4 " Indent with 4 spaces + + autocmd BufRead,BufNewFile *.component.css set filetype=css + autocmd FileType css,ts setlocal ts=2 sw=2 sts=0 expandtab " Transform tabs in CSS and TS into 2 spaces + " }}} + + " Folding {{{ + filetype plugin indent on + syntax on + autocmd FileType vim,text,sh setlocal foldmethod=marker + + set foldlevel=99 " Open all folds by default + autocmd FileType vim,sh setlocal foldlevel=0 + + set foldtext=MyFoldText() + function MyFoldText() + let line = substitute(getline(v:foldstart), "\t", repeat(" ", shiftwidth(0)), "") " Gets the first fold line and replace tabs with spaces (as many as shiftwidth is set to) + let linecount = v:foldend - v:foldstart " Calculates amount of folded lines + return line . repeat(" ", winwidth('%') - strlen(line) - 10 - strlen(linecount)) + \ . "  " . linecount . "  " " Shows our line, then a lot of spaces, and at the very end we have line number and arrows + endfunction + " }}} + + " Bindings {{{ + " Don't get into insert mode after adding a line with o/O + nnoremap o o + nnoremap O O + " Ctrl-Backspace deletes the previous word in insert mode. - noremap! - noremap! + inoremap + inoremap - " The usual Ctrl+s, Ctrl+v type of bindings + " Ctrl+s; Ctrl+c, Ctrl+v, Ctrl+x; Ctrl+z, Ctrl+r; Ctrl+a bindings that work on GUI applications " Partly taken from: https://gist.github.com/jshih/3423345 + imap :wa + nmap :w + "imap An impossible dream vmap "+yi - vmap "+c vmap c"+p imap "+pa - map ggVG + vmap "+c imap ui imap i - "imap An impossible dream - imap :wa - nmap :w + map ggVG + + " Show all buffers and be able to just type in the number of the buffer map :set nomore:ls:set more:b - " Use Ctrl + hjkl for navigation in insert mode - " inoremap - " inoremap - " inoremap - " inoremap - " Go between tabs with Ctrl+l (tab to the right) and Ctrl+h (tab to the left) - " nnoremap :tabn - " nnoremap :tabp + " Move a line up and down with Alt+k and Alt-j + execute "set =\ej" + nnoremap :m+1 + execute "set =\ek" + nnoremap :m-2 + + + " Make session file + nnoremap :mksession! .vim-session + " Show who edited the current line from git history + nnoremap :call gitblame#echo() + " Open lazygit in a new tab with = + nnoremap = :tab ter ++close lazygit " }}} - " Comand abbreviations {{{ - " Cyrilic (Bulgarian yawerty layout) support + " Command abbreviations {{{ + " Cyrillic (Bulgarian yawerty layout) support ca в w ca ва wa ca ь x ca ьа xa - " The following works almost the same as normal :x and :xa, but can also close running jobs (e.g. terminal windows) + " Make x and xa just save and quit without saving. This allows for closing all tabs and terminals. ca x w q! ca xa wa qa! @@ -133,37 +149,23 @@ ca te tabe " }}} - " Custom app open bindings {{{ - nnoremap :call gitblame#echo() - nnoremap = :tab ter ++close lazygit - " }}} - - " Other bindings {{{ - " Don't get into insert mode after adding a line with o/O - nnoremap o o - nnoremap O O - - " Move a line up and down with Alt+k and Alt-j - execute "set =\ej" - nnoremap :m+1 - execute "set =\ek" - nnoremap :m-2 - - " Make session file - nnoremap :mksession! .vim-session - " }}} - - " Omni complition {{{ + " Omni completion {{{ " Omni completion supports C, HTML, CSS, JavaScript, PHP, Python, Ruby, SQL, XML set omnifunc=syntaxcomplete#Complete " Completion for all supported languages " Do omni completion from Ctrl+Space - nnoremap - " }}} -------------------------< + inoremap + + " Thanks to: https://vim.fandom.com/wiki/Make_Vim_completion_popup_menu_work_just_like_in_an_IDE + set completeopt=longest,menuone + " [ The following are disabled, because they conflict with delimitMate's autobracket feature ] + " inoremap pumvisible() ? "\" : "\u\" + " inoremap pumvisible() ? '' : '=pumvisible() ? "\Down>" : ""' + " }}} " Spell check mode {{{ " When you press F6 it will toggle a "spell check mode", - " spell is activated and the colorscheme is changed + " spell is activated and the colour scheme is changed nmap :call SpellCheckModeToggle() function! SpellCheckModeToggle() @@ -179,6 +181,8 @@ " Scrolling (shows history) in terminal (except in lazygit) " Scroll up to activate it, and press a to deactivate it " Slightly modified version of: https://github.com/vim/vim/issues/2490#issuecomment-393973253 + tmap :call EnterNormalMode() + function! ExitNormalMode() unmap call feedkeys("a") @@ -193,8 +197,11 @@ map :call ExitNormalMode() endif endfunction - - tmap :call EnterNormalMode() + " }}} + + " Other {{{ + autocmd BufRead,BufNewFile * set tw=0 " Sets textwidth to 0 for all files (set with autocmd since just doing "set tw=0" can be overridden) + set signcolumn=number " Show signs and numbers on the same column " }}} " }}} @@ -205,56 +212,29 @@ " }}} " NERDTree {{{ - let NERDTreeCustomOpenArgs={'file':{'where':'t'}} " Open file in new tab, doesn't work only for double-click - let NERDTreeShowHidden=1 " Toggle NERDTree with Tab nmap :NERDTreeToggle - let NERDTreeIgnore=['\.swp$', '\~$'] " Ignore file, ending with .swp and ~ + + let NERDTreeCustomOpenArgs = {'file':{'where':'t'}} " Open file in new tab, doesn't work only for double-click + let NERDTreeShowHidden = 1 + let NERDTreeWinPos = "right" + let NERDTreeIgnore = ['\.swp$', '\~$'] " Ignore file, ending with .swp and ~ " }}} " Undotree {{{ " Toggle undotree with F5 nmap :UndotreeToggle - if !exists('g:undotree_WindowLayout') - let g:undotree_WindowLayout = 2 - endif - - " e.g. using 'd' instead of 'days' to save some space. - if !exists('g:undotree_ShortIndicators') - let g:undotree_ShortIndicators = 1 - endif - - " if set, let undotree window get focus after being opened, otherwise - " focus will stay in current window. - if !exists('g:undotree_SetFocusWhenToggle') - let g:undotree_SetFocusWhenToggle = 1 - endif - - " tree node shape. - if !exists('g:undotree_TreeNodeShape') - let g:undotree_TreeNodeShape = '*' - endif - - if !exists('g:undotree_DiffCommand') - let g:undotree_DiffCommand = "diff" - endif + let g:undotree_WindowLayout = 2 + let g:undotree_ShortIndicators = 1 " e.g. using 'd' instead of 'days' to save some space. + let g:undotree_SetFocusWhenToggle = 1 " if set, let undotree window get focus after being opened, otherwise focus will stay in current window. + let g:undotree_TreeNodeShape = '*' + let g:undotree_DiffCommand = "diff" " }}} " Tabman {{{ let g:tabman_toggle = '' - let g:tabman_side = 'right' -" }}} - -" Syntastic {{{ - set statusline+=%#warningmsg# - set statusline+=%{SyntasticStatuslineFlag()} - set statusline+=%* - - let g:syntastic_always_populate_loc_list=1 - let g:syntastic_auto_loc_list=1 - let g:syntastic_check_on_open=1 - let g:syntastic_check_on_wq=0 + let g:tabman_side = 'right' " }}} " Lightline {{{ @@ -305,7 +285,7 @@ \ } " }}} - " Function modification {{{ + " Function overrides {{{ " Most of the following functions are just modification of source: " Examples from doc file - https://github.com/itchyny/lightline.vim/blob/53176a0b75d6389d775d7bce0d494e58fc654f38/doc/lightline.txt#L583 " Tab source code - https://github.com/itchyny/lightline.vim/blob/master/autoload/lightline/tab.vim @@ -330,11 +310,11 @@ return strlen(&filetype) ? WebDevIconsGetFileTypeSymbol() . ' ' . &filetype : '' endfunction - " Adds the filetype icon in tabs and limit their width + " Adds the file type icon in tabs and limit their width function! LightlineTabFilename(n) abort let buflist = tabpagebuflist(a:n) - let winnr = tabpagewinnr(a:n) - let _ = (expand('#'.buflist[winnr - 1].':t') !=# '' ? expand('#'.buflist[winnr - 1].':t') : '[No Name]') + let winnr = tabpagewinnr(a:n) + let _ = (expand('#'.buflist[winnr - 1].':t') !=# '' ? expand('#'.buflist[winnr - 1].':t') : '[No Name]') " Limit the width of tabs, so they don't go out of the screen let tabNameLengthMax = &columns/((tabpagenr('$') > 0 ? tabpagenr('$') : 0) + 5) @@ -354,208 +334,34 @@ " }}} " }}} -" Ale settings {{{ - let g:ale_linters = { - \ 'cs': ['OmniSharp'], - \} - let b:ale_linters = ['cs'] -" }}} - -" vim-go {{{ - let g:go_highlight_extra_types = 1 - let g:go_highlight_space_tab_error = 1 - let g:go_highlight_trailing_whitespace_error = 1 - let g:go_highlight_operators = 1 - let g:go_highlight_functions = 1 - let g:go_highlight_function_parameters = 1 - let g:go_highlight_function_calls = 1 - let g:go_highlight_types = 1 - let g:go_highlight_fields = 1 - let g:go_highlight_variable_declarations = 1 - let g:go_highlight_variable_assignments = 1 +" asyncomplete {{{ + inoremap pumvisible() ? "\" : "\" + inoremap pumvisible() ? "\" : "\" + " inoremap pumvisible() ? asyncomplete#close_popup() : "\" + imap (asyncomplete_force_refresh) - autocmd Filetype go nmap : GoRename - autocmd Filetype go nmap : GoRun main/main.go -" }}} - -" OmniSharp settings {{{ - let g:syntastic_cs_checkers = ['code_checker'] + " allow modifying the completeopt variable, or it will + " be overridden all the time + let g:asyncomplete_auto_completeopt = 0 + + set completeopt=menuone,noinsert,noselect,preview - autocmd Filetype cs nmap gd : OmniSharpGotoDefinition - autocmd Filetype cs nmap gy : OmniSharpTypeLookup - autocmd Filetype cs nmap gi : OmniSharpFindImplementations - autocmd Filetype cs nmap gr : OmniSharpFindUsages - autocmd FileType cs nmap : OmniSharpRename - autocmd FileType cs nmap ff : OmniSharpCodeFormat - autocmd FileType cs nmap fu : OmniSharpFixUsings + autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif " }}} -" haskell-vim settings {{{ - let g:haskell_classic_highlighting = 1 - let g:haskell_enable_quantification = 1 " to enable highlighting of `forall` - let g:haskell_enable_recursivedo = 1 " to enable highlighting of `mdo` and `rec` - let g:haskell_enable_arrowsyntax = 1 " to enable highlighting of `proc` - let g:haskell_enable_pattern_synonyms = 1 " to enable highlighting of `pattern` - let g:haskell_enable_typeroles = 1 " to enable highlighting of type roles - let g:haskell_enable_static_pointers = 1 " to enable highlighting of `static` - let g:haskell_backpack = 1 " to enable highlighting of backpack keywords +" vim-lsp {{{ + let g:lsp_diagnostics_echo_cursor = 1 + let g:lsp_diagnostics_float_cursor = 1 + let g:lsp_diagnostics_signs_error = {'text': ' '} + let g:lsp_diagnostics_signs_warning = {'text': ' '} + let g:lsp_diagnostics_signs_hint = {'text': ' '} + let g:lsp_document_code_action_signs_hint = {'text': ' '} + + let g:lsp_semantic_enabled = 1 + let g:lsp_format_sync_timeout = 1000 + let g:lsp_document_did_save_delay = 1000 " }}} -" COC settings {{{ - " All of the following is the example configuration with some values modified - " https://github.com/neoclide/coc.nvim#example-vim-configuration - - " TextEdit might fail if hidden is not set. - set hidden - - " Some servers have issues with backup files, see #649. - set nobackup - set nowritebackup - - " Give more space for displaying messages. - set cmdheight=2 - - " Having longer update time (default is 4000 ms = 4 s) leads to noticeable - " delays and poor user experience. - set updatetime=300 - - " Don't pass messages to |ins-completion-menu|. - set shortmess+=c - - " Always show the signcolumn, otherwise it would shift the text each time - " diagnostics appear/become resolved. - if has("patch-8.1.1564") - " Recently vim can merge signcolumn and number column into one - set signcolumn=number - else - set signcolumn=yes - endif - - " Use tab for trigger completion with characters ahead and navigate. - " NOTE: Use command ':verbose imap ' to make sure tab is not mapped by - " other plugin before putting this into your config. - inoremap - \ pumvisible() ? "\" : - \ check_back_space() ? "\" : - \ coc#refresh() - inoremap pumvisible() ? "\" : "\" - - function! s:check_back_space() abort - let col = col('.') - 1 - return !col || getline('.')[col - 1] =~# '\s' - endfunction - - " Use to trigger completion. - if has('nvim') - inoremap coc#refresh() - else - inoremap coc#refresh() - endif - - " Use to confirm completion, `u` means break undo chain at current - " position. Coc only does snippet and additional edit on confirm. - " could be remapped by other vim plugin, try `:verbose imap `. - if exists('*complete_info') - inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" - else - inoremap pumvisible() ? "\" : "\u\" - endif - - " Use `[g` and `]g` to navigate diagnostics - " Use `:CocDiagnostics` to get all diagnostics of current buffer in location list. - nmap [g (coc-diagnostic-prev) - nmap ]g (coc-diagnostic-next) - - " GoTo code navigation. - nmap gd (coc-definition) - nmap gy (coc-type-definition) - nmap gi (coc-implementation) - nmap gr (coc-references) - - " Use K to show documentation in preview window. - nnoremap K :call show_documentation() - - function! s:show_documentation() - if (index(['vim','help'], &filetype) >= 0) - execute 'h '.expand('') - else - call CocAction('doHover') - endif - endfunction - - " Highlight the symbol and its references when holding the cursor. - autocmd CursorHold * silent call CocActionAsync('highlight') - - " Symbol renaming. - nmap rn (coc-rename) - - " Formatting selected code. - xmap f (coc-format-selected) - nmap f (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 codeAction to the selected region. - " Example: `aap` for current paragraph - xmap a (coc-codeaction-selected) - nmap a (coc-codeaction-selected) - - " Remap keys for applying codeAction to the current buffer. - nmap ac (coc-codeaction) - " Apply AutoFix to problem on the current line. - nmap qf (coc-fix-current) - - " Map function and class text objects - " NOTE: Requires 'textDocument.documentSymbol' support from the language server. - xmap if (coc-funcobj-i) - omap if (coc-funcobj-i) - xmap af (coc-funcobj-a) - omap af (coc-funcobj-a) - xmap ic (coc-classobj-i) - omap ic (coc-classobj-i) - xmap ac (coc-classobj-a) - omap ac (coc-classobj-a) - - " Use CTRL-S for selections ranges. - " Requires 'textDocument/selectionRange' support of language server. - " nmap (coc-range-select) - " xmap (coc-range-select) - - " Add `:Format` command to format current buffer. - command! -nargs=0 Format :call CocAction('format') - - " Add `:Fold` command to fold current buffer. - command! -nargs=? Fold :call CocAction('fold', ) - - " Add `:OR` command for organize imports of the current buffer. - command! -nargs=0 OR :call CocAction('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 a :CocList diagnostics - " Manage extensions. - nnoremap e :CocList extensions - " Show commands. - nnoremap c :CocList commands - " Find symbol of current document. - nnoremap o :CocList outline - " Search workspace symbols. - nnoremap s :CocList -I symbols - " Do default action for next item. - nnoremap j :CocNext - " Do default action for previous item. - nnoremap k :CocPrev - " Resume latest coc list. - nnoremap p :CocListResume +" vim-lsp-settings {{{ + let g:lsp_settings_enable_suggestions = 0 " }}} -- cgit v1.2.3