diff --git a/vimrc.new b/vimrc.new new file mode 100644 index 0000000..b39f811 --- /dev/null +++ b/vimrc.new @@ -0,0 +1,1433 @@ + +" #plugins {{{ + +if empty(glob('~/.vim/autoload/plug.vim')) + silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs + \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + autocmd VimEnter * PlugInstall --sync | source $MYVIMRC +endif +call plug#begin('~/.vim/bundle') + +"css3-syntax +Plug 'hail2u/vim-css3-syntax' + +"scss-syntax +Plug 'cakebaker/scss-syntax.vim' + +"tagbar +Plug 'majutsushi/tagbar' + +"vim-surround +Plug 'tpope/vim-surround' + +"undotree +Plug 'mbbill/undotree' + +" Ctrlp +Plug 'ctrlpvim/ctrlp.vim' +" +" Obsession +Plug 'tpope/vim-obsession' + +" vim-css-color +" Plug 'ap/vim-css-color' +" vim-javascript +Plug 'pangloss/vim-javascript' + +" ultisnips +" https://github.com/sirver/UltiSnips +Plug 'SirVer/ultisnips' +" and some snippets +" https://github.com/honza/vim-snippets +" Plug 'honza/vim-snippets' + +" ALE +" https://github.com/w0rp/ale +Plug 'w0rp/ale' + +" MatchTag +" https://github.com/gregsexton/MatchTag +" DISABLED DUE TO KNOWN ISSUE - https://github.com/gregsexton/MatchTag/issues/40 +" Plug 'gregsexton/MatchTag' + +" phpcomplete.vim +" https://github.com/shawncplus/phpcomplete.vim +Plug 'shawncplus/phpcomplete.vim' +" https://github.com/dsawardekar/wordpress.vim +" For up to date Wordpress Files see: +" https://github.com/joseluis/wordpress.vim-generator + +"Plug 'dsawardekar/wordpress.vim' +" disabled - doesn't support universal ctags? + +" vim-vue +" https://github.com/posva/vim-vue +Plug 'posva/vim-vue' + +" vim-commentary +" https://github.com/tpope/vim-commentary +Plug 'tpope/vim-commentary' + +" vim-repeat +" https://github.com/tpope/vim-repeat +Plug 'tpope/vim-repeat' + +" https://github.com/mattn/emmet-vim +Plug 'mattn/emmet-vim' + +" vimwiki +" https://github.com/vimwiki/vimwiki +Plug 'vimwiki/vimwiki' + +" gitgutter +" https://github.com/airblade/vim-gitgutter/blob/master/README.mkd +Plug 'airblade/vim-gitgutter' + +" vim-gutentags +" https://github.com/ludovicchabant/vim-gutentags +Plug 'ludovicchabant/vim-gutentags' + +" vim-qlist +" https://github.com/romainl/vim-qlist/ +" Plug 'romainl/vim-qlist' + +" fugitive-vim +" https://github.com/tpope/vim-fugitive/blob/master/README.markdown +Plug 'tpope/vim-fugitive' + +" vim-dispatch +" https://github.com/tpope/vim-dispatch +Plug 'tpope/vim-dispatch' + +" colorV +" https://github.com/gu-fan/colorv.vim +Plug 'gu-fan/colorv.vim' + +" vim switch +"https://github.com/AndrewRadev/switch.vim +Plug 'AndrewRadev/switch.vim' + +" gitv +" https://github.com/gregsexton/gitv +Plug 'gregsexton/gitv' + +" wakarime +" https://wakatime.com/vim +Plug 'wakatime/vim-wakatime' + +" vim-easy-align +" https://github.com/junegunn/vim-easy-align +Plug 'junegunn/vim-easy-align' + +" vim-instant-markdown +" https://github.com/suan/vim-instant-markdown +Plug 'suan/vim-instant-markdown' + +" asyncomplete.vim +" https://github.com/prabirshrestha/asyncomplete.vim +" Plug 'prabirshrestha/asyncomplete.vim' +" Plug 'yami-beta/asyncomplete-omni.vim' +" Plug 'prabirshrestha/asyncomplete-ultisnips.vim' +" Plug 'prabirshrestha/asyncomplete-file.vim' +" Plug 'prabirshrestha/asyncomplete-buffer.vim' +" Plug 'prabirshrestha/asyncomplete-tags.vim' +" Plug 'prabirshrestha/asyncomplete-lsp.vim' +" Plug 'Shougo/neco-vim' +" Plug 'prabirshrestha/asyncomplete-necovim.vim' + +" vim-lsp +" https://github.com/prabirshrestha/vim-lsp +Plug 'prabirshrestha/async.vim' +Plug 'prabirshrestha/vim-lsp' + +" inline_edit.vim +" https://github.com/AndrewRadev/inline_edit.vim +" Plug 'AndrewRadev/inline_edit.vim' + +call plug#end() + +runtime macros/matchit.vim + +"}}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" #plugin settings {{{ + +" inline_edit.vim +" let g:inline_edit_patterns = [{ +" \ 'main_filetype': '*html', +" \ 'sub_filetype': 'scss', +" \ 'indent_adjustment': 1, +" \ 'start': '[^>]*lang=.scss[^>]*>', +" \ 'end': '' +" \ }] + +" let g:inline_edit_autowrite = 1 +" let g:inline_edit_proxy_type = "tempfile" +" let g:inline_edit_new_buffer_command ="tabedit" +" let g:inline_edit_modify_statusline = 0 + +" nnoremap ie :InlineEdit + +" asyncomplete.vim +"{{{ +" let g:asyncomplete_auto_popup = 0 +" let g:asyncomplete_remove_duplicates = 1 +" inoremap asyncomplete#force_refresh() + +" not working why? +" let g:asyncomplete_min_chars = 3 + +" augroup User asyncomplete_setup +" autocmd! + +" autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif +" augroup END + +" call asyncomplete#register_source(asyncomplete#sources#file#get_source_options({ +" \ 'name': 'file', +" \ 'whitelist': ['*'], +" \ 'priority': -20, +" \ 'completor': function('asyncomplete#sources#file#completor') +" \ })) + +" call asyncomplete#register_source(asyncomplete#sources#ultisnips#get_source_options({ +" \ 'name': 'ultisnips', +" \ 'whitelist': ['*'], +" \ 'priority': -30, +" \ 'completor': function('asyncomplete#sources#ultisnips#completor'), +" \ })) + +" call asyncomplete#register_source(asyncomplete#sources#necovim#get_source_options({ +" \ 'name': 'necovim', +" \ 'whitelist': ['vim'], +" \ 'priority': -40, +" \ 'completor': function('asyncomplete#sources#necovim#completor'), +" \ })) + +" call asyncomplete#register_source(asyncomplete#sources#buffer#get_source_options({ +" \ 'name': 'buffer', +" \ 'whitelist': ['*'], +" \ 'blacklist': ['go'], +" \ 'priority': -50, +" \ 'completor': function('asyncomplete#sources#buffer#completor'), +" \ })) + +" call asyncomplete#register_source(asyncomplete#sources#omni#get_source_options({ +" \ 'name': 'omni', +" \ 'whitelist': ['*'], +" \ 'blacklist': ['c', 'cpp', 'html', 'python', 'vue'], +" \ 'priority': -60, +" \ 'completor': function('asyncomplete#sources#omni#completor') +" \ })) + +" call asyncomplete#register_source(asyncomplete#sources#tags#get_source_options({ +" \ 'name': 'tags', +" \ 'whitelist': ['*'], +" \ 'blacklist': ['vim', 'python'], +" \ 'priority': -70, +" \ 'completor': function('asyncomplete#sources#tags#completor'), +" \ 'config': { +" \ 'max_file_size': 50000000, +" \ }, +" \ })) + +"}}} + +" vim-lsp +"{{{ +let g:lsp_signs_enabled = 1 +let g:lsp_signs_error = {'text': '>>'} +let g:lsp_signs_warning = {'text': '>'} +let g:lsp_signs_information = {'text': '--'} +let g:lsp_signs_hint = {'text': '--'} +let g:lsp_diagnostics_echo_cursor = 1 +let g:lsp_diagnostics_echo_delay = 0 +nnoremap \l :LspDocumentDiagnostics +nnoremap \h :LspHover +nnoremap \d :LspDefinition +nnoremap \r :LspReferences +nnoremap \n :LspRename +nnoremap \s :LspDocumentSymbol +nnoremap \w :LspWorkspaceSymbol +nnoremap \ff :LspDocumentFormat +nnoremap \fr :LspDocumentRangeFormat +augroup User lsp_setup + autocmd! + if executable('vls') + autocmd User lsp_setup call lsp#register_server({ + \ 'name': 'vue', + \ 'cmd': {server_info->['vls']}, + \ 'whitelist': ['vue'], + \ }) + endif + + if executable('pyls') + autocmd User lsp_setup call lsp#register_server({ + \ 'name': 'pyls', + \ 'cmd': {server_info->['pyls']}, + \ 'whitelist': ['python'], + \ }) + endif + + if executable('typescript-language-server') + au User lsp_setup call lsp#register_server({ + \ 'name': 'typescript-language-server', + \ 'cmd': { server_info->[&shell, &shellcmdflag, 'typescript-language-server --stdio']}, + \ 'root_uri': { server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_directory(lsp#utils#get_buffer_path(), '.git/..'))}, + \ 'whitelist': ['typescript', 'javascript', 'javascript.jsx'] + \ }) + endif +augroup END + +"}}} + +" ALE +"{{{ +nnoremap ne :lnext +nnoremap pe :lprev + +let g:ale_sign_error = '>>' +let g:ale_sign_warning = '>' +let g:ale_sign_column_always = 1 + +" let g:ale_linters = {'scss': ['stylelint'], 'javascript': ['eslint'], 'php':['php'], 'html':['htmlhint'], 'python': [], 'vue': []} +let g:ale_linters = {'scss': ['stylelint'], 'javascript': [], 'php':['php'], 'html':['htmlhint'], 'python': [], 'vue': []} +" let g:ale_linters_explicit = 1 +let g:ale_html_htmlhint_options = '-c ~/.htmlhintrc --format=unix' +let g:ale_fixers = {'javascript': ['eslint']} +"}}} + +" vim-easy-align +"{{{ +xmap ga (EasyAlign) +nmap ga (EasyAlign) +"}}} + +" switch.vim +"{{{ +let g:switch_mapping = '-' +let g:switch_custom_definitions = [ + \ ['0', '1'], + \ ['ease-in', 'ease-out'], + \ ['auto', 'none'], + \ ['left', 'right'], + \ ['top', 'bottom'], + \ ['relative', 'absolute', 'fixed'] +\ ] +"}}} + +" gitgutter +"{{{ +nmap ]h GitGutterNextHunk +nmap [h GitGutterPrevHunk +omap ih GitGutterTextObjectInnerPending +omap ah GitGutterTextObjectOuterPending +xmap ih GitGutterTextObjectInnerVisual +xmap ah GitGutterTextObjectOuterVisual +"}}} + +" Use the silver searcher ag command instead of grep +"{{{ +if executable('ag') + " Use ag over grep + set grepprg=ag\ --nogroup\ --nocolor + + " Use ag in CtrlP for listing files. Lightning fast and respects .gitignore + let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""' + + " ag is fast enough that CtrlP doesn't need to cache + let g:ctrlp_use_caching = 0 +endif + +"vim-wiki +let g:vimwiki_list = [{'path': '~/vimwiki/', 'path_html': '~/vimwiki_html/'}] + +" emmet +let g:user_emmet_leader_key=',,' +let g:user_emmet_settings = { +\ 'indentation': ' ', +\ 'html': { +\ 'indentation': ' ', +\ } +\} +"}}} + +" vue-vim +"{{{ +" disable preprocessor checking for vue files - increases speed +let g:vue_disable_pre_processors=0 +" set custom syntax highlighting +augroup fixhighlighting + autocmd! + autocmd BufNewFile,BufRead *.vue syntax sync fromstart +augroup END +"}}} + +" ultisnips +"{{{ +nnoremap ul :call ListUltisnips() +inoremap jkul :call ListUltisnips() + +let g:UltiSnipsSnippetsDir='~/.vim/UltiSnips' +" Trigger configuration. Do not use if you use https://github.com/Valloric/YouCompleteMe. +let g:UltiSnipsExpandTrigger='' +let g:UltiSnipsJumpForwardTrigger='' +let g:UltiSnipsJumpBackwardTrigger='' +let g:UltiSnipsEditSplit='horizontal' + +function! ListUltisnips() abort + let l:snips = UltiSnips#SnippetsInCurrentScope(1) + let l:keylist = sort(keys(l:snips)) + echo ' --------------------------------------------------' + for l:key in l:keylist + echo printf(" %-10s\t%s", l:key, l:snips[l:key]) + endfor + echo '---------------------------------------------------' +endfunction + +function! CompleteSnippets(findstart, base) + if a:findstart + let l:line = getline('.') + let l:start = col('.') - 1 + while l:start > 0 && l:line[l:start - 1] =~ '\a' + let l:start -= 1 + endwhile + return l:start + else + let l:res = [] + let l:snips = UltiSnips#SnippetsInCurrentScope(1) + let l:keylist = sort(keys(l:snips)) + for l:key in l:keylist + if l:key =~ '^' . a:base + let l:item = {'word': l:key, 'menu': l:snips[l:key]} + call add(l:res, l:item) + endif + endfor + return l:res + endif +endfunction + +set completefunc=CompleteSnippets + + + + + +"}}} + +" Netrw +"{{{ +let g:netrw_liststyle=3 +let g:netrw_list_hide='^\..*' +let g:netrw_preview = 0 +"}}} + +" undotree +"{{{ +nnoremap ut :UndotreeToggle +"}}} + +" TagBar +"{{{ +nnoremap tb :TagbarOpen fj +nnoremap ] :tag /[.#@]=expand('') +let g:tagbar_autoclose = 1 +" let g:tagbar_autopreview = 1 +" let g:tagbar_previewwin_pos = '' + +let g:tagbar_type_css = { +\ 'ctagstype' : 'css', +\ 'kinds' : [ +\ 'c:classes', +\ 'i:ids', +\ 't:tags', +\ 'm:medias' +\ ] +\} + +let g:tagbar_type_scss = { +\ 'ctagstype' : 'scss', +\ 'kinds' : [ +\ 'v:variables', +\ 'c:classes', +\ 'i:ids', +\ 't:tags', +\ 'd:medias', +\ 'm:mixins', +\ 'f:functions' +\ ] +\} + +let g:tagbar_type_vue = { +\ 'ctagstype' : 'vue', +\ 'kinds' : [ +\ 'o:objects', +\ 'f:functions', +\ 'a:array', +\ 's:string', +\ 'b:boolean', +\ 'n:number', +\ 'v:variable' +\ ] +\ } +"}}} + +" gutentags +"{{{ +let g:gutentags_ctags_tagfile = '.tags' +let g:gutentags_ctags_exclude = ['package.json', 'Session.vim', 'package-lock.json', 'TODO.txt'] +"}}} + +" colorV +"{{{ +let g:colorv_no_global_map = 1 +let g:colorv_win_pos = 'top' +let g:colorv_preview_area = 0 + +nnoremap cv :ColorV +nnoremap ce :ColorVEdit +nnoremap cc :call ToggleColorPreview() +nnoremap ci :ColorVInsert +nnoremap cp :ColorVPicker + +function! ToggleColorPreview() abort + if !exists('w:colorv_is_previewing') + let w:colorv_is_previewing = 0 + endif + if w:colorv_is_previewing == 0 + execute 'ColorVPreview' + let w:colorv_is_previewing = 1 + else + execute 'ColorVClear' + let w:colorv_is_previewing = 0 + endif +endfunction +"}}} + +" vim-instant-markdown +" this doesn't work - issue is open in guthub +let g:instant_markdown_open_to_the_world = 1 + +"}}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" #functions {{{ +function! SetColor(name, fg, bg, fg_l, bg_l, style) abort"{{{ + + if &background ==? 'dark' + if a:fg ==? 'normal' + let l:guifg = ' guifg=' . g:d_normal_fg + let l:ctermfg = 'ctermfg=black' + " let l:termfg = 'termfg=black' + elseif a:fg ==? 'none' + let l:guifg = ' guifg=' . g:d_normal_bg + let l:ctermfg = ' ctermfg=white' + " let l:termfg = ' termfg=white' + elseif a:fg ==? '' + let l:guifg = '' + let l:ctermfg = '' + " let l:termfg = '' + else + let l:guifg = ' guifg=' . a:fg + let l:ctermfg = ' ctermfg=black' + " let l:termfg = ' termfg=black' + endif + + if a:bg ==? 'none' + let l:guibg = ' guibg=NONE' + let l:ctermbg = ' ctermbg=none' + " let l:termbg = ' termbg=none' + elseif a:bg ==? '' + let l:guibg = '' + let l:ctermbg = '' + " let l:termbg = '' + else + let l:guibg = ' guibg=' . a:bg + let l:ctermbg = ' ctermbg=black' + endif + else " light background + if a:fg_l ==? 'normal' + let l:guifg = ' guifg=' . g:l_normal_fg + let l:ctermfg = ' ctermfg=black' + " let l:termfg = ' termfg=black' + elseif a:fg_l ==? 'none' + let l:guifg = ' guifg=' . g:l_normal_bg + let l:ctermfg = ' ctermfg=white' + " let l:termfg = ' termfg=white' + elseif a:fg_l ==? '' + let l:guifg = '' + let l:ctermfg = '' + let l:termfg = '' + else + let l:guifg = ' guifg=' . a:fg_l + let l:ctermfg = ' ctermfg=black' + " let l:termfg = ' termfg=black' + endif + + if a:bg_l ==? 'none' + let l:guibg = ' guibg=NONE' + let l:ctermbg = ' ctermbg=none' + " let l:termbg = ' termbg=none' + elseif a:bg_l ==? '' + let l:guibg = '' + let l:ctermbg = '' + " let l:termbg = '' + else + let l:guibg = ' guibg=' . a:bg_l + let l:ctermbg = ' ctermbg=white' + " let l:termbg = ' termbg=white' + endif + endif + + if a:style ==? '' + let l:style = ' term=none cterm=none gui=NONE' + else + let l:style = ' term=' . a:style . ' cterm=' . a:style . ' gui=' . a:style + endif + + let l:histring = 'hi! ' . a:name . l:guifg . l:guibg . l:style + let l:histring .= l:ctermfg . l:ctermbg + " let l:histring .= l:termfg . l:termbg + + execute 'hi clear ' . a:name + execute l:histring + +endfunction"}}} + +function! GetStatusFrag(condition, colorname, conditionprefix, text) abort "{{{ +" TODO better name + let l:frag='%#' . a:colorname . '#' + let l:frag.=a:conditionprefix + let l:frag.='%{(' . a:condition . ")?'" . a:text . "':''}" + return l:frag +endfunction"}}} + +function! MyFoldText()"{{{ + + let l:linecount = v:foldend - v:foldstart - 1 + let l:line = getline(v:foldstart) + + let l:postfix = ' +' . l:linecount . ' ' . v:folddashes . '|' + while len(l:postfix) < 11 + let l:postfix = ' ' . l:postfix + endwhile + " unicode characters counted as 2 digits in length - TODO find fix + " checkout strlen + " let l:postfix = ' •••••••••••• +' . l:linecount . ' ' . v:folddashes . '|' + + let l:len_line = len(l:line) + let l:len_postfix = len(l:postfix) + + " TODO use width of window maybe (i fit's less than 80) + if l:len_line + l:len_postfix <= 80 + let l:padding = ' ' . ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -'[l:len_line + l:len_postfix + 4:79] + if l:padding[:-1] !== '-' + let l:padding = ' ' . l:padding [0:-1] + endif + let l:foldtext = l:line . l:padding . l:postfix + else + let l:foldtext = l:line[:76 - l:len_postfix] . '...' . l:postfix + endif + + return l:foldtext +endfunction"}}} + +" get name of syntax item +function! SyntaxItem() abort "{{{ + + return synIDattr(synID(line('.'),col('.'),1),'name') . ' -> ' . synIDattr(synIDtrans(synID(line('.'),col('.'),1)), 'name' ) +endfunction +nnoremap pp :echom SyntaxItem() +"}}} + +" devdocs DD +" https://gist.github.com/romainl/8d3b73428b4366f75a19be2dad2f0987#file-devdocs-vim +function! s:Get_env() abort "{{{ + if has('win64') || has('win32') || has('win16') + return 'WINDOWS' + else + return toupper(substitute(system('uname'), '\n', '', '')) + endif +endfunction +" What command to use on what system +let s:cmds = {'DARWIN': 'open', 'LINUX': 'qutebrowser', 'WINDOWS': 'start'} + +" Build the URL stub +let s:stub = s:cmds[Get_env()] . " 'http://devdocs.io/?q=" + +command! -nargs=* DD silent! call system(len(split(, ' ')) == 0 ? + \ s:stub . &ft . ' ' . expand('') . "'" : len(split(, ' ')) == 1 ? + \ s:stub . &ft . ' ' . . "'" : s:stub . . "'") +"}}} + +" use ranger as file manager +if !exists('*RangerExplorer') "{{{ + function RangerExplorer() abort + exec 'silent !ranger --choosefile=/tmp/vim_ranger_current_file ' . expand('%:p:h') + if filereadable('/tmp/vim_ranger_current_file') + exec 'edit ' . system('cat /tmp/vim_ranger_current_file') + call system('rm /tmp/vim_ranger_current_file') + endif + redraw! + endfun + map ra :call RangerExplorer() +endif +"}}} + +function! SetColorColumn() abort"{{{ + if &buftype == '' + setlocal colorcolumn=80 + endif +endfunction +"}}} + +function! GetLinterStatus(key) abort "{{{ + + let l:statuscount = 0 + + if exists('b:ale_linted') + let l:linter = ale#statusline#Count(bufnr('')) + else + let l:linter = GetDiagnosticCountsFromSigns(bufnr('')) + endif + + if has_key(l:linter, a:key) + let l:statuscount = l:linter[a:key] + endif + return l:statuscount +endfunction +"}}} + +" Shell command +" http://vim.wikia.com/wiki/VimTip1599 +function! s:RunShellCommand(cmdline) abort"{{{ + + let l:expanded_cmdline = a:cmdline + for l:part in split(a:cmdline, ' ') + if l:part[0] =~ '\v[%#<]' + let l:expanded_part = fnameescape(expand(l:part)) + let l:expanded_cmdline = substitute(l:expanded_cmdline, l:part, l:expanded_part, '') + endif + endfor + + if g:shell_scratch_buffer_nr > -1 + let l:win_nr = bufwinnr(g:shell_scratch_buffer_nr) + if l:win_nr < 0 + execute 'bdelete' g:shell_scratch_buffer_nr + top new + let g:shell_scratch_buffer_nr = bufnr('%') + else + execute l:win_nr. ' wincmd w' + setlocal modifiable + %delete _ + endif + else + top new + let g:shell_scratch_buffer_nr = bufnr('%') + endif + + setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap + nnoremap q :bdelete + augroup ResetShellBufferNr + autocmd! * + autocmd BufUnload let g:shell_scratch_buffer_nr = -1 + augroup END + + " call setline(1, 'You entered: ' . a:cmdline) + " call setline(2, 'Expanded Form: ' .l:expanded_cmdline) + " call setline(3,substitute(getline(2),'.','=','g')) + execute '$read !'. l:expanded_cmdline + 1 + + setlocal nomodifiable + if !exists('b:shell_line_count') + let b:shell_line_count = line('$') + if b:shell_line_count > 25 + let b:shell_line_count = 20 + endif + execute 'resize' b:shell_line_count + 1 + endif + + wincmd p +endfunction + +command! -complete=shellcmd -nargs=+ Shell call s:RunShellCommand() +let g:shell_scratch_buffer_nr = -1 +"}}} + +function! GetDiagnosticCountsFromSigns(buffer) abort "{{{ + let l:error = 0 + let l:warn = 0 + let l:info = 0 + let l:hint = 0 + + redir => l:result + silent exec 'sign place buffer=' . a:buffer + redir end + + let l:lines = split(l:result, '\n') + + for l:line in l:lines + if l:line =~? 'Error' + let l:error += 1 + endif + if l:line =~? 'Warning' + let l:warn += 1 + endif + if l:line =~? 'Info' + let l:info += 1 + endif + if l:line =~? 'Hint' + let l:hint += 1 + endif + endfor + + return {'error': l:error, 'warning': l:warn, 'info': l:info, 'hint': l:hint} + +endfunction +"}}} + +" https://stackoverflow.com/a/40195855 +" ex_command: command to run to execute file +function! SaveAndExecute(ex_command) abort "{{{ + " SOURCE [reusable window]: https://github.com/fatih/vim-go/blob/master/autoload/go/ui.vim + + " save and reload current file + silent execute "update | edit" + + " get file path of current file + let s:current_buffer_file_path = expand("%") + + let s:output_buffer_name = "Output" + let s:output_buffer_filetype = "output" + + " reuse existing buffer window if it exists otherwise create a new one + if !exists("s:buf_nr") || !bufexists(s:buf_nr) || bufwinnr(s:buf_nr) == -1 + silent execute 'top new ' . s:output_buffer_name + let s:buf_nr = bufnr('%') + elseif bufwinnr(s:buf_nr) != bufwinnr('%') + silent execute bufwinnr(s:buf_nr) . 'wincmd w' + endif + + silent execute "setlocal filetype=" . s:output_buffer_filetype + setlocal bufhidden=delete + setlocal buftype=nofile + setlocal noswapfile + setlocal nobuflisted + setlocal winfixheight + setlocal cursorline " make it easy to distinguish + setlocal nonumber + setlocal norelativenumber + setlocal showbreak="" + + nnoremap q :bdelete!'.zz + + " clear the buffer + setlocal noreadonly + " setlocal modifiable + %delete _ + + " add the console output + silent execute '.!'. a:ex_command . ' ' . shellescape(s:current_buffer_file_path, 1) + + " resize window to content length + " Note: This is annoying because if you print a lot of lines then your code buffer is forced to a height of one line every time you run this function. + " However without this line the buffer starts off as a default size and if you resize the buffer then it keeps that custom size after repeated runs of this function. + " But if you close the output buffer then it returns to using the default size when its recreated + "execute 'resize' . line('$') + + " make the buffer non modifiable + setlocal readonly + " setlocal nomodifiable +endfunction +"}}} +"}}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" #settings {{{ +scriptencoding utf-8 +set ttyfast + +if &term ==? 'xterm-256color' + set termguicolors +endif + +syntax on +set background=light +set fillchars=stl:\ ,stlnc:\ ,vert:\| +colorscheme monotonous + +set guioptions-=mTrLb +set guioptions+=c + +set updatetime=100 + +set backupdir=~/.vimtmp +set directory=~/.vimtmp + +set tags+=./.tags,.tags;/home/ray/ + +" persisitent undo file +set undodir=/home/ray/.vim/undodir +set undofile + +set clipboard=unnamedplus + +set ignorecase +set smartcase + +set wildmenu +set wildmode=longest:full,full + +set hidden + +set number relativenumber +set hlsearch + +" set previewheight=24 +" set splitbelow + +set completeopt=longest,menuone +set completeopt-=preview + +set nospell +set spelllang=en_gb +set dictionary+=/usr/share/dict/brit-a-z.txt,/usr/share/dict/britcaps.txt +set thesaurus+=/usr/share/dict/mthesaur.txt + +" function! GetGitRoot() abort +" let gitroot=system("git rev-parse --show-toplevel") +" if gitroot=~?"^fatal" +" let gitstring = system("echo ${PWD/#$HOME/'~'}") . "/" +" let gitstring .= expand("%t") +" else +" let gitstring = system("echo ${PWD/#$HOME/'~'}") . "/" +" let gitstring .= expand("%t") +" let gitstring .= " [ " . system("git branch | grep '*' | cut -d ' ' -f2") +" let gitstring .= " ] ( " . system('basename "' . gitroot . '"') . " )" +" endif +" return gitstring +" endfunction +" let &titlestring="%{GetGitRoot()}" +" set title + +set tabstop=8 +set softtabstop=2 +set shiftwidth=2 +set shiftround +set expandtab +set autoindent + +set textwidth=180 +set formatoptions=cq +set wrapmargin=0 + +set foldcolumn=1 +set signcolumn=yes +set colorcolumn=80 + +set iskeyword+=- +set scrolloff=10 +set showcmd +set incsearch + +set laststatus=2 +set shortmess=aoOT +set cmdheight=2 + +set foldmethod=manual + +set showmode + +set autoindent +set breakindent +set showbreak=\ \ ↳\ + +set mouse=a + +set listchars=eol:¬,tab:>-,trail:~,extends:>,precedes:<,space:· + +set foldtext=MyFoldText() +"}}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" #mappings {{{ +let g:mapleader = ' ' + +" miscallaneous {{{ +nnoremap : :setlocal norelativenumber: +nnoremap rc :so $MYVIMRC +nnoremap nn :set invrelativenumber +nnoremap nh (&hls && v:hlsearch ? ':nohls' : ':set hls')."\n" +nnoremap sl :set invlist +nnoremap aa A +nnoremap a2 A +nnoremap ab AB +nnoremap co :!clear; +" Focus on current fold, close the rest +nnoremap zz zMzvzt +" replace current word with last yanked/deleted text +nnoremap rr "_diwP +" replace current word with last yanked text +nnoremap ry diw"0P +" quick grep of visual selection +vnoremap gr y:grep! -R " . +" open quickfix window of TODOs +nnoremap td :grep! -R '// *TODO' .:botright cwindow:echo len(getqflist()) 'TODOs' +" devdocs mapping +nnoremap dd :DD +" write and delete current buffer +nnoremap bx :w\|bd + +"}}} + +" git mappings {{{ +nnoremap gs :Gstatus +nnoremap gd :Gdiff +nnoremap gD :!clear; echo 'git diff'; git diff +nnoremap ga :!clear; git add %; git status +nnoremap gA :!clear; git add .; git status +nnoremap gc :Gcommit +nnoremap gg :!clear; git add %; git commit -m '' +nnoremap gp :!clear; echo 'git push'; git push +" nnoremap gp :terminal echo ':git push' & git push +" nnoremap gp :Gpush +" nnoremap gp :pedit | read ! echo 'git push'; git push +nnoremap gl :Glog +"}}} + +" netrw {{{ +nnoremap ex :Ex +nnoremap ee :e . +nnoremap eq :Rex +"}}} + + " better window/tab/buffer navigation/management {{{ +nnoremap j :resize -5 +nnoremap k :resize +5 +nnoremap l :vertical resize +5 +nnoremap h :vertical resize -5 + +"}}} + +"location list and quickfix mappings {{{ +nnoremap lo :botright lwindow +nnoremap :lprevzv +nnoremap :lnextzv +nnoremap lc :lclose +nnoremap lh :lhistory +nnoremap lp :lolder +nnoremap ln :lnewer + +nnoremap qo :botright cwindow +nnoremap :cprevzv +nnoremap :cnextzv +nnoremap qc :cclose +nnoremap qh :chistory +nnoremap qp :colder +nnoremap qn :cnewer +"}}} + +" insert mode mappings {{{ +inoremap jkrg :reg +inoremap :w :w +inoremap [:w :w +inoremap {:w :w +"}}} + +" brace/quotes completion {{{ +inoremap {{ {} +inoremap { {}O +inoremap {; {};O +inoremap {{{ {{}} + +inoremap (( () +inoremap ( ()O +inoremap (; (); + +inoremap [[ [] +inoremap [ []O + +inoremap "" "" +inoremap """ "" +inoremap "; ""; +inoremap '' '' +inoremap ''' '' +inoremap '; ''; + +"}}} + +"}}} +"}}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" #abbreviations {{{ +iabbrev adn and +iabbrev waht what +iabbrev tehn then +"}}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" #autocommands {{{ + +" persistent folds {{{ +augroup AutoSaveFolds + autocmd! + autocmd BufWinLeave ?* mkview + autocmd BufWinEnter ?* silent loadview +augroup END +"}}} + +" fix higlight problems such as vertical-align etc {{{ +augroup VimCSS3Syntax + autocmd! + autocmd FileType css setlocal iskeyword+=- +augroup END +"}}} + +" Show trailing whitepace and spaces before a tab: {{{ +augroup whitespaceerrors + autocmd! + autocmd Syntax * syn match ExtraWhitespace /\s\+$\| \+\ze\t/ containedin=ALL +augroup END +"}}} + +" automatically reload if color scheme file written {{{ +" augroup coloreload +" autocmd! +" autocmd BufWritePost customred256.vim so $MYVIMRC +" augroup end +" +"}}} + +" line numbering {{{ +augroup linenumbering + autocmd! + autocmd InsertEnter * :set norelativenumber + autocmd InsertLeave * :set number relativenumber + autocmd WinEnter * :set number relativenumber + autocmd WinLeave * set norelativenumber + autocmd CmdlineLeave * :set number relativenumber + " see 'mapping nnoremap :' for setting norelative number. +augroup END +"}}} + +" colorcolumns {{{ +augroup colorcolumns + autocmd! + autocmd WinEnter * call SetColorColumn() + autocmd WinLeave * setlocal colorcolumn=0 +augroup END +"}}} + +" Automatically reload .vimrc if chanaged {{{ +augroup myvimrc + autocmd! + autocmd BufWritePost .vimrc,_vimrc,vimrc,.gvimrc,_gvimrc,gvimrc so $MYVIMRC | if has('gui_running') | so $MYGVIMRC | endif +augroup END +"}}} + +" Open qfix after grepping {{{ +augroup qfixopen + autocmd! + autocmd QuickFixCmdPost *grep* botright cwindow +augroup END +"}}} +" }}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" #statusline {{{ +set statusline=%!GetStatus(1) + +function! GetStatus(isactive) abort "{{{ + " let l:linter = ale#statusline#Count(bufnr('')) + let l:divider = '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >' + let l:separator = '%#StatusLineSeparator# ' + let l:normal = '%#StatusLineNormal#' + let l:active = '%#StatusLineActive#' + let l:statusline = '' + + "buffer number + if a:isactive + let l:statusline .= '%#StatusLineBufferNrActive#' + else + let l:statusline .= '%#StatusLineBufferNr#' + endif + let l:statusline .= ' %n %* ' + + + " file percentage {{{ + let l:statusline .= '%#FoldColumn# ' + if a:isactive + let l:statusline .= '%#StatusLinePercentActive#' + let l:statusline .= '%P %#StatusLineDirActive#of %#StatusLineFileActive#%L %* ' + else + let l:statusline .= '%#StatusLinePercent#' + let l:statusline .= '%P %#StatusLineDir#of %#StatusLinePercent#%L %* ' + endif"}}} + + " non-empty buftype (help, quickfix, etc) {{{ + if a:isactive + let l:statusline .= l:active . "%{&buftype == '' ? '' : ' '}%q%h%w%#StatusLineActiveNoText#" + else + let l:statusline .= l:normal . "%{&buftype == '' ? '' : ' '}%q%h%w%#StatusLineNormalNoText#" + endif + let l:statusline .= "%{&buftype == '' ? '' : ' '}%s" +"}}} + + " right/left divider {{{ + let l:statusline.=l:separator + " modified version + let l:color = 'StatusLineDivMod' . (a:isactive?'Active':'') + let l:statusline .= GetStatusFrag("&modified && mode() != 'i'", l:color, '%<', l:divider) + + " unmodified version + let l:color = 'StatusLineDiv' . (a:isactive?'Active':'') + let l:statusline .= GetStatusFrag("!&modified && mode() != 'i'", l:color, '%<', l:divider) + + " input mode version + if a:isactive + let l:statusline .= GetStatusFrag("mode() == 'i'", 'StatusLineDivInput', '%<', l:divider) + endif + + let l:statusline.= l:separator . '%*%=' + + let l:statusline .= ' ' + "}}} + + " file info{{{ + if a:isactive == 1 + " let l:statusline.=l:active + let l:statusline.='%#StatusLineFileActive#' + " let l:statusline.=" %{strlen(&ft)?&ft:'none'} " + " let l:statusline.=l:separator . l:active + let l:statusline.=' %{strlen(&fenc)?&fenc:&enc} ' + " let l:statusline.=l:separator . l:active + let l:statusline.=' %{&fileformat} ' + let l:statusline.=l:separator . l:active + " let l:statusline.=' %{&spelllang} ' + " let l:statusline.=l:separator + endif +"}}} + + " path/filename.extension {{{ + if a:isactive + let l:statusline.='%#StatusLineDirActive# ' + let l:statusline.="%{expand('%:p:h:t')}/" + let l:statusline.='%#StatusLineFileActive#' + + let l:statusline.="%{expand('%:t:r')}" + + let l:statusline.='%#StatusLineDotActive#' + let l:statusline.="%{strlen(expand('%:e'))?'.':''}" + let l:statusline.='%#StatusLineExtActive#' + let l:statusline.="%{strlen(expand('%:e'))?expand('%:e'):expand('%:e')} " + let l:statusline .= '%#InterfaceSignWarning# %R ' + else + let l:statusline.='%#StatusLineDir# ' + let l:statusline.="%{fnamemodify(expand('%:p:h'),':~')}/" + let l:statusline.='%#StatusLineFile#' + + let l:statusline.="%{expand('%:t:r')}" + + let l:statusline.='%#StatusLineDot#' + let l:statusline.="%{strlen(expand('%:e'))?'.':''}" + let l:statusline.='%#StatusLineExt#' + let l:statusline.="%{strlen(expand('%:e'))?expand('%:e'):expand('%:e')} " + let l:statusline .= '%#LinterWarningInactive# %R ' + endif + let l:statusline.='%*' + "}}} + + " linter status {{{ + if a:isactive + " errors + let l:statusline .= "%#LinterDashActive#%{(GetLinterStatus('error') == 0?'-':'')}" + let l:statusline .= "%#LinterError#%{(GetLinterStatus('error') == 0?'':GetLinterStatus('error'))}" + " style errors + let l:statusline .= '%#LinterDash#|' + let l:statusline .= "%#LinterDashActive#%{(GetLinterStatus('style_error') == 0?'-':'')}" + let l:statusline .= "%#LinterErrorStyle#%{(GetLinterStatus('style_error') == 0?'':GetLinterStatus('style_error'))} " + + " warnings + let l:statusline .= "%#LinterDashActive#%{(GetLinterStatus('warning') == 0?'-':'')}" + let l:statusline .= "%#LinterWarning#%{(GetLinterStatus('warning') == 0?'':GetLinterStatus('warning'))}" + " style warnings + let l:statusline .= '%#LinterDash#|' + let l:statusline .= "%#LinterDashActive#%{(GetLinterStatus('style_warning') == 0?'-':'')}" + let l:statusline .= "%#LinterWarningStyle#%{(GetLinterStatus('style_warning') == 0?'':GetLinterStatus('style_warning'))} " + + " info + let l:statusline .= "%#LinterDashActive#%{(GetLinterStatus('info') == 0?'-':'')}" + let l:statusline .= "%#LinterInfo#%{(GetLinterStatus('info') == 0?'':GetLinterStatus('info'))}" + else + " errors + let l:statusline .= "%#LinterDash#%{(GetLinterStatus('error') == 0?'-':'')}" + let l:statusline .= "%#LinterErrorInactive#%{(GetLinterStatus('error') == 0?'':GetLinterStatus('error'))}" + " style errors + let l:statusline .= '%#LinterDash#|' + let l:statusline .= "%{(GetLinterStatus('style_error') == 0?'-':'')}" + let l:statusline .= "%#LinterErrorStyleInactive#%{(GetLinterStatus('style_error') == 0?'':GetLinterStatus('style_error'))} " + + " warnings + let l:statusline .= "%#LinterDash#%{(GetLinterStatus('warning') == 0?'-':'')}" + let l:statusline .= "%#LinterWarningInactive#%{(GetLinterStatus('warning') == 0?'':GetLinterStatus('warning'))}" + " style warnings + let l:statusline .= '%#LinterDash#|' + let l:statusline .= "%{(GetLinterStatus('style_warning') == 0?'-':'')}" + let l:statusline .= "%#LinterWarningStyleInactive#%{(GetLinterStatus('style_warning') == 0?'':GetLinterStatus('style_warning'))} " + + " info + let l:statusline .= "%#LinterDash#%{GetLinterStatus('info') == 0 ? '-' : GetLinterStatus('info')}" + endif +"}}} + + return l:statusline + +endfunction +"}}} + +function! DoInsertEnter() "{{{ + set cursorline + call SetColor('LineNr', '#262626', '', '#cccccc', '', '') + call SetColor('CursorLineNr', '#bcbcbc', '', '#999999', '', 'bold') +endfunction +"}}} + +function! DoInsertLeave() "{{{ + set nocursorline + call SetColor('LineNr', '#3a3a3a', '', '#999999', '', '') + call SetColor('CursorLineNr', '#767676', '', '#777777', '', 'bold') +endfunction +"}}} + +augroup status "{{{ + autocmd! + autocmd WinNew,WinEnter * setlocal statusline=%!GetStatus(1) + autocmd WinLeave * setlocal statusline=%!GetStatus(0) + " autocmd WinNew * setlocal statusline=%!GetStatus(1) + " autocmd InsertChange * setlocal statusline=%!GetStatus(1) +augroup END +"}}} + +augroup statuscursorlines "{{{ + au! + au InsertEnter * call DoInsertEnter() + au InsertLeave * call DoInsertLeave() +augroup END +"}}} +"}}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" #tabline {{{ +if exists('+showtabline') + + " Rename tabs to show tab number. + " based on: + " http://stackoverflow.com/questions/5927952/whats-implementation-of-vims-default-tabline-function + + function! MyTabLine() "{{{ + let l:customtabline = '' + let l:currenttabnum = tabpagenr() + let l:lasttabnumber = tabpagenr('$') + let l:tabnumber = 1 + while l:tabnumber <= l:lasttabnumber + let l:buflist = tabpagebuflist(l:tabnumber) + let l:winnr = tabpagewinnr(l:tabnumber) + + if l:lasttabnumber > 1 + let l:customtabline .= '%' . l:tabnumber . 'T' + let l:customtabline .= (l:tabnumber == l:currenttabnum ? '%1*' : '%2*') + + let l:customtabline .= (l:tabnumber == l:currenttabnum ? '%#TabNumSel#' : '%#TabNum#') + let l:customtabline .= ' ' . l:tabnumber + let l:customtabline .= '%#TabSeparator#:' + let l:customtabline .= (l:tabnumber == l:currenttabnum ? '%#TabLineItemSel#' : '%#TabLineItem#') + endif + + let l:bufnr = l:buflist[l:winnr - 1] + let l:file = bufname(l:bufnr) + let l:buftype = getbufvar(l:bufnr, '&buftype') + + if l:buftype ==# 'help' + let l:file = 'help:' . fnamemodify(l:file, ':t:r') + + elseif l:buftype ==# 'quickfix' + let l:file = 'quickfix' + + elseif l:buftype ==# 'nofile' + if l:file =~# '\/.' + let l:file = substitute(l:file, '.*\/\ze.', '', '') + endif + + else + let l:file = fnamemodify(l:file, ':p:t') + + endif + + if l:file ==# '' + let l:file = "''" + endif + + let l:customtabline .= l:file . ' %#TabLineNoise# ' + + let l:tabnumber = l:tabnumber + 1 + + endwhile + + let l:customtabline .= '%T%#TabLineFill#%=' + let l:customtabline .= '%#TabLineItemSel# %{fugitive#statusline()}%#TabSeparator# ' + let l:customtabline .= '%#TabLineNoise# ' + let l:customtabline .= '%#TabLineNoise# ' + " let l:customtabline .= '%#TabSeparator# "%#TabLineItemSel#%{v:register}%#TabSeparator#" ' + " let l:customtabline .= '%#TabLineNoise# ' + let l:customtabline .= "%#TabLineItemSel# %{ObsessionStatus(fnamemodify(v:this_session,':t'),'---')} %*" + + return l:customtabline + + endfunction +"}}} + + set showtabline=2 + set tabline=%!MyTabLine() + +endif " exists("+showtabline") +"}}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" #pymode {{{ +let g:pymode = 1 +let g:pymode_syntax = 1 +let g:pymode_syntax_all = 1 +let g:pymode_syntax_print_as_function = 1 +let g:pymode_syntax_highlight_async_await = 1 +let g:pymode_syntax_highlight_equal_operator = 1 +let g:pymode_syntax_highlight_stars_operator = 1 +let g:pymode_syntax_highlight_self = 1 +let g:pymode_syntax_indent_errors = 0 +let g:pymode_syntax_space_errors = 0 +let g:pymode_syntax_string_formatting = 1 +let g:pymode_syntax_string_format = 1 +let g:pymode_syntax_string_templates = 1 +let g:pymode_syntax_doctests = 1 +let g:pymode_syntax_docstrings = 1 +let g:pymode_syntax_builtin_objs = 1 +let g:pymode_syntax_builtin_types = 1 +let g:pymode_syntax_builtin_funcs = 1 +let g:pymode_syntax_highlight_exceptions = 1 +let g:pymode_syntax_slow_sync = 1 +"}}} + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" vim: foldmethod=marker