set nocompatible

" VUNDLE
" {
if filereadable(expand("$HOME/.vim/bundle/vundle/README.md"))
    filetype off                   " required!

    set rtp+=~/.vim/bundle/vundle/
    call vundle#rc()

    " let Vundle manage Vundle
    " required!
    Bundle 'gmarik/vundle'

    Bundle 'xolox/vim-session'
    Bundle 'vim-ruby/vim-ruby'
    Bundle 'tpope/vim-rails'
    Bundle 'tpope/vim-haml'
    Bundle 'tpope/vim-markdown'

    Bundle "garbas/vim-snipmate"
    " snipMate dependencies
    Bundle "MarcWeber/vim-addon-mw-utils"
    Bundle "tomtom/tlib_vim"
    Bundle "honza/snipmate-snippets"

    Bundle 'goldfeld/vim-seek'
    Bundle 'Lokaltog/vim-easymotion'
    Bundle 'ton/vim-bufsurf'

    Bundle 'Gundo'
    Bundle 'The-NERD-tree'
    Bundle 'The-NERD-Commenter'
    Bundle 'closetag.vim'
    Bundle 'taglist.vim'
    Bundle 'VisIncr'
endif
" }

filetype plugin indent on
syntax enable

set t_Co=256

set background=dark
colorscheme desert

set relativenumber
set showmode
set expandtab
set shiftwidth=2
set smarttab

set autoindent
set nowrap

set hidden
set ruler
set showcmd
set fileencoding=utf-8
set fileformats=unix,dos,mac
set cmdheight=2
set noerrorbells
set mouse=a
set nohls
set scrolloff=4
set sidescrolloff=4
set noincsearch
set noshowmatch

set listchars=nbsp:ยท,tab:>-,extends:>,precedes:<
set list

set splitright

set wildmenu
set wildmode=longest:full,full
set wildignore=*~,*.o,*.obj,*.bak,*.exe,*.class,*.jpg,*.png,*.gif,*.mp3

set laststatus=2
set statusline=%f\ %m\ [%{&ff}]\ [%Y]\ [%{&fileencoding}]%=[%04l,\ %04v]\ [len=%04L]

set nocursorline
set nocursorcolumn

set pastetoggle=<F2>

set history=100
set undolevels=150

set undofile

if !filewritable(expand("~/.vim/tmp/undo"))
    call mkdir(expand("~/.vim/tmp/undo"), "p")
endif
set undodir=~/.vim/tmp/undo

set backup

if !filewritable(expand("~/.vim/tmp/backup"))
    call mkdir(expand("~/.vim/tmp/backup"), "p")
endif
set backupdir=~/.vim/tmp/backup

let mapleader = ","

" FOLDING
" {
set foldenable
set foldmethod=syntax
" Number of columns to the left of the window to display folds
set foldcolumn=0
" Fold level to close when opening a file
set foldlevelstart=100

" Don't open folds when searching or undoing into them
set foldopen-=search
set foldopen-=undo
" }

" MAPPING
" {
map <F1> <ESC>
imap <F1> <ESC>

noremap gy :call ToggleYesNo()<CR>

map <F3> <ESC>:NERDTreeToggle<CR>
map <F4> <ESC>:Tlist<CR>
map <F5> <ESC>:GundoToggle<CR>

map <F11> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
" Rot13
map <F12> ggVGg?

nnoremap <silent> <leader>r :call NumberToggle()<CR>

nnoremap <silent> ,bp :bprevious<CR>
nnoremap <silent> ,bf :bnext<CR>
nnoremap <silent> ,Bp :BufSurfBack<CR>
nnoremap <silent> ,Bf :BufSurfForward<CR>
" }

" PLUGINS
" {
" Session
let g:session_autoload = 'no'
let g:session_autosave = 'no'

let g:session_directory=$HOME."/.vim/tmp/sessions"
if !filewritable(expand(g:session_directory))
    call mkdir(expand(g:session_directory), "p")
endif


" closetag
autocmd FileType html,htmldjango,jinjahtml,eruby,mako let b:closetag_html_style=1
autocmd FileType html,xhtml,xml,htmldjango,jinjahtml,eruby,mako source ~/.vim/bundle/closetag.vim/plugin/closetag.vim

" TagList : http://vim-taglist.sourceforge.net/
" Need ctags
" :help taglist
let Tlist_Ctags_Cmd="ctags"

" Doxygen
let g:DoxygenToolkit_authorName="Guillaume DOTT"
" }

" FILETYPES
" {
" Open PDF files
" need xpdf and cups-pdf
autocmd BufReadPre *.pdf set ro nowrap
autocmd BufReadPost *.pdf silent %!pdftotext "%" -nopgbrk -layout -q -eol unix -
autocmd BufWritePost *.pdf silent !rm -rf ~/Documents/%
autocmd BufWritePost *.pdf silent !lp -s -d pdffg "%"
autocmd BufWritePost *.pdf silent !until [ -e ~/Documents/% ]; do sleep 1; done
autocmd BufWritePost *.pdf silent !mv ~/Documents/% %:p:h

" PHP
let php_sql_query = 1
let php_htmlInStrings = 1

au Filetype css vertical resize 50

" chmod +x on the file if it starts with a shebang
function! ModeChange()
    if getline(1) =~ "^#!"
        if getline(1) =~ "/bin/"
            silent !chmod a+x <afile>
        endif
    endif
endfunction

au BufWritePost * call ModeChange()
" }

" FUNCTIONS
" {
function! ToggleYesNo()
    let w=expand("<cword>")
    if     w=="yes"    | let w="no"
    elseif w=="no"     | let w="yes"
    elseif w=="on"     | let w="off"
    elseif w=="off"    | let w="on"
    elseif w=="True"   | let w="False"
    elseif w=="False"   | let w="True"
    elseif w=="true"   | let w="false"
    elseif w=="false"  | let w="true"
    elseif w=="manual" | let w="auto"
    elseif w=="auto"   | let w="manual"
    elseif w=="public"   | let w="private"
    elseif w=="private"   | let w="protected"
    elseif w=="protected"   | let w="public"
    else               | let w=""
    endif
    if w!=""
        exec "normal! \"_ciw\<C-R>=w\<CR>\<Esc>b"
    endif
endfunc

" NumberToggle toggles between relative and absolute line numbers
function! NumberToggle()
    if(&relativenumber == 1)
        set number
    else
        set relativenumber
    endif
endfunc
" }

" MISC
" {
" Every spaces/tabs at the end of line will be highlighted.
au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\s\+$', -1)
" autocmd BufWrite * silent! %s/[\r \t]\+$//

autocmd WinLeave * set number
autocmd WinEnter * set relativenumber
autocmd InsertEnter * set number
autocmd InsertLeave * set relativenumber
" }