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': ''
+" \ }]
+
+" 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