Skip to content

Instantly share code, notes, and snippets.

@emilyst
Last active July 24, 2016 17:45
Show Gist options
  • Save emilyst/9243544 to your computer and use it in GitHub Desktop.
Save emilyst/9243544 to your computer and use it in GitHub Desktop.
I'm trying to keep this up to date with whatever my actual .vimrc is at the time. It may or may not track pretty closely, but at the time of writing this description (1 Mar 14), it's perfectly up to date.
" 0 preamble ============================================================== {{{
"
" There is a great organization scheme in place here. If you run the
" :options command in Vim, you see a list of all the options that you
" can set, along with their current settings and a brief description of
" them. The great thing about this scheme is that--for better or
" worse--it sets up a system which can organize all my settings. I've
" decided to organize everything below thus, throwing ancillary things
" (my own mappings, plugin settings, and so on) where it makes sense.
"
" A lot of plugin settings end up going into the various section, and
" that seems fine. I'll probably collect lots of utility functions there
" as well as I go along.
"
" The great part about all this is that I have a sensible way now to
" extend this giant settings file so that I don't get so anxious about
" it.
"
" ========================================================================= }}}
" 1 important ============================================================= {{{
set all&
set nocompatible
if has('autocmd')
au! BufEnter *
endif
" bring in Pathogen
let g:pathogen_disabled = ['bufexplorer', 'neocomplcache', 'nerdtree-tabs']
if v:version < 702
let g:pathogen_disabled += ['tagbar', 'neocomplcache',]
endif
if v:version < 703 || !has('python')
let g:pathogen_disabled += ['jedi-vim', 'gundo']
endif
runtime bundle/pathogen/autoload/pathogen.vim
if exists("g:loaded_pathogen")
execute pathogen#infect()
execute pathogen#helptags()
endif
" fix up rtp a bit to exclude rusty old default scripts if they exist
if exists("g:loaded_pathogen")
let list = []
for dir in pathogen#split(&rtp)
if dir !~# '/usr/share/vim/vimfiles'
call add(list, dir)
endif
endfor
let &rtp = pathogen#join(list)
endif
" ========================================================================= }}}
" 2 moving around, searching and patterns ================================= {{{
set nostartofline
set magic
set ignorecase
set smartcase
set gdefault
set incsearch
set showmatch
set hlsearch
" ========================================================================= }}}
" 3 tags ================================================================== {{{
set showfulltag
" ========================================================================= }}}
" 4 displaying text ======================================================= {{{
set scroll=7
set scrolloff=3
set nowrap
set fillchars+=stl:\
set fillchars+=stlnc:\
set fillchars+=fold:\
set fillchars+=diff:\
set fillchars+=vert:\
set linebreak
set lazyredraw
set list
set listchars+=tab:›\ "
set listchars+=trail:·
set listchars+=nbsp:␣
set listchars+=extends:›
set listchars+=precedes:‹
set listchars+=eol:\ "
"set showbreak=→
if exists('&relativenumber')
set relativenumber
endif
set number
if has('autocmd')
augroup AlwaysRelative
au!
au BufReadPost *
\ if &number && exists('&relativenumber') |
\ silent! setl relativenumber |
\ silent! setl number |
\ endif
augroup END
endif
" ========================================================================= }}}
" 5 syntax, highlighting and spelling ===================================== {{{
set background=dark
syntax enable
set t_Co=256
set background=dark
let g:solarized_italic = 0
let g:solarized_diffmode = "high"
let g:solarized_visibility = "low"
let g:solarized_underline = 0
let g:solarized_hitrail = 1
let g:solarized_contrast = "normal"
colorscheme solarized
set cursorline
"set cursorcolumn
"if exists('+colorcolumn') | set colorcolumn+=80,120 | endif
if exists('&colorcolumn')
let &colorcolumn=join(range(81,9999), ',')
endif
set spelllang=en_us
" custom highlights
" hi LineNr cterm=bold gui=bold " ctermbg=234 guibg=#222222
" hi SignColumn cterm=bold gui=bold " ctermbg=234 guibg=#222222
" hi CursorLineNr cterm=bold gui=bold " ctermbg=234 guibg=#222222
" hi CursorLine ctermbg=234 guibg=#222222
" hi ColorColumn ctermbg=234 guibg=#222222
" Highlight VCS conflict markers
match ErrorMsg '^\(<\|=\|>\)\{7\}\([^=].\+\)\?$'
" Highlight Word
"
" This mini-plugin provides a few mappings for highlighting words temporarily.
"
" Sometimes you're looking at a hairy piece of code and would like a certain
" word or two to stand out temporarily. You can search for it, but that only
" gives you one color of highlighting. Now you can use <leader>N where N is
" a number from 1-6 to highlight the current word in a specific color.
function! HiInterestingWord(n)
" Save our location.
normal! mz
" Yank the current word into the z register.
normal! "zyiw
" Calculate an arbitrary match ID. Hopefully nothing else is using it.
let mid = 86750 + a:n
" Clear existing matches, but don't worry if they don't exist.
silent! call matchdelete(mid)
" Construct a literal pattern that has to match at boundaries.
let pat = '\V\<' . escape(@z, '\') . '\>'
" Actually match the words.
call matchadd("InterestingWord" . a:n, pat, 1, mid)
" Move back to our original location.
normal! `z
endfunction
" Default Highlights
hi def InterestingWord1 guifg=#000000 ctermfg=16 guibg=#ffa724 ctermbg=214
hi def InterestingWord2 guifg=#000000 ctermfg=16 guibg=#aeee00 ctermbg=154
hi def InterestingWord3 guifg=#000000 ctermfg=16 guibg=#8cffba ctermbg=121
hi def InterestingWord4 guifg=#000000 ctermfg=16 guibg=#b88853 ctermbg=137
hi def InterestingWord5 guifg=#000000 ctermfg=16 guibg=#ff9eb8 ctermbg=211
hi def InterestingWord6 guifg=#000000 ctermfg=16 guibg=#ff2c4b ctermbg=195
" ========================================================================= }}}
" 6 multiple windows ====================================================== {{{
set winminheight=0
set winminwidth=0
set hidden
set switchbuf=useopen,usetab
set splitbelow
set scrollopt=ver,hor,jump
" ========================================================================= }}}
" 7 multiple tab pages ==================================================== {{{
" ========================================================================= }}}
" 8 terminal ============================================================== {{{
"set ttyscroll=0
set ttyfast
set title
set titlestring=%t%(\ %M%)%(\ (%{expand(\"%:~:.:h\")})%)%(\ %a%)
set titlelen=85
" bar cursor in insert mode
if exists('$TMUX')
let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
else
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
endif
" ========================================================================= }}}
" 9 using the mouse ======================================================= {{{
if has('mouse')
set mouse+=a
set mousemodel=popup_setpos
set ttymouse=xterm2 " tmux knows the extended mouse mode
" if &term =~ '^screen'
" set ttymouse=xterm2 " tmux knows the extended mouse mode
" endif
endif
" block select with control-click-and-drag
noremap <C-LeftMouse> <LeftMouse><Esc><C-V>
noremap <C-LeftDrag> <LeftDrag>
" ========================================================================= }}}
" 10 GUI ================================================================== {{{
if has('gui_running')
set linespace=1
set guifont=Inconsolata:h13
if has('transparency')
set transparency=0
endif
endif
" ========================================================================= }}}
" 11 printing ============================================================= {{{
" ========================================================================= }}}
" 12 messages and info ==================================================== {{{
set noshowmode
set showcmd
set shortmess+=I
" ========================================================================= }}}
" 13 selecting text ======================================================= {{{
if has('clipboard')
set clipboard=unnamed
if has('xterm_clipboard')
set clipboard+=unnamedplus
endif
endif
"set selectmode+=mouse,key,cmd
" ========================================================================= }}}
" 14 editing text ========================================================= {{{
if has('persistent_undo')
set undolevels=1000
if exists('&undoreload')
set undoreload=10000
endif
endif
" set complete=.,w,b,u,t
set completeopt+=preview,menuone,longest
set backspace=indent,eol,start
set whichwrap+=<>[]
set textwidth=72
set formatoptions=qrn1
set showmatch
" ========================================================================= }}}
" 15 tabs and indenting =================================================== {{{
filetype indent on
set smartindent
set smarttab
set tabstop=4
set shiftwidth=4
set expandtab
" ========================================================================= }}}
" 16 folding ============================================================== {{{
set foldenable
set foldmethod=manual
set foldlevelstart=99 " Don't autofold anything
set foldlevel=99 " Don't autofold anything
function! MyFoldText()
let line = getline(v:foldstart)
let nucolwidth = &fdc + &number * &numberwidth
let windowwidth = winwidth(0) - nucolwidth - 3
let foldedlinecount = v:foldend - v:foldstart
" expand tabs into spaces
let onetab = strpart(' ', 0, &tabstop)
let line = substitute(line, '\t', onetab, 'g')
let line = strpart(line, 0, windowwidth - 2 -len(foldedlinecount))
let fillcharcount = windowwidth - len(line) - len(foldedlinecount)
return line . '…' . repeat(" ",fillcharcount) . foldedlinecount . '…' . ' '
endfunction
set foldtext=MyFoldText()
" ========================================================================= }}}
" 17 diff mode ============================================================ {{{
" ========================================================================= }}}
" 18 mapping ============================================================== {{{
let mapleader = ","
let maplocalleader = "\\"
set notimeout
set ttimeout
set ttimeoutlen=10
noremap <F1> :checktime<cr>
inoremap <F1> <esc>:checktime<cr>
" Keep search matches in the middle of the window
nnoremap n nzzzv
nnoremap N Nzzzv
" Same when jumping around
nnoremap g; g;zz
nnoremap g, g,zz
nnoremap <c-o> <c-o>zz
nnoremap <leader><space> :noh<cr>
nnoremap <tab> %
vnoremap <tab> %
nnoremap <silent> * :let stay_star_view = winsaveview()<cr>*:call winrestview(stay_star_view)<cr>
vnoremap <silent> * :let stay_star_view = winsaveview()<cr>*:call winrestview(stay_star_view)<cr>
" nnoremap / /\v
" vnoremap / /\v
" Visual Mode */# from Scrooloose
function! s:VSetSearch()
let temp = @@
norm! gvy
let @/ = '\V' . substitute(escape(@@, '\'), '\n', '\\n', 'g')
let @@ = temp
endfunction
vnoremap * :<C-u>call <SID>VSetSearch()<CR>//<CR><c-o>
vnoremap # :<C-u>call <SID>VSetSearch()<CR>??<CR><c-o>
nnoremap <silent> <leader>1 :call HiInterestingWord(1)<cr>
nnoremap <silent> <leader>2 :call HiInterestingWord(2)<cr>
nnoremap <silent> <leader>3 :call HiInterestingWord(3)<cr>
nnoremap <silent> <leader>4 :call HiInterestingWord(4)<cr>
nnoremap <silent> <leader>5 :call HiInterestingWord(5)<cr>
nnoremap <silent> <leader>6 :call HiInterestingWord(6)<cr>
" Keep the cursor in place while joining lines
nnoremap J mzJ`z
" Split line (sister to [J]oin lines)
" The normal use of S is covered by cc, so don't worry about shadowing it.
nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w
" Sudo to write
cnoremap w!! w !sudo tee % >/dev/null
" Typos
command! -bang E e<bang>
command! -bang Q q<bang>
command! -bang W w<bang>
command! -bang QA qa<bang>
command! -bang Qa qa<bang>
command! -bang Wa wa<bang>
command! -bang WA wa<bang>
command! -bang Wq wq<bang>
command! -bang WQ wq<bang>
" Wrapped lines goes down/up to next row, rather than next line in file.
noremap <Up> gk
noremap <Down> gj
noremap k gk
noremap j gj
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk
" I suck at typing.
vnoremap - =
" Unfuck my screen
nnoremap U :syntax sync fromstart<cr>:redraw!<cr>
" clean trailing whitespace
nnoremap <leader>W :%s/\s\+$//<cr>:let @/=''<CR>
" wrap a paragraph
vnoremap Q gq
nnoremap Q gqap
" retain selection when changing indent level
vnoremap < <gv
vnoremap > >gv
" reselect what was just pasted
nnoremap <leader>v V`]
" quickly open .vimrc as split window
nnoremap <leader>ev :exec 'edit ' . resolve(expand($MYVIMRC))<CR>
" switch splits more easily
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
" move lines with leader-{j,k}, indent with leader-{h,l}
nnoremap <leader>k :m-2<CR>==
nnoremap <leader>j :m+<CR>==
nnoremap <leader>h <<
nnoremap <leader>l >>
inoremap <leader>j <Esc>:m+<CR>==gi
inoremap <leader>k <Esc>:m-2<CR>==gi
inoremap <leader>h <Esc><<`]a
inoremap <leader>l <Esc>>>`]a
vnoremap <leader>j :m'>+<CR>gv=gv
vnoremap <leader>k :m-2<CR>gv=gv
vnoremap <leader>h <gv
vnoremap <leader>l >gv
" clear old search
nnoremap <leader>/ :let @/ = ""<CR>
" display unprintable characters
nnoremap <F2> :set list!<CR>
" toggle spellcheck
nnoremap <F4> :set spell!<CR>
" sort CSS
nnoremap <leader>S ?{<CR>jV/^\s*\}?$<CR>k:sort<CR>:noh<CR>
noremap <F7> :NERDTreeToggle<CR>
noremap <leader>o :CtrlPMixed<CR>
noremap <leader>p :CtrlP<CR>
noremap <leader>b :CtrlPBuffer<CR>
noremap <leader>u :CtrlPUndo<CR>
noremap <leader>T :CtrlPTag<CR>
noremap <leader>t :CtrlPBufTagAll<CR>
noremap <leader>m :CtrlPMRUFiles<CR>
noremap <F8> :TagbarToggle<CR>
nnoremap <Leader>aa :Tabularize argument_list<CR>
vnoremap <Leader>aa :Tabularize argument_list<CR>
nnoremap <Leader>a<Space> :Tabularize / /<CR>
vnoremap <Leader>a<Space> :Tabularize / /<CR>
nnoremap <Leader>a& :Tabularize /&<CR>
vnoremap <Leader>a& :Tabularize /&<CR>
nnoremap <Leader>a= :Tabularize /=<CR>
vnoremap <Leader>a= :Tabularize /=<CR>
nnoremap <Leader>a: :Tabularize /:<CR>
vnoremap <Leader>a: :Tabularize /:<CR>
nnoremap <Leader>a:: :Tabularize /:\zs<CR>
vnoremap <Leader>a:: :Tabularize /:\zs<CR>
nnoremap <Leader>a, :Tabularize /,<CR>
vnoremap <Leader>a, :Tabularize /,<CR>
nnoremap <Leader>a,, :Tabularize /,\zs<CR>
vnoremap <Leader>a,, :Tabularize /,\zs<CR>
nnoremap <Leader>a<Bar> :Tabularize /<Bar><CR>
vnoremap <Leader>a<Bar> :Tabularize /<Bar><CR>
nnoremap <leader>* :Ack! -i '\b<c-r><c-w>\b'<cr> " ack word under cursor
nnoremap <leader>8 :Ack! -i '\b<c-r><c-w>\b'<cr> " ack word under cursor
nnoremap <leader>g* :Ack! -i '<c-r><c-w>'<cr> " fuzzy ack word under cursor
nnoremap <leader>g8 :Ack! -i '<c-r><c-w>'<cr> " fuzzy ack word under cursor
" folding (if enabled)
nnoremap <silent> <Space> @=(foldlevel('.')?'za':'l')<CR>
vnoremap <Space> zf
nnoremap <c-z> mzzMzvzz15<c-e>`z:Pulse<cr>
cnoreabbrev <expr> ack ((getcmdtype() is# ':' && getcmdline() is# 'ack')?('Ack'):('ack'))
" toggle solarized background
call togglebg#map("<F12>")
" Column scroll-binding on <leader>sb
noremap <silent> <leader>sb :<C-u>let @z=&so<CR>:set so=0 noscb<CR>:bo vs<CR>Ljzt:setl scb<CR><C-w>p:setl scb<CR>:let &so=@z<CR>
" ========================================================================= }}}
" 19 reading and writing files ============================================ {{{
set modeline
set backup
set writebackup
set backupdir=~/.vim/local/backup//
if !isdirectory(expand(&backupdir))
call mkdir(expand(&backupdir), "p")
endif
set backupskip=/tmp/*,/private/tmp/*"
set autowriteall
set autoread
if exists('&cryptmethod')
set cryptmethod=blowfish
endif
" ========================================================================= }}}
" 20 the swap file ======================================================== {{{
set directory=~/.vim/local/swap//
if !isdirectory(expand(&directory))
call mkdir(expand(&directory), "p")
endif
set updatetime=500
" ========================================================================= }}}
" 21 command line editing ================================================= {{{
set wildmenu
set wildmode=list:longest
set wildignore+=*.o,*.obj,.git,*.rbc,*.class,.svn,vendor/gems/*,*.bak,*.exe
set wildignore+=*.pyc,*.DS_Store,*.db
set history=5000
if has('persistent_undo')
set undofile
set undodir=~/.vim/local/undo//
if !isdirectory(expand(&undodir))
call mkdir(expand(&undodir), "p")
endif
endif
" ========================================================================= }}}
" 22 executing external commands ========================================== {{{
"set nowarn
" ========================================================================= }}}
" 23 running make and jumping to errors =================================== {{{
if has('autocmd')
augroup QuickFix
au!
au BufReadPost quickfix setlocal nolist
augroup END
endif
" ========================================================================= }}}
" 24 language specific ==================================================== {{{
set iskeyword-=:
" ========================================================================= }}}
" 25 multi-byte characters ================================================ {{{
set encoding=utf-8
set fileencoding=utf-8
set termencoding=utf-8
" ========================================================================= }}}
" 26 various ============================================================== {{{
set virtualedit+=block,onemore
" set gdefault
if exists('&viewdir')
set viewdir=~/.vim/local/view//
if !isdirectory(expand(&viewdir))
call mkdir(expand(&viewdir), "p")
endif
endif
set viminfo^=%,h
if has('autocmd')
augroup RedrawOnResize
au!
au VimResized * silent! redraw!
augroup END
augroup RememberLastView
au!
au BufWinLeave * silent! mkview "make vim save view (state) (folds, cursor, etc)
au BufWinEnter * silent! loadview "make vim load view (state) (folds, cursor, etc)
augroup END
augroup Stdin
au!
au StdinReadPost * :set buftype=nofile
augroup END
endif
function! s:Pulse()
redir => old_hi
silent execute 'hi CursorLine'
redir END
let old_hi = split(old_hi, '\n')[0]
let old_hi = substitute(old_hi, 'xxx', '', '')
let steps = 8
let width = 1
let start = width
let end = steps * width
let color = 233
for i in range(start, end, width)
execute "hi CursorLine ctermbg=" . (color + i)
redraw
sleep 6m
endfor
for i in range(end, start, -1 * width)
execute "hi CursorLine ctermbg=" . (color + i)
redraw
sleep 6m
endfor
execute 'hi ' . old_hi
endfunction
command! -nargs=0 Pulse call s:Pulse()
" NERDTree settings
" let NERDTreeMinimalUI = 1
let NERDTreeDirArrows = 1
" let NERDTreeHijackNetrw=0
let NERDTreeShowBookmarks=1
let NERDTreeIgnore=['\.pyc', '\~$', '\.swo$', '\.swp$', '\.git', '\.hg', '\.svn', '\.bzr']
let NERDTreeChDirMode=0
let NERDTreeQuitOnOpen=0
" let NERDTreeMouseMode=3
" let NERDTreeShowHidden=1
let NERDTreeKeepTreeInNewTab=1
let g:nerdtree_tabs_open_on_gui_startup=0
let NERDChristmasTree=1
let NERDTreeAutoCenter=1
if has('autocmd')
augroup CloseNERDTreeIfLastWindow
autocmd!
autocmd BufEnter *
\ if winnr("$") == 1 |
\ if exists("b:NERDTreeType") |
\ if b:NERDTreeType == "primary" |
\ quit |
\ endif |
\ endif |
\ endif |
augroup END
" returns true iff is NERDTree open/active
function! rc:isNTOpen()
return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1)
endfunction
" returns true iff focused window is NERDTree window
function! rc:isNTFocused()
return -1 != match(expand('%'), 'NERD_Tree')
endfunction
" calls NERDTreeFind iff NERDTree is active, current window contains a modifiable file, and we're not in vimdiff
function! rc:syncTree()
if &modifiable && rc:isNTOpen() && !rc:isNTFocused() && strlen(expand('%')) > 0 && !&diff
NERDTreeFind
silent! execute "normal zz"
wincmd p
endif
endfunction
augroup SyncNERDTree
au!
au BufEnter * call rc:syncTree()
augroup END
endif
" CtrlP settings
let g:ctrlp_extensions = ['tag', 'buffertag', 'quickfix', 'dir', 'rtscript',
\ 'undo', 'line', 'changes', 'mixed', 'bookmarkdir']
let g:ctrlp_cmd = 'CtrlPMixed'
let g:ctrlp_match_window = 'top,order:ttb,min:1,max:16'
let g:ctrlp_mruf_relative = 1
if filereadable(expand('~/.local/bin/ctags'))
let g:ctrlp_buftag_ctags_bin = expand('~/.local/bin/ctags')
endif
if executable('ag')
" Use ag in CtrlP for listing files. Lightning fast and respects .gitignore
let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
" ag is fast enough that CtrlP doesn't need to cache
let g:ctrlp_use_caching = 0
endif
" TagBar settings
if filereadable(expand('~/.local/bin/ctags'))
let g:tagbar_ctags_bin = expand('~/.local/bin/ctags')
endif
let g:tagbar_autoclose = 0
" let g:tagbar_singleclick = 1
let g:tagbar_iconchars = ['▸','▾']
let g:tagbar_type_perl = {
\ 'kinds' : [
\ 'u:use',
\ 'b:base',
\ 't:test',
\ 'd:describe',
\ 'e:extends',
\ 'a:attribute',
\ 'r:role',
\ 'm:method',
\ 's:function',
\ 'c:class'
\ ]
\ }
" Jedi-vim settings
let g:jedi#squelch_py_warning = 1
" Syntastic settings
let g:syntastic_error_symbol='✖'
let g:syntastic_warning_symbol='✹'
"let g:syntastic_python_checker_args='--ignore=E501'
let syntastic_python_flake8_args='--ignore=E501'
let g:syntastic_auto_loc_list=1
let g:syntastic_loc_list_height=5
let g:syntastic_mode_map = { 'mode': 'passive',
\ 'active_filetypes': [],
\ 'passive_filetypes': ['perl'] }
" SuperTab settings
let g:SuperTabCompletionContexts = ['s:ContextText', 's:ContextDiscover']
let g:SuperTabContextTextOmniPrecedence = ['&omnifunc', '&completefunc']
let g:SuperTabContextDiscoverDiscovery =
\ ["&omnifunc:<c-x><c-o>", "&completefunc:<c-x><c-u>",]
let g:SuperTabDefaultCompletionType = "context"
" Ack settings
if executable('ag')
let g:ackprg = 'ag --smart-case --nogroup --nocolor --column'
endif
" Airline settings
" let g:airline_solarized_bg = 'light'
let g:airline_theme='luna'
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
" unicode symbols
let g:airline_left_sep = ''
let g:airline_right_sep = ''
let g:airline_symbols.linenr = '␤'
let g:airline_symbols.branch = '⎇'
let g:airline_symbols.paste = '✹'
let g:airline_symbols.whitespace = '¶'
" vim: set fdm=marker fdl=0 tw=72 :
" ========================================================================= }}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment