"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" .vimrc
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" User-specified ~/.vimrc, compatible with vim on GNU/Linux and Apple OS X
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~




"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" Functionality setup
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


" Source a global configuration file if available
if filereadable("/etc/vim/vimrc.local")
	source /etc/vim/vimrc.local
endif

" Uncomment the following to have Vim jump to the last position when reopening
" a file
if has("autocmd")
	au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif

" Uncomment the following to have Vim load indentation rules and plugins
" according to the detected filetype.
if has("autocmd")
	filetype plugin indent on
endif

" Use plugin manager if available
if (filereadable($HOME."/.vim/autoload/plug.vim")) || (filereadable("/usr/share/vim/vimfiles/autoload/plug.vim"))
	let g:use_pluggin_manager = 1
else
	let g:use_pluggin_manager = 0
endif



"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" Syntax highlighting
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


if has("syntax")
	set t_Co=256
	syntax on
	" Uncomment the following 'let' lines if using xter16 color scheme
	" Select colormap: 'soft', 'softlight', 'standard', or 'allblue'
	let xterm16_colormap = 'allblue'
	" Select brightness: 'low', 'med', 'high', 'default', or custom levels
	let xterm16_brightness = 'high'
	"Other override options:
	let xterm16fg_Cursor = '555'
	let xterm16bg_Normal = 'none'
	"Set color scheme
	colorscheme xterm16
endif

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
set background=dark



"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" General options selection
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


set showcmd                     " Show (partial) command in status line.
set showmatch                   " Show matching brackets.
set ignorecase                  " Do case insensitive matching
set smartcase                   " Do smart case matching
set mouse=a                     " Enable mouse usage (all modes)
set hlsearch                    " Turn on search highlighting
set shiftwidth=4                " Auto-indent amount when using cindent, <<, >>, etc.
set softtabstop=4               " How many spaces represent a tab
set tabstop=4                   " Real tab size
set autoindent                  " Indent level of new line set by previous line
set cindent                     " Attempt to intelligently guess level of indent for new line
set cinkeys-=0#                 " Don't un-indent comments
set indentkeys-=0#              " Don't un-indent comments
set nf=octal,hex,alpha          " additional ctrl-a increments
set spell spelllang=en_us       " Set spell check language
set scrolloff=5                 " Add visible lines beyond cursor at top or bottom of window
set linebreak                   " Soft wrap whole words together
set breakindent                 " Indent linebreaks to match
set showbreak=\ \ \ ⇲           " Visual linebreak indicator
set updatetime=100              " Make some plugins snappier
set backspace=indent,eol,start  " Fix OS X backspace behavior
set ruler                       " Fix OS X missing ruler



"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" Filetype-specific options
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


autocmd FileType plaintex,tex,latex syntax spell toplevel
autocmd FileType plaintex,tex,latex set tw=80
autocmd FileType tex,latex let g:tex_flavor = 'latex'
autocmd FileType pug,jade set tw=80
autocmd FileType text set tw=80 nocindent

autocmd BufNewFile,BufRead *.cu set filetype=c
autocmd BufNewFile,BufRead *.tp set filetype=taskpaper

aug python
	" to override ftype/python.vim
	autocmd FileType python setlocal ts=4 sts=4 sw=4 noexpandtab
aug end

syntax spell toplevel




"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" Key mapping customizations
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


" Turn off search highlighting with Enter
nnoremap <silent> <C-@> :nohlsearch<CR>
nnoremap <silent> <C-l> :GitGutter<CR>:nohlsearch<CR><C-l>
nnoremap <silent> <CR> :nohlsearch<CR><CR>

" Center page on search
noremap n nzz
noremap N Nzz
noremap * *zz
noremap # #zz
noremap g* g*zz
noremap g# g#zz

" Better scrolling keys
noremap <C-n> <C-e>
noremap <C-p> <C-y>
inoremap <C-n> <C-o><C-e>
inoremap <C-p> <C-o><C-y>

" Allow saving files with sudo after starting vim
cmap w!! w !sudo tee > /dev/null %



"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" Plugin helper functions
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


" Build script when installing/updating YouCompleteMe
function! BuildYCM(info)
	" info is a dictionary with 3 fields
	" - name:   name of the plugin
	" - status: 'installed', 'updated', or 'unchanged'
	" - force:  set on PlugInstall! or PlugUpdate!
	if a:info.status == 'installed' || a:info.force
		" YCM dependencies for --all option:
		" gcc, make, cmake, python3, clang, mono, go, node.js, npm, rust, jdk8
		!./install.py --all
	endif
endfunction


" Pick a more convenient spot for the latency from loading YCM
let g:YouCompleteMeLazyLoaded = 0
function! LazyLoadingYMC()
	if g:YouCompleteMeLazyLoaded == 0
		let g:YouCompleteMeLazyLoaded = 1
		call plug#load('YouCompleteMe') | call youcompleteme#Enable()
	endif
endfunction
if g:use_pluggin_manager == 1
	autocmd BufRead * call timer_start(1, {id->execute('call LazyLoadingYMC()')} )
	" (also try BufWinEnter, InsertEnter, or CursorHold and CursorHoldI events)
endif


" Enable vimtex completions for YCM
function! VimtexYCMSetup()
	if !exists('g:ycm_semantic_triggers')
		let g:ycm_semantic_triggers = {}
	endif
	if exists('g:vimtex#re#youcompleteme')
		let g:ycm_semantic_triggers.tex=g:vimtex#re#youcompleteme
	endif
endfunction
if has("autocmd")
	autocmd VimEnter * call VimtexYCMSetup()
endif



"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" Plugin setup with vim-plug
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


" Use with :PlugInstall and :PlugUpdate

"if exists('g:use_pluggin_manager') && g:use_pluggin_manager
if g:use_pluggin_manager == 1
	" Set custom plugin directory
	call plug#begin('~/.vim/vim-plug')

	Plug 'ycm-core/YouCompleteMe', { 'do': function('BuildYCM'), 'on': [] }
	Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
	Plug 'dense-analysis/ale'
	Plug 'airblade/vim-gitgutter'
	Plug 'godlygeek/tabular'
	Plug 'tpope/vim-surround'
	Plug 'tpope/vim-unimpaired'
	Plug 'tpope/vim-speeddating'
	Plug 'tpope/vim-repeat'
	Plug 'lervag/vimtex'

	call plug#end()
endif



"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" Plugin options
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


" Close the YCM preview window automatically
let g:ycm_autoclose_preview_window_after_insertion = 1
let g:ycm_autoclose_preview_window_after_completion = 1

" Suggest language keywords
let g:ycm_seed_identifiers_with_syntax = 1

" Start with ale linting disabled
let g:ale_enabled = 0



"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" Plugin key mappings
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


" (optionally press / instead of _ for :NERDTreeToggle)
nnoremap <C-_> :NERDTreeToggle<CR>
nnoremap <F2> :ALEToggle<CR>
nmap <silent> [W <Plug>(ale_first)
nmap <silent> ]W <Plug>(ale_last)
nmap <silent> [w <Plug>(ale_previous_wrap)
nmap <silent> ]w <Plug>(ale_next_wrap)
nmap <silent> [e <Plug>(ale_previous_wrap_error)
nmap <silent> ]e <Plug>(ale_next_wrap_error)



"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" End
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~