" XDG Specifications
let rtp=&runtimepath
set runtimepath=~/.config/vim
let &runtimepath.=','.rtp.',~/.config/vim/after'
set directory=~/.config/vim/swap//,.,~/tmp,/var/tmp,/tmp
set backupdir=~/.config/vim/backup//,.,~/tmp,~/
set spellfile=~/.config/vim/spell/en.utf-8.add
set viminfo+=n~/.config/vim/viminfo
set viewdir=~/.config/vim/view/
set undodir=~/.config/vim/undo//,.

" Preferences
let mapleader = "\<Space>"
set list listchars=tab:⎸\ ,trail:~
set clipboard=unnamedplus
set gp=git\ grep\ -n
set shellcmdflag=-c
set encoding=utf-8
set relativenumber
filetype plugin on
set shiftwidth=4
set nocompatible
set cursorline
set ignorecase
set smartcase
set expandtab
set autoread
set wildmenu
set hlsearch
set swapfile
set undofile
set mouse=a
set showcmd
set number
syntax on

if (empty($TMUX) && getenv('TERM_PROGRAM') != 'Apple_Terminal')
    if (has("nvim"))
        let $NVIM_TUI_ENABLE_TRUE_COLOR=1
    endif
    if (has("termguicolors"))
        set termguicolors
    endif
endif

" Keybinds
noremap <F5> :setlocal spell! spelllang=en<CR>
noremap <F6> :setlocal spell! spelllang=es<CR>
noremap <F8> :TagbarToggle<CR>
noremap <C-e> !!$SHELL<CR>
noremap <tab> :bn<CR>
noremap <C-c> :bd<CR>
noremap <C-s> :w<CR>
noremap <A-h> 5<C-w><
noremap <A-j> 5<C-w>-
noremap <A-k> 5<C-w>+
noremap <A-l> 5<C-w>>
noremap H :nohl<CR>
noremap <leader><Space> za

autocmd BufWinLeave *.* mkview

" QuickFix
autocmd QuickFixCmdPost [^l]* nested cwindow
autocmd QuickFixCmdPost    l* nested lwindow
autocmd QuickFixCmdPost     * if &ft ==# 'qf' | wincmd J | endif

function! WrapQuickfixNext()
    try
        execute 'cnext'
    catch /^Vim\%((\a\+)\)\=:E553/
        cfirst
    endtry
endfunction
function! WrapQuickfixPrev()
    try
        execute 'cprevious'
    catch /^Vim\%((\a\+)\)\=:E553/
        clast
    endtry
endfunction

nnoremap <silent> <Leader>n :call WrapQuickfixNext()<CR>
nnoremap <silent> <Leader>p :call WrapQuickfixPrev()<CR>
nnoremap <leader>m :make<CR><CR>
nnoremap <F9> :make<CR><CR>

" c/c++
autocmd FileType c :compiler gcc | setlocal makeprg=gcc\ -Wall\ -c\ %
autocmd FileType cpp :compiler gcc | setlocal makeprg=g++\ -Wall\ -c\ %

" groff
autocmd FileType troff noremap <buffer> <silent> <F9> :!zathura --fork %:r.pdf<CR> & disown
autocmd FileType troff noremap <buffer> <C-s> :w<CR> :!grofftex %<CR><CR>

" Python
autocmd FileType python noremap <buffer> <F9> :!python %<CR>

function! SetMakeprg()
    if filereadable('Makefile')
        set makeprg=make
    else
    endif
endfunction
autocmd VimEnter * call SetMakeprg()

" Functions

"Open a shell on a vertical split
set splitright
function OpenTerminal()
    execute "normal \<C-l>"
    execute "normal \<C-l>"
    execute "normal \<C-l>"
    execute "normal \<C-l>"

    let bufNum = bufnr("%")
    let bufType = getbufvar(bufNum, "&buftype", "not found")

    if bufType == "terminal"
        execute "q"
    else
        execute "bot sp term://bash"
        execute "resize -8"
        execute "set nonu"
        execute "set nornu"
        silent au BufLeave <buffer> stopinsert!
        silent au BufWinEnter,WinEnter <buffer> startinsert!
        execute "tnoremap <buffer> <C-h> <C-\\><C-n><C-w><C-h>"
        execute "tnoremap <buffer> <C-t> <C-\\><C-n>:q<CR>"
        execute "tnoremap <buffer> <C-\\><C-\\> <C-\\><C-n>"
        execute "IndentLinesDisable"

        startinsert!
    endif
endfunction
nnoremap <C-t> :call OpenTerminal()<CR>