set nocompatible              " be iMproved, required
filetype off                  " required
set ttyfast

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
" Nerdtree and nerdtree-git
Plugin 'scrooloose/nerdtree.git'
Plugin 'Xuyuanp/nerdtree-git-plugin'
"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'
" gutentag
"Plugin 'ludovicchabant/vim-gutentags'
" 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'
" vim-mucomplete
" https://github.com/lifepillar/vim-mucomplete
Plugin 'lifepillar/vim-mucomplete'
" 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?

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList       - lists configured plugins
" :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

colorscheme customred256

" tags file set tags=tags;/

" ignore case when searching
set ignorecase
" unless search contains uppercase
set smartcase

" allow hidden buffers
set hidden

set bg=dark
" set number
set nonumber
set autoindent

" set width of the fold column to create a margin
set foldcolumn=2


" key mappings
let g:mapleader = "\<space>"

" jk acts as escape in insert,visual/select modes
inoremap jk <esc>
"inoremap <esc> <nop>

" disable arrow keys
"noremap <Up> <nop>
"noremap <Down> <nop>
"noremap <Left> <nop>
"noremap <Right> <nop>

" 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

" better window resizing
" need to use <Esc>j because urxvt sends the character prefixed with Escape
" instead of setting the eighth bit
" see https://unix.stackexchange.com/a/199705
nnoremap <Esc>j :resize +1<CR>
nnoremap <Esc>k :resize -1<CR>
nnoremap <Esc>l :vertical resize +1<CR>
nnoremap <Esc>h :vertical resize -1<CR>

nnoremap <leader>ep :lprev<CR>
nnoremap <leader>en :lnext<CR>


" brace/quotes completion
inoremap {{			{<CR><Tab><CR>}<Up><Right>
inoremap ((			()<Left>
inoremap ""			""<Left>
inoremap ''			''<Left>
inoremap [[			[]<Left>

" abbreviations
iabbrev adn and
iabbrev waht what
iabbrev tehn then




" statusline format
set statusline=\ %F\   " filename and path
"set statusline+=%{SyntaxItem()}
set statusline+=%h     " help file flag
set statusline+=%w     " preview window flag
set statusline+=%m     " modified flag
set statusline+=%r     " read only flag
set statusline+=\ 
set statusline+=[%{strlen(&ft)?&ft:'none'},     " filetype
set statusline+=%{strlen(&fenc)?&fenc:&enc},    " encoding
set statusline+=%{&fileformat}]\                " file format
set statusline+=%{&spelllang}\ \ \ \ \          " Spell language
set statusline+=%{fugitive#statusline()}

set statusline+=%=                              " left/right separator
set statusline+=[\ %{v:register}\ ]\            " active register 
set statusline+=[%{ObsessionStatus(fnamemodify(v:this_session,':t'),'---')}]\ \ " session status

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

set statusline+=%#InterfaceNormal#
set statusline+=\ %l\ 
set statusline+=%#InterfaceNormalDark#
set statusline+=(%P)
set statusline+=%*

" always show statusline
set laststatus=2

" set a right margin and it's colour
set colorcolumn=100

set foldmethod=manual

syntax on
" tabs
"set tabstop=2      " leave at default
set expandtab       " tab inserts 'softtabstop' number of spaces
" set following with autocommands to override filetype plugin indent
au Filetype * let &l:softtabstop=2   " 
au Filetype * let &l:shiftwidth=2    " affects what happens with >>,<<,== and automatic indentation	
set shiftround      " round indent to multiples of shiftwidth
set autoindent      " copy indent from current line over to new line
set mouse=a

filetype plugin indent on   " file type based indentation

" rewrapping set to 80
set tw=180
" disable automatic wrapping
set fo=cq
" disable wrapping based on terminal size
set wm=0

set t_Co=8
set t_Sf=<Esc>[3%p1%dm
set t_Sb=<Esc>[4%p1%dm

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode


" set custom syntax highlighting
autocmd BufNewFile,BufRead *.html set syntax=html_custom
autocmd BufNewFile,BufRead *.php set syntax=php_custom


" fix higlight problems such as vertical-align etc
augroup VimCSS3Syntax
  autocmd!

  autocmd FileType css setlocal iskeyword+=-
augroup END


" autocommands
" automatically reload if color scheme file written
augroup coloreload
  au!
	au BufWritePost customred256.vim so $MYVIMRC
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


" persisitent undo file
set undodir=/home/ray/.vim/undodir
set undofile



" Functions

" 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>



" plugins stuff

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

" MUcomplete
set completeopt+=menuone
let g:mucomplete#enable_auto_at_startup = 1
inoremap <expr> <c-e> mucomplete#popup_exit("\<c-e>")
inoremap <expr> <c-y> mucomplete#popup_exit("\<c-y>")
inoremap <expr>  <cr> mucomplete#popup_exit("\<cr>")
set completeopt+=noselect
set completeopt+=noinsert

set complete-=i
set complete-=t
let g:mucomplete#chains = { 'default' : ['tags', 'c-p', 'incl'] }
let g:mucomplete#popup_direction = { 'path' : 1, 'c-p': 1, 'tags': 1, 'incl': 1 }
set shortmess+=c   " Shut off completion messages
set belloff+=ctrlg " If Vim beeps during completion
	
call add(g:mucomplete#chains['default'], 'ulti')

" ALE
let g:ale_sign_error = '>>'
let g:ale_sign_warning = '--'
let g:ale_sign_column_always = 1

"let g:ale_linters = {'scss': ['stylelint'], 'javascript': ['jshint'], 'php':['php'], 'html':['htmlhint']}
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']}
"let g:ale_javascript_prettier_options = '--single-quote '

" override ALE's eslint fix function to use correct config file
function! ale#fixers#eslint#Fix(buffer) abort
    let l:executable = ale#handlers#eslint#GetExecutable(a:buffer)
    return {
    \   'command': ale#node#Executable(a:buffer, l:executable)
    \       . ' --config /home/ray/.config/eslint/.eslintrc.js'     
    \       . ' --fix %t',
    \   'read_temporary_file': 1,
    \}
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', all_non_errors, all_errors)
endfunction
"nmap <silent> <C-k> <Plug>(ale_previous_wrap)
"nmap <silent> <C-j> <Plug>(ale_next_wrap)

"wordpress.vim
"let g:wordpress_vim_wordpress_path = "~/Projects/Wordpress/WordpressSource"
"let g:wordpress_vim_ctags_path = "/usr/bin/ctags"

" syntastic

"let g:syntastic_always_populate_loc_list = 1
"let g:syntastic_auto_loc_list = 0
"let g:syntastic_check_on_open = 1
"let g:syntastic_check_on_wq = 0
"let g:syntastic_stl_format = "[%E{%e E: %fe}%B{,} %W{%w W: %fw}]"

"let g:syntastic_scss_checkers = ['sass_lint']
"let g:syntastic_scss_sass_lint_args = "-v -c /home/ray/.config/sass-lint/sass-lint.yml"

" ultisnips
" Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe.
let g:UltiSnipsExpandTrigger="<leader>u"
let g:UltiSnipsJumpForwardTrigger="<c-b>"
let g:UltiSnipsJumpBackwardTrigger="<c-z>"

" NERDtree
nnoremap <F3> :NERDTreeFocus<CR>
nnoremap <leader>nt :NERDTreeFocus<CR>
" allow closing if only window open is a NERDTree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
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
call project_tags#add_language('.phptags','php')
call project_tags#add_language('.jstags','js')
call project_tags#add_language('.vimtags','vim')
call project_tags#add_language('.css','css')
call project_tags#add_language('.scss','scss')

" jsut some example text one two three four five Six "Seven"

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

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





" ze end