ssvistunov /.vimrc

set nocompatible
set ruler
set incsearch
set smartcase
set nohlsearch
set novisualbell
set t_vb=
set hidden
set history=500
set undolevels=500
set ttyfast

set encoding=cp1251
set fileencodings=cp1251
set termencoding=cp1251

set mouse=a
set mousemodel=popup

set autoindent
set smartindent
set expandtab
set nowrap
set backspace=indent,eol,start whichwrap+=<,>,[,]
set backspace=2

set shiftwidth=4
set softtabstop=4
set tabstop=8

let loaded_matchparen = 1

" Coloring " colorschemes blue darkblue default desert elflord evening koehler morning murphy pablo peachpuff ron shine torte zellner
syntax on
set t_Co=256
set background=dark
colorscheme darkblue

" Remove whitespace on save
autocmd BufWritePre *.* call StripTrailingSpaces()

" Perl fold
let perl_fold=1
let perl_nofold_packages=1
set foldtext=MyFoldText()
set foldclose="all"
set foldopen="block,insert,jump,mark,percent,quickfix,search,tag,undo"
set foldcolumn=1

" Plugins
runtime plugin/*.vim

" Backups
set backupdir=~/.vim/tmp,/tmp
set directory=~/.vim/tmp,/tmp



" Maping ======================================================================

" No Replace mode TODO shit with blank line
imap  li

" Delete Line
nmap  dd
imap  dd

" Undo Redo
nmap  u
imap  u
vmap  u
nmap  
imap  
vmap  

" Ctrl xcv TODO
vmap  yi
vmap  di
nmap  p
imap  pi

" Open Close folds
nmap  :call OpenCloseFold()
imap  :call OpenCloseFold()
vmap  :call OpenCloseFold()

" Toggle Comment / Tab TODO
vmap  :<gv
vmap  :>gv
vmap  :s/^\(\s*\)#/\1/gv
vmap  :s/^\(.*\)/#\1/gv

" nosi noai / si ai / wrap / nowrap TODO
nmap  :set si ai
imap  :set si ai
vmap  :set si ai
nmap  :set nosi noai
imap  :set nosi noai
vmap  :set nosi noai
nmap  :set wrap
imap  :set wrap
vmap  :set wrap
nmap  :set nowrap
imap  :set nowrap
vmap  :set nowrap

" Save and Quit
nmap  :w
imap  :w
vmap  :w
nmap  :q!
imap  :q!
vmap  :q!

"nmap  :call Testing()

"set winminheight=0
"nnoremap  rk:resize
"nnoremap  jR:resize
"inoremap  i
"inoremap  i



" FUNCTIONS ===================================================================

" For test propose TODO
fun! Testing()
    echo v:foldclose
endfun

" StripTrailingSpaces
fun! StripTrailingSpaces()
    let currPos=Mark()
    exec 'v:^--\s*$:s:\s\+$::e'
    exe currPos
endfun

" Mark
fun! Mark(...)
    if a:0 == 0
        let mark = line(".") . "G" . virtcol(".") . "|"
        normal! H
        let mark = "normal!" . line(".") . "Gzt" . mark
        execute mark
        return mark
    elseif a:0 == 1
        return "normal!" . a:1 . "G1|"
    else
        return "normal!" . a:1 . "G" . a:2 . "|"
    endif
endfun

" MyFoldText
fun! MyFoldText()
    let line = getline(v:foldstart)
    let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
    return sub
endfun

" OpenCloseFold
fun OpenCloseFold()
    if foldclosed(line(".")) == -1
        try
            exec "foldclose"
        catch
        endtry
    else
        try
            let cursor=Mark(v:foldstart)
            exec "foldopen"
            exe cursor
        catch
        endtry
    endif
endfun