aboutsummaryrefslogtreecommitdiff
path: root/vim/vimrc
diff options
context:
space:
mode:
Diffstat (limited to 'vim/vimrc')
-rw-r--r--vim/vimrc564
1 files changed, 7 insertions, 557 deletions
diff --git a/vim/vimrc b/vim/vimrc
index dd8d9232..a5849694 100644
--- a/vim/vimrc
+++ b/vim/vimrc
@@ -7,568 +7,18 @@ if has('multi_byte')
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 and indentation for file types
-if has('autocmd')
- filetype indent plugin on
-endif
-
-" 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/backup; 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 for backups, just undo and swap files
- 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
-
-" 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
-
-" Rebind Ctrl-C in insert mode to undo the current insert operation
-inoremap <C-c> <C-c>u
-
-" A few very important custom digraphs
-if has('digraphs')
- digraph ./ 8230 " Ellipsis (HORIZONTAL ELLIPSIS U+2026)
- digraph %% 8984 " Mac command key (PLACE OF INTEREST SIGN U+2318)
- digraph 8: 9731 " Snowman (SNOWMAN U+2603)
-endif
-
-" 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
-
-" 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 spaces instead of tabs
-set expandtab
-
-" 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 indented 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
-
-" If we can, add j to the format options to get rid of comment leaders when
-" joining lines
-if v:version > 703 || v:version == 703 && has('patch541')
- set formatoptions+=j
-endif
-
-"
-" 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) ? '-=' : '+='
- silent! exec 'setlocal formatoptions' . l:operation . a:flag
- setlocal formatoptions?
- endfunction
- nnoremap <silent> <leader>a :<C-U>call ToggleFormatFlag('a')<CR>
- nnoremap <silent> <leader>c :<C-U>call ToggleFormatFlag('c')<CR>
- nnoremap <silent> <leader>t :<C-U>call ToggleFormatFlag('t')<CR>
-endif
-
-" Strip trailing whitespace with \x
-if has('eval')
- function! StripTrailingWhitespace()
- let l:search = @/
- %substitute/\s\+$//e
- let @/ = l:search
- nohlsearch
- endfunction
- nnoremap <silent> <leader>x :<C-U>call StripTrailingWhitespace()<CR>
-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 <leader>l :setlocal list!<CR>
-
-" 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
-if exists('+shellslash')
- set shellslash
-fi
-
-" Don't show line numbers by default, but \n toggles them
-set nonumber
-nnoremap <leader>n :setlocal number!<CR>
-
-" 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=<F10>
-
-" 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
-
-" Some special settings for searching, if available
-if has('extra_search')
-
- " Searching as I enter my pattern, \i toggles this
- set incsearch
- nnoremap <leader>i :set incsearch!<CR>
-
- " Highlight search results, \h toggles this
- set hlsearch
- nnoremap <leader>h :set hlsearch!<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 <silent> <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!
- silent! autocmd InsertEnter * set nohlsearch
- silent! autocmd InsertLeave * set hlsearch
- augroup END
- endif
-endif
-
-" 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
-
-" 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!
- silent! autocmd BufNewFile,BufReadPre
- \ /tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*,*/shm/*
- \ setlocal viminfo=
- augroup END
-endif
-
-" 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>
-
-" 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; the same thing works for undo files
- 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 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!
- silent! autocmd BufNewFile,BufReadPre
- \ /tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*,*/shm/*
- \ setlocal noswapfile
- augroup END
- endif
-
-" Otherwise, don't use swap files at all
-else
- set noswapfile
-endif
-
-" 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<bang> <args>
- command! -bang -complete=file -nargs=? W w<bang> <args>
- command! -bang -complete=file -nargs=? WQ wq<bang> <args>
- command! -bang -complete=file -nargs=? Wq wq<bang> <args>
- command! -bang Q q<bang>
- command! -bang Qa qa<bang>
- command! -bang QA qa<bang>
- command! -bang Wa wa<bang>
- command! -bang WA wa<bang>
-endif
-
-" 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; the same thing works for swap files
- 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
-
- " Don't track changes to sensitive files
- if has('autocmd')
- augroup undoskip
- autocmd!
- silent! autocmd BufWritePre
- \ /tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*,*/shm/*
- \ setlocal noundofile
- augroup END
- endif
-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
-
-" 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
+ " With the plugins loaded, we might now be able to use my custom colorscheme
+ if has('syntax')
+ silent! colorscheme sahara
endif
endif
-
-" 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
-
- " Don't resize windows we're not splitting (Tmux-like; think Mondrian)
- set noequalalways
-
- " 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
-
- " Get rid of visually noisy folding characters
- if has('folding')
- let &fillchars = 'diff: ,fold: ,vert: '
- endif
-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 <leader>w :set wrap!<CR>
-
-" 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
-
-" 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=...
- if v:version > 704 || v:version == 704 && has('patch338')
- set breakindent
- endif
-
- " Bind \b to turn off linebreak and toggle the showbreak characters on and
- " off for convenience of copypasting multiple lines from terminal emulators.
- if has('eval')
- function! ToggleBreak()
- if &linebreak
- set nolinebreak
- set showbreak=
- if v:version > 704 || v:version == 704 && has('patch338')
- set nobreakindent
- endif
- else
- set linebreak
- set showbreak=...
- if v:version > 704 || v:version == 704 && has('patch338')
- set breakindent
- endif
- endif
- endfunction
- nnoremap <silent> <leader>b :<C-U>call ToggleBreak()<CR>
- endif
-endif
-
-" 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>
-
-" 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
-
-" When opening a large file, take some measures to keep things loading quickly
-if has('eval') && has('autocmd')
-
- " Threshold is 10 MiB
- let g:bigfilesize = 10 * 1024 * 1024
-
- " Declare function for turning off slow options
- function! BigFileMeasures()
- let l:file = expand('<afile>')
- if getfsize(l:file) > g:bigfilesize
- setlocal nobackup
- setlocal nowritebackup
- setlocal noswapfile
- if has('persistent_undo')
- setlocal noundofile
- endif
- if exists('&synmaxcol')
- setlocal synmaxcol=256
- endif
- endif
- endfunction
-
- " Define autocmd for calling to check filesize
- augroup bigfilesize
- autocmd!
- autocmd BufReadPre * call BigFileMeasures()
- augroup end
-endif