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'
" vim-project-tags
"dependancy needed:
"https://github.com/still-dreaming-1/vim-project-tags
Plugin 'still-dreaming-1/vim-elhiv'
Plugin 'still-dreaming-1/vim-project-tags'
" Ctrlp
Plugin 'ctrlpvim/ctrlp.vim'
" Obsession
Plugin 'tpope/vim-obsession'
" vim-css-color
Plugin 'ap/vim-css-color'
" vim-javascript-syntax
" Plugin 'jelera/vim-javascript-syntax'
" 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'

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required





" #settings
" set t_Sf=<Esc>[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=<Esc>[4%p1%dm  " background coloru

set updatetime=100

set backupdir=~/.vimtmp
set directory=~/.vimtmp

" 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 = "\<space>"

" replace current word with last yanked/deleted text
nnoremap <leader>rr "_diwP
" replace current word with last yanked text
nnoremap <leader>ry diw"0P

inoremap jk <esc>

nnoremap A :call Checksemicolon()<CR>

nnoremap <leader>co :!clear; 
nnoremap <leader>gs :!clear; git status<CR>
nnoremap <leader>gd :!clear; git diff<CR>

" netrw
nnoremap <leader>ex :Ex<CR>
nnoremap <leader>ee :e .<CR>
nnoremap <leader>eq :Rex<CR>

" better window navigaton
nnoremap <C-h> <C-w>h
nnoremap <C-l> <C-w>l
nnoremap <C-k> <C-w>k
nnoremap <C-j> <C-w>j

nnoremap <Esc>j :resize -5<CR>
nnoremap <Esc>k :resize +5<CR>
nnoremap <Esc>l :vertical resize +5<CR>
nnoremap <Esc>h :vertical resize -5<CR>
nnoremap <Esc>= <C-w>=

"location list and quickfix mappings
nnoremap <leader>ll :botright lwindow<CR>
nnoremap <leader>lp :lprev<CR>
nnoremap <leader>ln :lnext<CR>
nnoremap <leader>lc :lclose<CR>
nnoremap <leader>llh :lhistory<CR>
nnoremap <leader>llp :lolder<CR>
nnoremap <leader>lln :lnewer<CR>

nnoremap <leader>qf :botright cwindow<CR>
nnoremap <leader>qp :cprev<CR>
nnoremap <leader>qn :cnext<CR>
nnoremap <leader>qc :cclose<CR>
nnoremap <leader>qfh :chistory<CR>
nnoremap <leader>qfp :colder<CR>
nnoremap <leader>qfn :cnewer<CR>

nnoremap <leader>nh :noh<CR>

" quick grep of visual selection
vnoremap <leader>gr y:grep! -R <C-r>" .

" open quickfix window of TODOs
nnoremap <leader>td :grep! -R '// *TODO' .<CR>:botright cwindow<CR>:echo len(getqflist()) 'TODOs'<CR>

" brace/quotes completion
inoremap {{               {}<left>
inoremap {<CR>    {<CR>}<esc>O
inoremap {;       {<CR>};<esc>O
inoremap }}       {{}}<Left><Left>

inoremap ((           		()<Left>
inoremap (;   		();<Left><Left>

inoremap [[			          []<Left>
inoremap [<CR>		[<CR>]<esc>O

inoremap ""			  ""<Left>
inoremap ";		    "";<Left><Left>
inoremap ''			  ''<Left>
inoremap ';		    '';<Left><Left>

inoremap ;;               ;<esc>

nnoremap <leader>nn :set invrelativenumber<CR>
nnoremap <leader>hl :nohlsearch<CR>

" devdocs mapping
nnoremap <leader>dd :DD<CR>



" #abbreviations
iabbrev adn and
iabbrev waht what
iabbrev tehn then




" #statusline format
set statusline=%#LineNr#
set statusline+=\ \ \ 
set statusline+=%#StatusLineFile#
set statusline+=\  
set statusline+=%#StatusLineMod#
set statusline+=%M      " modified flag
set statusline+=%*
set statusline+=%#StatusLineDir#
set statusline+=\ %{expand('%:p:h:t')}/     " directory tail
set statusline+=%#StatusLineFile#
set statusline+=%{expand('%:t:r')}
set statusline+=%#StatusLineDot#
set statusline+=.
set statusline+=%#StatusLineExt#
set statusline+=%{expand('%:e')}\ 

set statusline+=%*
set statusline+=%q     " quickfix/location list flag
set statusline+=%h     " help file flag
set statusline+=%w     " preview window flag
set statusline+=%r     " read only flag
set statusline+=%#StatusLineNC#
set statusline+=\ 
set statusline+=%*
set statusline+=\ %{strlen(&ft)?&ft:'none'},     " filetype
set statusline+=%{strlen(&fenc)?&fenc:&enc},    " encoding
set statusline+=%{&fileformat}\ 
set statusline+=%#StatusLineNC#
set statusline+=\ 
set statusline+=%*
set statusline+=\ %{&spelllang}\ 
set statusline+=%#StatusLineNC#

set statusline+=%=                              " left/right separator

set statusline+=%#StatusLineNC#
set statusline+=\ 
set statusline+=%*
set statusline+=\ \"%{v:register}\"\ 
set statusline+=%#StatusLineNC#
set statusline+=\ 
set statusline+=%*
set statusline+=\ %{ObsessionStatus(fnamemodify(v:this_session,':t'),'---')}\ " session status

set statusline+=%#InterfaceH2#
set statusline+=\ %{LinterStatus()}

set statusline+=%#InterfaceNormalDark#
set statusline+=\ %P\  " percentage through file
set statusline+=%*



" #autocommands

" persistent folds
augroup AutoSaveFolds
  autocmd!
  autocmd BufWritePost *.* mkview
  autocmd BufWinEnter *.* silent loadview
augroup END

" set custom syntax highlighting
augroup syntaxhighlighting
  autocmd BufNewFile,BufRead *.html set syntax=html_custom
  autocmd BufNewFile,BufRead *.php set syntax=php_custom
  autocmd BufNewFile,BufRead *.vue set syntax=vue_custom
  autocmd BufNewFile,BufRead *.vue syntax sync fromstart
  autocmd BufNewFile,BufRead *.js set syntax=pangloss_javascript_custom
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

function! Checksemicolon()
  :normal $
  if getline('.')[col('.')-1] == ';'
    :startinsert
  else
    :startinsert!
  endif
endfunction

" get name of syntax item
function! SyntaxItem()
  return synIDattr(synID(line('.'),col('.'),1),'name') . ' -> ' . synIDattr(synIDtrans(synID(line('.'),col('.'),1)), 'name' )
endfunction
nnoremap <leader>p :echom SyntaxItem()<CR>

" 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[<SID>Get_env()] . " 'http://devdocs.io/?q="

command! -nargs=* DD silent! call system(len(split(<q-args>, ' ')) == 0 ?
            \ s:stub . &ft . ' ' . expand('<cword>') . "'" : len(split(<q-args>, ' ')) == 1 ?
            \ s:stub . &ft . ' ' . <q-args> . "'" : s:stub . <q-args> . "'")


" use ranger as file manager
if !exists('*RangerExplorer')
	function RangerExplorer()
			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 <Leader>ra :call RangerExplorer()<CR>
endif





" #plugin settings

" gitgutter
nmap ]h <Plug>GitGutterNextHunk
nmap [h <Plug>GitGutterPrevHunk
omap ih <Plug>GitGutterTextObjectInnerPending
omap ah <Plug>GitGutterTextObjectOuterPending
xmap ih <Plug>GitGutterTextObjectInnerVisual
xmap ah <Plug>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='<C-y>'

" 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

" ALE
nnoremap <leader>ne :lnext<cr>
nnoremap <leader>pe :lprev<cr>

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_javascript_eslint_options = '-c ~/.config/eslint/.eslintrc.js'
let g:ale_fixers = {'javascript': ['eslint']}

" function! ale#handlers#eslint#FindConfig(buffer)
"   return '/home/ray/.config/eslint/.eslintrc.js'
" endfunction



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
"nmap <silent> <C-k> <Plug>(ale_previous_wrap)
"nmap <silent> <C-j> <Plug>(ale_next_wrap)

" ultisnips
let g:UltiSnipsSnippetsDir="~/.vim/UltiSnips"
" Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe.
let g:UltiSnipsExpandTrigger='<c-j>'
let g:UltiSnipsJumpForwardTrigger='<c-b>'
let g:UltiSnipsJumpBackwardTrigger='<c-z>'
let g:UltiSnipsEditSplit='horizontal'

" Netrw
let g:netrw_liststyle=3
let g:netrw_list_hide='^\..*'

" NERDtree
" nnoremap <F3> :NERDTreeFocus<CR>
" nnoremap <leader>nt :NERDTreeFocus<CR>
" nnoremap <leader>nf :NERDTreeFind<CR>
" " allow closing if only window open is a NERDTree
" augroup nerdtreewindow
"   autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" augroup END
" let NERDTreeQuitOnOpen = 1

" TagBar
nnoremap <leader>tb :TagbarOpen fj<CR>
let g:tagbar_autoclose = 1


" tagbar css/scss thingy
nnoremap <leader>] :tag /[.#@]<c-r>=expand('<cword>')<cr><cr>


" bufexploer
nnoremap <leader>o :BufExplorer<CR>

" undotree
nnoremap <leader>ut :UndotreeToggle<cr>

" vim-project-tags
source ~/.vim/bundle/vim-elhiv/elhiv.vim

" override function so we can have custom tag names for built in languages
" function! project_tags#add_built_in_language_support()
" 	call project_tags#add_language('.jstags', 'js')
" 	call project_tags#add_language('.vimtags', 'vim')
" 	call project_tags#add_language('.phptags', 'php')
" endfunction

" above function causes error (maybe autoloading problem when no
" tags are being used or whatever?)
" see if following three lines work instead
call project_tags#add_language('.jstags', 'js')
call project_tags#add_language('.vimtags', 'vim')
call project_tags#add_language('.phptags', 'php')

call project_tags#add_language('.csstags','css')
call project_tags#add_language('.scsstags','scss')

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




" ze end