set nocompatible
filetype off

" Plugins
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

" Tags
Plugin 'xolox/vim-misc'
Plugin 'xolox/vim-easytags'
Plugin 'majutsushi/tagbar'

" Templates
Plugin 'aperezdc/vim-template'

" Selection expand
Plugin 'terryma/vim-expand-region'
Plugin 'kana/vim-textobj-user'
Plugin 'kana/vim-textobj-line'
Plugin 'kana/vim-submode'

" Better Pasting
Plugin 'ConradIrwin/vim-bracketed-paste'

" Tmux navigation
Plugin 'christoomey/vim-tmux-navigator'

" YouCompleteMe
Plugin 'Valloric/YouCompleteMe'
Plugin 'rdnetto/YCM-Generator'

" Git
Plugin 'tpope/vim-fugitive'

" Comments
Plugin 'scrooloose/nerdcommenter'

" Surround
Plugin 'tpope/vim-surround'

" Snippets
" Track the engine.
Plugin 'SirVer/ultisnips'
" Snippets are separated from the engine. Add this if you want them:
Plugin 'honza/vim-snippets'
Plugin 'ervandew/supertab'

"Buftabeline
"Plugin 'ap/vim-buftabline'

" Highlight matching xml tags
Plugin 'Valloric/MatchTagAlways'

"Javascript
Plugin 'pangloss/vim-javascript'

" Tex
Plugin 'lervag/vimtex'

"Go
Plugin 'fatih/vim-go'

call vundle#end()
filetype plugin indent on
set cinkeys-=0#

" Terminal emulator settings
set t_Co=256
set term=screen-256color

" Color configuration
colorscheme badwolf	" some color ..
syntax enable	" enable syntax processing

" Disable annoying bell
set noerrorbells

" Allow modelines at the beginning and end of a file
set modeline

" Key configuration
let mapleader = "\<Space>" " Make space the leader key
nnoremap <Leader>w :w<CR>| " Write file
nnoremap <Leader>q :q<CR>| " Close file
nnoremap <Leader>s :w !sudo tee %<CR>L<CR>

nmap <Leader><Leader> V| " Change to visual line mode
map q: :q| " No command history
nmap <Leader><CR> O<ESC> | " Add line above
nmap <CR> o<ESC>| " Add line below
nmap <Leader>f gq}| " Format paragraph
" Window management
nmap <Leader>mt :tab sp<CR> | " maximize window to new tab
nmap <Leader>. <C-w>= | " Split windows equally
map gb :bnext<CR>
map gB :bNext<CR>
call submode#enter_with('grow/shrink', 'n', '', '<Leader>r', '<Nop>')
call submode#map('grow/shrink', 'n', '', '+', '<C-w>+')
call submode#map('grow/shrink', 'n', '', '-', '<C-w>-')
call submode#map('grow/shrink', 'n', '', '<', '<C-w><')
call submode#map('grow/shrink', 'n', '', '>', '<C-w>>')
set splitbelow
set splitright

"disable submode timeouts:
let g:submode_timeout = 0
" don't consume submode-leaving key
let g:submode_keep_leaving_key = 1

" Configuration of spaces and tabs
set tabstop=4 " show 4 spaces per TAB
set softtabstop=4 " insert 4 spaces per TAB
set smarttab
set expandtab	" tabs are spaces
set shiftwidth=4

" UI
set number " show line numbers
set relativenumber "relative line numbers
set showcmd " show last command in bottom bar
set cursorline " highlight current line

" Statusline
set statusline+=%f\  " show Filepath
set statusline+=[%{strlen(&fenc)?&fenc:'none'}] "file encoding
set statusline+=%m%r " Modified and read only flag
set statusline+=%= " align left
set statusline+=%y " show Filetype
set statusline+=[%{&fo}] " Show format options
set laststatus=2 " always show statusline

" Filetypes
filetype on " filetype detection on
filetype indent on " filetype-specific indent .vim/indent/
filetype plugin on " filteype plugins in .vim/ftplugins

set smartindent
set wildmenu " visual autocomplete for command menu
set lazyredraw " redraw only when necessary
set showmatch " highlight matching brackets
set mouse=a " Mouse control

" Searching
set incsearch " search while entering
set hlsearch " highlight matches
nnoremap <Leader>h :set hlsearch!<CR>
set ignorecase
set smartcase

" Line wrapping
set tw=79 " set textwidth of 80 characters
set formatoptions-=t " Don't wrap code
set formatoptions+=c " Wrap comments
set formatoptions+=mB " Don't break multibyte characters
set formatoptions+=j " Remove multiple comment markers
function TextWrapToggle()
    if &fo =~'t'
        setlocal fo-=t
    else
        setlocal fo+=t
    endif
    let formatoptions = &formatoptions
    echom formatoptions
endfunction
nmap <Leader>t :call TextWrapToggle()<CR>

" Highlight characters past 80
"augroup vimrc_autocmds
    "autocmd BufEnter * highlight OverLength ctermbg=88 guibg=#592929
    "autocmd BufEnter * match OverLength /\%81v.*/
"augroup END

"Copying
set clipboard=unnamedplus,unnamed " Copy/Paste


" TagBar
nmap <F8> :TagbarToggle<CR>
imap <F8> <ESC>:TagbarToggle<CR>gi
nmap <C-]> <C-w><C-]><C-w>T

" YouCompleteMe
let g:ycm_collect_identifiers_from_tags_files = 1 " Read from tag files
let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py' " Standard conf
let g:ycm_enable_diagnostic_signs = 0 " Do not show semantic error bar
let g:ycm_server_python_interpreter = '/usr/bin/python'
let g:ycm_key_list_select_completion   = ['<C-j>', '<C-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-k>', '<C-p>', '<Up>']

"Tags
let g:easytags_async = 1

" make
autocmd QuickFixCmdPre make set cmdheight=2
"autocmd QuickFixCmdPost make nested cwindow "Open the quickfix window
"autocmd QuickFixCmdPost make nested lwindow "Change to the quickfix window
set switchbuf=split
nmap <F9> :silent! make<CR>:redraw!<CR>
nmap <Leader>m :silent! make<CR>:redraw!<CR>
nmap <Leader>x :silent! make ex<CR>:redraw!<CR>
imap <F9> <ESC>:make<CR>:redraw!<CR>i

" vim-templates config-file
try
    source ~/.vim/.vimrc_config_template
catch
    " Ignore non existing file
endtry

" Expand region
vmap v <Plug>(expand_region_expand)
vmap <C-v> <Plug>(expand_region_shrink)

" Snippets
let g:SuperTabDefaultCompletionType    = '<C-n>'
let g:SuperTabCrMapping                = 0

let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
let g:UltiSnipsEditSplit="vertical"
set rtp+=~/.vim/my-snippets

try
    source ~/.vim/.vimrc_config_expand_region
catch
    " Ignore non existing file
endtry

" Powerline
try
    source ~/.vim/.vimrc_config_powerline
catch
    " Ignore non existing file
endtry

" Extra stuff
try
    source ~/.vim/.vimrc_config_extra_stuff
catch
    " Ignore non existing file
endtry
