"
" Vim configuration file (~/.vimrc)
" 2009-2014, kolter <kolter@openics.org>
"
"  This file is distributed in the hope that it will be useful,
"  but WITHOUT ANY WARRANTY
"

" {{{ Load Plugins
call plug#begin('~/.vim/plugged')
Plug 'junegunn/indentLine'
Plug 'sjl/gundo.vim'
Plug 'scrooloose/syntastic'
Plug 'majutsushi/tagbar'
Plug 'scrooloose/nerdtree'
Plug 'bling/vim-airline'
Plug 'kien/ctrlp.vim'
Plug 'tpope/vim-fugitive'
Plug 'airblade/vim-gitgutter'
Plug 'gregsexton/gitv'
Plug 'terryma/vim-multiple-cursors'
Plug 'jlanzarotta/bufexplorer'
Plug 'flazz/vim-colorschemes'
Plug 'vim-scripts/comments.vim'
Plug 'ervandew/supertab'
Plug 'rstacruz/sparkup'
Plug 'Lokaltog/vim-easymotion'
Plug 'editorconfig/editorconfig-vim'
Plug 'godlygeek/tabular'
Plug 'plasticboy/vim-markdown'
Plug 'http://git.openics.org/kolter/vim-bindzone.git'
call plug#end()
" }}}

" {{{ General Settings
" Filetypes Settings
if has('autocmd')
    filetype plugin indent on
    "reload Vim config file after saving
    "autocmd BufWritePost $MYVIMRC :source $MYVIMRC
    "always limit the width for text files
    autocmd BufRead *.txt set tw=78
    autocmd QuickFixCmdPre * botright cwindow 5
endif

"Term settings (under tmux)
if &term =~ '^screen'
    "tmux will send xterm-style keys when its xterm-keys option is on
    execute "set <xUp>=\e[1;*A"
    execute "set <xDown>=\e[1;*B"
    execute "set <xRight>=\e[1;*C"
    execute "set <xLeft>=\e[1;*D"
endif

set nocompatible "no vi compatibility
set history=1000 "command history size
set undolevels=120 "undo levels count

set autoread "notify file changes
set autochdir "switch to the current file directory
set clipboard+=unnamed "share system clipboard
set backup "enable backups
set backupdir=~/.vim/backups "backup directory
set directory=~/.vim/tmp "directory to place swap files in

"Encoding settings
if has("multi_byte")
    if &termencoding == ""
        let &termencoding = &encoding
    endif
    set encoding=utf-8
    setglobal fileencoding=utf-8
    set fileencodings=utf-8,default,latin1,ucs-bom
endif

"Syntax highlight
syntax on
set t_Co=256
set bg=dark
colorscheme grb256
" }}}

" {{{ Interface Settings
set title "show title
set number "show line numbers
set ruler "statusline for each window
set visualbell t_vb= "visual beep

set showcmd "show incomplete commands
set confirm "raise a dialog asking what to do instead of failing

"set mouse=a "enable mouse support
set lazyredraw "do not redraw when running macros
set ttyfast "fast terminal connection support
set ttimeout
set ttimeoutlen=100

set scrolloff=999
set sidescrolloff=5

set shortmess=a "abbreviations on status line
set laststatus=2 "always statusline

set wildmenu "display completion menu
set wildmode=list:longest,list:full "content of completion menu
"ignore some extensions while completing filename
"set wildignore=*.o,*.so,,*.gz,*.bz2,*.tar,*.tgz,*.tbz2,*.png,*.jpg,*.jpeg,*.gif
set wildchar=<TAB> "wildcar expansion character

set modeline "allow last lines of documents set vim mode
set modelines=3 "number of lines to check for modelines
" }}}

" {{{ Keyboard Settings
" keep ctrl-a/ctrl-e for begining/end of line
nmap <c-a> <c-o>I
imap <c-a> <c-o>I
vmap <c-a> <c-o>I

nmap <c-e> <c-o>A
imap <c-e> <c-o>A
vmap <c-e> <c-o>A

"reopen current file
map <F5> :e!<cr>
"using redraw to disable highlighted search patterns
nnoremap <c-L> :nohl<cr><c-L>

"map F1 to open previous buffer
nmap <F1> :bp<cr>
imap <F1> <ESC>:bp<cr>a
"map F2 to open next buffer
nmap <F2> :bn<cr>
imap <F2> <ESC>:bn<cr>a

imap <c-@> <c-x><c-o>

nmap <c-s-left> :tabprevious<cr>
nmap <c-s-right> :tabnext<cr>
nmap <c-s-up> :tabnew<cr>
nmap <c-s-down> :tabclose<cr>

nmap <c-d> :bw<cr>

nmap <F6> :vsplit<cr>
nmap <F7> :split<cr>

"ctrl-$arrow to cycle around splitted windows
map <c-left> <c-w>h
map <c-right> <c-w>l
map <c-Up> <c-w>k
map <c-Down> <c-w>j

"ident in visual mode keep selection
vmap > >gv
vmap < <gv
" }}}

" {{{ Editor Settings
set fileformats=unix,dos,mac "support all three, in this order
set hidden "make possible to change buffer without saving
set report=0 "agressive reporting
set pastetoggle=<F11> "use <F11> to toggle between 'paste' and 'nopaste'
set nostartofline "leave the cursor where it is

"indent settings
set autoindent
set backspace=indent,eol,start "enhance backspacing
set smartindent
set cindent
set smarttab

"tabs and spaces settings
set expandtab "tab are spaces
set tabstop=4
set shiftwidth=4
set shiftround "round indent to shiftwidth
set softtabstop=4

set showmatch "brace/parenthese/bracket matching
set nowrap "wrap long lines
if has("multi_byte")
    set showbreak="…"
else
    set showbreak="+++"
endif

"show some not printable chars
set list
if has("multi_byte")
    set listchars=trail:·,extends:>,precedes:<,nbsp:•,tab:▷\⋅
else
    set listchars=tab:>.,trail:·,extends:>,precedes:<,nbsp:%
endif

"search settings
set hlsearch "highlight searches
set incsearch "incremental searches
set ignorecase "ignore case in search patterns
set infercase "smart case support
" }}}

" {{{ Code folding
set foldmethod=indent   "fold based on indent
set foldnestmax=10      "deepest fold is 10 levels
set nofoldenable        "dont fold by default
set foldlevel=1
" }}}

" {{{ Email Settings
if has('autocmd')
    autocmd BufRead ~/.mutt/tmp/mutt-* set filetype=mail
    autocmd FileType mail set autoindent expandtab nocindent formatoptions=tcqn
    autocmd FileType mail vmap D dO[...]<CR>
    autocmd FileType mail call EnableSpellChecking()
endif
" }}}

" {{{ Spell Checking
"set spellfile=~/.vim/spell/words
function! EnableSpellChecking()
    setlocal spell spelllang=fr,en_us
    let b:spell = 1
endfunction

function! DisableSpellChecking()
    setlocal nospell
    unlet b:spell
endfunction

function! ToggleSpell()
    if !exists("b:spell")
        execute 'call EnableSpellChecking()'
    else
        execute 'call DisableSpellChecking()'
    endif
endfunction

nmap <F4> :call ToggleSpell()<CR>
imap <F4> <Esc>:call ToggleSpell()<CR>a
" }}}

" {{{ Gundo extension Setup
" Gundo sidebar on the right
let g:gundo_right = 1
" Gundo layout
let g:gundo_width = 60
let g:gundo_preview_height = 40
" Gundo status lines
let g:gundo_tree_statusline = "Gundo"
let g:gundo_preview_statusline = "Gundo Preview"
" Preview pane below the buffer
let g:gundo_preview_bottom = 1
" Close Gundo panes on revert
let g:gundo_close_on_revert = 1

" F3 key to show/hide Gundo sidebar
nnoremap <F3> :GundoToggle<CR>
" }}}

" {{{ Syntastic extension Setup
" automatically open/close pane when errors (or not)
let g:syntastic_auto_loc_list = 1
" Redefine errors/warning symbols on sidebar
let g:syntastic_error_symbol = 'EE'
let g:syntastic_style_error_symbol = 'ee'
let g:syntastic_warning_symbol = 'WW'
let g:syntastic_style_warning_symbol = 'Ws'
" redefine default python linter
"let g:syntastic_python_checker = 'pylint'
" add options to python linter
"let g:syntastic_python_checker_args = ''
" }}}

" {{{ ctrlp extension Setup
" Change default key
let g:ctrlp_map = '<c-o>'
" Match window height
let g:ctrlp_max_height = 20
" Add a key to search in opened buffers
map <c-b> :CtrlPBuffer<cr>
" }}}

" {{{ airline extension setup
let g:airline_powerline_fonts=1
let g:airline#extensions#tabline#enabled=1
" }}}

" {{{ tagbar extension setup
nmap <F8> :TagbarToggle<CR>
" }}}

" vim: foldmethod=marker foldlevel=0 foldenable