" 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('.') . ';') " * 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 = @@ " 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()?? 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