" Manage plugins using vim-plug
"if ! exists('*plug#begin')
"	echo "Downloading junegunn/vim-plug to manage plugins..."
"endif
"
call plug#begin()
Plug 'alvan/vim-closetag'
Plug 'ap/vim-css-color'
Plug 'junegunn/goyo.vim'
Plug 'vimwiki/vimwiki'
call plug#end()

"" Basic options
set autochdir			" Always change directory to current file
set autoindent			" Keeps indentation on new lines
set hlsearch			" Highlight search hits
set ignorecase			" Case-insensitive search...
set linebreak			" Word wrap
set list			" Show whitespace characters defined in listchars
set listchars=tab:⇥\ \,space:·	" Highlight tabs and spaces
set mouse=a			" Because sometimes it's just easier to use the mouse
set number relativenumber	" Enable relative line numbers
set smartcase			" ...Unless the search term is capital
set splitbelow splitright	" Open splits on bottom/right instead of top/left
set termguicolors		" Enable GUI colors for the terminal to get truecolor
set wildmode=longest,list,full	" Enable file auto-complete
syntax on			" Enable syntax highlighting

" Get rid of the pointless .viminfo files that clutter the home directory
let skip_defaults_vim=1
set viminfo=""

" Disables automatic commenting on newline:
autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o

"" Plugin options
" Closetag
let g:closetag_filenames = '*.html,*.xhtml,*.phtml'
" VimWiki
let g:vimwiki_list = [{'path': '~/docs/school/arc/docs/wiki/', 'path_html': '~/docs/school/arc/docs/wiki/site/'}]

" Filetype options
autocmd BufRead,BufNewFile *.tex set filetype=tex
au Filetype tex let b:autopairs_enabled = 0
au Filetype tex setlocal indentexpr=
au BufRead,BufNewFile *.tssg set filetype=tssg

"" Keybindings
" Set leader-key to comma
let mapleader =","
" Invoke goyo with comma-m
nmap <leader>m :Goyo 120x<CR>
" Invoke spellcheck mode with comma-l
nmap <leader>l :setlocal spell! spelllang=en_us<CR>
" Set cursorcolumn with comma-c
nmap <leader>c :set cursorcolumn!<CR>
" Navigate faster than hjkl with ctrl-hjlk
nmap <C-h> 0
nmap <C-j> <C-d>
nmap <C-k> <C-u>
nmap <C-l> $
" Faster split navigation (leader-wasd, as opposed to ctrl-w + hjlk)
map <leader>a <C-w>h
map <leader>s <C-w>j
map <leader>w <C-w>k
map <leader>d <C-w>l
" Keys for tab navigation
nmap <leader><TAB> gt
nmap <leader>t :tabnew<CR>
nmap <C-T> :tabnew<CR>
" Copy and cut with standard bindings
map <C-c> "+y
map <C-x> "+x
" Unmap Ex mode
map Q <NOP>
" Perform dot commands over visual blocks:
vnoremap . :normal .<CR>
" Save file as sudo on files that require root permission
cnoremap w!! execute 'silent! write !doas tee % >/dev/null' <bar> edit!
" Camel case every word on the line
nmap gcc :s/\v<(.)(\w*)/\u\1\L\2/g<CR>
nmap gCC :%s/\v<(.)(\w*)/\u\1\L\2/g<CR>
" HTML shortcuts
nmap gwp I<p><ESC>l4xA</p><ESC>
nmap gwh1 I<h1><ESC>l5xA</h1><ESC>
nmap gwh2 I<h2><ESC>l5xA</h2><ESC>
nmap gwh3 I<h3><ESC>l5xA</h3><ESC>

"" Extra functionality
" Colorscheme for root and normal users (since vimrc is just symlinked to the root user's home)
if ($USER) == 'root'
	colorscheme koehler
else
"	if empty($DISPLAY)
"		colorscheme koehler
"	else
		set bg=dark
		let g:gruvbox_contrast_dark = 'hard'
		colorscheme gruvbox-timmy
"	endif
endif

" Functions for changing the terminal emulator's class name to 'Vim'
function GetTermPID(temu)
	let pinfo = ['', getpid(), '']
	while !(pinfo[2] =~ a:temu || pinfo[1] == '0')
		let pinfo = split(system('ps h -o pid,ppid,command= -p' . pinfo[1]))
	endwhile
	return pinfo[0]
endfunction

function SetTermClassName(termpid, name)
	" Command chaining in xdotool doesn't work here for some reason
	silent exec "!xdotool set_window --class " . a:name . " $(xdotool search --pid " . a:termpid . ")"
endfunction

" Behaviors exclusive to either a tty or a graphical terminal emulator
if empty($DISPLAY)
	" Clear the tty screen after exiting vim
	autocmd VimLeave * :clear
else
	" Highlight current line
	set cursorline
	" Change window title
	autocmd BufEnter * :set title
	let &titleold="st"
	" Change class name
	let temu = "st"
	let temupid = GetTermPID(temu)
	if (temupid != 1)
		autocmd VimEnter * call SetTermClassName(temupid, "Vim")
		autocmd VimLeave * call SetTermClassName(temupid, temu)
	endif
endif

" Automatically deletes all trailing whitespace on save
function DelWS()
	let l:save_view = winsaveview()
	:%s/\s*$//e
	call winrestview(l:save_view)
endfunction
autocmd BufWritePre * call DelWS()


" vim -b : edit binary using xxd-format!
augroup Binary
  au!
  au BufReadPre  *.bin let &bin=1
  au BufReadPost *.bin if &bin | %!xxd
  au BufReadPost *.bin set ft=xxd | endif
  au BufWritePre *.bin if &bin | %!xxd -r
  au BufWritePre *.bin endif
  au BufWritePost *.bin if &bin | %!xxd
  au BufWritePost *.bin set nomod | endif
augroup END