" set vim mode
set nocompatible

source ~/.vim/plugins.vim

filetype plugin indent on

if has("vms")
  set nobackup
else
  " set backup
  if has('persistent_undo')
    set undofile
  endif
endif

syntax enable
" set transparent background
" let g:solarized_termtrans=1
" use italics
let g:solarized_term_italics=1
" filetype-specific syntax highlighting groups
let g:solarized_extra_hi_groups=1
" let g:solarized_contrast="high"
" let g:solarized_visibility="high"
set background=dark
colorscheme solarized8
" underline spelling
highlight clear SpellBad
highlight SpellBad cterm=undercurl

" true color
set termguicolors
" make true colors work in tmux
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"

" make comments and HTML attributes italic
"highlight Comment cterm=italic
"highlight htmlArg cterm=italic

"highlight Normal ctermbg=NONE guibg=NONE
"highlight NonText ctermbg=NONE guibg=NONE

" files and backups
set directory=$HOME/.vim/swapfiles//
" set backupdir=$HOME/.vim/backupdir//
set undodir=$HOME/.vim/undofiles//

" yank into system clipboard
set clipboard=unnamedplus

" Only do this part when compiled with support for autocommands.
if has("autocmd")
  " Put these in an autocmd group, so that we can delete them easily.
  augroup vimrcEx
  au!

  autocmd FileType text setlocal foldtext<

  augroup END

  " remember cursor position
  autocmd BufReadPost *
	\ if line("'\"") > 1 && line("'\"") <= line("$") |
  	\	exe "normal! g`\"" |
  	\ endif

endif " has("autocmd")

if !has('nvim')
    " Get the defaults that most users want.
    source $VIMRUNTIME/defaults.vim
    " The matchit plugin makes the % command work better
    packadd matchit
endif

" always set autoindenting on
set autoindent
" smart indent; stop indent when closing brackets etc
set smartindent

" searching
" highlight search result
set hlsearch
" ignore case
set ignorecase
" case-sensitive if expression contains capital letters
set smartcase
" incremental search
set incsearch
set nolazyredraw

" delete whitespace, line break and char using <BS>
set backspace=indent,eol,start
" always show curser position
set ruler
" keep 1000 lines of history
set history=1000
set textwidth=120
set colorcolumn=+1
" display absolute number of current line
set number
" display relative line numbers
set relativenumber
" highlight current line
set cursorline
" encoding
set fileencoding=utf-8
" break at last word instead of last char
set linebreak

" autoload file changes
set autoread

" tab control
" insert spaces
set expandtab
set smarttab
set tabstop=4
set softtabstop=4
set shiftwidth=4
set shiftround
"set completeopt+=longest

" invisible characters
set list
set listchars=tab:→\ ,eol:¬,trail:⋅,extends:❯,precedes:❮
set showbreak=↪

" code folding settings
" fold based on syntax
set foldmethod=indent
" don't fold by default
set nofoldenable
set foldlevel=1

" smoother redrawing
set ttyfast
" diff with vertical split
set diffopt+=vertical
" show the status line all the time
set laststatus=2
" keep 5 lines on the screen when scrolling
set scrolloff=5
" enhanced command line completion
set wildmenu
" Search down into subfolders
" Provides tab-completion for all file-related tasks
set path+=**
" allow switching away from unsaved buffers
set hidden
" show incomplete commands
set showcmd
"set noshowmode				" don't show which mode disabled for PowerLine
" complete files like a shell
set wildmode=list:longest
set shell=$SHELL
" command bar height
set cmdheight=1
" set terminal title
set title
set shortmess+=TOFwat

" show matching braces
set showmatch
" how many tenths of a second to blink
set mat=2
" set spell langs
set spelllang=de,en

"" user commands

"" create tags file
"" ^]	jump to tag under cursor
"" g^]	for ambiguous tags
"" ^t	jump back in the tag stack
"command! MakeTags !ctags -R .

" error bells
set errorbells
set visualbell
set timeoutlen=500

" turn on manpages (:Man)
runtime ftplugin/man.vim

" set a map leader for more key combos
let mapleader=','

" clear highlighted search
noremap <space> :nohlsearch<cr>

" enable . command in visual mode
vnoremap . :normal .<cr>

" move between windows using CTRL+hjll
map <silent> <C-h> :call functions#WinMove('h')<cr>
map <silent> <C-j> :call functions#WinMove('j')<cr>
map <silent> <C-k> :call functions#WinMove('k')<cr>
map <silent> <C-l> :call functions#WinMove('l')<cr>

" count wraped lines as one line when doing relative jumps
noremap <silent> <expr> j (v:count == 0 ? 'gj' : 'j')
noremap <silent> <expr> k (v:count == 0 ? 'gk' : 'k')

" scroll the viewport faster
nnoremap <C-e> 3<C-e>
nnoremap <C-y> 3<C-y>
"
"" moving up and down work as you would expect
"nnoremap j gj
"nnoremap k gk
"nnoremap ^ g^
"nnoremap $ g$

"" cool resizing
"nnoremap <Left> :vertical resize +2<CR>
"nnoremap <Right> :vertical resize -2<CR>
"nnoremap <Up> :resize -2<CR>
"nnoremap <Down> :resize +2<CR><Paste>

" search for word under the cursor
nnoremap <leader>/ "fyiw :/<c-r>f<cr>

" highlight conflicts
match ErrorMsg '^\(<\|=\|>\)\{7\}\([^=].\+\)\?$'

" make the highlighting of tabs and other non-text less annoying
highlight SpecialKey ctermbg=none ctermfg=8
highlight NonText ctermbg=none ctermfg=8

"" Section AutoGroups {{{
"" file type specific settings
augroup configgroup
    autocmd!

    " automatically resize panes on resize
    autocmd VimResized * exe 'normal! \<c-w>='
    autocmd BufWritePost .vimrc,.vimrc.local,init.vim source %
    autocmd BufWritePost .vimrc.local source %
    " save all files on focus lost, ignoring warnings about untitled buffers
    autocmd FocusLost * silent! wa

    " make quickfix windows take all the lower section of the screen
    " when there are multiple windows open
    autocmd FileType qf wincmd J

"    autocmd BufNewFile,BufReadPost *.md set filetype=markdown
"    let g:markdown_fenced_languages = ['css', 'javascript', 'js=javascript', 'json=javascript', 'stylus', 'html']

"    " autocmd! BufEnter * call functions#ApplyLocalSettings(expand('<afile>:p:h'))

"    autocmd BufNewFile,BufRead,BufWrite *.md syntax match Comment /\%^---\_.\{-}---$/

    autocmd! BufWritePost * Neomake
augroup END
" }}}

" paste without indention
function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

"let &t_SI .= WrapForTmux("\<Esc>[?2004h")
"let &t_EI .= WrapForTmux("\<Esc>[?2004l")

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

" ctrlp
" order top to bottom
let g:ctrlp_match_window='bottom,order::ttb'
" open files in new buffer
let g:ctrlp_switch_buffer=0
" use ripgrep if available
if executable('rg')
    set grepprg=rg\ --color=never
    let g:ctrlp_user_command='rg %s --files --color=never --glob ""'
    let g:ctrlp_use_caching=0
endif
" use ag if available
if executable('ag')
    set grepprg=ag\ --nogroup\ --nocolor
    let g:ctrlp_user_command='ag %s -l --nocolor -g ""'
    let g:ctrlp_use_caching=0
endif

" Append modeline after last line in buffer.
" Use substitute() instead of printf() to handle '%%s' modeline in LaTeX files.
function! AppendModeline()
    let l:modeline = printf(" vim: set filetype=%s ts=%d sw=%d tw=%d %set :",
                \ &filetype, &tabstop, &shiftwidth, &textwidth, &expandtab ? '' : 'no')
    let l:modeline = substitute(&commentstring, "%s", l:modeline, "")
    call append(line("$"), l:modeline)
endfunction
nnoremap <silent> <Leader>ml :call AppendModeline()<CR>

" set textwidth for mails
autocmd FileType mail setlocal textwidth=72

" netrw settings
" disable banner
let g:netrw_banner=0
" open in prior window
let g:netrw_browse_split=4
" open splits to the right
let g:netrw_altv=1
" treeview
let g:netrw_liststyle=3
let g:netrw_list_hide=netrw_gitignore#Hide()
let g:netrw_list_hide.=',\(^\|\s\s\)\zs\.\S\+'

"" racer config (rust autocomplete)
"let g:racer_cmd = "/home/me/.cargo/bin/racer"
"let g:racer_experimental_completer = 1
"au FileType rust nmap gd <Plug>(rust-def)
"au FileType rust nmap gs <Plug>(rust-def-split)
"au FileType rust nmap gx <Plug>(rust-def-vertical)
"au FileType rust nmap <leader>gd <Plug>(rust-doc)

"" " javacomplete2
"" autocmd FileType java setlocal omnifunc=javacomplete#Complete
"" " enable smart (trying to guess import option) inserting class imports with F4
"" nmap <F4> <Plug>(JavaComplete-Imports-AddSmart)
"" imap <F4> <Plug>(JavaComplete-Imports-AddSmart)
"" " enable smart (trying to guess import option) inserting class imports with F4
"" nmap <F5> <Plug>(JavaComplete-Imports-Add)
"" imap <F5> <Plug>(JavaComplete-Imports-Add)
"" " add all missing imports with F6
"" nmap <F6> <Plug>(JavaComplete-Imports-AddMissing)
"" imap <F6> <Plug>(JavaComplete-Imports-AddMissing)
"" " add all missing imports with F6
"" nmap <F7> <Plug>(JavaComplete-Imports-RemoveUnused)
"" imap <F7> <Plug>(JavaComplete-Imports-RemoveUnused)