+" MAPPINGS (except for plugins, see PLUGIN SETTINGS below)
+
+" noremap is used to make sure the right side is executed as is and can't be
+" modified by a plugin or other settings. Except for <Nop> which isn't
+" affected by mappings.
+
+" Easy way to exit insert mode.
+inoremap jj <Esc>
+inoremap jk <Esc>
+" Also for command mode, thanks to http://github.com/mitechie/pyvim
+" (2010-10-15).
+cnoremap jj <C-C>
+cnoremap jk <C-C>
+
+" Disable arrow keys for all modes except command modes. Thanks to James Vega
+" (http://git.jamessan.com/?p=etc/vim.git;a=summary).
+map <Right> <Nop>
+map <Left> <Nop>
+map <Up> <Nop>
+map <Down> <Nop>
+imap <Right> <Nop>
+imap <Left> <Nop>
+imap <Up> <Nop>
+imap <Down> <Nop>
+" Also disable arrow keys in command mode, use <C-P>/<C-N> as replacement (see
+" below).
+cmap <Up> <Nop>
+cmap <Down> <Nop>
+cmap <Right> <Nop>
+cmap <Left> <Nop>
+
+" Use <C-P>/<C-N> as replacement for <Up>/<Down> in command mode. Thanks to
+" abstrakt and grayw in #vim on Freenode (2010-04-12 21:20 CEST).
+cnoremap <C-P> <Up>
+cnoremap <C-N> <Down>
+
+if has('eval')
+" Don't move the cursor to the first column for certain scroll commands (<C-F,
+" <C-B>, <C-D>, <C-U>). Thanks to jamessan in #vim on Freenode (2011-08-31
+" 02:27 CEST) for the 'nostartofline' tip. But I can't use 'nostartofline'
+" directly because it also enables that feature for other commands which I
+" don't want.
+
+ " Set 'nostartofline' for a single movement.
+ function! s:TemporaryNostartofline(movement)
+ let l:startofline = &startofline
+ set nostartofline
+ execute 'normal! ' . a:movement
+ let &startofline = l:startofline
+ endfunction
+
+ " Thanks to fow in #vim on Freenode (2012-02-16 15:38 CET) for the idea to
+ " use "<Bslash><Lt>"; Vim documentation reference: :help <>.
+ nnoremap <silent> <C-F>
+ \ :call <SID>TemporaryNostartofline("<Bslash><Lt>C-F>")<CR>
+ nnoremap <silent> <C-B>
+ \ :call <SID>TemporaryNostartofline("<Bslash><Lt>C-B>")<CR>
+ nnoremap <silent> <C-D>
+ \ :call <SID>TemporaryNostartofline("<Bslash><Lt>C-D>")<CR>
+ nnoremap <silent> <C-U>
+ \ :call <SID>TemporaryNostartofline("<Bslash><Lt>C-U>")<CR>
+endif
+
+" Write before suspending, thanks to deryni in #vim on Freenode (2011-05-09
+" 20:02 CEST). To suspend without saving either unmap this or use :stop<CR>.
+" Only the current buffer is written.
+nnoremap <silent> <C-Z> :update<CR>:stop<CR>
+
+" 2<C-G> gives more verbose information, use it by default. Thanks to NCS_One
+" in #vim on Freenode (2011-08-15 00:17 CEST).
+nnoremap <C-G> 2<C-G>
+
+" Use <Space> to move down a page and - to move up one like in mutt. Don't use
+" nnoremap so the <C-F>/<C-B> 'nostartofline' fix (see above) works.
+nmap <Space> <C-F>
+nmap - <C-B>
+
+" Go to next and previous buffer. Thanks to elik in #vim on Freenode
+" (2010-05-16 18:38 CEST) for this idea.
+nnoremap <silent> gb :bnext<CR>
+nnoremap <silent> gB :bprevious<CR>
+
+" Fast access to buffers.
+nnoremap <silent> <Leader>1 :1buffer<CR>
+nnoremap <silent> <Leader>2 :2buffer<CR>
+nnoremap <silent> <Leader>3 :3buffer<CR>
+nnoremap <silent> <Leader>4 :4buffer<CR>
+nnoremap <silent> <Leader>5 :5buffer<CR>
+nnoremap <silent> <Leader>6 :6buffer<CR>
+nnoremap <silent> <Leader>7 :7buffer<CR>
+nnoremap <silent> <Leader>8 :8buffer<CR>
+nnoremap <silent> <Leader>9 :9buffer<CR>
+nnoremap <silent> <Leader>0 :10buffer<CR>
+
+" Make last active window the only window. Similar to <C-W> o.
+nnoremap <C-W>O <C-W>p<C-W>o
+
+" Maps to change spell language between English and German and disable spell
+" checking.
+if exists('+spell')
+ nnoremap <silent> <Leader>sn :set nospell<CR>
+ nnoremap <silent> <Leader>se :set spell spelllang=en_us<CR>
+ nnoremap <silent> <Leader>sd :set spell spelllang=de_de<CR>
+endif
+
+" Add semicolon to the end of the line. Thanks to
+" http://www.van-laarhoven.org/vim/.vimrc for this idea and godlygeek in #vim
+" on Freenode for an improved version which doesn't clobber any marks.
+nnoremap <silent> <Leader>; :call setline(line('.'), getline('.') . ';')<CR>
+
+" * and # for selections in visual mode. Thanks to
+" http://got-ravings.blogspot.com/2008/07/vim-pr0n-visual-search-mappings.html
+" and all nerds involved (godlygeek, strull in #vim on Freenode).
+if has('eval')
+ function! s:VSetSearch()
+ let l:temp = @@
+ normal! gvy
+ " Added \C to force 'noignorecase' while searching the current visual
+ " selection. I want to search for the exact string in this case.
+ let @/ = '\C' . '\V' . substitute(escape(@@, '\'), '\n', '\\n', 'g')
+ let @@ = l:temp
+ endfunction
+ vnoremap * :<C-U>call <SID>VSetSearch()<CR>//<CR>
+ vnoremap # :<C-U>call <SID>VSetSearch()<CR>??<CR>
+endif
+
+" I often type "W" instead of "w" when trying to save a file. Fix my mistake.
+" Thanks to Tony Mechelynck <antoine.mechelynck@gmail.com> from the Vim
+" mailing list for the commands.
+if v:version < 700
+ cnoreabbrev W w
+ cnoreabbrev Wa wa
+ cnoreabbrev Wq wq
+ cnoreabbrev Wqa wqa
+else
+ cnoreabbrev <expr> W
+ \ ((getcmdtype() == ':' && getcmdpos() <= 2) ? 'w' : 'W')
+ cnoreabbrev <expr> Wa
+ \ ((getcmdtype() == ':' && getcmdpos() <= 3) ? 'wa' : 'Wa')
+ cnoreabbrev <expr> Wq
+ \ ((getcmdtype() == ':' && getcmdpos() <= 3) ? 'wq' : 'Wq')
+ cnoreabbrev <expr> Wqa
+ \ ((getcmdtype() == ':' && getcmdpos() <= 4) ? 'wqa' : 'Wqa')
+endif
+" Also fix my typo with "Q".
+if v:version < 700
+ cnoreabbrev Q q
+ cnoreabbrev Qa qa
+else
+ cnoreabbrev <expr> Q
+ \ ((getcmdtype() == ':' && getcmdpos() <= 2) ? 'q' : 'Q')
+ cnoreabbrev <expr> Qa
+ \ ((getcmdtype() == ':' && getcmdpos() <= 3) ? 'qa' : 'Qa')
+endif
+
+" In case 'hlsearch' is used disable it with <C-L>. Thanks to frogonwheels and
+" vimgor (bot) in #vim on Freenode (2010-03-30 05:58 CEST).
+noremap <silent> <C-L> :nohlsearch<CR><C-L>
+
+" <C-U> in insert mode deletes a lot, break undo sequence before deleting the
+" line so the change can be undone. Thanks to the vimrc_example.vim file in
+" Vim's source.
+inoremap <C-U> <C-G>u<C-U>
+" Same for <C-@> (insert previously inserted text and leave insert mode).
+inoremap <C-@> <C-G>u<C-@>
+" And for <C-A> (insert previously inserted text).
+inoremap <C-A> <C-G>u<C-A>
+" And for <C-W> (delete word before cursor).
+inoremap <C-W> <C-G>u<C-W>
+
+if has('eval')
+" New text-objects ii and ai to work on text with the same indentation. Thanks
+" to http://vim.wikia.com/index.php?title=Indent_text_object&oldid=27126
+" (visited on 2011-11-19).
+ onoremap <silent> ai :<C-U>call <SID>IndTxtObj(0)<CR>
+ onoremap <silent> ii :<C-U>call <SID>IndTxtObj(1)<CR>
+ vnoremap <silent> ai :<C-U>call <SID>IndTxtObj(0)<CR><Esc>gv
+ vnoremap <silent> ii :<C-U>call <SID>IndTxtObj(1)<CR><Esc>gv
+
+ function! s:IndTxtObj(inner)
+ let curline = line(".")
+ let lastline = line("$")
+ let i = indent(line(".")) - &shiftwidth * (v:count1 - 1)
+ let i = i < 0 ? 0 : i
+ if getline(".") !~ "^\\s*$"
+ let p = line(".") - 1
+ let nextblank = getline(p) =~ "^\\s*$"
+ while p > 0
+ \ && ((i == 0 && !nextblank)
+ \ || (i > 0 && ((indent(p) >= i
+ \ && !(nextblank && a:inner))
+ \ || (nextblank && !a:inner))))
+ -
+ let p = line(".") - 1
+ let nextblank = getline(p) =~ "^\\s*$"
+ endwhile
+ normal! 0V
+ call cursor(curline, 0)
+ let p = line(".") + 1
+ let nextblank = getline(p) =~ "^\\s*$"
+ while p <= lastline
+ \ && ((i == 0 && !nextblank)
+ \ || (i > 0 && ((indent(p) >= i
+ \ && !(nextblank && a:inner))
+ \ || (nextblank && !a:inner))))
+ +
+ let p = line(".") + 1
+ let nextblank = getline(p) =~ "^\\s*$"
+ endwhile
+ normal! $
+ endif
+ endfunction
+endif
+
+
+" ABBREVIATIONS
+
+" Fix some of my spelling mistakes.
+inoreabbrev relle reelle
+inoreabbrev reele reelle
+
+
+" SYNTAX SETTINGS
+