From eeee46d29f22d0bacfa7873f465116e968740179 Mon Sep 17 00:00:00 2001 From: Michael Campagnaro Date: Thu, 19 Apr 2012 10:23:13 -0400 Subject: [PATCH] update vim and git config --- .vimrc | 97 +++++++++++++++++ gitconfig | 35 +++++++ githelpers | 40 +++++++ vimrc | 302 +++++++++++++++++++++++++++++++++++++++++------------ 4 files changed, 410 insertions(+), 64 deletions(-) create mode 100644 .vimrc create mode 100644 gitconfig create mode 100644 githelpers diff --git a/.vimrc b/.vimrc new file mode 100644 index 0000000..aff33f0 --- /dev/null +++ b/.vimrc @@ -0,0 +1,97 @@ +filetype indent on +set tabstop=4 +set smarttab +set shiftwidth=4 +set autoindent +set expandtab +syntax on +set number +set wildmenu +set mouse=a + +" The PC is fast enough, do syntax highlight syncing from start +autocmd BufEnter * :syntax sync fromstart + +" Enable filetype plugins and indention +filetype on +filetype plugin on + +" prefer unix over windows over os9 formats +set fileformats=unix,dos,mac + +" utf-8 default encoding +set enc=utf-8 + +" keep some more lines for scope +set scrolloff=5 + +" ; is an alias for : +nnoremap ; : + +" template language support (SGML / XML too) +" ------------------------------------------ +" and disable taht stupid html rendering (like making stuff bold etc) + +fun! s:SelectHTML() +let n = 1 +while n < 50 && n < line("$") + " check for jinja + if getline(n) =~ '{%\s*\(extends\|block\|macro\|set\|if\|for\|include\|trans\)\>' + set ft=htmljinja + return + endif + " check for django + if getline(n) =~ '{%\s*\(extends\|block\|comment\|ssi\|if\|for\|blocktrans\)\>' + set ft=htmldjango + return + endif + " check for mako + if getline(n) =~ '<%\(def\|inherit\)' + set ft=mako + return + endif + " check for genshi + if getline(n) =~ 'xmlns:py\|py:\(match\|for\|if\|def\|strip\|xmlns\)' + set ft=genshi + return + endif + let n = n + 1 + endwhile + " go with html + set ft=html +endfun + +autocmd BufNewFile,BufRead *.html,*.htm call s:SelectHTML() + +" CSS +" --- +autocmd FileType css setlocal expandtab shiftwidth=4 tabstop=4 softtabstop=4 + +" Javascript +" ---------- +autocmd FileType javascript setlocal expandtab shiftwidth=2 tabstop=2 softtabstop=2 colorcolumn=79 +let javascript_enable_domhtmlcss=1 + + +" New Config +" ---------------------------------------------------------------- + +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" 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 + + 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 + + " Indent p tags + autocmd FileType html,eruby if g:html_indent_tags !~ '\\|p\>' | let g:html_indent_tags .= '\|p\|li\|dt\|dd' | endif +augroup END diff --git a/gitconfig b/gitconfig new file mode 100644 index 0000000..ce02541 --- /dev/null +++ b/gitconfig @@ -0,0 +1,35 @@ +[user] + name = Michael Campagnaro + email = mikecampo@gmail.com +[diff] +[color] + ui = auto +[alias] + st = status + ci = commit + co = checkout + di = diff + dc = diff --cached + amend = commit --amend + aa = add --all + head = !git l -1 + h = !git head + hp = "!source ~/.githelpers && show_git_head" + r = !git l -20 + ra = !git r --all + ff = merge --ff-only + pullff = pull --ff-only + noff = merge --no-ff + l = "!source ~/.githelpers && pretty_git_log" + la = !git l --all + div = divergence + gn = goodness + gnc = goodness --cached + fa = fetch --all + pom = push origin master + b = branch + ds = diff --stat=160,120 + dh1 = diff HEAD~1 + +[merge] + tool = vimdiff diff --git a/githelpers b/githelpers new file mode 100644 index 0000000..0c33b69 --- /dev/null +++ b/githelpers @@ -0,0 +1,40 @@ +#!/bin/bash + +# Log output: +# +# * 51c333e (12 days) add vim-eunuch +# +# The time massaging regexes start with ^[^<]* because that ensures that they +# only operate before the first "<". That "<" will be the beginning of the +# author name, ensuring that we don't destroy anything in the commit message +# that looks like time. +# +# The log format uses } characters between each field, and `column` is later +# used to split on them. A } in the commit subject or any other field will +# break this. + +HASH="%C(yellow)%h%Creset" +RELATIVE_TIME="%Cgreen(%ar)%Creset" +AUTHOR="%C(bold blue)<%an>%Creset" +REFS="%C(red)%d%Creset" +SUBJECT="%s" + +FORMAT="$HASH}$RELATIVE_TIME}$AUTHOR}$REFS $SUBJECT" + +show_git_head() { + pretty_git_log -1 + git show -p --pretty="tformat:" +} + +pretty_git_log() { + git log --graph --abbrev-commit --date=relative --pretty="tformat:${FORMAT}" $* | + # Repalce (2 years ago) with (2 years) + sed -Ee 's/(^[^<]*) ago)/\1)/' | + # Replace (2 years, 5 months) with (2 years) + sed -Ee 's/(^[^<]*), [[:digit:]]+ .*months?)/\1)/' | + # Line columns up based on } delimiter + column -s '}' -t | + # Page only if we need to + less -FXRS +} + diff --git a/vimrc b/vimrc index a082c26..d6ed0a1 100644 --- a/vimrc +++ b/vimrc @@ -1,82 +1,256 @@ -filetype indent on -set tabstop=4 -set smarttab -set shiftwidth=4 -set autoindent +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" BASIC EDITING CONFIGURATION +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +set nocompatible +" allow unsaved background buffers and remember marks/undo for them +set hidden +" remember more commands and search history +set history=10000 set expandtab +set tabstop=4 +set shiftwidth=4 +set softtabstop=4 +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 cmdheight=2 +set switchbuf=useopen +set numberwidth=5 +set showtabline=2 +set winwidth=79 +set shell=bash +" 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 -set number +" 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 -set mouse=a +let mapleader="," -" The PC is fast enough, do syntax highlight syncing from start -autocmd BufEnter * :syntax sync fromstart +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" 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("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif -" Remember cursor position -au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif + 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 -" Enable filetype plugins and indention -filetype on -filetype plugin on + " Indent p tags + autocmd FileType html,eruby if g:html_indent_tags !~ '\\|p\>' | let g:html_indent_tags .= '\|p\|li\|dt\|dd' | endif +augroup END -" prefer unix over windows over os9 formats -set fileformats=unix,dos,mac +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" MISC KEY MAPS +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +let mapleader="," -" utf-8 default encoding -set enc=utf-8 +" insert a hash rocket with +imap => -" keep some more lines for scope -set scrolloff=5 +" set esc to +imap -" ; is an alias for : -nnoremap ; : +" Clear the search buffer (highlighting) when hitting return +:nnoremap :nohlsearch +nnoremap -" template language support (SGML / XML too) -" ------------------------------------------ -" and disable taht stupid html rendering (like making stuff bold etc) +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" ARROW KEYS ARE UNACCEPTABLE +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +map :echo "no!" +map :echo "no!" +map :echo "no!" +map :echo "no!" -fun! s:SelectHTML() -let n = 1 -while n < 50 && n < line("$") - " check for jinja - if getline(n) =~ '{%\s*\(extends\|block\|macro\|set\|if\|for\|include\|trans\)\>' - set ft=htmljinja - return - endif - " check for django - if getline(n) =~ '{%\s*\(extends\|block\|comment\|ssi\|if\|for\|blocktrans\)\>' - set ft=htmldjango - return - endif - " check for mako - if getline(n) =~ '<%\(def\|inherit\)' - set ft=mako - return + +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" MULTIPURPOSE TAB KEY +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +function! InsertTabWrapper() + let col = col('.') - 1 + if !col || getline('.')[col - 1] !~ '\k' + return "\" + else + return "\" endif - " check for genshi - if getline(n) =~ 'xmlns:py\|py:\(match\|for\|if\|def\|strip\|xmlns\)' - set ft=genshi - return +endfunction +inoremap =InsertTabWrapper() +inoremap + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" 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 - let n = n + 1 - endwhile - " go with html - set ft=html -endfun +endfunction +map n :call RenameFile() -autocmd FileType html,xhtml,xml,htmldjango,htmljinja,eruby,mako setlocal expandtab shiftwidth=2 tabstop=2 softtabstop=2 -autocmd BufNewFile,BufRead *.rhtml setlocal ft=eruby -autocmd BufNewFile,BufRead *.mako setlocal ft=mako -autocmd BufNewFile,BufRead *.tmpl setlocal ft=htmljinja -autocmd BufNewFile,BufRead *.py_tmpl setlocal ft=python -autocmd BufNewFile,BufRead *.html,*.htm call s:SelectHTML() +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" 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 p :PromoteToLet -" CSS -" --- -autocmd FileType css setlocal expandtab shiftwidth=4 tabstop=4 softtabstop=4 +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" MAPS TO JUMP TO SPECIFIC COMMAND-T TARGETS AND FILES +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +map gr :topleft :split config/routes.rb +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 gR :call ShowRoutes() +map gv :CommandTFlush\|:CommandT app/views +map gc :CommandTFlush\|:CommandT app/controllers +map gm :CommandTFlush\|:CommandT app/models +map gh :CommandTFlush\|:CommandT app/helpers +map gl :CommandTFlush\|:CommandT lib +map gp :CommandTFlush\|:CommandT public +map gs :CommandTFlush\|:CommandT public/stylesheets/sass +map gf :CommandTFlush\|:CommandT features +map gg :topleft 100 :split Gemfile +map gt :CommandTFlush\|:CommandTTag +map f :CommandTFlush\|:CommandT +map F :CommandTFlush\|:CommandT %% -" Javascript -" ---------- -autocmd FileType javascript setlocal expandtab shiftwidth=2 tabstop=2 softtabstop=2 colorcolumn=79 -let javascript_enable_domhtmlcss=1 +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" 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, '\') != -1 || match(current_file, '\') != -1 || match(current_file, '\') != -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 . :call OpenTestAlternate() + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" RUNNING TESTS +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +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 + +function! SetTestFile() + " Set the spec file that tests will be run for. + let t:grb_test_file=@% +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\)$') != -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 + +map t :call RunTestFile() +map T :call RunNearestTest() +map a :call RunTests('') +map c :w\|:!script/features +map w :w\|:!script/features --profile wip