" set.vim {{{
"# Pas de compatibilité avec Vi (meilleur comportement)
set nocompatible

"# Encodage général
set encoding=utf-8

"# Change le <Leader> en , à la place de \
let mapleader=","

"# Indentation
set autoindent
" Intelligente ({}, commentaires...)
set smartindent
" Remplace les tabulations par des espaces
set expandtab
" <BS> supprime un niveau d'indentation
set smarttab
" Affiche 2 espaces pour les tabulations
set tabstop=2
" Indentation de 2 espaces
set shiftwidth=2
" Arrondi à un niveau d'indentation
set shiftround

"# Numérotation
set number

"# Affichage de caractères spéciaux
set list
set listchars=nbsp:¬,tab:»·,trail:·

"# caractères de séparation de fenêtres
set fillchars+=vert:\ ,fold:\ 

"# Affichage de la dernière ligne, même non entière
"# Affichage des caractères spéciaux sous form <hex> plutôt que ^X
set display=lastline,uhex

"# Affiche toujours la statusline
set laststatus=2

"# Pas de sonneries
set noerrorbells
set novisualbell

"# Limites haute et basse du curseur
set scrolloff=8

"# Limites gauche et droite du curseur
"set nowrap
set sidescrolloff=3
set sidescroll=1

"# Recherche
" Va au résultat directement
set incsearch
set ignorecase
set smartcase
" /g par défaut (remettre /g pour annuler)
set gdefault
" Surligne les résultats
set hlsearch
" et pour l'enlever : ,/
nnoremap <silent> <Leader><Space> :nohlsearch<CR>

"# Menus améliorés (e.g <Tab>)
set wildmenu

"# Désactive les fichiers swap
set noswapfile
set nobackup
set nowritebackup

"# Correction (à activer avec set spell)
set spelllang=fr,en
set spellsuggest=5

"# Ne met pas le curseur au début de ligne lors du changement de buffer
" (impacte aussi gg, G, H, M, L, %, d…)
set nostartofline

"# Effacement (backspace) fonctionnel
set backspace=indent,eol,start

"# Priorité aux fichiers avec un . dans l'autocomplétion
" e.g : prog.c > prog
set suffixes+=,,

"# Méthode de cryptage (avec :X)
if version >= 704 && has("patch399")
  set cryptmethod=blowfish2
endif

"# Tilde avec motion
set tildeop

"# Demande une confirmation plutôt que de lever une erreur (:q, :e)
set confirm

"# Surligne la ligne courante
set cursorline

"# Autorise de changer de buffer sans sauvegarder
set hidden

"# Pas de support de la souris
set mouse=

"# share clipboad with X
set clipboard+=unnamedplus

"# default *.tex files ftplugin to latex file type
let g:tex_flavor = "latex"
" }}}
" plugins.vim {{{
"# Chargement de Vundle
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim'

"# Liste des plugins
Plugin 'scrooloose/nerdtree'
Plugin 'jeffkreeftmeijer/vim-numbertoggle'
Plugin 'tpope/vim-fugitive'
Plugin 'tpope/vim-dispatch'
Plugin 'airblade/vim-gitgutter'
Plugin 'tmhedberg/matchit'
Plugin 'morhetz/gruvbox'
Plugin 'bkad/CamelCaseMotion'
Plugin 'Townk/vim-autoclose'
Plugin 'tpope/vim-endwise'
Plugin 'majutsushi/tagbar'
Plugin 'jeetsukumaran/vim-buffergator'
Plugin 'mbbill/undotree'
Plugin 'wesQ3/vim-windowswap'
Plugin 'vim-airline/vim-airline'
Plugin 'tpope/vim-commentary'
Plugin 'ervandew/supertab'
" TODO lire :h ins-completion
" TODO : retab <tab> to <C-X><??> ?
Plugin 'justmao945/vim-clang'
"Plugin 'Valloric/YouCompleteMe'
"Plugin 'jvoorhis/coq.vim'
"Plugin 'vim-scripts/CoqIDE'

" Dépendance pour coquille
Plugin 'let-def/vimbufsync'
Plugin 'the-lambda-church/coquille'

" TODO ocaml: fichier .annot, maps (ANNOT : trouve le type du mot sous le curseur :D)
" http://stackoverflow.com/questions/15514908/which-is-the-current-setup-to-use-ocaml-in-vim/17234163#17234163
" annot : require compile with -annot
au BufRead,BufNewFile *.ml,*.mli compiler ocaml

" a tester
" ocaml : https://github.com/the-lambda-church/merlin
" coq   : https://github.com/the-lambda-church/coquille
"Plugin 'xolox/vim-misc' " dépendance pour vim-easytags
"Plugin 'xolox/vim-easytags' " idem ====> Que le fichier en cours ? Aucun intérêt si oui
"Plugin 'airblade/vim-rooter' " combiné avec les tags (pour éviter d'avoir des fichiers tags dans les sous-dossiers)
"Plugin 'octol/vim-cpp-enhanced-highlight' " idem
"Plugin 'Xuyuanp/nerdtree-git-plugin' " => caractères moches

" http://vim.wikia.com/wiki/Compiling_LaTeX_from_Vim#Automatic_LaTeX_plugin (à mettre dans ftplugin/tex ?)
" Plugin 'coot/atp_vim'

" TODO : cscope ?
" https://en.wikipedia.org/wiki/Cscope
" http://vim.wikia.com/wiki/Browsing_programs_with_tags#Comments

call vundle#end()

"# Remap les mouvements normaux (w, b, e) en mouvements CamelCaseMotion
map <silent> w <Plug>CamelCaseMotion_w
map <silent> b <Plug>CamelCaseMotion_b
map <silent> e <Plug>CamelCaseMotion_e
map <silent> ge <Plug>CamelCaseMotion_ge
sunmap w
sunmap b
sunmap e
sunmap ge

"# Mapping pour activer/désactiver vim-autoclose
nmap <silent> <Leader>a :AutoCloseToggle<CR>

"# Mapping pour ouvrir/fermer NERDTree
nmap <silent> <Leader>t :NERDTreeToggle<CR>

"# Mapping pour ouvrir/fermer TagBar
nmap <silent> <Leader>r :TagbarToggle<CR>

"# Mapping pour ouvrir/fermer Undotree
nmap <silent> <Leader>u :UndotreeToggle<CR>

"# Mapping pour GitGutter
nmap <silent> gu :GitGutterUndoHunk<CR>
nmap <silent> gn :GitGutterNextHunk<CR>
nmap <silent> gp :GitGutterPrevHunk<CR>

"# Ouvre NERDTree automatiquement
"autocmd vimenter * NERDTree
" focus sur la fenêtre principale
"autocmd vimenter * wincmd w

" et ferme vim s'il ne reste que NERDTree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" NERDTree à droite

let g:NERDTreeWinPos = "right"

"# Paramètres de buffergator
" Pas de chemin absolu
let g:buffergator_show_full_directory_path = 0
" Désactive tous les raccourcis d'accès
let g:buffergator_suppress_keymaps = 1
" Sauf ceux-ci :
nmap <Leader>b :BuffergatorOpen<CR>
nmap gb <C-^>
" Fenêtre en haut, hauteur 8
let g:buffergator_viewport_split_policy = "T"
let g:buffergator_hsplit_size = 8

"# Paramètres de Airline
" Pas de vérifications sur les caractères blancs
let g:airline#extensions#whitespace#checks = []

"# N'active pas le completement automatiquement pour vim-clang
"let g:clang_auto = 0

" TODO : plutôt regrouper par outils (coq, …)
"# Paramètres de vim-commentary
autocmd FileType coq setlocal commentstring=(*\ %s\ *)
map <buffer> <silent> <M-c> :CoqLaunch<CR>
map <buffer> <silent> <M-j> :CoqNext<CR>
map <buffer> <silent> <M-k> :CoqUndo<CR>
map <buffer> <silent> <M-l> :CoqToCursor<CR>


"# Paramètres de coquille
" Bouge le curseur
let g:coquille_auto_move = 'true'

"# Active l'indentation et les plugins spécifiques
filetype indent on
filetype plugin on
" }}}
" theme.vim {{{
"# Active la coloration syntaxique
syntax enable

"# Mode sombre
set background=dark

"# Thème
try
  colorscheme gruvbox
catch
endtry

"# Couleurs des mots mal écrits (exmaple)
highlight clear SpellBad
highlight SpellBad cterm=underline ctermfg=red
highlight clear SpellCap
highlight SpellCap cterm=underline ctermfg=blue
highlight clear SpellLocal
highlight SpellLocal cterm=underline ctermfg=blue
highlight clear SpellRare
highlight SpellRare cterm=underline ctermfg=blue
" }}}
" specifiques.vim {{{
"# Undo persistant
if has("persistent_undo")
  " Crée le dossier s'il le faut
  silent !mkdir ~/.vim/backups > /dev/null 2>&1
  set undodir=~/.vim/backups
  set undofile
endif

"# Clipboard mélangé avec celui de X
if has("xterm_clipboard")
  set clipboard=unnamedplus
endif

"# Revient à la même position à la réouverture d'un fichier
augroup DernierePosition
  autocmd BufReadPost *
    \ if line("'\"") > 0 && line("'\"") <= line("$") |
    \   exe "normal! g`\"" |
    \ endif
augroup END
" }}}
" mappings.vim {{{
"# Accès au début de ligne : au premier caractère non blanc
" (le premier caractère est toujours accessible avec | )
nmap 0 ^
" 0 sans touche shift
nmap à 0

"# Remap <C-space> (= <Nul>) pour l'autocomplétion (<Tab>)
imap <Nul> <Tab>

"# Commande w!! pour enregistrer avec sudo
"cmap w!! %!sudo tee > /dev/null %
cabbrev w!! %!sudo tee > /dev/null %

"# Désactive l'accès au mode Ex
map Q <Nop>

"# Mappings pour lancer :Make (vim-dispatch) (a)synchrone
map <Leader>m :Make<CR>
map <Leader>M :Make!<CR>

"# Mapping pour activer/désactiver l'affichage "visuel"
" des caracètres spéciaux (e.g : tabulation)
nmap <Leader>l :set list!<CR>

"# Mapping pour enlever tous les espaces de fin de ligne
nmap <Leader>s :%s/\s\+$//e<CR>:nohlsearch<CR>

"# Mapping pour créer le fichier tags (nécessite ctags)
nmap <silent> <Leader><Leader>g :silent r!ctags -R &<CR>:echo "génération des tags lancée"<CR>

"# Mapping pour aller à la faute précédente/suivante (spell)
nmap (s [s
nmap )s ]s

"# Mapping pour aller à la marque au caractère près
nmap ' `
" }}}

" vim: set fen fdm=marker:
