""" VIM config file | Jan Andrle | 2024-02-07 (VIM >=8.1) "" #region B – Base scriptencoding utf-8 | set encoding=utf-8 let $BASH_ENV = "~/.bashrc" set runtimepath^=~/.vim/bundle/* packadd! matchit set hidden set title colorscheme codedark set updatetime=300 lazyredraw ttyfast " Having longer updatetime (default is 4s) leads to noticeable delays and poor user experience. Also reduce redraw frequency and fast terminal typing set noerrorbells novisualbell set belloff=esc set confirm set guioptions-=T cabbrev %PWD% execute('pwd') cabbrev %CD% fnameescape(expand('%:p:h')) cabbrev %CS% mini_enhancement#selectedText() cabbrev %CW% expand('') let mapleader = "\\" " better for my keyboard, but maybe use `:help keymap`? nnoremap § @ nnoremap §§ @@ nnoremap ů ; nnoremap ; : nnoremap u U nnoremap U nnoremap ž nnoremap nnoremap " imap  cmap  if has("patch-8.1.0360") set diffopt+=algorithm:patience,indent-heuristic | endif set diffopt+=iwhite augroup vimrc_help autocmd! autocmd BufEnter *.txt if &buftype == 'help' | wincmd L | vertical resize 90 | endif augroup END """ #region BB – Build-in plugins " https://github.com/rbtnn/vim-gloaded/blob/master/plugin/gloaded.vim let g:loaded_vimballPlugin = 1 " :h pi_vimball … for plugin creators let g:vifm_replace_netrw= 1 | let g:loaded_netrw= 1 | let g:loaded_netrwPlugin= 1 " this line needs to be commented to let vim dowmload spelllangs!!! … see http://jdem.cz/fgyw25 """ #endregion BB "" #endregion B "" #region H – Helpers + remap 'sS' (primary ss, see `vim-scommands`) nmap sh :execute 'ALTredir :map s \ map '.mapleader.' \ map § \ map ů \ map ; \ map U \ map ž':g/^$/d:g/^v s/m$úgg call scommands#map('s', 'CL', "n,v") command! -nargs=? CLscratch 10split | enew | setlocal buftype=nofile bufhidden=wipe noswapfile nobuflisted | if !='' | execute 'normal "'..'p' | endif | nnoremap ;q :q call scommands#map('S', 'SET', "n,v") call scommands#map('a', 'ALT', "n,V") cabbrev ALTR ALTredrawSyntax set grepprg=LC_ALL=C\ grep\ -nrsH command! -nargs=0 \ ALTredrawSyntax edit | exec 'normal `"' | exec 'set ft='.&ft command! -complete=command -bar -range -nargs=+ \ ALTredir call jaandrle_utils#redir(0, , , , ) command! -nargs=+ -complete=file_in_path -bar \ ALTgrep cgetexpr jaandrle_utils#grep() | call setqflist([], 'a', {'title': ':' . g:jaandrle_utils#last_command}) command! -nargs=+ -complete=file_in_path -bar \ ALTlgrep lgetexpr jaandrle_utils#grep() | call setloclist(0, [], 'a', {'title': ':' . g:jaandrle_utils#last_command}) command! -nargs=0 \ ALTargsBWQA execute 'argdo bw' | %argdelete let g:quickfix_len= 0 function! QuickFixStatus() abort hi! link User1 StatusLine if !g:quickfix_len | return 'Ø' | endif if g:quickfix_len>0 | return g:quickfix_len | endif let type= &termguicolors ? 'gui' : 'cterm' execute 'hi! User1 '.type.'bg='.synIDattr(synIDtrans(hlID('StatusLine')), 'bg'). \' '.type.'fg='.synIDattr(synIDtrans(hlID('WarningMsg')), 'fg') return -g:quickfix_len endfunction function! s:QuickFixCmdPost() abort let q_len= len(getqflist()) let g:quickfix_len= q_len ? -q_len : len(getloclist(0)) endfunction augroup quickfix autocmd! autocmd QuickFixCmdPost * call QuickFixCmdPost() autocmd filetype qf \ if filter(getwininfo(), {i,v -> v.winnr == winnr()})[0].loclist \| nnoremap ;q :lclose \| nnoremap ;w :lgetbuffer:lclose:lopen \| nnoremap ;s :ldo s///gc \| update \| else \| nnoremap ;q :cclose \| nnoremap ;w :cgetbuffer:cclose:copen \| nnoremap ;s :cdo s///gc \| update \| endif augroup END "" #endregion H "" #region SLH – Status Line + Command Line + History (general) + Sessions + File Update, … set showcmd cmdheight=2 showmode set wildmenu wildoptions=pum "" wildmode=list:longest,list:full " Tab autocomplete in command mode cabbrev wbw wbw set sessionoptions-=options command! -nargs=1 \ CLSESSIONcreate :call mini_sessions#create() command! -nargs=0 \ CLSESSIONconfig :call mini_sessions#sessionConfig() command! -nargs=1 -complete=customlist,mini_sessions#complete \ CLSESSIONload :call mini_sessions#load() command! -nargs=0 \ Scd :call mini_sessions#recoverPwd() if !has("gui_running") execute 'hi! User2 ctermbg='.synIDattr(synIDtrans(hlID('StatusLine')), 'bg').' ctermfg=grey' | endif set laststatus=2 " Show status line on startup set statusline+=··%1*≡·%{QuickFixStatus()}%*··%2*»·%{user_tips#current()}%*··%= set statusline+=%<%f%R\%M··▶·%{&fileformat}·%{&fileencoding?&fileencoding:&encoding}·%{&filetype}··∷·%{mini_sessions#name('–')}··  set history=500 " How many lines of (cmd) history has to remember set nobackup nowritebackup noswapfile " …there is issue #649 (for servers) and I’m using git/system backups try set undodir=~/.vim/undodir undofile | catch | endtry command! CLundotree UndotreeToggle | echo 'Use also :undolist :earlier :later' | UndotreeFocus command! SETundoClear let old_undolevels=&undolevels | set undolevels=-1 | exe "normal a \\" | let &undolevels=old_undolevels | unlet old_undolevels | write "" #endregion SLH "" #region LLW – Left Column + Line + Wrap + Scrolling if has("nvim-0.5.0") || has("patch-8.1.1564") " Recently vim can merge signcolumn and number column into one set signcolumn=number | else | set signcolumn=yes | endif " show always to prevent shifting when diagnosticappears set cursorline cursorcolumn " Always show current position set number foldcolumn=2 " enable line numbers and add a bit extra margin to the left set colorcolumn=+1 " …marker visual command -nargs=? SETtextwidth if | let &textwidth= | let &colorcolumn=',120,240' | else | let &textwidth=250 | let &colorcolumn='120,240' | endif SETtextwidth " wraping lines and show two lines set nowrap " Don't wrap long lines by default set breakindent breakindentopt=shift:2 showbreak=↳ set scrolloff=5 sidescrolloff=10 " offset for lines/columns when scrolling "" #endregion LLW "" #region CN – Clipboard + Navigation throught Buffers + Windows + … (CtrlP) set pastetoggle= | nnoremap :set invpaste paste? nnoremap " :call jaandrle_utils#copyRegister() nmap š buffer_number("#")==-1 ? "sš" : "\" nmap s3 :buffers:b nmap sš :CtrlPBuffer nmap č sš let g:ctrlp_map = 'ě' command! -nargs=? SETctrlp execute 'nnoremap '.g:ctrlp_map.' :CtrlP ' call scommands#map(g:ctrlp_map, 'CtrlP', "n") let g:ctrlp_clear_cache_on_exit = 0 let g:ctrlp_prompt_mappings= { \ 'ToggleType(1)': [''], \ 'ToggleType(-1)': [''], \ 'PrtCurStart()': [''], \} "" #endregion CN "" #region FOS – File(s) + Openning + Saving set autowrite autoread | autocmd FocusGained,BufEnter *.* checktime set modeline command! -nargs=? \ CLmodeline :call jaandrle_utils#AppendModeline(=='basic' ? 0 : 1) set path+=src/**,app/**,build/** " File matching for `:find` for ignore in [ '.git', '.npm', 'node_modules' ] exec ':set wildignore+=**'.ignore.'**' exec ':set wildignore+=**/'.ignore.'/**' endfor set wildignore+=*.bmp,*.gif,*.ico,*.jpg,*.png,*.ico set wildignore+=*.pdf,*.psd nmap e :Vifm call scommands#map('e', 'Vifm', "n") nnoremap gx :silent exec "!xdg-open '".shellescape(substitute(expand(''), '?', '\\?', ''), 1)."'" \| redraw! vnoremap gx :silent exec "!xdg-open '".shellescape(substitute(mini_enhancement#selectedText(), '?', '\\?', ''), 1)."'" \| redraw! "" #endregion FOS "" #region EN – Editor navigation + search set hlsearch incsearch " highlight search, start when typing if maparg('', 'n') ==# '' nnoremap :nohlsearch=has('diff')?'diffupdate':'' | endif call scommands#map('n', 'NAV', "n") command! NAVjumps call jaandrle_utils#gotoJumpChange('jump') command! NAVchanges call jaandrle_utils#gotoJumpChange('change') command! NAVmarks call jaandrle_utils#gotoMarks() let g:markbar_persist_mark_names = v:false nmap m ToggleMarkbar "" #endregion EN "" #region EA – Editing adjustment + Syntax + White chars + Folds " use § for § inoremap § set nrformats-=octal command! -nargs=1 SETTOGGLEnrformats if &nf=~ | set nf-= | else | set nf+= | endif let g:htl_css_templates=1 let g:markdown_fenced_languages= [ 'javascript', 'js=javascript', 'json', 'html', 'php', 'bash', 'vim', 'vimscript=javascript', 'sass' ] augroup conceal autocmd! au FileType markdown \ syn region markdownLink matchgroup=markdownLinkDelimiter start="(" end=")" contains=markdownUrl keepend contained conceal \| syn region markdownLinkText matchgroup=markdownLinkTextDelimiter start="!\=\[\%(\%(\_[^][]\|\[\_[^][]*\]\)*]\%( \=[[(]\)\)\@=" end="\]\%( \=[[(]\)\@=" nextgroup=markdownLink,markdownId skipwhite contains=@markdownInline,markdownLineStart concealends au FileType markdown,json \ setlocal conceallevel=2 augroup END augroup convenient autocmd FileType markdown,text setlocal keywordprg=dict autocmd FileType git,gitcommit setlocal foldmethod=syntax foldlevel=1 augroup END " PARENTHESES plugin junegunn/rainbow_parentheses.vim let g:rainbow#pairs= [['(', ')'], ['[', ']'], [ '{', '}' ]] let g:rainbow#blacklist = [203,9] autocmd VimEnter * try \| call rainbow_parentheses#toggle() | catch | endtry command! SETTOGGLErainbowParentheses call rainbow_parentheses#toggle() " HIGHLIGHT&YANK plugins machakann/vim-highlightedyank & cwordhi.vim let g:highlightedyank_highlight_duration= 250 let g:cwordhi#autoload= 1 set showmatch " Quick highlight oppening bracket/… for currently writted set timeoutlen=1000 ttimeoutlen=0 " Remove timeout when hitting escape TAB if v:version > 703 || v:version == 703 && has("patch541") set formatoptions+=j | endif " Delete comment character when joining commented lines set smarttab command! -nargs=1 SETtab let &shiftwidth= | let &tabstop= | let &softtabstop= SETtab 4 set backspace=indent,eol,start " Allow cursor keys in insert mode: http://vi.stackexchange.com/a/2163 set shiftround autoindent " round diff shifts to the base of n*shiftwidth, https://stackoverflow.com/a/18415867 filetype plugin indent on " SYNTAX&COLORS if ($TERM =~ '256' && has("termguicolors")) set termguicolors | endif if (&t_Co > 2 || has("gui_running")) && !exists("syntax_on") syntax on | endif set list listchars=tab:»·,trail:·,extends:#,nbsp:~,space:· " Highlight spec. chars / Display extra whitespace augroup syntax_sync_min_lines autocmd! autocmd Syntax * syn sync minlines=2000 augroup END let g:vim_vue_plugin_config = { 'foldexpr': 1, 'attribute': 1, 'keyword': 1 } " SPELL if !has("gui_running") hi clear SpellBad | hi SpellBad cterm=underline,italic | endif command! -nargs=? SETspell if ==&spelllang || =='' | set spell! | else | set spell | set spelllang= | endif | if &spell | set spelllang | endif " EDIT HEPERS nnoremap o o nnoremap O O nnoremap a for l in [ 'y', 'p', 'P', 'd' ] | for m in [ 'n', 'v' ] execute m.'noremap '.l.' "+'.l | endfor | endfor " FOLDS command! -nargs=0 SETFOLDregions set foldmethod=marker command! -nargs=1 SETFOLDindent set foldmethod=indent | let &foldlevel= | let &foldnestmax=+1 command! -nargs=* SETFOLDindents set foldmethod=indent | let &foldlevel=split(, ' ')[0] | let &foldnestmax=split(, ' ')[1] set foldmarker=#region,#endregion " SAVE VIEW set viewoptions=cursor,folds augroup remember__view autocmd! autocmd BufWinLeave *.* if &buflisted | mkview | endif autocmd BufWinEnter *.* silent! loadview augroup END "" #endregion EA "" #region GIT call scommands#map('g', 'GIT', "n,V") function s:gitCompletion(_, CmdLine, __) let l:cmd= a:CmdLine->split() let l:cmd_start= l:cmd[0] \ ->substitute('GIThub', 'gh', '') \ ->substitute('GIT', 'git ', '')->trim()->split(' ') return bash#complete((l:cmd_start+l:cmd[1:])->join()) endfunction function s:gitCmd(candidate) execute '!clear && echo ":: git '.a:candidate->escape('"').' ::" && git '.a:candidate endfunction command! -nargs=* -complete=customlist,gitCompletion \ GIT call gitCmd() command! -nargs=* -complete=customlist,gitCompletion \ GITstatus !git status-- command! -nargs=* -complete=customlist,gitCompletion \ GITcommit !git commit-- command! -nargs=* -complete=customlist,gitCompletion \ GITpush !git push command! -nargs=* -complete=customlist,gitCompletion \ GITdiff if =='' | execute '!clear && git diff %:p' | else | silent! execute '!git diff ' | endif command! -nargs=* \ GITrestore execute '!clear && git status '.(=='.' ? '%:p':'').' -bs & git restore '.(=='' ? '%:p':'').' --patch' command! -nargs=* -complete=customlist,gitCompletion \ GIThub execute '!clear && echo ":: gh '.->escape('"').' ::" && gh '. command! -nargs=? \ GIThubIssue execute '!clear && gh issue view '.expand('').' '. let g:git_messenger_no_default_mappings= v:true let g:git_messenger_date_format= '%Y-%m-%d (%c)' let g:git_messenger_always_into_popup= v:true augroup git_messenger_help autocmd! autocmd FileType gitmessengerpopup setlocal keywordprg=git\ show augroup END command! -nargs=0 \ GITblameThis GitMessenger "" #endregion GIT "" #region COC – COC and so on, compilers, code/commands completions let g:coc_global_extensions= ['coc-css', 'coc-docthis', 'coc-emmet', 'coc-emoji', 'coc-pretty-ts-errors', 'coc-eslint', 'coc-gitmoji', 'coc-html', 'coc-json', 'coc-marketplace', 'coc-phpls', 'coc-sh', 'coc-snippets', 'coc-styled-components', 'coc-svg', 'coc-tabnine', 'coc-tsserver'] " https://github.com/antonk52/cssmodules-language-server call coc#config('languageserver.cssmodules', { \ "command": "cssmodules-language-server", \ "initializationOptions": {"camelCase": "dashes"}, \ "filetypes": ["javascript", "javascriptreact", "typescript", "typescriptreact"], \ "requireRootPattern": 0, \ "settings": {} \ }) autocmd FileType scss setl iskeyword+=@-@ command -nargs=? ALTmake if &filetype=='javascript' | compiler jshint | elseif &filetype=='php' | compiler php | endif \| if !='' | silent make | else | silent make '%' | endif | checktime | silent redraw! " …prev line, hotfix (filetype detection does’t works) function ToggleALTmakeOnWrite() if exists('#ALTmake_auto#BufWritePost') augroup ALTmake_auto autocmd! augroup END else augroup ALTmake_auto autocmd! autocmd BufWritePost *.{php,js,mjs} execute 'ALTmake' | call QuickFixCmdPost() augroup END endif endfunction command! ALTmakeOnWrite call ToggleALTmakeOnWrite() function! CustomKeyWord(word) if(a:word=="gulp_place") highlight link gulp_place ErrorMsg syntax match gulp_place "gulp_place" augroup gulp_place autocmd! autocmd BufEnter *.{js,html} syntax match gulp_place "gulp_place" augroup END return 0 endif endfunction set completeopt=menuone,preview,noinsert,noselect inoremap coc#pum#visible() ? coc#pum#confirm() : coc#refresh() set wildcharm= inoremap coc#pum#visible() ? coc#pum#next(1) : check_back_space() ? "\" : coc#refresh() inoremap coc#pum#visible() ? coc#pum#prev(1) : "\" function! s:check_back_space() abort let col = col('.') - 1 return !col || getline('.')[col - 1] =~# '\s' endfunction nmap gd (coc-definition) nmap / :CocSearch nmap ? / command! -bang NAVdiagnostic call CocActionAsync('diagnostic'.( "" == '!' ? 'Previous' : 'Next' )) command! NAVdefinition call CocActionAsync('jumpDefinition') command! NAVtype call CocActionAsync('jumpTypeDefinition') command! NAVimplementation call CocActionAsync('jumpImplementation') command! NAVreferences call CocActionAsync('jumpReferences') " navigate diagnostics, use `:CocDiagnostics` to get all diagnostics of current buffer in location list. nnoremap gh :call show_documentation(expand("")) vnoremap gh :call show_documentation(mini_enhancement#selectedText()) nnoremap gf :let g:ctrlp_default_input=expand("") execute 'CtrlP' unlet g:ctrlp_default_input vnoremap gf :let g:ctrlp_default_input=mini_enhancement#selectedText() execute 'CtrlP' unlet g:ctrlp_default_input """ #region COCP – Coc popups scroll (Remap and for scroll float windows/popups.) if has('nvim-0.4.0') || has('patch-8.2.0750') nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" vnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" vnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" endif """ #endregion COCP command! -nargs=? SETFOLDcoc :call CocAction('fold', ) call scommands#map('C', 'Coc', "n,v") nmap sc :CocList lists nmap Sc :CocListResume nnoremap :CLwhereami command! CLwhereami :call popup_notification([ \expand('%:t').( coc#status() != "" ? '/'.CocAction("getCurrentFunctionSymbol")."\t…\t".coc#status() : '' ), \"– – –", \"Line:\t".line('.').' / '.line('$'), \"Column:\t".col('.').' / '.col('$'), \"Path:\t".expand('%:p:h') \], #{ line: &lines-3, pos: 'botleft', moved: 'any', close: 'button', time: 3000 }) command! CLhelpCocPlug call feedkeys(':help (coc ', 'tn') command! CLhelpCocAction call feedkeys(':help CocAction('' ', 'tn') command! CLrename call CocActionAsync('rename') command! CLrenameFile exec 'CocCommand workspace.renameCurrentFile' command! -nargs=? -bang \ CLreplace call feedkeys(':'.(==''?'.':).'s/'.(""=='!'?mini_enhancement#selectedText():expand('')).'//cgODODOD', 'tn') command! CLrepeatLastChange call feedkeys('/\V"cgn', 'tn') command! CLjsdoc exec 'CocCommand docthis.documentThis' command! CLjshintGlobal normal yiwmm?\/\* globalf*hi, p`m command! CLcodeactionCursor call CocActionAsync('codeAction', 'cursor') command! CLfixCodeQuick call CocActionAsync('doQuickfix') function! AIcodeFn(range, ...) range abort let l:instruction = 'Hi, can you help me with ' . &filetype . 'code? Thanks in advance. I would like to: ' if a:0 let l:instruction = l:instruction . a:1 endif if a:range '<,'>call vim_ai#AIRun(a:range, {}, l:instruction) else call vim_ai#AIRun(a:range, {}, l:instruction) endif endfunction command! -range -nargs=? AIcode ,call AIcodeFn(, ) vnoremap :AI nnoremap :AI command! -nargs=? \ CLcheat call cheat_copilot#open(==''?&filetype:) function! s:show_documentation(word) if (index(['vim', 'help'], &filetype) >= 0) " inspired by https://github.com/tpope/vim-scriptease/blob/74bd5bf46a63b982b100466f9fd47d2d0597fcdd/autoload/scriptease.vim#L737 let syn= get(reverse(map(synstack(line('.'), col('.')), 'synIDattr(v:val,"name")')), 0, '') if syn ==# 'vimFuncName' | return show_documentation_vim('h '.a:word.'()') elseif syn ==# 'vimOption' | return show_documentation_vim("h '".a:word."'") elseif syn ==# 'vimUserAttrbKey' | return show_documentation_vim('h :command-'.a:word) endif let col= col('.') - 1 while col && getline('.')[col] =~# '\k' | let col-= 1 | endwhile let pre= col == 0 ? '' : getline('.')[0 : col] let col= col('.') - 1 while col && getline('.')[col] =~# '\k' | let col+= 1 | endwhile if pre =~# '^\s*:\=$' | return show_documentation_vim('h :'.a:word) elseif pre =~# '\show_documentation_vim('h v:'.a:word) endif let post= getline('.')[col : -0] if a:word ==# 'v' && post =~# ':\w\+' | return show_documentation_vim('h v'.matchstr(post, ':\w\+')) | endif return show_documentation_vim('h '.a:word) endif if (!CocAction('hasProvider', 'hover')) return feedkeys('K', 'in') endif if &filetype=='html' && coc#source#custom_elements#hover(a:word)!=0 return 0 endif return CocActionAsync('doHover') endfunction function! s:show_documentation_vim(cmd) call execute(a:cmd) | call histadd("cmd", a:cmd) endfunction "" #endregion COC let g:codeium_disable_bindings = 1 imap