filetype plugin indent on
syntax on

colorscheme habamax

set nobackup nowritebackup
set noswapfile

set number

set tabstop=8
set shiftwidth=4
set softtabstop=4
set expandtab
set autoindent
set smarttab

set mouse=a

set laststatus=2

set scrolloff=5

set ignorecase
set hlsearch
set incsearch

set nowrap

set timeoutlen=1000
set ttimeoutlen=0
set hidden
set wildmenu
set clipboard=unnamed,unnamedplus
set colorcolumn=75
"set backspace=indent,eol,start

set updatetime=100
set signcolumn=auto

" ----- Custom Functions --------------------------------------------------
" Align regex
command! -nargs=? -range Align <line1>,<line2>call AlignSection('<args>')
vnoremap <silent> <Leader>a :Align<CR>
function! AlignSection(regex) range
    let extra = 1
    let sep = empty(a:regex) ? '=' : a:regex
    let maxpos = 0
    let section = getline(a:firstline, a:lastline)
    for line in section
        let pos = match(line, ' *'.sep)
        if maxpos < pos
            let maxpos = pos
        endif
    endfor
    call map(section, 'AlignLine(v:val, sep, maxpos, extra)')
    call setline(a:firstline, section)
endfunction

function! AlignLine(line, sep, maxpos, extra)
    let m = matchlist(a:line, '\(.\{-}\) \{-}\('.a:sep.'.*\)')
        if empty(m)
        return a:line
    endif
    let spaces = repeat(' ', a:maxpos - strlen(m[1]) + a:extra)
    return m[1] . spaces . m[2]
endfunction

" Window Operations
function! CreateOrSelectWindow()
    let win_count = winnr('$')

    if win_count == 1
        execute 'vsplit'
    endif

    execute '2wincmd w'
endfunction

function! PutIntoShade()
    let max_width = float2nr(&columns * 0.95)
    let min_width = float2nr(&columns * 0.5)

    if winwidth(0) > min_width
        execute 'vertical resize ' . min_width
    elseif winwidth(0) <= min_width
        execute 'vertical resize ' . max_width
    endif
endfunction

" Preserve paste line column
function! PasteAbove()
    let c = col('.')
    normal! P
    call cursor(0, c)
endfunction

function! PasteBelow()
    let c = col('.')
    normal! p
    call cursor(0, c)
endfunction

" ----- Custom Keymaps ----------------------------------------------------
nnoremap <silent> K <Nop>

vnoremap <silent> > >:normal gv<CR>
vnoremap <silent> < <:normal gv<CR>

vnoremap <silent> J :m '>+1<CR>gv=gv
vnoremap <silent> K :m '<-2<CR>gv=gv

nnoremap <silent> H :bnext<CR>zz
nnoremap <silent> L :bprev<CR>zz

nnoremap <silent> , :copen<CR>
nnoremap <silent> > :cn<CR>
nnoremap <silent> < :cp<CR>

nnoremap <silent> g/ :noh<CR>

nnoremap <silent> E :Ex<CR>

nnoremap <silent> <space>z :set relativenumber!<CR>
nnoremap <silent> <space>x :set wrap!<CR>

nnoremap gb :make<CR>
nnoremap gr :make run<CR>

nnoremap <silent> gw :close<CR>
nnoremap <silent> gq :bdelete<CR>

nnoremap <silent> ! :1wincmd w<CR>
nnoremap <silent> @ :call CreateOrSelectWindow()<CR>
nnoremap <silent> # :call PutIntoShade()<CR>

nnoremap <silent> P :call PasteAbove()<CR>
nnoremap <silent> p :call PasteBelow()<CR>

" ----- Highlights --------------------------------------------------------
" Todo Comments highlights
" Colors: https://vim.fandom.com/wiki/Xterm256_color_names_for_console_Vim
" NOTE: These are confirmed to work with 'habamax' color scheme.
highlight TODOPerf    term=bold,underline cterm=bold,underline ctermfg=93  " purple
highlight TODOHack    term=bold,underline cterm=bold,underline ctermfg=214 " orange
highlight TODOTodo    term=bold,underline cterm=bold,underline ctermfg=51  " cyan
highlight TODONote    term=bold,underline cterm=bold,underline ctermfg=46  " green
highlight TODOFix     term=bold,underline cterm=bold,underline ctermfg=196 " green
highlight TODOWarning term=bold,underline cterm=bold,underline ctermfg=214 " orange

augroup HiglightTODO
    autocmd!
    autocmd WinEnter,VimEnter * :silent! call matchadd('TODOPerf',    'PERF:',    -1)
    autocmd WinEnter,VimEnter * :silent! call matchadd('TODOHack',    'HACK:',    -1)
    autocmd WinEnter,VimEnter * :silent! call matchadd('TODOTodo',    'TODO:',    -1)
    autocmd WinEnter,VimEnter * :silent! call matchadd('TODONote',    'NOTE:',    -1)
    autocmd WinEnter,VimEnter * :silent! call matchadd('TODOFix',     'FIX:',     -1)
    autocmd WinEnter,VimEnter * :silent! call matchadd('TODOWarning', 'WARNING:', -1)
augroup END
