"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" by phaero - http://phaero.segolsson.se/
" 
"   In large part inspired by ( if not copied ) by:
"        Amir Salihefendic <amix3k at gmail.com> vimrc at:
"             http://www.amix.dk/vim/vimrc.html
"        Ciaran McCreesh vimrc at:
"             http://ciaranm.org/vimrc
"
" Maintainer:   Johan Segolsson < johan dot segolssson at gmail dot com >
" Version: 0.1
" Last Change: 2007-05-06 22:29:07
" 
" Sections:
" ----------------------
" General
" Colors and Fonts
" Fileformats
" VIM userinterface
"    Statusline
" Visual
" Moving around and tabs
" General Autocommands
" Parenthesis/bracket expanding
" General Abbrevs
" Editing mappings etc.
" Command-line config
" Buffer related
" Files and backups
" Folding
" Text options
"    Indent
" Spell checking
" Plugin configuration
"    Yank ring
"    File explorer
"    Minibuffer
"    Tag list (ctags) - not used
" Filetype generic
"    Todo
"    VIM
"    HTML related
"    Ruby & PHP section
"    Python section
"    Cheetah section
"    Vim section
"    Java section
"    JavaScript section
"    C mappings
"    C++ mappings
" Snippets
"    Python
"    JavaScript
"    HTML
"    Java
"    C
"    C++
" Cope
" MISC
"
"  Tip:
"   If you find anything that you can't understand than do this:
"   help keyword OR helpgrep keywords
"  Example:
"   Go into command-line mode and type helpgrep nocompatible, ie.
"   :helpgrep nocompatible
"   then press <leader>c to see the results, or :botright cw
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Get out of VI's compatible mode..
set nocompatible

" Sets how many lines of history VIM has to remember
set history=1000

" Enable filetype plugins
filetype plugin on
filetype indent on
filetype plugin indent on

" Set to auto read when a file is changed from the outside
set autoread

" Have mouse enabled all the time
set mouse=a

" Set mapleader
let mapleader=","
let g:mapleader=","

" Fast saving
nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>

" Fast reloading of the .vimrc
map <leader>s :source ~/projects/vim/vimrc<cr>
" Fast editing of .vimrc
map <leader>e :e! ~/projects/vim/vimrc<cr>
" When .vimrc is edited, reload it
"autocmd! bufwritepost vimrc source ~/projects/vimrc


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Colors and Fonts
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Enable syntax highlightning
syntax enable

" Set font
if MySys() == "linux"
    set gfn=Bitstream\ Vera\ Sans\ Mono\ Bold\ 10
else
    set gfn=Monospace\ Bold\ 10
endif

if has( "gui_running" )
    set guioptions=
    colorscheme dante
else
    set background=dark
    colorscheme dante
endif

" Some nice mappings to switch syntax ( useful if one mixes different 
" languages in one file )
map <leader>1 :set syntax=cheetah<cr>
map <leader>2 :set syntax=xhtml<cr>
map <leader>3 :set syntax=python<cr>
map <leader>4 :set ft=text<cr>
map <leader>$ :syntax sync fromstart<cr>

autocmd BufEnter * :syntax sync fromstart

" Highlight current line
"if has( "gui_running" )
"   set cursorline
"endif


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Fileformats
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 'Favorite filetypes
set ffs=unix,dos,mac

" Set default encoding
set encoding=utf-8

nmap <leader>fd :se ff=dos<cr>
nmap <leader>fu :se ff=unix<cr>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" VIM userinterface
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Set 7 lines to the cursors - when moving vertically
set so=7

" Turn on Wild menu
set wildmenu

" Always show current position
set ruler

" The commandbar is 2 high
set cmdheight=2

" Show the command we are writing
set showcmd

" Show line numbers
set nu

" Do not redraw, when running macros.. lazy redraw
set lz

" Change buffer - without saving
set hid

" Set backspace
set backspace=eol,start,indent

" Backspace and cursor keys wrap to
set whichwrap+=<,>,h,l

" Set magic on
set magic

" No sound on errors
set noerrorbells
set novisualbell
set t_vb=
autocmd GUIEnter * set novisualbell t_vb=

" show matching bracets
set showmatch

" How many tenths of a second to blink
set mat=2

" Ignore case when searching
set ignorecase
set incsearch
set infercase

" Highlight search things
set hlsearch

" Show full tags when doin search completion
set showfulltag

    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    " Statusline
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    " Always hide the status line
    set laststatus=2

    function! CurDir()
        let curdir = substitute( getcwd(), '/home/phaero/', "~/", "g" )
        return curdir
    endfunction

    " Format the statusline
    set statusline=
    set statusline+=%-3.3n\                        " Buffer
    set statusline+=%f\                            " filename
    set statusline+=%h%m%r%w                       " flags
    set statusline+=\[%{strlen(&ft)?&ft:'none'},   " Filetype
    set statusline+=%{&encoding},              " Encoding
    set statusline+=%{&fileformat}]\ \             " Fileformat
    set statusline+=CWD:\ %r%{CurDir()}%h
    set statusline+=%=                             " Right align
    set statusline+=0x%-8B\                        " Current char
    set statusline+=%-14.(%l,%c%V%)\ %<%P      " Offset



"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Visual
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" From an idea by Michael Naumann
function! VisualSearch(direction) range
    let l:saved_reg = @"
    execute "normal! vgvy"
    let l:pattern = escape(@", '\\/.*$^~[]')
    let l:pattern = substitute( l:pattern, "\n$", "", "" )
    if a:direction == 'b'
        execute "normal ?" . l:pattern . "^M"
    else
        execute "normal /" . l:pattern . "^M"
    endif
    let @/ = l:pattern
    let @" = l:saved_reg
endfunction

vnoremap <silent> * :call VisualSearch('f')<cr>
vnoremap <silent> # :call VisualSearch('b')<cr>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Moving around and tabs
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Map space to / and c-space to ?
map <space> /
map <c-space> ?

" Smart way to move btw. windows
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-h> <c-w>h
map <c-l> <c-w>l

" Actually, the tab doesn't switch buffers, but my arrows 
" BClose function can be found in "Buffer related" section
map <leader>bd :Bclose<cr>
map <down> <leader>bd

" Use the arrows to something useful
map <right> :bn<cr>
map <left> :bp<cr>

" Tab configuration
map <leader>th :tabnew %<cr>
map <leader>te :tabedit
map <leader>tc :tabclose<cr>
map <leader>tm :tabmove

try
    set switchbuf=usetab
    set stal=2
catch
endtry

" Moving fast to front, back and 2 sides ;)
imap <m-$> <esc>$a
imap <m-0> <esc>0i
imap <D-$> <esc>$a
imap <D-0> <esc>0i


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" General Autocommands
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Switch to current dir
map <leader>cd :cd %:p:h<cr>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Parenthesis/bracket expanding
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
vnoremap $1 <esc>`>a)<esc>`<i(<esc>
vnoremap $2 <esc>`>a]<esc>`<i[<esc>
vnoremap $3 <esc>`>a}<esc>`<i{<esc>
vnoremap $$ <esc>`>a"<esc>`<i"<esc>
vnoremap $q <esc>`>a'<esc>`<i'<esc>
vnoremap $w <esc>`>a"<esc>`<i"<esc>

"Map auto complete of (, ", ', [
inoremap $1 ()<esc>:let leavechar=")"<cr>i
inoremap $2 []<esc>:let leavechar="]"<cr>i
inoremap $4 {<esc>o}<esc>:let leavechar="}"<cr>O
inoremap $3 {}<esc>:let leavechar="}"<cr>i
inoremap $q ''<esc>:let leavechar="'"<cr>i
inoremap $w ""<esc>:let leavechar='"'<cr>i
au BufNewFile,BufRead *.\(vim\)\@! inoremap " ""<esc>:let leavechar='"'<cr>i
au BufNewFile,BufRead *.\(txt\)\@! inoremap ' ''<esc>:let leavechar="'"<cr>i

imap <m-l> <esc>:exec "normal f" . leavechar<cr>a
imap <d-l> <esc>:exec "normal f" . leavechar<cr>a


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" General Abbrevs
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" My information
iab xdate <c-r>=strftime("%Y-%m-%d %T")<cr>
iab xname Johan Segolsson


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Editing mappings etc.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Remap VIM 0
map 0 ^

"Move a line of text using control
nmap <M-j> mz:m+<cr>`z
nmap <M-k> mz:m-2<cr>`z
vmap <M-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <M-k> :m'<-2<cr>`>my`<mzgv`yo`z

if MySys() == "mac"
    nmap <D-j> <M-j>
    nmap <D-k> <M-k>
    vmap <D-j> <M-j>
    vmap <D-k> <M-k>
endif

func! DeleteTrailingWS()
    exe "normal mz"
    %s/\s\+$//ge
    exe "normal `z"
endfunc

autocmd BufWrite *.py :call DeleteTrailingWS()

set completeopt=menu


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Command-line config
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
func! Cwd()
    let cwd = getcwd()
    return "e " . cwd 
endfunc

func! DeleteTillSlash()
    let g:cmd = getcmdline()
    if MySys() == "linux" || MySys() == "mac"
        let g:cmd_edited = substitute(g:cmd, "\\(.*\[/\]\\).*", "\\1", "")
    else
        let g:cmd_edited = substitute(g:cmd, "\\(.*\[\\\\]\\).*", "\\1", "")
    endif
    if g:cmd == g:cmd_edited
        if MySys() == "linux" || MySys() == "mac"
            let g:cmd_edited = substitute(g:cmd, "\\(.*\[/\]\\).*/", "\\1", "")
         else
            let g:cmd_edited = substitute(g:cmd, "\\(.*\[\\\\\]\\).*\[\\\\\]", "\\1", "")
        endif
    endif
    return g:cmd_edited
endfunc

func! CurrentFileDir(cmd)
  return a:cmd . " " . expand("%:p:h") . "/"
endfunc

"Smart mappings on the command line
cno $h e ~/
cno $d e ~/Desktop/
cno $j e ./

cno $q <C-\>eDeleteTillSlash()<cr>

cno $c e <C-\>eCurrentFileDir("e")<cr>

cno $tc <C-\>eCurrentFileDir("tabnew")<cr>
cno $th tabnew ~/
cno $td tabnew ~/Desktop/

"Bash like
cnoremap <C-A>   <Home>
cnoremap <C-E>   <End>
cnoremap <C-K>   <C-U>

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Buffer related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Fast open a buffer by search for a name
map <c-q> :sb

"Open a dummy buffer for paste
map <leader>q :e ~/buffer<cr>

"Restore cursor to file position in previous editing session
set viminfo='10,\"100,:20,%,n~/.viminfo
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

" Buffer - reverse everything ... :)
map <F9> ggVGg?

" Don't close window, when deleting a buffer
command! Bclose call <SID>BufcloseCloseIt()

function! <SID>BufcloseCloseIt()
    let l:currentBufNum = bufnr("%")
    let l:alternateBufNum = bufnr("#")

    if buflisted(l:alternateBufNum)
        buffer #
    else
        bnext
    endif

    if bufnr("%") == l:currentBufNum
        new
    endif

    if buflisted(l:currentBufNum)
        execute("bdelete! ".l:currentBufNum)
    endif
endfunction


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Files and backups
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Turn backup off
set nobackup
set nowb
set noswapfile


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Folding
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Enable folding, I find it very useful
set nofen
set fdl=0

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Text options
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"set expandtab
set nosta
set noet
set shiftwidth=4
set tabstop=4

map <leader>t2 :set shiftwidth=2<cr>
map <leader>t4 :set shiftwidth=4<cr>
map <leader>ts :set sta et<cr>
map <leader>tt :set nosta noet<cr>

" Don't remove indent even if I don't write anything on that line
imap <cr> <cr> <bs>

" Highlight whitespace
if has( "gui_running" )
    set listchars=eol:,tab:»\ ,trail:.,extends:<e2><80><a6>
else
    set listchars=eol:$,tab:>-,trail:.
endif
set list

" Don't make # force column 0
au FileType python,bash inoremap # X<bs>#

"au FileType html,python,vim,javascript setl shiftwidth=4
"au FileType html,python,vim,javascript setl tabstop=4
"au FileType java setl shiftwidth=4
"au FileType java setl tabstop=4

set lbr
set tw=500

" Help with completion
set dictionary=/usr/share/dict/words

" set up some more useful digraphs
digraph ., 8230  " ellipsis (…)

    """"""""""""""""""""""""""""""
    " Indent
    """"""""""""""""""""""""""""""
    "Auto indent
    set ai

    "Smart indet
    set si

    "C-style indeting
    "set cindent
    set smartindent

    "Wrap lines
    set wrap


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Spell checking
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
map <leader>sn ]s
map <leader>sp [s
map <leader>sa zg
map <leader>s? z=


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Keybindings
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Delete a buffer but keep layout
command! Kwbd enew|bw #

nmap <silent> <f3> :silent nohlsearch<cr>
imap <silent> <f3> <c-o>:silent nohlsearch<cr>
nmap <f4> :Kwbd<cr>
nmap <f5> <c-w>c
nmap <F7> :so %<CR>
nmap <F8> :make<CR>
nmap <F11> <C-]>
nmap <F12> :pop<CR>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Plugin configuration
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

    """"""""""""""""""""""""""""""
    " Vim Grep
    """"""""""""""""""""""""""""""
    let Grep_Skip_Dirs = 'RCS CVS SCCS .svn'

    """"""""""""""""""""""""""""""
    " Yank Ring
    """"""""""""""""""""""""""""""
    map <leader>y :YRShow<cr>

    """"""""""""""""""""""""""""""
    " File explorer
    """"""""""""""""""""""""""""""
    "Split vertically
    let g:explVertical=1

    "Window size
    let g:explWinSize=35

    let g:explSplitLeft=1
    let g:explSplitBelow=1

    "Hide some files
    let g:explHideFiles='^\.,.*\.class$,.*\.swp$,.*\.pyc$,.*\.swo$,\.DS_Store$'

    "Hide the help thing..
    let g:explDetailedHelp=0


    """"""""""""""""""""""""""""""
    " Minibuffer
    """"""""""""""""""""""""""""""
    let g:miniBufExplModSelTarget = 1
    let g:miniBufExplorerMoreThanOne = 0
    let g:miniBufExplModSelTarget = 0
    let g:miniBufExplUseSingleClick = 1
    let g:miniBufExplMapWindowNavVim = 1
    let g:miniBufExplVSplit = 25
    let g:miniBufExplSplitBelow=1

    let g:bufExplorerSortBy = "name"

    autocmd BufRead,BufNew :call UMiniBufExplorer


    """"""""""""""""""""""""""""""
    " Tag list (ctags) - not used
    """"""""""""""""""""""""""""""
    "let Tlist_Ctags_Cmd = "/sw/bin/ctags-exuberant"
    "let Tlist_Sort_Type = "name"
    "let Tlist_Show_Menu = 1
    "map <leader>t :Tlist<cr>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Filetype generic
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
autocmd FileType c set omnifunc=ccomplete#Complete

    """"""""""""""""""""""""""""""
    " VIM
    """"""""""""""""""""""""""""""
    autocmd FileType vim map <buffer> <leader><space> :w!<cr>:source %<cr>


    """"""""""""""""""""""""""""""
    " HTML related
    """"""""""""""""""""""""""""""
    " HTML entities - used by xml edit plugin
    let xml_use_xhtml = 1
    "let xml_no_auto_nesting = 1

    "To HTML
    let html_use_css = 1
    let html_number_lines = 0
    let use_xhtml = 1


    """"""""""""""""""""""""""""""
    " PHP section
    """"""""""""""""""""""""""""""
    autocmd FileType php compiler php
    autocmd FileType php map <buffer> <leader><space> <leader>cd:w<cr>:make %<cr>


    """"""""""""""""""""""""""""""
    " Python section
    """"""""""""""""""""""""""""""
    "Run the current buffer in python - ie. on leader+space
    au FileType python so ~/projects/vim/scripts/python.vim
    autocmd FileType python map <buffer> <leader><space> :w!<cr>:!python %<cr>
    autocmd FileType python so ~/projects/vim/ftplugin/python_fold.vim

    "Set some bindings up for 'compile' of python
    autocmd FileType python compiler pylint
    autocmd BufReadPost quickfix map <buffer> <silent> <cr> :.cc <cr> :ccl
    autocmd FileType python nmap <leader>cw :cw<cr>
    autocmd FileType python nmap <leader>cn :cn<cr>
    autocmd FileType python nmap <leader>cp :cp<cr>
    "autocmd FileType python set makeprg=python\ -c\ \"import\ py_compile,sys;\ sys.stderr=sys.stdout;\ py_compile.compile(r'%')\"
    "autocmd FileType python set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m

    "Python iMaps
    au FileType python set cindent
    au FileType python inoremap <buffer> $r return
    au FileType python inoremap <buffer> $s self
    au FileType python inoremap <buffer> $c ##<cr>#<space><cr>#<esc>kla
    au FileType python inoremap <buffer> $i import
    au FileType python inoremap <buffer> $p print
    au FileType python inoremap <buffer> $d """<cr>"""<esc>O

    "Run in the Python interpreter
    function! Python_Eval_VSplit() range
        let src = tempname()
        let dst = tempname()
        execute ": " . a:firstline . "," . a:lastline . "w " . src
        execute ":!python " . src . " > " . dst
        execute ":pedit! " . dst
    endfunction
    au FileType python vmap <F6> :call Python_Eval_VSplit()<cr>

    """"""""""""""""""""""""""""""
    " Cheetah section
    """""""""""""""""""""""""""""""
    autocmd FileType cheetah set ft=xml
    autocmd FileType cheetah set syntax=cheetah

    """""""""""""""""""""""""""""""
    " Vim section
    """""""""""""""""""""""""""""""
    autocmd FileType vim set nofen

    """""""""""""""""""""""""""""""
    " Java section
    """""""""""""""""""""""""""""""
    au FileType java inoremap <buffer> <C-t> System.out.println();<esc>hi

    "Java comments
    autocmd FileType java source ~/vim_local/macros/jcommenter.vim
    autocmd FileType java let b:jcommenter_class_author='Johan Segolsson'
    autocmd FileType java let b:jcommenter_file_author='Johan Segolsson'
    autocmd FileType java map <buffer> <F2> :call JCommentWriter()<cr>

    "Abbr'z
    autocmd FileType java inoremap <buffer> $pr private
    autocmd FileType java inoremap <buffer> $r return
    autocmd FileType java inoremap <buffer> $pu public
    autocmd FileType java inoremap <buffer> $i import
    autocmd FileType java inoremap <buffer> $b boolean
    autocmd FileType java inoremap <buffer> $v void
    autocmd FileType java inoremap <buffer> $s String

    "Folding
    function! JavaFold()
        setl foldmethod=syntax
        setl foldlevelstart=1
        syn region foldBraces start=/{/ end=/}/ transparent fold keepend extend
        syn match foldImports /\(\n\?import.\+;\n\)\+/ transparent fold

        function! FoldText()
            return substitute(getline(v:foldstart), '{.*', '{...}', '')
        endfunction
        setl foldtext=FoldText()
    endfunction

    au FileType java call JavaFold()
    au FileType java setl fen

    au BufEnter *.sablecc,*.scc set ft=sablecc

    """"""""""""""""""""""""""""""
    " JavaScript section
    """""""""""""""""""""""""""""""
    au FileType javascript so ~/vim_local/syntax/javascript.vim
    function! JavaScriptFold()
      setl foldmethod=syntax
      setl foldlevelstart=1
      syn region foldBraces start=/{/ end=/}/ transparent fold keepend extend

      function! FoldText()
         return substitute(getline(v:foldstart), '{.*', '{...}', '')
      endfunction
      setl foldtext=FoldText()
    endfunction
    au FileType javascript call JavaScriptFold()
    au FileType javascript setl fen

    au FileType javascript imap <c-t> console.log();<esc>hi
    au FileType javascript imap <c-a> alert();<esc>hi
    au FileType javascript setl nocindent
    au FileType javascript inoremap <buffer> $r return

    au FileType javascript inoremap <buffer> $d //<cr>//<cr>//<esc>ka<space>
    au FileType javascript inoremap <buffer> $c /**<cr><space><cr>**/<esc>ka


    """"""""""""""""""""""""""""""
    " HTML
    """""""""""""""""""""""""""""""
    au FileType html,cheetah set ft=xml
    au FileType html,cheetah set syntax=html


    """"""""""""""""""""""""""""""
    " C mappings
    """""""""""""""""""""""""""""""
    autocmd FileType c map <buffer> <leader><space> :w<cr>:!gcc %<cr>


    """"""""""""""""""""""""""""""
    " C++ mappings
    """""""""""""""""""""""""""""""
    fun! <SID>abbrev_cpp()
        inoremap <buffer> jci const_iterator
        inoremap <buffer> jcl class
        inoremap <buffer> jco const
        inoremap <buffer> jdx /**<CR><CR>/<Up>
        inoremap <buffer> jit iterator
        inoremap <buffer> jns namespace
        inoremap <buffer> jpr protected
        inoremap <buffer> jpu public
        inoremap <buffer> jpv private
        inoremap <buffer> jsl std::list
        inoremap <buffer> jsm std::map
        inoremap <buffer> jss std::string
        inoremap <buffer> jsv std::vector
        inoremap <buffer> jty typedef
        inoremap <buffer> jun using namespace
        inoremap <buffer> jvi virtual
    endfun

    autocmd FileType cpp :call <SID>abbrev_cpp()


""""""""""""""""""""""""""""""
" Snippets
"""""""""""""""""""""""""""""""
    " This will be rewritten later...
    " 
    "You can use <c-j> to goto the next <++> - it is pretty smart ;)

    """""""""""""""""""""""""""""""
    " Python
    """""""""""""""""""""""""""""""
    autocmd FileType python inorea <buffer> cfun <c-r>=IMAP_PutTextWithMovement("def <++>(<++>):\n<++>\nreturn <++>")<cr>
    autocmd FileType python inorea <buffer> cclass <c-r>=IMAP_PutTextWithMovement("class <++>:\n<++>")<cr>
    autocmd FileType python inorea <buffer> cfor <c-r>=IMAP_PutTextWithMovement("for <++> in <++>:\n<++>")<cr>
    autocmd FileType python inorea <buffer> cif <c-r>=IMAP_PutTextWithMovement("if <++>:\n<++>")<cr>
    autocmd FileType python inorea <buffer> cifelse <c-r>=IMAP_PutTextWithMovement("if <++>:\n<++>\nelse:\n<++>")<cr>


    """""""""""""""""""""""""""""""
    " JavaScript
    """""""""""""""""""""""""""""""
    autocmd FileType cheetah,html,javascript inorea <buffer> cfun <c-r>=IMAP_PutTextWithMovement("function <++>(<++>) {\n<++>;\nreturn <++>;\n}")<cr>
    autocmd filetype cheetah,html,javascript inorea <buffer> cfor <c-r>=IMAP_PutTextWithMovement("for(<++>; <++>; <++>) {\n<++>;\n}")<cr>
    autocmd FileType cheetah,html,javascript inorea <buffer> cif <c-r>=IMAP_PutTextWithMovement("if(<++>) {\n<++>;\n}")<cr>
    autocmd FileType cheetah,html,javascript inorea <buffer> cifelse <c-r>=IMAP_PutTextWithMovement("if(<++>) {\n<++>;\n}\nelse {\n<++>;\n}")<cr>


    """""""""""""""""""""""""""""""
    " HTML
    """""""""""""""""""""""""""""""
    autocmd FileType cheetah,html inorea <buffer> cahref <c-r>=IMAP_PutTextWithMovement('<a href="<++>"><++></a>')<cr>
    autocmd FileType cheetah,html inorea <buffer> cbold <c-r>=IMAP_PutTextWithMovement('<b><++></b>')<cr>
    autocmd FileType cheetah,html inorea <buffer> cimg <c-r>=IMAP_PutTextWithMovement('<img src="<++>" alt="<++>" />')<cr>
    autocmd FileType cheetah,html inorea <buffer> cpara <c-r>=IMAP_PutTextWithMovement('<p><++></p>')<cr>
    autocmd FileType cheetah,html inorea <buffer> ctag <c-r>=IMAP_PutTextWithMovement('<<++>><++></<++>>')<cr>
    autocmd FileType cheetah,html inorea <buffer> ctag1 <c-r>=IMAP_PutTextWithMovement("<<++>><cr><++><cr></<++>>")<cr>


    """""""""""""""""""""""""""""""
    " Java
    """""""""""""""""""""""""""""""
    autocmd FileType java inorea <buffer> cfun <c-r>=IMAP_PutTextWithMovement("public<++> <++>(<++>) {\n<++>;\nreturn <++>;\n}")<cr>
    autocmd FileType java inorea <buffer> cfunpr <c-r>=IMAP_PutTextWithMovement("private<++> <++>(<++>) {\n<++>;\nreturn <++>;\n}")<cr>
    autocmd FileType java inorea <buffer> cfor <c-r>=IMAP_PutTextWithMovement("for(<++>; <++>; <++>) {\n<++>;\n}")<cr>
    autocmd FileType java inorea <buffer> cif <c-r>=IMAP_PutTextWithMovement("if(<++>) {\n<++>;\n}")<cr>
    autocmd FileType java inorea <buffer> cifelse <c-r>=IMAP_PutTextWithMovement("if(<++>) {\n<++>;\n}\nelse {\n<++>;\n}")<cr>
    autocmd FileType java inorea <buffer> cclass <c-r>=IMAP_PutTextWithMovement("class <++> <++> {\n<++>\n}")<cr>
    autocmd FileType java inorea <buffer> cmain <c-r>=IMAP_PutTextWithMovement("public static void main(String[] argv) {\n<++>\n}")<cr>


    """""""""""""""""""""""""""""""
    " C++
    """""""""""""""""""""""""""""""
    fun! <SID>templates_cpp()
        inorea <buffer> csi <c-r>=IMAP_PutTextWithMovement( "#include <<++>>\n<++>" )<cr>
        inorea <buffer> cii <c-r>=IMAP_PutTextWithMovement( "#include \"<++>\"\n<++>" )<cr>
        inorea <buffer> cfund <c-r>=IMAP_PutTextWithMovement( "<+ret+> <+name+>( <+args+> );\n<++>" )<cr>
        inorea <buffer> cfun <c-r>=IMAP_PutTextWithMovement( "<+ret+> <+name+>( <+args+> )\n{\n<++>\n} // end func" )<cr>
        inorea <buffer> cif <c-r>=IMAP_PutTextWithMovement("if(<++> ) {\n<++>\n} // end if\n<++>")<cr>
        inorea <buffer> cifelse <c-r>=IMAP_PutTextWithMovement("if(<++> ) {\n<++>\n} else {\n<++>\n} // end if\n<++>")<cr>
        inorea <buffer> cfor <c-r>=IMAP_PutTextWithMovement("for(<++>; <++>; <++> ) {\n<++>\n} // end for\n<++>")<cr>
        inorea <buffer> cwhile <c-r>=IMAP_PutTextWithMovement("while(<++> ) {\n<++>\n} // end while\n<++>")<cr>
        inorea <buffer> cdo <c-r>=IMAP_PutTextWithMovement("do {\n<++>\n} while( <+cond+> );\n<++>")<cr>
        inorea <buffer> cclass <c-r>=IMAP_PutTextWithMovement( "class<+name+>\n{\n<++>\n}; // end class" )<cr>
        inorea <buffer> cclassi <c-r>=IMAP_PutTextWithMovement( "class<+name+> : <+base+>\n{\n<++>\n}; // end class" )<cr>
        inorea <buffer> cmain <c-r>=IMAP_PutTextWithMovement("int main( int argc, char* argv[] )\n{\n<++>\n} // end main")<cr>
    endfun

    autocmd FileType cpp :call <SID>templates_cpp()

    "Press c-q instead of space (or other key) to complete the snippet
    imap <C-q> <C-]>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Cope
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"For Cope
"map <silent> <leader><cr> :noh<cr>

"Orginal for all
"map <leader>n :cn<cr>
"map <leader>p :cp<cr>
"map <leader>c :botright cw 10<cr>
"map <c-u> <c-l><c-j>:q<cr>:botright cw 10<cr>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" MISC
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Remove the Windows ^M
noremap <Leader>m mmHmt:%s/<C-V><cr>//ge<cr>'tzt'm

"Paste toggle - when pasting something in, don't indent.
set pastetoggle=<f2>

"Remove indenting on empty lines
"map <F2> :%s/\s*$//g<cr>:noh<cr>''

"Super paste
inoremap <C-v> <esc>:set paste<cr>mui<C-R>+<esc>mv'uV'v=:set nopaste<cr>

"A function that inserts links & anchors on a TOhtml export.
" Notice:
" Syntax used is:
" Link
" Anchor
function! SmartTOHtml()
    TOhtml
    try
        %s/&quot;\s\+\*&gt; \(.\+\)</" <a href="#\1" style="color: cyan">\1<\/a></g
        %s/&quot;\(-\|\s\)\+\*&gt; \(.\+\)</" \&nbsp;\&nbsp; <a href="#\2" style="color: cyan;">\2<\/a></g
        %s/&quot;\s\+=&gt; \(.\+\)</" <a name="\1" style="color: #fff">\1<\/a></g
    catch
    endtry
    exe ":write!"
    exe ":bd"
endfunction