" Don't make any effort to be compatible with vi, use more sensible settings set nocompatible " Use UTF-8 by default wherever possible, including in this file if has('multi_byte') set encoding=utf-8 scriptencoding utf-8 endif " Load configuration files from ~/.vim/config or its analogue, before Pathogen " loads all its directories into 'runtimepath' runtime! config/*.vim " If our version isn't ancient and Pathogen is available, call it to load all " the plugins in .vim/bundle; these are saved as submodules if v:version >= 701 silent! call pathogen#infect() silent! call pathogen#helptags() endif " Load plugins for file types if has('autocmd') filetype plugin on endif " Options dependent on the syntax feature if has('syntax') " Use syntax highlighting with 100 lines of context silent! syntax enable silent! syntax sync minlines=100 " Use my custom color scheme if possible, otherwise I'm happy with whatever " the default is, and it usually cares about my background set background=dark silent! colorscheme sahara endif " Use all ancestors of current directory for :find if has('file_in_path') set path=** endif " Command-line based features if has('cmdline_info') " Show my current position in the status bar set ruler " Show the keystrokes being entered in the screen set showcmd " Show the mode we're using if not normal mode (e.g. --INSERT--) set showmode endif " Don't try to complete strings from included files, just use the strings in " the open buffers; I'll open the file if I want to complete from it set complete-=i " Try Mac line-endings if UNIX or DOS don't make sense; this has never " happened to me but who knows, it might one day set fileformats+=mac " Don't join lines with two spaces at the end of sentences; I don't two-space, " despite the noble Steve Losh's exhortations set nojoinspaces " Don't jump my screen around when I join lines, keep my cursor in the same " place; this is done by dropping a mark first and then immediately returning " to it; note that it wipes out your z mark, if you happen to use it nnoremap J mzJ`z " Strip trailing whitespace with \x if has('eval') function! StripTrailingWhitespace() let l:search = @/ %substitute/\s\+$//e let @/ = l:search nohlsearch endfunction nnoremap x :call StripTrailingWhitespace() endif " Keep plenty of command and search history, because disk space is cheap set history=2000 " Don't show whitespace characters or end-of-line characters visually by " default, but make \l toggle between them set nolist nnoremap l :setlocal list! " Try to run the version of matchit.vim included in the distribution, if there " is one; extends % to match more than it does by default silent! runtime macros/matchit.vim " Match all forms of brackets in pairs (including angle brackets) set matchpairs=(:),{:},[:],<:> " Don't show the Vim startup message, I have registered Vim and donated to " Uganda set shortmess+=I " Let me backspace over pretty much anything, even if it's not text I inserted " in the current session set backspace=indent,eol,start " Don't use modelines at all, they're apparently potential security problems " and I've never used them anyway set nomodeline " Don't assume a number with a leading zero is octal; it's far more likely a " zero-padded decimal, so increment and decrement with ^A and ^X on that basis set nrformats-=octal " Always tell me the number of lines changed by a command set report=0 " Always use forward slashes, I very seldom need to use Vim on Windows for " more than scratch space anyway set shellslash " Don't show line numbers by default, but \n toggles them set nonumber nnoremap n :setlocal number! " Start paste mode with F10 to prevent console Vim from confusing a swathe of " pre-formatted pasted text with actual keyboard input, and thereby attempting " to indent it inappropriately. If unimpaired.vim is available, it's generally " nicer to use yo or yO. set nopaste set pastetoggle= " If the Vim buffer for a file doesn't have any changes and Vim detects the " file has been altered, quietly update it set autoread " Save a file automatically if I change buffers or perform operations with the " argument list; this is particularly helpful for me as I don't use 'hidden' set autowrite " Allow the cursor to get to the top or bottom of the screen before scrolling " vertically, but set a reasonably wide gutter for scrolling horizontally; no " particular reason, just suits me better set scrolloff=0 set sidescrolloff=16 " Preserve the flags for a pattern when repeating a substitution with &; I don't " really understand why this isn't a default, but there it is nnoremap & :&& vnoremap & :&& " Don't bother about checking whether Escape is being used as a means to enter " a Meta-key combination, just register Escape immediately set noesckeys " Don't bother drawing the screen while executing macros or other automated or " scripted processes, just draw the screen as it is when the operation " completes set lazyredraw " Improve redrawing smoothness by assuming that my terminal is reasonably " fast set ttyfast " Never use any kind of bell, visual or not set visualbell t_vb= " Require less than one second between keys for mappings to work correctly set timeout set timeoutlen=1000 " Require less than a twentieth of a second between keys for key codes to work " correctly; I don't use Escape as a meta key anyway set ttimeout set ttimeoutlen=50 " Tolerate typos like :Wq, :Q, or :Qa and do what I mean, including any " arguments or modifiers; I fat-finger these commands a lot because I type " them so rapidly, and they don't correspond to any other commands I use if has('user_commands') command! -bang -complete=file -nargs=? E e command! -bang -complete=file -nargs=? W w command! -bang -complete=file -nargs=? WQ wq command! -bang -complete=file -nargs=? Wq wq command! -bang Q q command! -bang Qa qa command! -bang QA qa command! -bang Wa wa command! -bang WA wa endif " When in visual block mode, let me move the cursor anywhere in the buffer; " don't restrict me only to regions with text if has('virtualedit') set virtualedit+=block endif " Use the tilde as an operator with motions, rather than just swapping the " case of the character under the cursor set tildeop " When wrapping text, if a line is so long that not all of it can be shown on " the screen, show as much as possible anyway; by default Vim fills the left " column with @ symbols instead, which I don't find very helpful set display=lastline " Don't wrap by default, but use \w to toggle it on or off quickly set nowrap nnoremap w :set wrap! " Clearly show when the start or end of the row does not correspond to the " start and end of the line set listchars+=precedes:<,extends:> " Don't write the output of :make to the terminal set shellpipe=> " When wrapping, j and k should move by screen row, and not to the same " column number in the previous logical line, which feels very clumsy and is " seldom particularly helpful; you can use n| to jump to the nth column in a " line anyway if you need to nnoremap j gj nnoremap k gk " I really like ZZ and ZQ, so I wrote a couple more mappings; ZW forces a " write of the current buffer, but doesn't quit, and ZA forces a write of all " buffers but doesn't quit nnoremap ZW :w! nnoremap ZA :wa! " Change and delete with C and D both cut off the remainder of the line from " the cursor, but Y yanks the whole line, which is inconsistent (and can be " done with yy anyway); this fixes it so it only yanks the rest of the line nnoremap Y y$ " Allow jumping between windows and tabs to find an open instance of a given " buffer with :sbuffer. if v:version >= 701 set switchbuf=useopen,usetab else set switchbuf=useopen endif " Fedora's default environment adds a few auto commands that I don't like, " including the 'return to previous position in buffer' one; fortunately " they're nice enough to group the commands, so I can just clear them if has('autocmd') augroup fedora autocmd! augroup END endif