" Tom Ryder (tejr)'s vimrc: <https://sanctum.geek.nz/cgit/dotfiles.git>
"
" This file is not truly self-contained; it should run without errors on its
" own without the accompanying plugins to which it refers near the end of this
" file, but you'll get errors for some of the leader maps, for example.
" Load filetype-specific plugins, indent settings, and syntax highlighting
if has('autocmd')
filetype plugin indent on
endif
" Options dependent on the syntax feature
if has('syntax') && !has('g:syntax_on')
" Use syntax highlighting
syntax enable
" Use my colorscheme if using the GUI or if we have 256 colors
if has('gui_running') || &t_Co >= 256
silent! colorscheme sahara
endif
" If we couldn't use 'sahara', just flag a dark background (the author is
" almost certainly using one), and we'll use the default colorscheme
if !exists('g:colors_name')
set background=dark
endif
endif
" The all-important default indent settings; filetypes to tweak
set autoindent " Use indent of previous line on new lines
set expandtab " Use spaces instead of tabs
set shiftround " Round indenting to multiples of 'shiftwidth'
set shiftwidth=4 " Indent with four spaces
" Spaces to insert on Tab key press; use negative value to mirror 'shiftwidth'
" if supported
if v:version > 703 || v:version == 703 && has('patch693')
set softtabstop=-1
else
set softtabstop=4
endif
" Let me backspace over pretty much anything
set backspace=
set backspace+=eol " Line breaks
set backspace+=indent " Spaces from 'autoindent'
set backspace+=start " The start of current insertion
" Never use any kind of bell, visual or not
if exists('+belloff')
set belloff=all
else
set visualbell t_vb=
endif
" Clear default comment string, let the filetype handle it
set comments=
" How to deal with lines wrapping beyond the last screen row
if v:version > 704 || v:version == 704 && has('patch2109')
set display=truncate " Show '@@@' on the last line, if supported
else
set display=lastline " Just let it run off the screen
endif
" Don't wait for a key after Escape in insert mode
set noesckeys
" Delete comment leaders when joining lines, if supported
if v:version > 703 || v:version == 703 && has('patch541')
set formatoptions+=j
endif
" Don't join lines with two spaces at the end of sentences
set nojoinspaces
" Don't redraw the screen during batch execution
set lazyredraw
" Define list characters
set listchars+=extends:> " Unwrapped text to screen right
set listchars+=precedes:< " Unwrapped text to screen left
set listchars+=tab:>- " Tab characters, preserve width
set listchars+=trail:_ " Trailing spaces
" Add angle brackets to pairs of matched characters
set matchpairs+=<:>
" Don't allow setting options via buffer content
set nomodeline
" Increment/decrement numbers with a leading zero as decimal, not octal
set nrformats-=octal
" Always tell me the number of lines changed by a command
set report=0
" Abbreviate some of the regularly displayed messages
set shortmess=
set shortmess+=f " (file 3 of 5) -> (3 of 5)
set shortmess+=i " [Incomplete last line] -> [noeol]
set shortmess+=I " Don't show startup splash screen
set shortmess+=l " 999 lines, 888 characters -> 999L, 888C
set shortmess+=m " [Modified] -> [+]
set shortmess+=n " [New File] -> [New]
set shortmess+=o " Don't stack file writing messages
set shortmess+=O " Don't stack file reading messages
set shortmess+=r " [readonly] -> [RO]
set shortmess+=t " Truncate file message at start if too long
set shortmess+=T " Truncate other message in middle if too long
set shortmess+=w " written -> [w], appended -> [a]
set shortmess+=x " [dos format] -> [dos]
" Show my current position in the status bar, default format is fine
if has('cmdline_info')
set ruler
endif
" Highlight settings for search, if available
if has('extra_search')
set hlsearch " Highlight completed searches...
nohlsearch " ...but clear it on startup or after re-sourcing
set incsearch " Show matches as I type
endif
" Use all ancestors of current directory for :find
if has('file_in_path')
set path+=**
endif
" Don't load menus at all in GUI mode; needs to be set here, before gVim
" actually starts up
if has('gui_running')
set guioptions+=M
endif
" Line break settings and mappings
if has('linebreak')
" Break lines at word boundaries if possible
set linebreak
" Precede continued lines with '...'
set showbreak=...
" If we have the option, indent wrapped lines as much as the first line
if exists('+breakindent')
set breakindent
endif
endif
" Use New Zealand English by default; binding later in this file allow
" masquerading as a Yankee
if has('spell')
set spelllang=en_nz
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=list:longest
" Complete files without case sensitivity, if the option is available
if exists('+wildignorecase')
set wildignorecase
endif
endif
" Configuration for window features
if has('windows')
" Split windows to the right and bottom
set splitbelow
if has('vertsplit')
set splitright
endif
" Get rid of visually noisy folding characters
if has('folding')
let &fillchars = 'diff: ,fold: ,vert: '
endif
endif
" Rebind insert Ctrl-C to undo the current insert operation
inoremap <C-C> <C-C>u
" Rebind normal <Space> to scroll down a page
nnoremap <Space> <C-F>
" Rebind normal & to preserve substitution flags
nnoremap <silent> & :<C-U>&&<CR>
" Stack normal Ctrl-L to clear search highlighting before redraw
nnoremap <silent> <C-L> :<C-U>nohlsearch<CR><C-L>
" Cycle through argument list
nnoremap [a :<C-U>previous<CR>
nnoremap ]a :<C-U>next<CR>
" Cycle through buffers
nnoremap [b :<C-U>bprevious<CR>
nnoremap ]b :<C-U>bnext<CR>
" Cycle through quicklist items (more often :helpgrep results)
nnoremap [c :<C-U>cprevious<CR>
nnoremap ]c :<C-U>cnext<CR>
" Cycle through location list items
nnoremap [l :<C-U>lprevious<CR>
nnoremap ]l :<C-U>lnext<CR>
" Insert blank lines above and below current line
nmap [<Space> <Plug>PutBlankLinesAbove
nmap ]<Space> <Plug>PutBlankLinesBelow
" Swap buffer line vs screen row motions
nnoremap j gj
nnoremap k gk
nnoremap gj j
nnoremap gk k
" Remap Y to yank to end of line (consistent with C, D)
nnoremap Y y$
" ZA does an unconditional write for all buffers
nnoremap ZA :<C-U>wall!<CR>
" ZW does an unconditional write for this buffer
nnoremap ZW :<C-U>write!<CR>
" 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
" Use different keys for global and local leaders for plugins
if 1
let g:mapleader = '\'
let g:maplocalleader = '_'
endif
" Leader mappings below; use a literal backslash rather than <Leader> so that
" the non-plugin mappings work on vim-tiny
" \a toggles 'formatoptions' 'a' flag using a plugin
nnoremap \a :<C-U>ToggleOptionFlagLocal formatoptions a<CR>
" \b toggles copy-pasteable linebreak settings
nmap \b <Plug>CopyLinebreakToggle
" \c toggles 'cursorcolumn', \C toggles 'cursorline'
nnoremap \c :<C-U>set cursorcolumn! cursorcolumn?<CR>
nnoremap \C :<C-U>set cursorline! cursorline?<CR>
" Current date and time insertion commands, requiring POSIX date(1)
if has('unix')
" \d inserts the local date
nnoremap \d :<C-U>read !date<CR>
" \D inserts the UTC date
nnoremap \D :<C-U>read !date -u<CR>
endif
" \f shows the current 'formatoptions' at a glance
nnoremap \f :<C-U>set formatoptions?<CR>
" \h toggles highlighting search results
nnoremap \h :<C-U>set hlsearch! hlsearch?<CR>
" \i toggles showing matches as I enter my pattern
nnoremap \i :<C-U>set incsearch! incsearch?<CR>
" \j jumps to buffers (jetpack)
nnoremap \j :<C-U>ls<CR>:buffer<Space>
" \l toggles showing tab, end-of-line, and trailing whitespace
nnoremap \l :<C-U>set list! list?<CR>
" \n toggles line numbers
nnoremap \n :<C-U>set number! number?<CR>
" \o and \O open 'pasted insert' lines
nmap \o <Plug>PasteOpenBelow
nmap \O <Plug>PasteOpenAbove
" \p toggles paste mode
nnoremap \p :<C-U>set paste! paste?<CR>
" \r reloads .vimrc
nnoremap \r :<C-U>source $MYVIMRC<CR>
" \s toggles spell checking
nnoremap \s :<C-U>setlocal spell! spell?<CR>
" \t shows current filetype
nnoremap \t :<C-U>set filetype?<CR>
" \u sets US English spelling (compare \z)
nnoremap \u :<C-U>setlocal spelllang=en_us spelllang?<CR>
" \w toggles wrapping
nnoremap \w :<C-U>set wrap! wrap?<CR>
" \x strips trailing whitespace via a custom plugin
nmap \x <Plug>StripTrailingWhitespace
" \z sets NZ English spelling (compare \u)
nnoremap \z :<C-U>setlocal spelllang=en_nz spelllang?<CR>
" Add the packaged version of matchit.vim included in the distribution, if
" supported; plugin/macros.vim loads this for older Vims
if has('packages')
packadd! matchit
endif
" Disable most core plugin stuff that I don't use; after/plugin/dist.vim
" clears these variables later
if 1
" I use tohtml.vim often
" I like matchparen.vim
" I manage plugins myself with Git and a Makefile
let g:loaded_getscriptPlugin = 1
let g:loaded_vimballPlugin = 1
" Vim is the wrong tool for reading archives or compressed text
let g:loaded_gzip = 1
let g:loaded_tarPlugin = 1
let g:loaded_zipPlugin = 1
" I prefer filtering text with Unix tools
let g:loaded_logiPat = 1
" The shell, tab completion, and 'wildmenu' are good enough
let g:loaded_netrwPlugin = 1
" I don't use Vim servers
let g:loaded_rrhelper = 1
" I don't need extra spelling files
let g:loaded_spellfile_plugin = 1
endif
" Source all .vim files from ~/.vim/config
runtime! config/*.vim