aboutsummaryrefslogblamecommitdiff
path: root/vim/vimrc
blob: 185df60dfbd246fb4b34a2fe36bf5baa6387a0c1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10





                                                                              



                                        
     
 





                                                 




                                                                        


                                         
                                                     
                       
                                  











                                                                              

                                            


                                                       









                                                                              







                                                                            

                                        




















                                                                        






                                                                   






































                                                                              












                                                               



                                                                        
                                                     


                                                         
                                                         

                          
                                                   
 



















                                                                              

                                     





                                                                              



                                                          
 

                                                             



                                                                 











                                                                             
                      





                                                    
                                                                 


                                             
                                                               



                                                                         
                                                   







                                                               
                                                              




                                                                          

                                                                           




                                                                          
                                


                                                                          
                                





                                                                            


































                                                                              
                     






                                                                
                




























                                                                              






























                                                                            
                                                     





                                                                             




                                                           
 

                                                                         

             

             














                                                                         







































                                                                            








                                                                             

                                                                             

                                                                             

                                                                             


     





                                                                          

                                                                         
                     
" 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.

" Use UTF-8 by default wherever possible
if has('multi_byte')
  set encoding=utf-8
  scriptencoding utf-8
endif

" Use different keys for global and local leaders
if has('eval')
  let g:mapleader = '\'
  let g:maplocalleader = '_'
endif

" Load filetype settings, including filetype plugins and indent settings
if has('autocmd')
  filetype plugin indent on
endif

" Options dependent on the syntax feature
if has('syntax') && !has('g:syntax_on')

  " Use syntax highlighting with 150 lines of context
  silent! syntax enable
  silent! syntax sync minlines=150

  " Opinionated; if the author is using color at all, it will probably be with
  " a dark background
  set background=dark

  " The 'sahara' colorscheme only works in the GUI or with 256 colors
  if has('gui_running') || &t_Co >= 256
    silent! colorscheme sahara
  endif

endif

" Let me backspace over pretty much anything
set backspace=
set backspace+=indent  " Spaces from 'audoindent'
set backspace+=eol     " Line breaks
set backspace+=start   " The start of current insertion

" Default to no backup files at all, in a way that even ancient/tiny Vims will
" understand; the auto_cache_dirs.vim plugin will take care of re-enabling
" this with a 'backupdir' setting
set nobackup
set nowritebackup

" If backups are enabled, use a more explicit and familiar backup suffix
set backupext=.bak

" Allow jumping between windows and tabs to find an open instance of a given
" buffer with :sbuffer.
set switchbuf=useopen
if v:version >= 701
  set switchbuf+=usetab
endif

" Cycle back and forth through buffers.
nnoremap <silent> [b :<C-U>bprevious<CR>
nnoremap <silent> ]b :<C-U>bnext<CR>

" Keep plenty of command and search history, because disk space is cheap
set history=2000

" Always tell me the number of lines changed by a command
set report=0

" 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

" Current date and time insertion commands, requiring POSIX date(1)
if has('unix')
  " \d: Local
  nnoremap <silent> <Leader>d :<C-U>read !date<CR>
  " \D: UTC
  nnoremap <silent> <Leader>D :<C-U>read !date -u<CR>
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

" 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

  " 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

" 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

" Set up short message settings
set shortmess=
set shortmess+=f  " (file 3 of 5) -> (3 of 5)
set shortmess+=i  " [Incomplete last line] -> [eol]
set shortmess+=I  " I donated to Uganda, thanks Bram
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 midle if too long
set shortmess+=w  " written -> [w], appended -> [a]
set shortmess+=x  " [dos format] -> [dos]

" Don't show whitespace characters or end-of-line characters visually by
" default, but make \l toggle between them
set nolist
nnoremap <silent> <Leader>l :<C-U>set list! list?<CR>

" Don't show line numbers by default, but \n toggles them
set nonumber
nnoremap <silent> <Leader>n :<C-U>set number! number?<CR>

" Bind \p to show filetype
nnoremap <silent> <Leader>p :<C-U>set filetype?<CR>

" Use all ancestors of current directory for :find
if has('file_in_path')
  set path=**
endif

" 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

" Don't use modelines at all, they're apparently potential security problems
" and I've never used them anyway
set nomodeline

" 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 <silent> ZW :<C-U>write!<CR>
nnoremap <silent> ZA :<C-U>wall!<CR>

" 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

" Try to set the 'j' flag for 'formatoptions', to automatically delete comment
" leaders when joining lines, if supported
if v:version >= 704 || v:version == 703 && has('patch541')
  set formatoptions+=j
endif

" \f shows the current formatoptions at a glance
nnoremap <silent> <Leader>f :<C-U>setlocal formatoptions?<CR>

" Match all forms of brackets in pairs (including angle brackets)
set matchpairs+=<:>

" 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 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

" Rebind <Space> in normal mode as a lazy scroll
nnoremap <Space> <C-F>

" Some special settings for searching, if available
if has('extra_search')

  " Searching as I enter my pattern, \i toggles this
  set incsearch
  nnoremap <silent> <Leader>i :<C-U>set incsearch! incsearch?<CR>

  " Highlight search results, \h toggles this
  set hlsearch
  nnoremap <silent> <Leader>h :<C-U>set hlsearch! 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> :<C-U>nohlsearch<CR><C-L>

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 <silent> <Leader>s :<C-U>setlocal spell! 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 <silent> <Leader>u :<C-U>setlocal spelllang=en_us spelllang?<CR>
  nnoremap <silent> <Leader>z :<C-U>setlocal spelllang=en_nz spelllang?<CR>

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 <silent> & :<C-U>&&<CR>

" Same again for visual mode; we use vnoremap rather than xnoremap to stay
" compatible with old Vims without doing :execute dances
vnoremap <silent> & :<C-U>&&<CR>

" Default to no swap files at all, in a way that even ancient/tiny Vims will
" understand; the auto_cache_dirs.vim plugin will take care of re-enabling
" this with a 'directory' setting
set noswapfile

" 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>

" Don't bother about checking whether Escape is being used as a means to enter
" a Meta-key combination, just register Escape immediately
if exists('+esckeys')
  set noesckeys
endif

" 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

" Rebind Ctrl-C in insert mode to undo the current insert operation
inoremap <C-C> <C-C>u

" Keep screeds of undo history
set undolevels=2000

" 'undodir' and 'undofile' settings will be taken care of by the
" auto_cache_dirs.vim plugin if applicable/possible
if has('persistent_undo')
  set noundofile
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

" Adopt the indent of the last line on new lines
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

" 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

" 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

" Don't wrap by default, but use \w to toggle it on or off quickly
set nowrap
nnoremap <silent> <Leader>w :<C-U>set wrap! wrap?<CR>

" 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

" 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

" Swap the j/gj and k/gk command pairs so that we move by screen row, not
" buffer line, with j/k
nnoremap j gj
nnoremap k gk
nnoremap gj j
nnoremap gk k

" 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

" Disable most core plugin stuff that I don't use; after/plugin/dist.vim
" clears these variables later
if has('eval')

  " 2html.vim is often useful, so keep that
  " matchparen.vim I use constantly

  " I handle versioning plugins manually, and have never used .vba
  let g:loaded_getscriptPlugin = 1
  let g:loaded_vimballPlugin = 1

  " This is what grep, sed, Awk, and Perl are for
  let g:loaded_logiPat = 1

  " ^Z, my dudes
  let g:loaded_netrwPlugin = 1

  " Vim servers? What is this, Emacs?
  let g:loaded_rrhelper = 1

  " System dictionaries plus custom per-machine spell files are fine
  let g:loaded_spellfile_plugin = 1

  " If I want to read a file or a file archived within it I'll decompress or
  " unarchive it myself; a text editor should not do this
  let g:loaded_gzip = 1
  let g:loaded_tarPlugin = 1
  let g:loaded_zipPlugin = 1

endif

" Insert blank lines above and below via my custom unimpaired.vim rip
nmap [<Space> <Plug>PutBlankLinesAbove
nmap ]<Space> <Plug>PutBlankLinesBelow

" \b toggles copy-pasteable linebreak settings
nmap <Leader>b <Plug>CopyLinebreakToggle

" \x strips trailing whitespace via a custom plugin
nmap <Leader>x <Plug>StripTrailingWhitespace

" Use toggle_option_flag.vim plugin to bind quick toggle actions for some
" 'formatoptions' flags
if has('user_commands')

  " \a: Reformat paragraphs to 'textwidth' on all insert or delete operations
  nnoremap <silent> <Leader>a :<C-U>ToggleOptionFlagLocal formatoptions a<CR>
  " \c: Reformat comments to 'textwidth'
  nnoremap <silent> <Leader>c :<C-U>ToggleOptionFlagLocal formatoptions c<CR>
  " \j: Delete comment leaders when joining lines
  nnoremap <silent> <Leader>j :<C-U>ToggleOptionFlagLocal formatoptions j<CR>
  " \t: Reformat non-comment text to 'textwidth'
  nnoremap <silent> <Leader>t :<C-U>ToggleOptionFlagLocal formatoptions t<CR>

endif

" Add the packaged version of matchit.vim included in the distribution, if
" possible; plugin/macros.vim loads this for older Vims
if has('packages')
  silent! packadd! matchit
endif

" Source all .vim files from ~/.vim/config, which may override any of the
" above
runtime! config/*.vim