filetype off " required set ttyfast " #plugins{{{ set runtimepath+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'VundleVim/Vundle.vim' "css3-syntax Plugin 'hail2u/vim-css3-syntax.git' "scss-syntax Plugin 'cakebaker/scss-syntax.vim' "bufexplorer Plugin 'jlanzarotta/bufexplorer' "tagbar Plugin 'majutsushi/tagbar' "vim-surround Plugin 'tpope/vim-surround' "undotree Plugin 'mbbill/undotree' " Ctrlp Plugin 'ctrlpvim/ctrlp.vim' " Obsession Plugin 'tpope/vim-obsession' " vim-css-color Plugin 'ap/vim-css-color' " vim-javascript Plugin 'pangloss/vim-javascript' " ultisnips " https://github.com/sirver/UltiSnips Plugin 'SirVer/ultisnips' " and some snippets " https://github.com/honza/vim-snippets Plugin 'honza/vim-snippets' " ALE " https://github.com/w0rp/ale Plugin 'w0rp/ale' " MatchTag " https://github.com/gregsexton/MatchTag Plugin 'gregsexton/MatchTag' " phpcomplete.vim " https://github.com/shawncplus/phpcomplete.vim Plugin 'shawncplus/phpcomplete.vim' " https://github.com/dsawardekar/wordpress.vim " For up to date Wordpress Files see: " https://github.com/joseluis/wordpress.vim-generator "Plugin 'dsawardekar/wordpress.vim' " disabled - doesn't support universal ctags? " vim-vue " https://github.com/posva/vim-vue Plugin 'posva/vim-vue' " vim-commentary " https://github.com/tpope/vim-commentary Plugin 'tpope/vim-commentary' " vim-repeat " https://github.com/tpope/vim-repeat Plugin 'tpope/vim-repeat' " taboo.vim " https://github.com/gcmt/taboo.vim Plugin 'gcmt/taboo.vim' " https://github.com/mattn/emmet-vim Plugin 'mattn/emmet-vim' " vimwiki " https://github.com/vimwiki/vimwiki Plugin 'vimwiki/vimwiki' " youcompleteme " https://github.com/Valloric/YouCompleteMe Plugin 'Valloric/YouCompleteMe' " gitgutter " https://github.com/airblade/vim-gitgutter/blob/master/README.mkd Plugin 'airblade/vim-gitgutter' " vim-peekaboo " https://github.com/junegunn/vim-peekaboo Plugin 'junegunn/vim-peekaboo' " vim-gutentags " https://github.com/ludovicchabant/vim-gutentags Plugin 'ludovicchabant/vim-gutentags' " All of your Plugins must be added before the following line call vundle#end() " required filetype plugin indent on " required "}}} " #settings{{{ " set t_Sf=[3%p1%dm " foreground colour if &term == 'xterm-256color' set termguicolors endif syntax on colorscheme customred256 set guioptions-=mTrLb set guioptions+=c " set t_Sb=[4%p1%dm " background coloru 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 background=dark set number relativenumber set hlsearch set foldcolumn=1 set iskeyword+=- set scrolloff=10 set showcmd set incsearch set laststatus=2 set foldmethod=manual set showmode set autoindent set breakindent set showbreak=↳ set mouse=a set listchars=eol:¬,tab:->,trail:~,extends:>,precedes:<,space:· set textwidth=180 set formatoptions=cq set wrapmargin=0 "}}} " key #mappings{{{ let g:mapleader = "\" nnoremap rc :so $MYVIMRC " Focus on current fold, close the rest nnoremap zz zMzvzz " replace current word with last yanked/deleted text nnoremap rr "_diwP " replace current word with last yanked text nnoremap ry diw"0P inoremap jk nnoremap A :call CheckLineEnding() nnoremap co :!clear; nnoremap gs :!clear; echo 'git status'; git status nnoremap gd :!clear; echo 'git diff'; git diff nnoremap ga :!clear; git add %; git status nnoremap gA :!clear; git add .; git status nnoremap gc :!clear; git commit -m '' nnoremap gg :!clear; git add %; git commit -m '' nnoremap gp :!clear; echo 'git push'; git push nnoremap gl :!clear; git log " netrw nnoremap ex :Ex nnoremap ee :e . nnoremap eq :Rex " better window navigaton nnoremap h nnoremap l nnoremap k nnoremap j nnoremap j :resize -5 nnoremap k :resize +5 nnoremap l :vertical resize +5 nnoremap h :vertical resize -5 nnoremap = = "location list and quickfix mappings nnoremap ll :botright lwindow nnoremap lp :lprev nnoremap ln :lnext nnoremap lc :lclose nnoremap llh :lhistory nnoremap llp :lolder nnoremap lln :lnewer nnoremap qf :botright cwindow nnoremap qp :cprev nnoremap qn :cnext nnoremap qc :cclose nnoremap qfh :chistory nnoremap qfp :colder nnoremap qfn :cnewer nnoremap nh :noh " 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' " brace/quotes completion inoremap {{ {} inoremap { {}O inoremap {; {};O inoremap }} {{}} inoremap (( () inoremap (; (); inoremap [[ [] inoremap [ []O inoremap "" "" inoremap "; ""; inoremap '' '' inoremap '; ''; inoremap ;; ; nnoremap nn :set invrelativenumber nnoremap hl :nohlsearch " devdocs mapping nnoremap dd :DD "}}} " #abbreviations{{{ iabbrev adn and iabbrev waht what iabbrev tehn then "}}} " #statusline format " isactive = 0 when inactive, 1 otherwise " get status line{{{ function! GetStatus(isactive) " let l:linter = ale#statusline#Count(bufnr('')) let l:divider = '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >' let l:separator = '%#StatusLineSeparator# ' let l:normal = '%#StatusLineNormal#' let l:active = '%#StatusLineActive#' let l:bracket_open = '%#CRNoiseDark#(' let l:bracket_close = '%#CRNoiseDark#) ' let l:statusline = '' " let l:statusline = '%#CRNoise#b%#CRNoiseDark#:%#CRNoiseBright#%n ' " let l:curbuf = bufnr('') " let l:statusline .= '%#CRNormal#' . l:curbuf . ': ' . &buftype . ' ' " file percentage let l:statusline.='%#FoldColumn#: %#InterfaceNormal# %P%* ' if a:isactive let l:statusline.=l:active . ' %q%h%w%#StatusLineActiveNoText#' else let l:statusline.=l:normal . ' %q%h%w%#StatusLineNormalNoText#' endif let l:statusline .= "%{&buftype == '' ? '' : ' '}%s" "}}} " file info{{{ if a:isactive == 1 let l:statusline.=l:active 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} ' else let l:statusline.=l:separator endif "}}} " current register{{{ if a:isactive let l:statusline.=l:separator . l:active let l:statusline.=' %#StatusLineActiveQuotes#"' . l:active . '%{v:register}%#StatusLineActiveQuotes#" ' endif "}}} " session status{{{ if a:isactive let l:statusline.=l:separator . l:active let l:statusline.=" %{ObsessionStatus(fnamemodify(v:this_session,':t'),'---')} %*" let l:statusline.=l:separator . l:active endif "}}} " right/left divider{{{ " 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 . '%*%=' "}}} " modified flag {{{ " let l:statusline.='%#StatusLineMod#%M' . l:separator . '%*' "}}} " 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.=' %*' else let l:statusline.='%#StatusLineDir# ' let l:statusline.="%{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.=' %*' endif let l:statusline .= '%#CRNormal#%r' " TODO color "}}} " linter status "{{{ " let l:statusline.= "%{LinterStatus()} " if a:isactive " errors let l:statusline .= " %#CRNoiseDark#%{(GetLinterStatus('error') == 0?'-':'')}" let l:statusline .= "%#InterfaceSignError#%{(GetLinterStatus('error') == 0?'':GetLinterStatus('error'))}" " style errors let l:statusline .= '%#CRNoiseDarker#|' let l:statusline .= "%#CRNoiseDark#%{(GetLinterStatus('style_error') == 0?'-':'')}" let l:statusline .= "%#InterfaceSignErrorDark#%{(GetLinterStatus('style_error') == 0?'':GetLinterStatus('style_error'))} " " warnings let l:statusline .= "%#CRNoiseDark#%{(GetLinterStatus('warning') == 0?'-':'')}" let l:statusline .= "%#InterfaceSignWarning#%{(GetLinterStatus('warning') == 0?'':GetLinterStatus('warning'))}" " style warnings let l:statusline .= '%#CRNoiseDarker#|' let l:statusline .= "%#CRNoiseDark#%{(GetLinterStatus('style_warning') == 0?'-':'')}" let l:statusline .= "%#InterfaceSignWarningDark#%{(GetLinterStatus('style_warning') == 0?'':GetLinterStatus('style_warning'))} " " info let l:statusline .= "%#CRNoiseDark#%{(GetLinterStatus('info') == 0?'-':'')}" let l:statusline .= "%#CRNoiseRed#%{(GetLinterStatus('info') == 0?'':GetLinterStatus('info'))}" else " errors let l:statusline .= " %#CRNoiseDarker#%{(GetLinterStatus('error') == 0?'-':'')}" let l:statusline .= "%#CRNoiseBright#%{(GetLinterStatus('error') == 0?'':GetLinterStatus('error'))}" " style errors let l:statusline .= '%#CRNoiseDarker#|' let l:statusline .= "%{(GetLinterStatus('style_error') == 0?'-':'')}" let l:statusline .= "%#CRNoiseBright#%{(GetLinterStatus('style_error') == 0?'':GetLinterStatus('style_error'))} " " warnings let l:statusline .= "%#CRNoiseDarker#%{(GetLinterStatus('warning') == 0?'-':'')}" let l:statusline .= "%#CRNoise#%{(GetLinterStatus('warning') == 0?'':GetLinterStatus('warning'))}" " style warnings let l:statusline .= '%#CRNoiseDarker#|' let l:statusline .= "%{(GetLinterStatus('style_warning') == 0?'-':'')}" let l:statusline .= "%#CRNoise#%{(GetLinterStatus('style_warning') == 0?'':GetLinterStatus('style_warning'))} " " info let l:statusline .= "%#CRNoiseDarker#%{GetLinterStatus('info') == 0 ? '-' : GetLinterStatus('info')}" endif "}}} return l:statusline endfunction " status line autocommands{{{ augroup status autocmd! autocmd WinEnter * setlocal statusline=%!GetStatus(1) autocmd WinLeave * setlocal statusline=%!GetStatus(0) " autocmd InsertChange * setlocal statusline=%!GetStatus(1) augroup END "}}}}}} " #autocommands{{{ " persistent folds augroup AutoSaveFolds autocmd! autocmd BufWritePost *.* 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 Syntax * syn match ExtraWhitespace /\s\+$\| \+\ze\t/ containedin=ALL augroup END " automatically reload if color scheme file written augroup coloreload au! au BufWritePost customred256.vim so $MYVIMRC augroup end augroup linenumbering autocmd InsertEnter * :set norelativenumber autocmd InsertLeave * :set number relativenumber autocmd WinEnter * :set number relativenumber autocmd WinLeave * set norelativenumber augroup END augroup colorcolumns autocmd WinEnter * set colorcolumn=80 autocmd WinLeave * set colorcolumn=0 augroup END " Automatically reload .vimrc if chanaged augroup myvimrc au! au BufWritePost .vimrc,_vimrc,vimrc,.gvimrc,_gvimrc,gvimrc so $MYVIMRC | if has('gui_running') | so $MYGVIMRC | endif augroup END "}}} " #functions{{{ " TODO better name function! GetStatusFrag(condition, colorname, conditionprefix, text) abort "{{{ let l:frag='%#' . a:colorname . '#' let l:frag.=a:conditionprefix let l:frag.='%{(' . a:condition . ")?'" . a:text . "':''}" return l:frag endfunction"}}} function! CheckLineEnding() abort "{{{ :normal $ if getline('.')[col('.')-1] == ';' || getline('.')[col('.')-1] == ',' :startinsert else :startinsert! endif 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 p :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! LinterStatus() abort "{{{ let l:counts = ale#statusline#Count(bufnr('')) let l:all_errors = l:counts.error + l:counts.style_error let l:all_non_errors = l:counts.total - l:all_errors return l:counts.total == 0 ? 'OK' : printf('%dW %dE', l:all_non_errors, l:all_errors) endfunction "}}} function! GetLinterStatus(key) abort "{{{ let l:linter = ale#statusline#Count(bufnr('')) return l:linter[a:key] endfunction "}}} "}}} " #plugin settings{{{ " vim-peekaboo let g:peekaboo_window = 'vert to 30new' " 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/'}] " youcompleteme let g:ycm_collect_identifiers_from_tags_files = 1 " emmet let g:user_emmet_leader_key='' " taboo.vim set sessionoptions+=tabpages,globals let g:taboo_tab_format = ' %f%m ' let g:taboo_renamed_tab_format = ' %l%m ' let g:taboo_modified_tab_flag = '+' " vue-vim " disable preprocessor checking for vue files - increases speed let g:vue_disable_pre_processors=1 " set custom syntax highlighting augroup fixhighlighting autocmd BufNewFile,BufRead *.vue syntax sync fromstart 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']} let g:ale_html_htmlhint_options = '-c ~/.htmlhintrc --format=unix' let g:ale_fixers = {'javascript': ['eslint']} " ultisnips 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' " Netrw let g:netrw_liststyle=3 let g:netrw_list_hide='^\..*' " bufexploer nnoremap o :BufExplorer " 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'] "}}} " vim: foldmethod=marker