"
" Vim configuration file
"

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Useful functions
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! CleanClose()
    let todelbufNr = bufnr("%")
    let newbufNr = bufnr("#")
    if ((newbufNr != -1) && (newbufNr != todelbufNr) && buflisted(newbufNr))
        exe "b".newbufNr
    else
        bnext
    endif
    if (bufnr("%") == todelbufNr)
        new
    endif
    exe "bd".todelbufNr
endfunction

function! GetFileSize()
    let size = ''
    let bytes = getfsize(expand('%:p'))
    if bytes <= 1024
        let size = bytes . 'B'
    elseif bytes <= 1048576
        let size = (bytes / 1024) . 'KB'
    elseif bytes <= (1073741824)
        let size = (bytes / 1048576) . 'MB'
    elseif bytes <= 1099511627776
        let size = (bytes / 1073741824) . 'GB'
    elseif bytes <= 1125899906842624
        let size = (bytes / 1099511627776) . 'TB'
  endif
    return size
endfunction

function! GetMode()
    let curmode = mode()
    let mode = curmode
    if curmode == 'n'
        let mode = 'NORMAL'
    elseif curmode == 'i'
        let mode = 'INSERT'
    elseif curmode == 'R'
        let mode = 'REPLACE'
    elseif curmode == 'v'
        let mode = 'VISUAL'
    elseif curmode == 'V'
        if has("multi_byte")
            let mode = 'V⋅LINE'
        else
            let mode = 'VLINE'
        endif
    elseif curmode == 'V'
        if has("multi_byte")
            let mode = 'V⋅BLOC'
        else
            let mode = 'VBLOC'
        endif
    endif
    return mode
endfunction


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" General Settings
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"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=200 "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=$HOME/tmp "backup directory
set directory=$HOME/tmp "directory to place swap files in
set viminfo+=n$HOME/tmp/.viminfo "viminfo path

"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

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 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 shortmess=a "abbreviations on status line
set laststatus=2 "always statusline
set statusline=
set statusline+=\ %<%F\ %h%m%r%y%w
if version >= 730
    set statusline+=%q
endif
set statusline+=\ [%{GetMode()}(%n,%{mode()})]
"set statusline+=\ %{fugitive#statusline()}
set statusline+=%=
set statusline+=[
set statusline+=%{&fileformat}
set statusline+=,%{&fenc==\"\"?&enc:&fenc}
set statusline+=%{(exists(\"+bomb\")\ &&\ &bomb)?\",bom\":\"\"}
set statusline+=%{(exists(\"+binary\")\ &&\ &binary)?\",bin\":\"\"}
set statusline+=%{&endofline==1?\",eol\":\",noeol\"}
set statusline+=]
set statusline+=\ %{GetFileSize()}
set statusline+=\ %k\ %-14.(%l/%L,%c%V%)\ %P\ %3p%%

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-x> :bw<cr>
nmap <c-end> :call CleanClose()<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 backspace=indent,eol,start "enhance backspacing
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 smartindent
set cindent

"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

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Filetypes Settings
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
filetype plugin indent on