set nocompatible runtime macros/matchit.vim " Pathogen setup runtime! autoload/pathogen.vim if exists('g:loaded_pathogen') filetype off call pathogen#runtime_append_all_bundles() call pathogen#helptags() endif " Syntax syntax on filetype plugin indent on match ErrorMsg '\%>80v.\+' " UI set number set ruler set guioptions=ce set mouse=a colorscheme railscasts " Tabs/Whitespace set tabstop=2 set shiftwidth=2 set autoindent set smarttab set expandtab set nowrap set list listchars=tab:\ \ ,trail:ยท " Searching set hlsearch set incsearch set ignorecase set smartcase " Tab completion set wildmode=list:longest,list:full set wildignore+=*.o,*.obj,.git,*.rbc " Status bar set laststatus=2 " NERDTree configuration let NERDTreeIgnore=['\.rbc$', '\~$'] map n :NERDTreeToggle " Project Tree autocmd VimEnter * call s:CdIfDirectory(expand("")) " If the parameter is a directory, cd into it function s:CdIfDirectory(directory) let explicitDirectory = isdirectory(a:directory) let directory = explicitDirectory || empty(a:directory) if explicitDirectory exe "cd " . a:directory endif if directory NERDTree wincmd p bd endif endfunction " NERDTree utility function function s:UpdateNERDTree(...) let stay = 0 if(exists("a:1")) let stay = a:1 end if exists("t:NERDTreeBufName") let nr = bufwinnr(t:NERDTreeBufName) if nr != -1 exe nr . "wincmd w" exe substitute(mapcheck("R"), "", "", "") if !stay wincmd p end endif endif if exists("CommandTFlush") CommandTFlush endif endfunction " Utility functions to create file commands function s:CommandCabbr(abbreviation, expansion) execute 'cabbrev ' . a:abbreviation . ' =getcmdpos() == 1 && getcmdtype() == ":" ? "' . a:expansion . '" : "' . a:abbreviation . '"' endfunction function s:FileCommand(name, ...) if exists("a:1") let funcname = a:1 else let funcname = a:name endif execute 'command -nargs=1 -complete=file ' . a:name . ' :call ' . funcname . '()' endfunction function s:DefineCommand(name, destination) call s:FileCommand(a:destination) call s:CommandCabbr(a:name, a:destination) endfunction " Public NERDTree-aware versions of builtin functions function ChangeDirectory(dir, ...) execute "cd " . a:dir let stay = exists("a:1") ? a:1 : 1 NERDTree if !stay wincmd p endif endfunction function Touch(file) execute "!touch " . a:file call s:UpdateNERDTree() endfunction function Remove(file) let current_path = expand("%") let removed_path = fnamemodify(a:file, ":p") if (current_path == removed_path) && (getbufvar("%", "&modified")) echo "You are trying to remove the file you are editing. Please close the buffer first." else execute "!rm " . a:file endif call s:UpdateNERDTree() endfunction function Edit(file) if exists("b:NERDTreeRoot") wincmd p endif execute "e " . a:file ruby << RUBY destination = File.expand_path(VIM.evaluate(%{system("dirname " . a:file)})) pwd = File.expand_path(Dir.pwd) home = pwd == File.expand_path("~") if home || Regexp.new("^" + Regexp.escape(pwd)) !~ destination VIM.command(%{call ChangeDirectory(system("dirname " . a:file), 0)}) end RUBY endfunction " Define the NERDTree-aware aliases call s:DefineCommand("cd", "ChangeDirectory") call s:DefineCommand("touch", "Touch") call s:DefineCommand("rm", "Remove") call s:DefineCommand("e", "Edit") " This helps with RVM etc set shell=/bin/sh " CTags map rt :!ctags --extra=+f -R * " Remember last location in file if has("autocmd") au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") \| exe "normal g'\"" | endif endif function s:setupWrapping() set wrap set wm=2 set textwidth=72 endfunction function s:setupMarkup() call s:setupWrapping() map p :Mm endfunction " make and python use real tabs au FileType make set noexpandtab au FileType python set noexpandtab " Thorfile, Rakefile and Gemfile are Ruby au BufRead,BufNewFile {Gemfile,Rakefile,Thorfile,config.ru} set ft=ruby " md, markdown, and mk are markdown and define buffer-local preview au BufRead,BufNewFile *.{md,markdown,mdown,mkd,mkdn} call s:setupMarkup() au BufRead,BufNewFile *.txt call s:setupWrapping() " allow backspacing over everything in insert mode set backspace=indent,eol,start " Window manipulation "map tt map :wincmd h map :wincmd l map :wincmd H map :wincmd L " Opens an edit command with the path of the currently edited file filled in " Normal mode: e map e :e =expand("%:p:h") . "/" " Colemak " " * Switch 'h' and 'n' (so 'up' is on top of 'down'). " * Use and for and , instead (and disable 'j' " and 'l' which are where 'y' and 'u' are in in QWERTY) "nmap h "nmap k " Nicer split controls map :split map :vsplit " Emacs-like keys for the command line cnoremap cnoremap cnoremap set wildignore+=Transmission*Remote*GUI let g:ragtag_global_maps = 1 "Directories for swp files set backupdir=~/.vim/backup set directory=~/.vim/backup " better way to run this? let ignorethisvar = system("mkdir -p ~/.vim/backup") " Align cucumber tables inoremap :call align()a function! s:align() let p = '^\s*|\s.*\s|\s*$' if exists(':Tabularize') && getline('.') =~# '^\s*|' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p) let column = strlen(substitute(getline('.')[0:col('.')],'[^|]','','g')) let position = strlen(matchstr(getline('.')[0:col('.')],'.*|\s*\zs.*')) Tabularize/|/l1 normal! 0 call search(repeat('[^|]*|',column).'\s\{-\}'.repeat('.',position),'ce',line('.')) endif endfunction " Prevents 'DiscretionaryEnd' being inserted when pressing in " insert mode on new files. Blame SuperTab let g:SuperTabCrMapping = 0 let g:SuperTabDefaultCompletionType = "context" " vim wiki let g:vimwiki_hl_cb_checked = 1 let g:vimwiki_menu = 'Plugin.Vimwiki' let g:vimwiki_badsyms = ' ' let g:vimwiki_use_mouse = 1 let g:vimwiki_dir_link = 'index' let g:vimwiki_list = [ \ { \ 'path': '~/Dropbox/Wiki/Text', \ 'path_html': '~/Dropbox/Wiki/HTML', \ 'nested_syntaxes': { \ 'ruby': 'ruby' \ } \ } \] " Disable arrow keys nnoremap nnoremap nnoremap nnoremap inoremap inoremap inoremap inoremap if filereadable(expand('~/.vimrc.local')) source ~/.vimrc.local endif