set runtimepath^=$XDG_CONFIG_HOME/vim
set runtimepath+=$XDG_DATA_HOME/vim
set runtimepath+=$XDG_CONFIG_HOME/vim/after

set packpath^=$XDG_DATA_HOME/vim,$XDG_CONFIG_HOME/vim
set packpath+=$XDG_CONFIG_HOME/vim/after,$XDG_DATA_HOME/vim/after

let g:netrw_home = $XDG_DATA_HOME."/vim"
call mkdir($XDG_DATA_HOME."/vim/spell", 'p')

set backupdir=$XDG_STATE_HOME/vim/backup | call mkdir(&backupdir, 'p')
set directory=$XDG_STATE_HOME/vim/swap   | call mkdir(&directory, 'p')
set undodir=$XDG_STATE_HOME/vim/undo     | call mkdir(&undodir,   'p')
set viewdir=$XDG_STATE_HOME/vim/view     | call mkdir(&viewdir,   'p')

if !has('nvim') | set viminfofile=$XDG_STATE_HOME/vim/viminfo | endif

" vimplugs {{{
call plug#begin('~/.config/nvim/plugged')
" colorschemes {{{
Plug 'tomasiser/vim-code-dark'                          " codedark color scheme
Plug 'flazz/vim-colorschemes'                           " meta-color scheme package
Plug 'tomasiser/vim-code-dark'                          " codedark color scheme
Plug 'flazz/vim-colorschemes'                           " meta-color scheme package
Plug 'ZachIndigo/vim-preglow'                           " my old color scheme
" }}}
" language support {{{
Plug 'axvr/org.vim'                                     " basic org markup language implementation
Plug 'ziglang/zig.vim'                                  " zig programming language
Plug 'jdonaldson/vaxe'                                  " haxe programming language
Plug 'xuhdev/vim-latex-live-preview', { 'for': 'tex' }  " latex live preview support
Plug 'waycrate/swhkd-vim'                               " swhkd syntax highlighting
Plug 'HiPhish/guile.vim'                                " guile syntax highlighting
" }}}
" utility {{{
Plug 'preservim/nerdtree'                               " directory tree interface
Plug 'Xuyuanp/nerdtree-git-plugin'                      " git status indicator for nerdtree
Plug 'PhilRunninger/nerdtree-visual-selection'          " allows visual selection mode in nerdtree
Plug 'tpope/vim-fugitive'                               " git command interface
Plug 'junegunn/goyo.vim'                                " simplify the user interface (distraction-free)  [BROKEN]
Plug 'junegunn/limelight.vim'                           " focus on single paragraph of text at a time
Plug 'vim-airline/vim-airline'                          " powerline the vim bottom bar
Plug 'nathanaelkane/vim-indent-guides'                  " indent guides for vim
Plug 'mhinz/vim-signify'                                " use signs to show diffs
Plug 'tpope/vim-endwise'                                " auto end functions/if statements
Plug 'tpope/vim-surround'                               " auto close stuff
Plug 'mattn/emmet-vim'                                  " html css easy formating
Plug 'godlygeek/tabular'                                " Needed for vim-markdown
Plug 'plasticboy/vim-markdown'                          " Better markdown support
Plug 'ryanoasis/vim-devicons'                           " dev icons for nerdtree
" }}}
call plug#end()

" }}}
" nvim options {{{

"" nvimrc:
"" General

set showmatch " Highlight matching brace

set number
set relativenumber

colorscheme Dark2
 
set hlsearch                    " Highlight all search results
set smartcase                   " Enable smart-case search
set incsearch                   " Searches for strings incrementally
 
set expandtab                   " Use spaces instead of tabs
set shiftwidth=2                " Number of auto-indent spaces
set smartindent                 " Enable smart-indent
set smarttab                    " Enable smart-tabs
set softtabstop=2               " Number of spaces per Tab

"" Advanced
set ruler                       " Show row and column ruler information
set undolevels=1000             " Number of undo levels
set backspace=indent,eol,start  " Backspace behaviour
filetype plugin indent on
 
"" GUI Config
set guifont=mononoki\ Nerd\ Font\ Mono:h12

"hi Normal guibg=NONE ctermbg=NONE
"hi NonText guibg=NONE ctermbg=NONE
"set background=dark

set foldmethod=marker

set conceallevel=2

" set leader key

let mapleader="'"

" emmet {{{
let g:user_emmet_leader_key='<C-a>'
" }}}

" zig config {{{
let g:zig_fmt_autosave = 1
" }}}

" latex live preview {{{
let g:livepreview_previewer = 'zathura'
let g:livepreview_use_biber = 1
let g:livepreview_cursorhold_recompile = 0
" }}}

" vim-markdown {{{
let g:vim_markdown_folding_disabled = 1
let g:vim_markdown_folding_level = 3
let g:vim_markdown_toc_autofit = 1
let g:vim_markdown_emphasis_multiline = 0
let g:tex_conceal = ""
let g:vim_markdown_math = 1
let g:vim_markdown_conceal_code_blocks = 1
let g:vim_markdown_fenced_languages = ['c++=cpp', 'viml=vim', 'bash=sh', 'ini=dosini']
let g:vim_markdown_follow_anchor = 1
let g:vim_markdown_math = 1
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_toml_frontmatter = 1
let g:vim_markdown_strikethrough = 1
let g:vim_markdown_no_extensions_in_markdown = 1
let g:vim_markdown_autowrite = 1
let g:vim_markdown_auto_insert_bullets = 0
let g:vim_markdown_new_list_item_indent = 0
let g:vim_markdown_edit_url_in = 'tab'
" }}}

" NERDTree config {{{
let g:NERDTreeGitStatusUseNerdFonts = 1 " use nerd fonts
let g:NERDTreeGitStatusShowClean = 1 " default: 0
let g:NERDTreeDirArrowExpandable = '>'
let g:NERDTreeDirArrowCollapsible = '<'
let g:NERDTreeMapToggleHidden = 'z'
" }}}

" Goyo config {{{
let g:goyo_width = '90%'
let g:goyo_height = '100%'
" }}}

" limelight config {{{
let g:limelight_conceal_ctermfg = 'gray'
let g:limelight_conceal_guifg = 'gray'
" }}}

" devicon config {{{
let g:airline_powerline_fonts = 1
let g:webdevicons_enable_nerdtree = 1
" }}}

" vim-indent-guides config {{{
let g:indent_guides_enable_on_vim_startup = 0
" }}}

" vim-signify config {{{
set updatetime=100
" }}}

" }}}
" Functions {{{
" Goyo functions {{{
function! s:goyo_enter()
  if executable('tmux') && strlen($TMUX)
    silent !tmux set status off
    silent !tmux list-panes -F '\#F' | grep -q Z || tmux resize-pane -Z
  endif
  set noshowmode
  set noshowcmd
  set scrolloff=999
  Limelight
  NERDTreeClose
endfunction
function! s:goyo_leave()
  if executable('tmux') && strlen('$TMUX')
    silent !tmux set status on
    silent !tmux list-panes -F '\#F' | grep -q Z && tmux resize-pane -Z
  endif
  set showmode
  set showcmd
  set scrolloff=5
  Limelight!
  NERDTree
endfunction
" }}}
" }}}
" Autocommands {{{
" Goyo autocommands {{{
autocmd! User GoyoEnter nested call <SID>goyo_enter()
autocmd! User GoyoLeave nested call <SID>goyo_leave()
" }}}
" NERDTree autocmds {{{
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists('s:std_in') | NERDTree | wincmd p | endif
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists('s:std_in') |
      \ execute 'NERDTree' argv()[0] | wincmd p | enew | execute 'cd '.argv()[0] | endif
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
"autocmd BufEnter * if bufname('#') =~ 'NERD_tree_\d\+' && bufname('%') !~ 'NERD_tree_\d\+' && winnr('$') > 1 |
      "\ let buf=bufnr() | buffer# | execute "normal! \<C-W>w" | execute 'buffer;.buf | endif
autocmd BufWinEnter * if getcmdwintype() == '' | silent NERDTreeMirror | endif
" }}}
" custom augroup {{{
augroup custom
  autocmd!
  "au BufEnter     *.tex :LLPStartPreview
  au BufEnter     *.md :set textwidth=80
  au BufEnter     *.ms :set textwidth=80
  "au BufEnter     *.c :colo DevC++
  "au BufEnter     *.h :colo DevC++
  "au BufEnter     *.cc :colo DevC++
  "au BufEnter     *.hh :colo DevC++
  "au BufEnter     *.cpp :colo DevC++
  "au BufEnter     *.hpp :colo DevC++
  au BufWritePost init.vim :source %
  "au BufWritePost *.tex :make
  au BufWritePost *sxhkdrc* :!pkill -USR1 -x sxhkd
  au BufWritePost .Xresources :!xrdb ~/.Xresources
  au BufWritePost .gitignore :!git add .gitignore
augroup end
" }}}
" }}}
" keybindings {{{

" direction keys

inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk
inoremap <Home> <C-o>g<Home>
inoremap <End> <C-o>g<End>
vnoremap <Down> <C-o>gj
vnoremap <Up> <C-o>gk
vnoremap <Home> <C-o>g<Home>
vnoremap <End> <C-o>g<End>
nnoremap <Down> gj
nnoremap <Up> gk

" clear search highlights
nnoremap <leader>/ :noh<CR>

" toggles
nnoremap <leader>tn :set number!<CR>
nnoremap <leader>tr :set relativenumber!<CR>
nnoremap <leader>tt :NERDTreeToggle<CR>

" tabs
nnoremap <leader>th :tabprevious<CR>
nnoremap <leader>tl :tabnext<CR>
nnoremap <leader>tk :tabnew<CR>
nnoremap <leader>tj :tabclose<CR>

" splits
nnoremap <leader>wh :vertical resize -1<CR>
nnoremap <leader>wj :resize -1<CR>
nnoremap <leader>wk :resize +1<CR>
nnoremap <leader>wl :vertical resize +1<CR>

" config
nnoremap <leader>en :e ~/.config/nvim/init.vim<CR>
nnoremap <leader>ec :source %<CR>

" write as root
nnoremap ZW :w !pkexec tee % >/dev/null

" Goyo
nnoremap <leader>G :Goyo<CR>

" windows
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
vnoremap <C-h> <C-w>h
vnoremap <C-j> <C-w>j
vnoremap <C-k> <C-w>k
vnoremap <C-l> <C-w>l

" files
" these may go away soon
nnoremap <leader>xx :q<CR>
nnoremap <leader>x! :q!<CR>
" these are the new standard
nnoremap <leader>qq :q<CR>
nnoremap <leader>q! :q!<CR>
nnoremap <leader>wq :wq<CR>
nnoremap <leader>ww :w<CR>
nnoremap <leader>ee :e 

" escape for term windows
tnoremap <Esc> <C-\><C-n>

" vim-plug
nnoremap <leader>pi :PlugInstall<CR>
nnoremap <leader>pu :PlugUpdate<CR>
nnoremap <leader>pU :PlugUpgrade<CR>
nnoremap <leader>pc :PlugClean<CR>

" fugitive
nnoremap <leader>gp :G pull<CR>
nnoremap <leader>gd :G diff %<CR>

" }}}