" Vim main configuration file.
" Copyright (C) 2008-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 .
" EDITOR SETTINGS
" Save 'runtimepath' in case it was changed by the system's configuration
" files. Also save 'diff' as set all& resets it; but somehow later (after
" sourcing the vimrc - for example in a VimEnter autocmd) it gets
" automagically restored to the correct value.
if has('eval')
let s:save_runtimepath = &runtimepath
let s:save_diff = &diff
endif
" Reset all options (except 'term', 'lines' and 'columns'). This makes sure a
" system wide configuration file doesn't change default values.
set all&
" And restore it after all other options were reset.
if has('eval')
let &runtimepath = s:save_runtimepath
let &diff = s:save_diff
unlet s:save_runtimepath
unlet s:save_diff
endif
" Make sure Vim (and not Vi) settings are used.
set nocompatible
" Use UTF-8 for all internal data (buffers, registers, etc.). This doesn't
" affect reading files in different encodings, see 'fileencodings' for that.
set encoding=utf-8
" Load my scripts from ~/.vim (my scripts) and ~/.vim/runtime (checkout of Vim
" runtime files) if available.
set runtimepath-=~/.vim
set runtimepath^=~/.vim,~/.vim/runtime
" Don't store swap files in the same directory as the edited file. But only if
" we have a "safe" writable directory available.
if filewritable('~/.tmp') == 2 || filewritable('~/tmp') == 2
set directory-=.
endif
" But store them in ~/.tmp or ~/tmp (already set by default) if available.
set directory^=~/.tmp
" Disable modelines as they may cause security problems. Instead use
" securemodelines (Vim script #1876).
set nomodeline
" Complete to longest common string (list:longest) and then complete all full
" matches after another (full). Thanks to pbrisbin
" (http://pbrisbin.com:8080/dotfiles/vimrc).
set wildmode=list:longest,full
" Ignore case when completing files/directories.
if exists('+wildignorecase')
set wildignorecase
endif
" Ignore files with the following extensions because I almost never want to
" edit them in Vim (specifying them manually still works of course).
set wildignore=
" C
set wildignore+=*.o,*.d,*.so
" Java
set wildignore+=*.class
" LaTeX
set wildignore+=*.aux,*.log,*.out,*.toc,*.pdf
" Python
set wildignore+=*.pyc
" Show completion menu even if only one entry matches.
if exists('+completeopt')
set completeopt+=menuone
endif
" Increase history of executed commands (:) and search patterns (/).
set history=1000
" Increase number of possible undos.
set undolevels=1000
" Remember marks (including the last cursor position) for more files. ^= is
" necessary because 'viminfo' is parsed from the beginning and the first match
" is used.
if has('viminfo')
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. Necessary to support reloading the vimrc.
if has('autocmd')
augroup vimrc
autocmd!
augroup END
endif
" HELPER FUNCTIONS
if has('eval')
" Check if the given syntax group is available. Thanks to bairui in #vim on
" Freenode (2012-02-19 01:15 CET) for the try/catch silent highlight idea.
function! s:HasSyntaxGroup(group)
try
execute 'silent highlight ' . a:group
" \a = [A-Za-z]
catch /^Vim\%((\a\+)\)\=:E411/ " 'highlight group not found'
return 0
endtry
return 1
endfunction
" Check if the given Vim version and patch is available.
function! s:HasVersionAndPatch(version, patch)
return v:version > a:version
\ || (v:version == a:version && has('patch' . a:patch))
endfunction
endif
" TERMINAL SETTINGS
" Also enable fast terminal mode in GNU screen and tmux, but not for SSH
" connections.
if &term =~# '^screen' && !exists('$SSH_CONNECTION')
set ttyfast
endif
" EDIT SETTINGS
" Enable automatic file detection, plugin and indention support.
if has('autocmd')
filetype off " necessary for pathogen to force a reload of ftplugins
filetype plugin indent on
endif
" Use UTF-8 file encoding for all files. Automatically recognize latin1 in
" existing files.
set fileencodings=utf-8,latin1
" Always use unix line-endings for new files.
set fileformats=unix,dos
" Wrap text after 78 characters.
set textwidth=78
" Set tabs to 4 spaces, use softtabs.
set shiftwidth=4
set softtabstop=4
set expandtab
" When < and > is used indent/deindent to the next 'shiftwidth' boundary.
set shiftround
" Use the default value for real tabs.
set tabstop=8
" Enable auto indention.
set autoindent
" When joining lines only add one space after a sentence.
set nojoinspaces
" Allow backspacing over autoindent and line breaks.
set backspace=indent,eol
" Start a comment when hitting enter after a commented line (r) and when using
" o or O around a commented line (o).
set formatoptions+=ro
" Don't break a line if was already longer then 'textwidth' when insert mode
" started.
set formatoptions+=l
" Remove comment leader when joining lines where it makes sense.
if HasVersionAndPatch(703, 541)
set formatoptions+=j
endif
" Allow virtual editing (cursor can be positioned anywhere, even when there is
" no character) in visual block mode.
set virtualedit=block
" Already display matches while typing the search command. This makes spotting
" typos easy and searching faster.
set incsearch
" Activate syntax folding.
if has('folding')
set foldmethod=syntax
" Only use fold column if we have enough space (for example not in a
" (virtual) terminal which has only 80 columns).
if &columns > 80
set foldcolumn=2
endif
set foldlevel=99 " no closed folds at default, 'foldenable' would disable
" folding which is not what I want
" Don't open folds for block movements like '(', '{', '[[', '[{', etc.
set foldopen-=block
endif
" Only check case if the searched word contains a capital character.
set ignorecase
set smartcase
" Activate spell checking, use English as default.
if exists('+spell') && has('syntax')
" But not when diffing because spell checking is distracting in this case.
if !&diff
set spell
endif
set spelllang=en_us
endif
" Allow buffers with changes to be hidden. Very important for effective
" editing with multiple buffers. Prevents the "E37: No write since last change
" (add ! to override)" warning when switching buffers.
set hidden
" When splitting vertically put the new window right of the current one.
if has('vertsplit')
set splitright
endif
" DISPLAY SETTINGS
" Use a dark background. Doesn't change the background color, only sets text
" colors for a dark terminal.
set background=dark
" Use my color scheme if 256 colors are available.
if &t_Co == 256 || has('gui_running')
colorscheme simon
endif
" Display line numbers.
set number
" But use as little space as possible for the numbers column. Thanks to James
" Vega (http://git.jamessan.com/?p=etc/vim.git;a=summary).
if exists('+numberwidth')
set numberwidth=1
endif
" Display the ruler with current line/file position. If 'statusline' is used
" then this only affects .
set ruler
" Display partial commands in the status line.
set showcmd
" Don't redraw screen when executing macros; increases speed. Thanks to James
" Vega (http://git.jamessan.com/?p=etc/vim.git;a=summary).
set lazyredraw
" Visualize the line the cursor is currently in.
if exists('+cursorline')
set cursorline
endif
" Highlight all matches on the screen when searching. Use (see below) to
" remove the highlighting until the next search.
set hlsearch
" Display some special characters.
set list
set listchars=
" Display tabs as ">--------".
set listchars+=tab:>-
" Display trailing whitespace as "-".
set listchars+=trail:-
" Display markers for long lines when wrapping is disabled.
set listchars+=extends:>,precedes:<
" Display non-breakable space as "!".
if v:version >= 700
set listchars+=nbsp:!
endif
" Don't draw the vertical split separator by using space as character. Thanks
" to scp1 in #vim on Freenode (2012-06-16 16:12 CEST) for the idea to use a
" non-breakable space. But a simple space works as well, as long as the
" current color scheme is not reset.
if has('windows') && has('folding')
set fillchars+=vert:\ " comment to prevent trailing whitespace
endif
if has('statusline')
" Always display the status line even if there is only one window.
set laststatus=2
" If there's more than one buffer return "/" (e.g. "/05") where
" is the highest buffer number, otherwise return nothing. Used in
" 'statusline' to get an overview of available buffer numbers.
function! s: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
" Like %f but use relative filename if it's shorter than the absolute path
" (e.g. '../../file' vs. '~/long/path/to/file'). fnamemodify()'s ':.' is
" not enough because it doesn't create '../'s.
function! s:StatuslineRelativeFilename()
" Display only filename for help files.
if &buftype == 'help'
return expand('%:t')
endif
" Special case for scratch files.
if &buftype == 'nofile'
return '[Scratch]'
endif
let l:path = expand('%')
" No file.
if l:path == ''
return '[No Name]'
endif
" Path is already relative, nothing to do.
if stridx(l:path, '/') != 0
return l:path
endif
" Absolute path to this file.
let l:path = expand('%:p')
" Shortened path to this file, thanks to bairui in #vim on Freenode
" (2012-06-23 00:54) for the tip to use fnamemodify(). This is what
" Vim normally uses as %f (minus some exceptions).
let l:original_path = fnamemodify(l:path, ':~')
" Absolute path to the current working directory.
let l:cwd = getcwd()
" Working directory completely contained in path, replace it with a
" relative path. Happens for example when opening a file with netrw.
" %f displays this as absolute path, but we want a relative path of
" course.
if stridx(l:path, l:cwd) == 0
return strpart(l:path, strlen(l:cwd) + 1)
endif
let l:path_list = split(l:path, '/')
let l:cwd_list = split(l:cwd, '/')
" Remove the common path.
while l:path_list[0] == l:cwd_list[0]
call remove(l:path_list, 0)
call remove(l:cwd_list, 0)
endwhile
" Add as many '..' as necessary for the relative path and join the
" path. Thanks to Raimondi in #vim on Freenode (2012-06-23 01:13) for
" the hint to use repeat() instead of a loop.
let l:path = repeat('../', len(l:cwd_list)) . join(l:path_list, '/')
" Use the shorter path, either relative or absolute.
if strlen(l:path) < strlen(l:original_path)
return l:path
else
return l:original_path
endif
endfunction
" Display unexpected 'fileformat' and 'fileencoding' settings.
function! s:StatuslineFileFormat()
if &fileformat != 'unix'
return '[' . &fileformat . ']'
else
return ''
endif
endfunction
function! s:StatuslineFileEncoding()
if &fileencoding != '' && &fileencoding != 'utf-8'
\ && &filetype != 'help'
return '[' . &fileencoding . ']'
else
return ''
endif
endfunction
" Return current syntax group in brackets or nothing if there's none.
function! s:StatuslineSyntaxGroup()
let l:group = synIDattr(synID(line('.'), col('.'), 1), 'name')
if l:group != ''
return '[' . l:group . '] '
else
return ''
endif
endfunction
" Short function names to make 'statusline' more readable.
function! SBC()
return StatuslineBufferCount()
endfunction
function! SRF()
return StatuslineRelativeFilename()
endfunction
function! SFF()
return StatuslineFileFormat()
endfunction
function! SFE()
return StatuslineFileEncoding()
endfunction
function! SSG()
return StatuslineSyntaxGroup()
endfunction
set statusline=
" on the left
set statusline+=%02n " buffer number
set statusline+=%{SBC()} " highest buffer number
set statusline+=:
if has('modify_fname') && v:version >= 700 " some functions need 7.0
set statusline+=%{SRF()} " path to current file
set statusline+=\ " space after path
else
set statusline+=%f\ " path to current file in buffer
endif
set statusline+=%h " [help] if buffer is help file
set statusline+=%w " [Preview] if buffer is preview buffer
set statusline+=%m " [+] if buffer was modified,
" [-] if 'modifiable' is off
set statusline+=%r " [RO] if buffer is read only
if v:version >= 700 " %#..# needs 7.0
set statusline+=%#Error# " display warnings
set statusline+=%{SFF()} " - unexpected file format
set statusline+=%{SFE()} " - unexpected file encoding
set statusline+=%## " continue with normal colors
endif
" on the right
set statusline+=%= " right align
set statusline+=0x%-8B\ " current character under cursor as hex
set statusline+=%-12.(%l,%c%V%)\ " line number (%l),
" column number (%c),
" virtual column number if different
" than %c (%V)
set statusline+=%P " position in file in percent
endif
" 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 which isn't
" affected by mappings.
" Easy way to exit insert mode. jk is preferred because it's faster.
inoremap jj
inoremap jk
" Also for command mode, thanks to http://github.com/mitechie/pyvim
" (2010-10-15).
cnoremap jj
cnoremap jk
" Disable arrow keys for all modes except command modes. Thanks to James Vega
" (http://git.jamessan.com/?p=etc/vim.git;a=summary).
map
map
map
map
imap
imap
imap
imap
" Also disable arrow keys in command mode, use / as replacement (see
" below).
cmap
cmap
cmap
cmap
" Use / as replacement for / in command mode. Thanks to
" abstrakt and grayw in #vim on Freenode (2010-04-12 21:20 CEST).
cnoremap
cnoremap
if has('eval')
" Don't move the cursor to the first column for certain scroll commands (, , ). 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 ""; Vim documentation reference: :help <>.
nnoremap
\ :call TemporaryNostartofline("C-F>")
nnoremap
\ :call TemporaryNostartofline("C-B>")
nnoremap
\ :call TemporaryNostartofline("C-D>")
nnoremap
\ :call TemporaryNostartofline("C-U>")
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.
" Only the current buffer is written, thus switching to another buffer works
" too.
nnoremap :update:stop
" 2 gives more verbose information, use it by default. Thanks to NCS_One
" in #vim on Freenode (2011-08-15 00:17 CEST).
nnoremap 2
" Use to move down a page and - to move up one like in mutt. Don't use
" nnoremap so the / 'nostartofline' fix (see above) works.
nmap
nmap -
" Go to next and previous buffer. Thanks to elik in #vim on Freenode
" (2010-05-16 18:38 CEST) for this idea.
nnoremap gb :bnext
nnoremap gB :bprevious
if has('eval')
" But when starting again at the first buffer, print a warning which
" reminds me that I've already seen that buffer.
function! s:NextBuffer()
" Are we currently on the last buffer and moving to the first?
let l:last_buffer = 0
if bufnr('%') == bufnr('$') && bufnr('$') > 1
let l:last_buffer = 1
endif
" Go to the next buffer.
if !l:last_buffer
bnext
" Go to the first buffer, silent is necessary or the following message
" won't be displayed because it's overwritten by the status message
" displayed when entering a buffer.
else
silent bnext
echohl WarningMsg
echo 'Starting again at first buffer.'
echohl None
endif
endfunction
nnoremap gb :call NextBuffer()
endif
" Fast access to buffers.
nnoremap 1 :1buffer
nnoremap 2 :2buffer
nnoremap 3 :3buffer
nnoremap 4 :4buffer
nnoremap 5 :5buffer
nnoremap 6 :6buffer
nnoremap 7 :7buffer
nnoremap 8 :8buffer
nnoremap 9 :9buffer
nnoremap 0 :10buffer
" Make last active window the only window. Similar to o.
nnoremap O po
" Maps to change spell language between English and German and disable spell
" checking.
if exists('+spell')
nnoremap sn :set nospell
nnoremap se :set spell spelllang=en_us
nnoremap sd :set spell spelllang=de_de
" If no spell support is available, these mappings do nothing.
else
nmap sn
nmap se
nmap sd
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 ; :call setline(line('.'), getline('.') . ';')
if has('eval')
" * 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).
function! s:VSetSearch()
let l:temp = @@ " unnamed register
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 * :call VSetSearch()//
vnoremap # :call VSetSearch()??
" Use 'noignorecase' for * and #. See comment in s:VSetSearch() for details.
" Thanks to the writers of s:VSetSearch(), see above.
function! s:NSetSearch()
let l:cword = expand('')
let l:regex = substitute(escape(l:cword, '\'), '\n', '\\n', 'g')
let @/ = '\C\V'. '\<' . l:regex . '\>'
endfunction
nnoremap * :call NSetSearch()//
nnoremap # :call NSetSearch()??
endif
" I often type "W" instead of "w" when trying to save a file. Fix my mistake.
" Thanks to Tony Mechelynck 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 W
\ ((getcmdtype() == ':' && getcmdpos() <= 2) ? 'w' : 'W')
cnoreabbrev Wa
\ ((getcmdtype() == ':' && getcmdpos() <= 3) ? 'wa' : 'Wa')
cnoreabbrev Wq
\ ((getcmdtype() == ':' && getcmdpos() <= 3) ? 'wq' : 'Wq')
cnoreabbrev 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 Q
\ ((getcmdtype() == ':' && getcmdpos() <= 2) ? 'q' : 'Q')
cnoreabbrev Qa
\ ((getcmdtype() == ':' && getcmdpos() <= 3) ? 'qa' : 'Qa')
endif
" In case 'hlsearch' is used disable it with . Thanks to frogonwheels and
" vimgor (bot) in #vim on Freenode (2010-03-30 05:58 CEST).
nnoremap :nohlsearch
" 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 u
" Same for (insert previously inserted text and leave insert mode).
inoremap u
" And for (insert previously inserted text).
inoremap u
" And for (delete word before cursor).
inoremap u
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 ai :call IndTxtObj(0)
onoremap ii :call IndTxtObj(1)
vnoremap ai :call IndTxtObj(0)gv
vnoremap ii :call IndTxtObj(1)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 (German).
inoreabbrev relle reelle
inoreabbrev reele reelle
" Fix some of my spelling mistakes (English).
inoreabbrev completly completely
" SYNTAX SETTINGS
" Activate syntax coloring.
if has('syntax')
syntax enable
" Don't highlight more than 500 columns as I normally don't have that long
" lines and they slow down syntax coloring. Thanks to Derek Wyatt
" (http://www.derekwyatt.org/vim/the-vimrc-file/).
if exists('+synmaxcol')
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
" Function to enable all custom highlights. Necessary as highlights are
" window-local and thus must be set for each new window.
function! s:CustomSyntaxHighlights()
" Not the first time called, nothing to do.
if exists('w:vimrc_syntax_run')
return
endif
let w:vimrc_syntax_run = 1
" Highlight lines longer than 78 characters. Thanks to Tony Mechelynck
" from the Vim mailing list. It can easily be
" disabled when necessary with :2match (in Vim >= 700).
if !&diff && exists(':2match')
" Use ColorColumn for overlong lines if available and my color
" scheme is used.
if &t_Co == 256 && HasSyntaxGroup('ColorColumn')
2match ColorColumn /\%>78v./
else
2match Todo /\%>78v./
endif
elseif !&diff
match Todo /\%>78v./
endif
if exists('*matchadd')
" Highlight some important keywords in all documents.
let l:todos = ['TODO', 'XXX', 'FIXME',
\ 'CHANGED', 'REMOVED', 'DELETED']
" Compatibility fix for Vim 6.4 which can't handle for in function
" (without function it's ignored).
execute ' for l:x in l:todos'
\ '| call matchadd("Todo", l:x)'
\ '| endfor'
" Highlight Unicode whitespace which is no normal whitespace (0x20).
let l:spaces = ['00a0', '1680', '180e', '2000', '2001', '2002',
\ '2003', '2004', '2005', '2006', '2007', '2008',
\ '2009', '200a', '200b', '200c', '200d', '202f',
\ '205f', '2060', '3000', 'feff']
" Compatibility fix for Vim 6.4. Escape \ inside the " string or
" it won't work!
execute ' for l:x in l:spaces'
\ '| call matchadd("Error", "\\%u" . l:x)'
\ '| endfor'
" Special highlight for tabs to reduce their visibility in contrast to other
" SpecialKey characters (e.g. ^L).
if &t_Co == 256 && HasSyntaxGroup('specialKeyTab')
call matchadd('specialKeyTab', '\t')
endif
endif
endfunction
" Enable highlights for the current and all new windows. Thanks to bairui in
" #vim on Freenode (2012-04-01 00:22 CEST) for the WinEnter suggestion.
call CustomSyntaxHighlights()
if has('autocmd')
augroup vimrc
autocmd WinEnter * call CustomSyntaxHighlights()
augroup END
endif
" Settings for specific filetypes.
" C
let g:c_no_if0_fold = 1 " fix weird double fold in #if0 in recent versions
" 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
" Java.
let g:java_highlight_java_lang_ids = 1 " color java.lang.* identifiers
" 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
" PHP.
let g:php_folding = 3 " fold functions
let g:php_short_tags = 0 " no short tags ( .. ?>), not always usable
let g:php_sql_query = 1 " highlight SQL queries in strings
" Python.
let g:python_highlight_all = 1
" Shell.
let g:sh_noisk = 1 " don't add . to 'iskeyword'
let g:sh_is_posix = 1 " POSIX shell (e.g. dash) is compatible enough
let g:sh_fold_enabled = 7 " functions (1), heredoc (2) and if/do/for (4)
" 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
" PLUGIN SETTINGS
if has('eval')
" Use pathogen which allows one 'runtimepath' entry per plugin. This makes
" installing/removing/updating plugins simple. (Used for plugins with more
" than one file.) Ignore errors in case pathogen is not installed.
if v:version >= 700
silent! execute 'call pathogen#infect()'
endif
" Settings for securemodelines.
" Only allow items I need (also includes spl which is not enabled by
" default).
if v:version >= 700 " need lists
let g:secure_modelines_allowed_items = ['ft', 'spl', 'fdm',
\ 'sw', 'sts', 'noet']
endif
" Settings for the NERD commenter.
" Don't create any mappings I don't want to use.
let g:NERDCreateDefaultMappings = 0
" Map toggle comment.
nmap NERDCommenterToggle
" XPTemplate settings.
" Try to maintain snippet rendering even after editing outside of a
" snippet.
let g:xptemplate_strict = 0
" Don't complete any braces automatically.
let g:xptemplate_brace_complete = 0
" Only highlight the current placeholder.
let g:xptemplate_highlight = 'current'
" CtrlP settings.
" Don't manage the working directory (the default setting is too slow for
" me).
let g:ctrlp_working_path_mode = 0
" Path to cache directory. I prefer to keep generated files as local as
" possible.
let g:ctrlp_cache_dir = $HOME . '/.vim/cache/ctrlp'
" Permanent cache, cleared by a crontab entry.
let g:ctrlp_clear_cache_on_exit = 0
" FSWitch settings.
" Default don't work well for my projects.
augroup vimrc
autocmd BufEnter *.cc let b:fswitchdst = 'h'
\ | let b:fswitchlocs = './'
autocmd BufEnter *.h let b:fswitchdst = 'cc,c'
\ | let b:fswitchlocs = './'
augroup END
" Switch to corresponding header/source file.
nnoremap h :FSHere
endif
" AUTO COMMANDS
" Use a custom auto group to prevent problems when the vimrc files is sourced
" twice.
if has('autocmd')
augroup vimrc
" Go to last position of opened files. Taken from :help last-position-jump.
autocmd BufReadPost *
\ if line("'\"") > 1 && line("'\"") <= line('$') |
\ execute "normal! g'\"" |
\ endif
" But not for Git commits, go to beginning of the file.
autocmd BufReadPost COMMIT_EDITMSG normal! gg
" Make sure 'list' and 'number' is disabled in help files. This is necessary
" when switching to a help buffer which is in the background with :buffer as
" these options are local to windows (and not only to buffers). This happens
" because I often want to use only one window and thus the help buffer is in
" the background.
autocmd BufWinEnter *.txt
\ if &filetype == 'help' |
\ setlocal nolist |
\ setlocal nonumber |
\ endif
" 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. InsertLeave
" doesn't exist in older Vims.
if exists('##InsertLeave')
autocmd InsertLeave * set nopaste
endif
" Write all files when running :mak[e] before 'makeprg' is called.
" QuickFixCmdPre doesn't exist in older Vims.
if exists('##QuickFixCmdPre')
autocmd QuickFixCmdPre * wall
endif
" Don't ignore case while in insert mode, but ignore case in all other modes.
" This causes / to honor the case and thus only complete matching
" capitalization. But while searching (/) 'ignorecase' is used.
" InsertEnter/InsertLeave doesn't exist in older Vims.
if exists('##InsertEnter') && exists('##InsertLeave')
autocmd InsertEnter * set noignorecase
autocmd InsertLeave * set ignorecase
endif
" Display a warning when editing a file which contains "do not edit" (ignoring
" the case, \c), for example template files which were preprocessed or
" auto-generated files. Especially useful when the header is not displayed on
" the first screen, e.g. when the old position is restored. Not for vimrc
" though.
function! s:SearchForDoNotEditHeader()
if search('\cdo not edit', 'n') == 0
\ || expand(':t') =~# '^.\?vimrc$'
return
endif
echoerr 'Do not edit this file! (Maybe a template file.)'
endfunction
autocmd BufRead * call SearchForDoNotEditHeader()
" AFTER/FTPLUGIN AUTO COMMANDS
" Disable spell checking for files which don't need it.
autocmd FileType deb setlocal nospell
autocmd FileType diff setlocal nospell
autocmd FileType tar setlocal nospell
" Fix to allow Vim edit crontab files as crontab doesn't work with
" backupcopy=auto.
autocmd FileType crontab setlocal backupcopy=yes
" Don't use the modeline in git commits as the diff created by `git commit -v`
" may contain one which could change the filetype or other settings of the
" commit buffer. Also make sure we use only 72 characters per line which is
" the recommendation for git commit messages (http://tpope.net/node/106).
autocmd FileType gitcommit let g:secure_modelines_allowed_items = [] |
\ setlocal textwidth=72
" Use the same comment string as for Vim files in Vimperator files.
autocmd FileType vimperator setlocal commentstring=\"%s
" Use TeX compiler for (La)TeX files.
autocmd FileType tex compiler tex
" FTDETECT AUTO COMMANDS
" Recognize .md as markdown files (Vim default is .mkd).
autocmd BufRead,BufNewFile *.md set filetype=mkd
" Recognize .test as Tcl files.
autocmd BufRead,BufNewFile *.test set filetype=tcl
" OTHER AUTO COMMANDS
" Disable spell checking, displaying of list characters and long lines when
" viewing documentation.
autocmd BufReadPost /usr/share/doc/* setlocal nospell nolist | 2match
" Use diff filetype for mercurial patches in patch queue.
autocmd BufReadPost */.hg/patches/* set filetype=diff
augroup END
endif
" CUSTOM FUNCTIONS AND COMMANDS
if has('eval')
" Convenient command to see the difference between the current buffer and the
" 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')
command DiffOrig
\ let s:diff_orig_filetype = &filetype
\ | vertical new
\ | let &filetype = s:diff_orig_filetype
\ | unlet s:diff_orig_filetype
\ | set buftype=nofile
\ | read ++edit #
\ | 0d_
\ | diffthis
\ | wincmd p
\ | diffthis
endif
endif