Created
June 26, 2013 19:59
-
-
Save ajorgensen/5871066 to your computer and use it in GitHub Desktop.
vimrc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
call pathogen#runtime_append_all_bundles() | |
set runtimepath^=~/.vim/bundle/ctrlp.vim | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" VUNDLE CONFIGURATION | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
set nocompatible | |
filetype off | |
set rtp+=~/.vim/bundle/vundle/ | |
call vundle#rc() | |
" My bundles | |
Bundle 'gmarik/vundle' | |
Bundle 'Valloric/YouCompleteMe' | |
Bundle 'tpope/vim-fugitive' | |
Bundle 'tpope/vim-rails.git' | |
Bundle 'airblade/vim-gitgutter' | |
Bundle 'ruby-matchit' | |
Bundle 'vim-scripts/ctags.vim' | |
Bundle 'tpope/vim-surround' | |
Bundle 'vim-scripts/greplace.vim' | |
Bundle 'xenoterracide/html.vim' | |
Bundle 'tpope/vim-haml' | |
Bundle 'tpope/vim-markdown' | |
Bundle 'tpope/vim-bundler' | |
Bundle 'tpope/vim-cucumber' | |
Bundle 'thoughtbot/vim-rspec' | |
Bundle 'croaky/vim-colors-github' | |
Bundle 'danro/rename.vim' | |
Bundle 'Command-T' | |
Bundle 'taglist.vim' | |
Bundle 'ack.vim' | |
Bundle 'stjernstrom/vim-ruby-run' | |
Bundle 'ajorgensen/vim-rubytest' | |
Bundle 'noprompt/vim-yardoc' | |
Bundle 'L9' | |
Bundle 'FuzzyFinder' | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" TAGLIST CONFIG | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
let Tlist_Ctags_Cmd = '/usr/bin/ctags' | |
let Tlist_WinWidth = 50 | |
map <F4> :TlistToggle<cr> | |
map <F8> :!/usr/bin/ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR> | |
nmap <F9> :TagbarToggle<CR> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" COLOR | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
syntax enable | |
set background=dark | |
colorscheme solarized | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" BASIC EDITING CONFIGURATION | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
set nu | |
" allow unsaved background buffers and remember marks/undo for them | |
set hidden | |
" remember more commands and search history | |
set nobackup | |
set nowritebackup | |
set noswapfile | |
set history=1000 | |
set ruler | |
set expandtab | |
set tabstop=2 | |
set expandtab | |
set shiftwidth=2 | |
set softtabstop=2 | |
set autoindent | |
set laststatus=2 | |
set showmatch | |
set incsearch | |
set hlsearch | |
" make searches case-sensitive only if they contain upper-case characters | |
set ignorecase smartcase | |
" highlight current line | |
set cursorline | |
set cmdheight=2 | |
set switchbuf=useopen | |
set numberwidth=5 | |
set showtabline=2 | |
set winwidth=79 | |
" Prevent Vim from clobbering the scrollback buffer. See | |
" http://www.shallowsky.com/linux/noaltscreen.html | |
set t_ti= t_te= | |
" keep more context when scrolling off the end of a buffer | |
set scrolloff=3 | |
" Store temporary files in a central spot | |
set backup | |
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp | |
set directory=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp | |
" allow backspacing over everything in insert mode | |
set backspace=indent,eol,start | |
" display incomplete commands | |
set showcmd | |
" Enable highlighting for syntax | |
syntax on | |
" Enable file type detection. | |
" Use the default filetype settings, so that mail gets 'tw' set to 72, | |
" 'cindent' is on in C files, etc. | |
" Also load indent files, to automatically do language-dependent indenting. | |
filetype plugin indent on | |
" use emacs-style tab completion when selecting files, etc | |
set wildmode=longest,list | |
" make tab completion for files/buffers act like bash | |
set wildmenu | |
let mapleader="," | |
hi clear SignColumn | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" CUSTOM AUTOCMDS | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
augroup vimrcEx | |
" Clear all autocmds in the group | |
autocmd! | |
autocmd FileType text setlocal textwidth=78 | |
" Jump to last cursor position unless it's invalid or in an event handler | |
autocmd BufReadPost * | |
\ if line("'\"") > 0 && line("'\"") <= line("$") | | |
\ exe "normal g`\"" | | |
\ endif | |
"for ruby, autoindent with two spaces, always expand tabs | |
autocmd FileType ruby,haml,eruby,yaml,html,javascript,sass,cucumber set ai sw=2 sts=2 et | |
autocmd FileType python set sw=4 sts=4 et | |
autocmd! BufRead,BufNewFile *.sass setfiletype sass | |
autocmd BufRead *.mkd set ai formatoptions=tcroqn2 comments=n:> | |
autocmd BufRead *.markdown set ai formatoptions=tcroqn2 comments=n:> | |
" Indent p tags | |
autocmd FileType html,eruby if g:html_indent_tags !~ '\\|p\>' | let g:html_indent_tags .= '\|p\|li\|dt\|dd' | endif | |
" Don't syntax highlight markdown because it's often wrong | |
autocmd! FileType mkd setlocal syn=off | |
" Leave the return key alone when in command line windows, since it's used | |
" to run commands there. | |
autocmd! CmdwinEnter * :unmap <cr> | |
autocmd! CmdwinLeave * :call MapCR() | |
augroup END | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" STATUS LINE | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
:set statusline=%<%f\ (%{&ft})\ %-4(%m%)%=%-19(%3l,%02c%03V%) | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" MISC KEY MAPS | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
map <leader>y "*y | |
" Move around splits with <c-hjkl> | |
nnoremap <c-j> <c-w>j | |
nnoremap <c-k> <c-w>k | |
nnoremap <c-h> <c-w>h | |
nnoremap <c-l> <c-w>l | |
" Insert a hash rocket with <c-l> | |
imap <c-l> <space>=><space> | |
" Can't be bothered to understand ESC vs <c-c> in insert mode | |
imap <c-c> <esc> | |
" Clear the search buffer when hitting return | |
"function! MapCR() | |
" nnoremap <cr> :nohlsearch<cr> | |
"endfunction | |
"call MapCR() | |
nnoremap <leader><leader> <c-^> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" MULTIPURPOSE TAB KEY | |
" Indent if we're at the beginning of a line. Else, do completion. | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! InsertTabWrapper() | |
let col = col('.') - 1 | |
if !col || getline('.')[col - 1] !~ '\k' | |
return "\<tab>" | |
else | |
return "\<c-p>" | |
endif | |
endfunction | |
inoremap <tab> <c-r>=InsertTabWrapper()<cr> | |
inoremap <s-tab> <c-n> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" ARROW KEYS ARE UNACCEPTABLE | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
map <Left> <Nop> | |
map <Right> <Nop> | |
map <Up> <Nop> | |
map <Down> <Nop> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" OPEN FILES IN DIRECTORY OF CURRENT FILE | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
cnoremap %% <C-R>=expand('%:h').'/'<cr> | |
map <leader>e :edit %% | |
map <leader>v :view %% | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" RENAME CURRENT FILE | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! RenameFile() | |
let old_name = expand('%') | |
let new_name = input('New file name: ', expand('%'), 'file') | |
if new_name != '' && new_name != old_name | |
exec ':saveas ' . new_name | |
exec ':silent !rm ' . old_name | |
redraw! | |
endif | |
endfunction | |
map <leader>n :call RenameFile()<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" PROMOTE VARIABLE TO RSPEC LET | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! PromoteToLet() | |
:normal! dd | |
" :exec '?^\s*it\>' | |
:normal! P | |
:.s/\(\w\+\) = \(.*\)$/let(:\1) { \2 }/ | |
:normal == | |
endfunction | |
:command! PromoteToLet :call PromoteToLet() | |
:map <leader>p :PromoteToLet<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" EXTRACT VARIABLE (SKETCHY) | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! ExtractVariable() | |
let name = input("Variable name: ") | |
if name == '' | |
return | |
endif | |
" Enter visual mode (not sure why this is needed since we're already in | |
" visual mode anyway) | |
normal! gv | |
" Replace selected text with the variable name | |
exec "normal c" . name | |
" Define the variable on the line above | |
exec "normal! O" . name . " = " | |
" Paste the original selected text to be the variable value | |
normal! $p | |
endfunction | |
vnoremap <leader>rv :call ExtractVariable()<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" INLINE VARIABLE (SKETCHY) | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! InlineVariable() | |
" Copy the variable under the cursor into the 'a' register | |
:let l:tmp_a = @a | |
:normal "ayiw | |
" Delete variable and equals sign | |
:normal 2daW | |
" Delete the expression into the 'b' register | |
:let l:tmp_b = @b | |
:normal "bd$ | |
" Delete the remnants of the line | |
:normal dd | |
" Go to the end of the previous line so we can start our search for the | |
" usage of the variable to replace. Doing '0' instead of 'k$' doesn't | |
" work; I'm not sure why. | |
normal k$ | |
" Find the next occurence of the variable | |
exec '/\<' . @a . '\>' | |
" Replace that occurence with the text we yanked | |
exec ':.s/\<' . @a . '\>/' . @b | |
:let @a = l:tmp_a | |
:let @b = l:tmp_b | |
endfunction | |
nnoremap <leader>ri :call InlineVariable()<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" MAPS TO JUMP TO SPECIFIC COMMAND-T TARGETS AND FILES | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
map <leader>gr :topleft :split config/routes.rb<cr> | |
function! ShowRoutes() | |
" Requires 'scratch' plugin | |
:topleft 100 :split __Routes__ | |
" Make sure Vim doesn't write __Routes__ as a file | |
:set buftype=nofile | |
" Delete everything | |
:normal 1GdG | |
" Put routes output in buffer | |
:0r! rake -s routes | |
" Size window to number of lines (1 plus rake output length) | |
:exec ":normal " . line("$") . "_ " | |
" Move cursor to bottom | |
:normal 1GG | |
" Delete empty trailing line | |
:normal dd | |
endfunction | |
map <leader>gR :call ShowRoutes()<cr> | |
map <leader>gv :CommandTFlush<cr>\|:CommandT app/views<cr> | |
map <leader>gc :CommandTFlush<cr>\|:CommandT app/controllers<cr> | |
map <leader>gm :CommandTFlush<cr>\|:CommandT app/models<cr> | |
map <leader>gh :CommandTFlush<cr>\|:CommandT app/helpers<cr> | |
map <leader>gl :CommandTFlush<cr>\|:CommandT lib<cr> | |
map <leader>gp :CommandTFlush<cr>\|:CommandT public<cr> | |
map <leader>gs :CommandTFlush<cr>\|:CommandT public/stylesheets/sass<cr> | |
map <leader>gf :CommandTFlush<cr>\|:CommandT features<cr> | |
map <leader>gg :topleft 100 :split Gemfile<cr> | |
map <leader>gt :CommandTFlush<cr>\|:CommandTTag<cr> | |
map <leader>f :CommandTFlush<cr>\|:CommandT<cr> | |
map <leader>F :CommandTFlush<cr>\|:CommandT %%<cr> | |
"map <leader>f :CtrlP<cr> | |
"nnoremap gr :grep <cword> . --exclude-dir=log -R | copen<CR> | |
"nnoremap gG :grep <cword> ~/.rbenv/versions/$RBENV_VERSION/lib/ruby/gems/1.9.1/**/*.rb -R | copen<CR> | |
map gr :execute " grep! -srnw --binary-files=without-match --exclude-dir=.git --exclude-dir=log --exclude-dir=test --exclude-dir=spec . -e " . expand("<cword>") . " " <bar> cwindow<CR> | |
map gt :execute " grep! -srnw --binary-files=without-match --exclude-dir=.git --exclude-dir=log . -e " . expand("<cword>") . " " <bar> cwindow<CR> | |
map gG :execute " grep! -srnw --binary-files=without-match --exclude-dir=.git ~/.rbenv/versions/$RBENV_VERSION/lib/ruby/gems/1.9.1 -e " . expand("<cword>") . " " <bar> cwindow<CR> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" SWITCH BETWEEN TEST AND PRODUCTION CODE | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! OpenTestAlternate() | |
let new_file = AlternateForCurrentFile() | |
exec ':e ' . new_file | |
endfunction | |
function! AlternateForCurrentFile() | |
let current_file = expand("%") | |
let new_file = current_file | |
let in_spec = match(current_file, '^spec/') != -1 | |
let going_to_spec = !in_spec | |
let in_app = match(current_file, '\<controllers\>') != -1 || match(current_file, '\<models\>') != -1 || match(current_file, '\<views\>') != -1 || match(current_file, '\<helpers\>') != -1 | |
if going_to_spec | |
if in_app | |
let new_file = substitute(new_file, '^app/', '', '') | |
end | |
let new_file = substitute(new_file, '\.rb$', '_spec.rb', '') | |
let new_file = 'spec/' . new_file | |
else | |
let new_file = substitute(new_file, '_spec\.rb$', '.rb', '') | |
let new_file = substitute(new_file, '^spec/', '', '') | |
if in_app | |
let new_file = 'app/' . new_file | |
end | |
endif | |
return new_file | |
endfunction | |
nnoremap <leader>. :call OpenTestAlternate()<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" RUNNING TESTS | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
"map <leader>t :call RunTestFile()<cr> | |
"map <leader>T :call RunNearestTest()<cr> | |
"map <leader>a :call RunTests('')<cr> | |
"map <leader>c :w\|:!script/features<cr> | |
"map <leader>w :w\|:!script/features --profile wip<cr> | |
map <leader>z :wa\|:call RunPresetTest()<cr> | |
map <leader>Z :call SetTestFile()<cr> | |
map <leader>c :call UnsetTestFile()<cr> | |
let g:rubytest_cmd_testcase = "ruby %p -n '/%c/'" | |
function! RunPresetTest() | |
call SpinRunning() | |
if exists("t:grb_test_file") | |
if exists("t:spin_running") | |
exec "!spin push " . t:grb_test_file | |
else | |
if match(expand(t:grb_test_file), '\(_test.rb\)$') > 0 | |
exec "!bundle exec ruby " . t:grb_test_file | |
elseif match(expand(t:grb_test_file), '\(_spec.rb\)$') > 0 | |
exec "!bundle exec rspec " . t:grb_test_file | |
end | |
endif | |
else | |
if isdirectory("./spec") | |
if exists("t:spin_running") | |
exec "!spin push spec" | |
else | |
exec "!bundle exec rspec" | |
endif | |
else | |
exec "!bundle exec rake" | |
endif | |
end | |
endfunction | |
function! SetTestFile() | |
" Set the spec file that tests will be run for. | |
let t:grb_test_file=@% | |
endfunction | |
function! SpinRunning() | |
let l = system("ps aux | grep 'spin serve' | grep -v grep | wc -l") | |
if l == 1 | |
let t:spin_running=1 | |
else | |
if exists("t:spin_running") | |
unlet t:spin_running | |
endif | |
endif | |
endfunction | |
function! UnsetTestFile() | |
if exists("t:grb_test_file") | |
unlet t:grb_test_file | |
end | |
endfunction | |
function! RunTestFile(...) | |
if a:0 | |
let command_suffix = a:1 | |
else | |
let command_suffix = "" | |
endif | |
" Run the tests for the previously-marked file. | |
let in_test_file = match(expand("%"), '\(.feature\|_spec.rb\|_test.rb\)$') != -1 | |
if in_test_file | |
call SetTestFile() | |
elseif !exists("t:grb_test_file") | |
return | |
end | |
call RunTests(t:grb_test_file . command_suffix) | |
endfunction | |
function! RunNearestTest() | |
let spec_line_number = line('.') | |
call RunTestFile(":" . spec_line_number . " -b") | |
endfunction | |
function! RunTests(filename) | |
" Write the file and run tests for the given filename | |
:w | |
:silent !echo;echo;echo;echo;echo;echo;echo;echo;echo;echo | |
:silent !echo;echo;echo;echo;echo;echo;echo;echo;echo;echo | |
:silent !echo;echo;echo;echo;echo;echo;echo;echo;echo;echo | |
:silent !echo;echo;echo;echo;echo;echo;echo;echo;echo;echo | |
:silent !echo;echo;echo;echo;echo;echo;echo;echo;echo;echo | |
:silent !echo;echo;echo;echo;echo;echo;echo;echo;echo;echo | |
if match(a:filename, '\.feature$') != -1 | |
exec ":!script/features " . a:filename | |
else | |
if filereadable("script/test") | |
exec ":!script/test " . a:filename | |
elseif filereadable("Gemfile") | |
exec ":!bundle exec rspec --color " . a:filename | |
else | |
exec ":!rspec --color " . a:filename | |
end | |
end | |
endfunction | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" Md5 COMMAND | |
" Show the MD5 of the current buffer | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
command! -range Md5 :echo system('echo '.shellescape(join(getline(<line1>, <line2>), '\n')) . '| md5') | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" InsertTime COMMAND | |
" Insert the current time | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
command! InsertTime :normal a<c-r>=strftime('%F %H:%M:%S.0 %z')<cr> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment