" Vim main configuration file.
+" Copyright (C) 2011-2012 Simon Ruderich
+"
+" This file is free software: you can redistribute it and/or modify
+" it under the terms of the GNU General Public License as published by
+" the Free Software Foundation, either version 3 of the License, or
+" (at your option) any later version.
+"
+" This file is distributed in the hope that it will be useful,
+" but WITHOUT ANY WARRANTY; without even the implied warranty of
+" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+" GNU General Public License for more details.
+"
+" You should have received a copy of the GNU General Public License
+" along with this file. If not, see <http://www.gnu.org/licenses/>.
+
" EDITOR SETTINGS
" Increase number of possible undos.
set undolevels=1000
+if has('viminfo')
+ " Remember marks (including the last cursor position) for more files.
+ set viminfo^='1000
+endif
+
" Use strong encryption if possible, also used for swap/undo files.
if exists('+cryptmethod')
set cryptmethod=blowfish
endif
+" Clear all vimrc-related autocmds. Has to be done here as the vimrc augroup
+" is used multiple times.
+if has('autocmd')
+ augroup vimrc
+ autocmd!
+ augroup END
+endif
+
" EDIT SETTINGS
" Always display the status line even if there is only one window.
set laststatus=2
+ " If there's more than one buffer return "/<nr>" (e.g. "/05") where <nr>
+ " is the highest buffer number, otherwise return nothing. Used in
+ " 'statusline' to get an overview of available buffer numbers.
+ function! StatuslineBufferCount()
+ let l:bufnr = bufnr('$')
+ if l:bufnr > 1
+ let l:result = '/'
+ if exists('*printf')
+ let l:result .= printf('%02d', l:bufnr)
+ else
+ " Older Vims don't have printf() (and no .= either). Emulate
+ " "%02d".
+ if l:bufnr < 10
+ let l:result = l:result . '0'
+ endif
+ let l:result = l:result . l:bufnr
+ endif
+ return l:result
+ else
+ return ''
+ endif
+ endfunction
+
set statusline=
" on the left
- set statusline+=%02n: " buffer number
+ set statusline+=%02n " buffer number
+ set statusline+=%{StatuslineBufferCount()} " highest buffer number
+ set statusline+=:
set statusline+=%f\ " path to current file in buffer
set statusline+=%h " [help] if buffer is help file
set statusline+=%w " [Preview] if buffer is preview buffer
" 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>
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>.
nnoremap <silent> <C-Z> :update<CR>:stop<CR>
" 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.
-nnoremap <Space> <C-F>
-nnoremap - <C-B>
+" 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 :bprev<CR>
" Fast access to buffers.
-nnoremap <silent> <Leader>1 :1b<CR>
-nnoremap <silent> <Leader>2 :2b<CR>
-nnoremap <silent> <Leader>3 :3b<CR>
-nnoremap <silent> <Leader>4 :4b<CR>
-nnoremap <silent> <Leader>5 :5b<CR>
-nnoremap <silent> <Leader>6 :6b<CR>
-nnoremap <silent> <Leader>7 :7b<CR>
-nnoremap <silent> <Leader>8 :8b<CR>
-nnoremap <silent> <Leader>9 :9b<CR>
-nnoremap <silent> <Leader>0 :10b<CR>
+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')
- noremap <silent> <Leader>sn :set nospell<CR>
- noremap <silent> <Leader>se :set spell spelllang=en_us<CR>
- noremap <silent> <Leader>sd :set spell spelllang=de_de<CR>
+ 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
set synmaxcol=500
endif
+" Use (limited) syntax based omni completion if no other omni completion is
+" available. Taken from :help ft-syntax-omni.
+ if has('autocmd') && exists('+omnifunc')
+ augroup vimrc
+ autocmd FileType *
+ \ if &omnifunc == '' |
+ \ setlocal omnifunc=syntaxcomplete#Complete |
+ \ endif
+ augroup END
+ endif
+
" Highlight lines longer than 78 characters. Thanks to Tony Mechelynck
" <antoine.mechelynck@gmail.com> from the Vim mailing list. It can easily be
" disabled when necessary with :2match (in Vim >= 700).
" Settings for specific filetypes.
" Haskell.
+ let g:hs_highlight_delimiters = 1
let g:hs_highlight_boolean = 1
let g:hs_highlight_types = 1
let g:hs_highlight_more_types = 1
-
" Perl.
let g:perl_fold = 1
let g:perl_fold_blocks = 1
let g:perl_nofold_packages = 1
let g:perl_include_pod = 1 " syntax coloring for PODs
+ " Python.
+ let g:python_highlight_all = 1
+ " Vim.
+ let g:vimsyn_embed = 0 " don't highlight embedded languages
+ let g:vimsyn_folding = 'af' " folding for autogroups (a) and functions (f)
+ " XML.
+ let g:xml_syntax_folding = 1
endif
" twice.
if has('autocmd')
augroup vimrc
-" Remove all autocmds from the current group.
- autocmd!
" Go to last position of opened files. Taken from :help last-position-jump.
autocmd BufReadPost *
- \ if line("'\"") > 1 && line("'\"") <= line("$") |
+ \ if line("'\"") > 1 && line("'\"") <= line('$') |
\ execute "normal! g'\"" |
\ endif
" But not for Git commits, go to beginning of the file.
" Automatically disable 'paste' mode when leaving insert mode. Thanks to
" Raimondi in #vim on Freenode (2010-08-14 23:01 CEST). Very useful as I only
-" want to paste once and then 'paste' gets automatically unset.
+" want to paste once and then 'paste' gets automatically unset. InsertLeave
+" doesn't exist in older Vims.
if exists('##InsertLeave')
autocmd InsertLeave * set nopaste
endif
-" Write file when running :mak[e] before 'makeprg' is called.
- autocmd QuickFixCmdPre * write
+" Write file when running :mak[e] before 'makeprg' is called. QuickFixCmdPre
+" doesn't exist in older Vims.
+ if exists('##QuickFixCmdPre')
+ autocmd QuickFixCmdPre * write
+ endif
" AFTER/FTPLUGIN AUTO COMMANDS
" file it was loaded from, thus the changes you made. Thanks to the
" vimrc_example.vim file in Vim's source. Modified to use the same filetype
" for the diffed file than the filetype for the original file.
- if !exists(":DiffOrig")
+ if !exists(':DiffOrig')
command DiffOrig
\ let s:diff_orig_filetype = &filetype
\ | vertical new