aboutsummaryrefslogblamecommitdiff
path: root/vim/vimrc
blob: f12ac69ed41d32e610c1b6ff060eb21a31072b93 (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

" 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 the 'sahara' 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 4
set shiftwidth=4   " Indent with four spaces
set softtabstop=4  " Insert four spaces for a Tab press

" 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

" Never use any kind of bell, visual or not
if exists('+belloff')
  set belloff=all
else
  set visualbell t_vb=
endif

" Start with blank comment strings rather than the old default; let the
" filetype handle it
set comments=

" Show only one line of @ symbols for a truncated last line if possible, and
" show none at all if not
if v:version > 704 || v:version == 704 && has('patch2109')
  set display=truncate
else
  set display=lastline
endif

" Don't wait to see if Escape in insert mode precedes a key for an Alt binding
set noesckeys

" Try to set the 'j' flag for 'formatoptions', to automatically 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; I don't two-space,
" despite the noble Steve Losh's exhortations
set nojoinspaces

" 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

" 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 characters to match
set matchpairs+=<:>

" 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

" Set up short message settings
set shortmess=
set shortmess+=f  " (file 3 of 5) -> (3 of 5)
set shortmess+=i  " [Incomplete last line] -> [noeol]
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]

" Default to no swap files at all, let auto_cache_dirs.vim set it
set noswapfile

" Don't wrap by default, but use \w to toggle it on or off
set nowrap

" 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

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

  " 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

  " Get rid of visually noisy folding characters
  if has('folding')
    let &fillchars = 'diff: ,fold: ,vert: '
  endif

endif

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

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

" Preserve the flags for a pattern when repeating a substitution with &
nnoremap <silent> & :<C-U>&&<CR>
vnoremap <silent> & :<C-U>&&<CR>

" Pressing ^L will clear highlighting until the next search-related operation
nnoremap <silent> <C-L> :<C-U>nohlsearch<CR><C-L>

" Cycle through things with unimpaired.vim-style bindings:
" Buffers
nnoremap [b :<C-U>bprevious<CR>
nnoremap ]b :<C-U>bnext<CR>
" Quicklist items (more often :helpgrep results)
nnoremap [c :<C-U>cprevious<CR>
nnoremap ]c :<C-U>cnext<CR>
" Location list items
nnoremap [l :<C-U>lprevious<CR>
nnoremap ]l :<C-U>lnext<CR>

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

" 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

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

" 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
if 1
  let g:mapleader = '\'
  let g:maplocalleader = '_'
endif

" Leader mappings below; we use a literal backslash rather than <Leader> for
" the mappings here, because I want many of these even to work on tiny
" stripped-down Vims like Debian's. The settings above are for plugins.

" \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: Local date
  nnoremap \d :<C-U>read !date<CR>
  " \D: UTC
  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
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
nnoremap \z :<C-U>setlocal spelllang=en_nz spelllang?<CR>

" Add the packaged version of matchit.vim included in the distribution, if
" possible; 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
  " System dictionaries plus custom per-machine spell files are fine
  let g:loaded_spellfile_plugin = 1

endif

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