aboutsummaryrefslogtreecommitdiff
path: root/vim
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2013-07-18 21:07:06 +1200
committerTom Ryder <tom@sanctum.geek.nz>2013-07-18 21:07:06 +1200
commitb6d2b373a3c0deac1c58d5e5079785f80afa0369 (patch)
treeed5b61cfa610d6196d55bb0f23ac63a7d7376e2d /vim
parentMore logical order for wrapping settings (diff)
downloaddotfiles-b6d2b373a3c0deac1c58d5e5079785f80afa0369.tar.gz
dotfiles-b6d2b373a3c0deac1c58d5e5079785f80afa0369.zip
Comment the heck out of my .vimrc
Including some minor re-ordering of lines so that they make more sense in sequence. I've been meaning to do this for some time as reading my .vimrc wasn't actually terribly instructive for someone who didn't already know what all these lines were; hell, even I forgot what some of them do
Diffstat (limited to 'vim')
-rw-r--r--vim/vimrc298
1 files changed, 256 insertions, 42 deletions
diff --git a/vim/vimrc b/vim/vimrc
index 7380f647..0f79837b 100644
--- a/vim/vimrc
+++ b/vim/vimrc
@@ -1,15 +1,17 @@
-" Compatibility
+" Don't make any effort to be compatible with vi, use more sensible settings
set nocompatible
-" Plugins
+" If Pathogen is available, call it to load all the plugins in .vim/bundles;
+" these are saved as submodules
silent! call pathogen#infect()
silent! call pathogen#helptags()
-" Filetypes
+" Load plugins and indentation for file types
if has('autocmd')
filetype indent plugin on
- " Shortcuts
+ " Shortcuts to quickly switch to common file types; handy when using
+ " editing abstractions like sudoedit(8)
nnoremap _ap :setlocal filetype=apache<CR>
nnoremap _bi :setlocal filetype=bindzone<CR>
nnoremap _cs :setlocal filetype=css<CR>
@@ -25,67 +27,149 @@ if has('autocmd')
nnoremap _xm :setlocal filetype=xml<CR>
endif
-" Backups
+" Use backup features if on a UNIX-like system and not using sudo(8)
if !strlen($SUDO_USER) && has('unix')
+
+ " Keep backups with a .bak extension in ~/.vim/undo; the double-slash at
+ " the end of the directory is supposed to prod Vim into keeping the full
+ " path to the file in its backup filename to avoid collisions, but I don't
+ " think it actually works
set backup
set backupext=.bak
set backupdir^=~/.vim/backup//
+
+ " This option already includes various temporary directories, but we
+ " append to it so that we don't back up anything in a shared memory
+ " filesystem either
set backupskip+=*/shm/*
+
+ " Create the backup directory if necessary and possible
if !isdirectory($HOME . '/.vim/backup') && exists('*mkdir')
call mkdir($HOME . '/.vim/backup', 'p', 0700)
endif
+
+" Don't use backups at all otherwise
else
set nobackup
set nowritebackup
endif
-" Colors
+" Options dependent on the syntax feature
if has('syntax')
+
+ " Use syntax highlighting with a dark background
syntax enable
set background=dark
+
+ " Use my custom color scheme if possible
silent! colorscheme sahara
+
+ " Get rid of visually noisy folding characters
if has('folding')
let &fillchars = 'diff: ,fold: ,vert: '
endif
+
+ " Don't syntax highlight beyond 300 characters; mostly for efficiency
+ " reasons, but also useful for prodding me into breaking up unreadable
+ " long lines as well when writing code
if exists('&synmaxcol')
set synmaxcol=300
endif
endif
-" Commands
+" 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
+
+" Some mild heresy; use the familiar Readline bindings of ^A and ^E on the
+" command line to move to the start and end of the line respectively; note
+" that this also works when entering search terms
cnoremap <C-A> <Home>
cnoremap <C-E> <End>
-" Completion
+" 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
+
+" I use the file completion feature quite a lot, but typing ^X ^F is
+" a bit unwieldy, so I abbreviate it to just ^F, the default behavior for
+" which I simply don't use
inoremap <C-F> <C-X><C-F>
-" Digraphs
+" Vim lacks a built-in digraph for an ellipsis character (three dots); I like
+" to use the proper character in UTF-8 HTML documents so I nicked this from
+" Tim Pope
if has('digraphs')
digraph ./ 8230
endif
-" Encoding
+" 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
+
+" Use UTF-8 by default wherever possible
if has('multi_byte')
set encoding=utf-8
endif
-" Formatting
+" Adopt the indent of the last line on new lines; interestingly, plugins that
+" do clever things with indenting will often assume this is set
set autoindent
+
+" Use tabs instead of spaces
set expandtab
-set smarttab
-set nojoinspaces
-set shiftround
+
+" Indent with four spaces when an indent operation is used
set shiftwidth=4
+
+" Insert four spaces when Tab is pressed
set softtabstop=4
+
+" How many spaces to show for a literal tab when 'list' is unset
set tabstop=4
+
+" Indent intelligently to 'shiftwidth' at the starts of lines with Tab, but
+" use 'tabstop' everywhere else
+set smarttab
+
+" When indenting lines with < or >, round the indent to a multiple of
+" shiftwidth, so even if the line is idented by one space it will indent
+" up to 4 and down to 0, for example
+set shiftround
+
+" 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
+
+"
+" Quick way to toggle flags in 'formatoptions' that I often want to change;
+" specifically:
+"
+" a - Automatically format paragraphs, reapplying the wrap on every text
+" insertion or deletion; sometimes I want this and sometimes I
+" don't, it particularly varies when typing prose in Markdown that
+" includes headings and code
+" c - Automatically wrap comments at 'textwidth' (which I allow the filetypes
+" to set for me)
+" t - Automatically wrap text at 'textwidth' (as above)
+"
+" So I just have to type e.g. \a to toggle the auto-format flag on and off;
+" very handy
+"
if has('eval')
function! ToggleFormatFlag(flag)
let l:operation = (&formatoptions =~ a:flag) ? '-=' : '+='
@@ -97,55 +181,93 @@ if has('eval')
nnoremap <silent> <leader>t :<C-U>call ToggleFormatFlag('t')<CR>
endif
-" History
+" Keep plenty of command and search history, because disk space is cheap
set history=2000
-" List
+" Don't show whitespace characters or end-of-line characters visually by
+" default, but make \l toggle between them
set nolist
nnoremap <leader>l :setlocal list!<CR>
-" Matching
+" 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
-" Messages
+" Don't show the Vim startup message, I have registered Vim and donated to
+" Uganda
set shortmess+=I
-" Miscellaneous
+" 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
-" Netrw
+" Configure the netrw plugin included with Vim for file listings and network
+" editing
if has('eval')
+
+ " Perform file transfers silently
let g:netrw_silent = 1
+
+ " Use a tree-style file listing
let g:netrw_liststyle = 3
+
+ " Don't list the current directory shortcut, and don't show tags files
let g:netrw_list_hide = '^\.,^tags$'
endif
-" Numbers
+" Don't show line numbers by default, but \n toggles them
set nonumber
nnoremap <leader>n :setlocal number!<CR>
-" Paste
+" 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
set nopaste
set pastetoggle=<F10>
-" Reading
+" 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
-" Scrolling
+" 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
-" Search
+" Some special settings for searching, if available
if has('extra_search')
+
+ " Highlight search results, \h toggles this
set hlsearch
+
+ " Searching as I enter my pattern, \i toggles this
set incsearch
nnoremap <leader>h :set hlsearch!<CR>
nnoremap <leader>i :set incsearch!<CR>
+
+ " Pressing ^L will clear highlighting until the next search-related
+ " operation; quite good because the highlighting gets distracting after
+ " you've found what you wanted
nnoremap <C-l> :nohlsearch<CR><C-l>
+
+ " Clear search highlighting as soon as I enter insert mode, and restore it
+ " once I leave it
if has('autocmd')
augroup highlight
autocmd!
@@ -155,16 +277,24 @@ if has('extra_search')
endif
endif
-" Spelling
+" Configure spell checking features, if available
if has('spell')
+
+ " Don't check spelling by default, but bind \s to toggle this
set nospell
nnoremap <leader>s :setlocal spell!<CR>
+
+ " Use New Zealand English for spelling by default (it's almost identical
+ " to British English), but bind \u to switch to US English and \z to
+ " switch back
set spelllang=en_nz
nnoremap <leader>u :setlocal spelllang=en_us<CR>
nnoremap <leader>z :setlocal spelllang=en_nz<CR>
endif
-" State
+" Don't keep .viminfo information for files in temporary directories or shared
+" memory filesystems; this is because they're used as scratch spaces for tools
+" like sudoedit(8) and pass(1) and hence could present a security problem
if has('viminfo') && has('autocmd')
augroup viminfoskip
autocmd!
@@ -174,19 +304,30 @@ if has('viminfo') && has('autocmd')
augroup END
endif
-" Substitution
+" 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 & :&&<CR>
vnoremap & :&&<CR>
-" Swaps
+" Swap files are used if using Unix and not using sudo(8); I very seldom need
+" them, but they are occasionally useful after a crash, and they don't really
+" get in the way if kept in their own directory
if !strlen($SUDO_USER) && has('unix')
+
+ " Use swap files but keep them in ~/.vim/swap; the double-slash at the end
+ " of the directory prods Vim into keeping the full path to the file in its
+ " undo filename to avoid collisions
set swapfile
set directory^=~/.vim/swap//
+
+ " Create the ~/.vim/swap directory if necessary and possible
if !isdirectory($HOME . '/.vim/swap') && exists('*mkdir')
call mkdir($HOME . '/.vim/swap', 'p', 0700)
endif
- " Don't swap sensitive files
+ " Don't keep swap files for files in temporary directories or shared memory
+ " filesystems; this is because they're used as scratch spaces for tools
+ " like sudoedit(8) and pass(1) and hence could present a security problem
if has('autocmd')
augroup swapskip
autocmd!
@@ -195,23 +336,40 @@ if !strlen($SUDO_USER) && has('unix')
\ setlocal noswapfile
augroup END
endif
+
+" Otherwise, don't use swap files at all
else
set noswapfile
endif
-" Terminal
+" 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=
-" Timeout
+" 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
-" Typos
+" 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<bang> <args>
command! -bang -complete=file -nargs=? W w<bang> <args>
@@ -224,11 +382,21 @@ if has('user_commands')
command! -bang WA wa<bang>
endif
-" Undo
+" Keep screeds of undo history
set undolevels=2000
+
+" Keep undo history in a separate file if the feature is available, we're on
+" Unix, and not using sudo(8); this goes really well with undo visualization
+" plugins like Gundo or Undotree.
if !strlen($SUDO_USER) && has('unix') && has('persistent_undo')
+
+ " Keep per-file undo history in ~/.vim/undo; the double-slash at the end
+ " of the directory prods Vim into keeping the full path to the file in its
+ " undo filename to avoid collisions
set undofile
set undodir^=~/.vim/undo//
+
+ " Create the ~/.vim/undo directory if necessary and possible
if !isdirectory($HOME . '/.vim/undo') && exists('*mkdir')
call mkdir($HOME . '/.vim/undo', 'p', 0700)
endif
@@ -244,63 +412,109 @@ if !strlen($SUDO_USER) && has('unix') && has('persistent_undo')
endif
endif
-" Unmaps
+" Unmap F1, I don't use it, I prefer :help
noremap <F1> <nop>
+
+" Unmap K, which normally pulls up the man(1) page for a given binary or
+" function; I don't find terribly helpful in most filetypes and often hit it
+" accidentally
nnoremap K <nop>
+
+" Unmap Q, which normally starts an ex mode, which I've never wanted or needed
nnoremap Q <nop>
-" Visual
+" 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
-" Wildmenu
+" Configuration for the command completion feature; rather than merely cycling
+" through possible completions with Tab, show them above the command line
if has('wildmenu')
+
+ " Use the wild menu, both completing and showing all possible completions
+ " with a single Tab press, just as I've configured Bash to do
set wildmenu
set wildmode=longest:list
+
+ " Don't complete certain files that I'm not likely to want to manipulate
+ " from within Vim:
if has('wildignore')
set wildignore+=*.a,*.o
set wildignore+=*.bmp,*.gif,*.ico,*.jpg,*.png
set wildignore+=.DS_Store,.git,.hg,.svn
set wildignore+=*~,*.swp,*.tmp
endif
+
+ " Complete files without case sensitivity, if the option is available
if exists('&wildignorecase')
set wildignorecase
endif
endif
-" Windows
+" Configuration for window features
if has('windows')
+
+ " Show the status in a distinct bar above the command line only if there's
+ " more than one window on the screen or in the current tab
set laststatus=1
+
+ " New split windows appear below or to the right of the existing window,
+ " not above or to the left per the default
set splitbelow
if has('vertsplit')
set splitright
endif
+
+ " Only show the tab bar if there's more than one tab
if exists('&showtabline')
set showtabline=1
endif
endif
-" Wrapping
+" 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 <leader>w :set wrap!<CR>
+
+" 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
+
+" Break lines at word boundaries if possible and not simply at the last
+" character that will fit on the screen, preceding the next line with three
+" periods to make it obvious that it's a continuation of the previous line
if has('linebreak')
set linebreak
set showbreak=...
endif
-" Writing
+" 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
+
+" 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!<CR>
nnoremap ZA :wa!<CR>
-" Yanking
+" 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$
-" Local
+" If a file named ~/.vimrc.local exists, source its configuration; this is
+" useful for defining FileType rules on systems which happen to have files of
+" a known type with atypical suffixes or locations
if filereadable(glob('~/.vimrc.local'))
source ~/.vimrc.local
endif