" ___ _ _ _ " | _ ) __ _ _ _ __ _| |_( )___ __ _(_)_ __ _ _ __ " | _ \/ _` | '_/ _` | / //(_-< \ V / | ' \| '_/ _| " |___/\__,_|_| \__,_|_\_\ /__/ (_)_/|_|_|_|_|_| \__| " " " ** BASIC EDITOR SETTINGS ** " " First, we are vim, not vi, so start as many others do with set nocompatible " Allow background buffers. Super important for various tab modes. set hidden " Set default spacing. " Hard tabs should show as 8. set ts=8 " Soft tabs should be 2 wide, and we should use spaces. " (This is the Googler in me. I've converted to spaces over " the years because it really is more consistent.) set softtabstop=2 set shiftwidth=2 set expandtab " I like comma instead of slash, but that probably comes from playing " Nethack and Angband let mapleader = "," let maplocalleader = "\\" " Set 'smart' things in Vim " Search case insensitive, unless it contains Uppercase letters set smartcase " Use all the indent features set autoindent set smartindent set cindent " Make backspace remove indents and line breaks, like a normal editor set backspace=indent,eol,start " Keep a bigger history set history=1000 " Allow tab completion for files in command mode. set wildmenu set wildmode=list:longest " Show where you are in the file in the statusbar. set ruler " I hate split above, so make it split below. Likewise, to the right. set splitbelow " For autocomplete, show a menu, show it when there's only one option, " and only complete the longest common bit instead of the whole thing (like " bash). set completeopt=menu,menuone,longest " Some stuff for 256-Color consoles that I've forgotten. set t_Co=256 set t_Sf=ESC[3%dm set t_Sb=ESC[4%dm "set t_kb= " This is like HiglightTooLongLines below, but for modern vim. The problem is " that it highlights the column, even if your short. Good for measuring, bad for " my eyes. "if v:version >= 703 "set relativenumber "set colorcolumn=81 "endif " ** FILETYPE SETTINGS ** filetype off "let g:ft_ignore_pat = '.org' "filetype plugin indent on " If you prefer the Omni-Completion tip window to close when a selection is " made, these lines close it on movement in insert mode or when leaving " insert mode autocmd CursorMovedI * if pumvisible() == 0|pclose|endif autocmd InsertLeave * if pumvisible() == 0|pclose|endif set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'gmarik/Vundle.vim' Plugin 'conque_2.3' Plugin 'eclim' Plugin 'vim-scripts/DrawIt' Plugin 'tpope/vim-speeddating' Plugin 'vim-scripts/EasyGrep' Plugin 'chrisbra/NrrwRgn' Plugin 'hsitz/VimOrganizer' Plugin 'mileszs/ack.vim' Plugin 'mattn/calendar-vim' Plugin 'vim-scripts/fish-syntax' Plugin 'sjbach/lusty' Plugin 'scrooloose/nerdcommenter' Plugin 'scrooloose/nerdtree' Plugin 'rstacruz/sparkup' Plugin 'scrooloose/syntastic' Plugin 'kchmck/vim-coffee-script' Plugin 'tpope/vim-fugitive' Plugin 'airblade/vim-gitgutter' Plugin 'lunaru/vim-less' Plugin 'terryma/vim-multiple-cursors' Plugin 'rodjek/vim-puppet' Plugin 'tpope/vim-unimpaired' Plugin 'Valloric/YouCompleteMe' Plugin 'b4winckler/vim-angry' Plugin 'tristen/vim-sparkup' Plugin 'bling/vim-airline' Plugin 'kien/ctrlp.vim' Plugin 'Blackrush/vim-gocode' Plugin 'bling/vim-bufferline' Plugin 'majutsushi/tagbar' Plugin 'Raimondi/delimitMate' Plugin 'eagletmt/neco-ghc' Plugin 'eagletmt/ghcmod-vim' Plugin 'Shougo/vimproc.vim' Plugin 'SirVer/ultisnips' Bundle 'honza/vim-snippets' Plugin 'JuliaLang/julia-vim' Plugin 'tpope/vim-surround' "https://git.wincent.com/command-t.git call vundle#end() filetype plugin indent on " required " Sources "source ~/.vim/supertab.vim "source ~/.vim/charm.vim "source ~/.vim/plugin/AppleT.vim runtime macros/matchit.vim " Completion features (TODO: Add to filetype.vim) autocmd FileType ruby,eruby set omnifunc=rubycomplete#Complete autocmd FileType python set tags+=$HOME/.vim/tags/python.ctags "autocmd FileType python set omnifunc=pythoncomplete#Complete "autocmd FileType python call SuperTabSetCompletionType("") " Set filetype for VimOrganizer au! BufRead,BufWrite,BufWritePost,BufNewFile *.org au BufEnter *.org call org#SetOrgFileType() "au! BufRead,BufWrite,BufWritePost,BufNewFile *.org "au BufEnter *.org call org#SetOrgFileType() command! OrgCapture :call org#CaptureBuffer() command! OrgCaptureFile :call org#OpenCaptureFile() " Cull trailing whitespace for all files. autocmd BufWritePre * :call AutoTrimWhitespace() " Set syntax and highlighting syntax on " baraknew is my own colorscheme. I used to use slate or dante. colorscheme baraknew "colorscheme slate "colorscheme dante " Turn on the cursorline (highlight on line under cursor) but only for the " window and buffer you're currently in. A handy trick, I'm trying out as of " 2013-04-12 but the jury is still out. autocmd BufEnter * setlocal cursorline autocmd WinEnter * setlocal cursorline autocmd WinLeave * setlocal nocursorline setlocal cursorline " ** PLUGIN CONFIGURATION ** " * Vim general/Unknown let python_highlight_all = 1 let g:Tb_MaxSize=0 let g:Tb_MapCTabSwitchBufs = 1 let g:UseGooglePythonSettings = 0 " * Eclim let g:EclimCompletionMethod = 'omnifunc' " * Syntastic let g:syntastic_python_flake8_args='--ignore=E111' let g:syntastic_go_checkers=['go', 'govet', 'golintc'] " E111 = Spaces should be multiples of 4. I use 2. " * Configure browser for haskell_doc.vim let g:haddock_browser = "open" let g:haddock_browser_callformat = "%s %s" " * Lusty plugins let g:LustyExplorerSuppressRubyWarning = 1 let g:LustyJugglerSuppressRubyWarning = 1 let g:LustyJugglerShowKeys = 'a' " * Buftabs let g:buftabs_only_basename = 1 "let g:buftabs_in_statusline=1 " Bufferline let g:bufferline_echo = 0 let g:bufferline_modified = '+' let g:bufferline_show_bufnr = 1 let g:bufferline_rotate = 1 " * NERDTree let g:NERDChristmasTree = 1 let g:NERDChristmasTree = 1 let g:NERDTreeQuitOnOpen = 1 let g:NERDTreeWinPos = "right" let g:NERDTreeWinSize = 40 let g:NERDTreeDirArrows=0 " * Tagbar plugin settings let g:tagbar_width = 40 let g:tagbar_autofocus = 1 let g:tagbar_autoclose = 1 let g:tagbar_compact = 1 " * Taglist plugin settings (deprecated) let Tlist_GainFocus_On_ToggleOpen = 1 let Tlist_Use_Right_Window = 1 let Tlist_Inc_Winwidth = 0 let Tlist_File_Fold_Auto_Close = 1 let Tlist_WinWidth = 40 let Tlist_Show_One_File = 0 " * ConqueTerm let g:ConqueTerm_CWInsert = 1 let g:ConqueTerm_InsertOnEnter = 0 let g:ConqueTerm_SendVisKey = 'ss' " * YouCompleteMe let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py' let g:ycm_confirm_extra_conf = 0 let g:ycm_key_invoke_completion = "" let g:ycm_use_ultisnips_completer = 1 "let g:ycm_add_preview_to_completeopt = 1 "let g:ycm_autoclose_preview_window_after_completion = 1 " * UltiSnips let g:UltiSnipsSnippetDirectories=["UltiSnips", "usnips"] let g:UltiSnipsExpandTrigger="," let g:UltiSnipsJumpForwardTrigger="," let g:UltiSnipsJumpBackwardTrigger="" " * MinBufExplorer "let g:miniBufExplMapWindowNavVim = 1 "let g:miniBufExplMapWindowNavArrows = 1 "let g:miniBufExplMapCTabSwitchBufs = 1 "let g:miniBufExplModSelTarget = 1 "let g:miniBufExplForceSyntaxEnable = 1 " * CommandT let g:CommandTMaxFiles = 1000 let g:CommandTMaxDepth = 7 " * VimOrganizer " default Tag list. Will be changed in near future so " that these are defined by config lines in each .org " file itself, but now these are where you can change things: " let g:org_todo_setup='TODO | DONE' " while g:org_tag_setup is itself a string "let g:org_tag_setup='{@home(h) @work(w) @tennisclub(t)} \n {easy(e) hard(d)} \n {computer(c) phone(p)}' "au! BufRead,BufWrite,BufWritePost,BufNewFile *.org "au BufEnter *.org call org#SetOrgFileType() " * Airline set noshowmode let g:airline_enable_branch = 1 let g:airline_enable_syntastic = 1 let g:airline_enable_tagbar = 1 let g:airline_theme="murmur" let g:airline_left_sep = '' let g:airline_right_sep = '' let g:airline#extensions#syntastic#enabled = 1 let g:airline#extensions#hunks#non_zero_only = 1 let g:airline#extensions#whitespace#enabled = 0 let g:airline_mode_map = { \ '__' : '-', \ 'n' : 'N', \ 'i' : 'I', \ 'R' : 'R', \ 'c' : 'C', \ 'v' : 'V', \ 'V' : 'V', \ '' : 'V', \ 's' : 'S', \ 'S' : 'S', \ '' : 'S', \ } " * CtrlP let g:ctrlp_map = ',t' let g:ctrlp_cmd = 'CtrlP' let g:ctrlp_working_path_mode = 'ra' let g:ctrlp_match_window = 'bottom,order:ttb,min:1,max:15' " ** STATUSLINE ** " set laststatus=2 set statusline=%t "tail of the filename "set statusline+=[%{&ff}] "file format "set statusline+=%h "help file flag set statusline+=\ %w "help file flag set statusline+=%r "read only flag set statusline+=%y "filetype set statusline+=\ %m "modified flag set statusline+=%= "left/right separator set statusline+=%{fugitive#statusline()}\ \ set statusline+=%c, "cursor column set statusline+=%l/%L "cursor line/total lines set statusline+=\ %P "percent through file " ** SMALL FUNCTIONS THAT DON'T FIT AS PLUGINS *** " Add capital W so I can be lazy about my shift key if !exists(":W") command W :w endif " CD to the path of the file I'm editing. command Cdf :cd %:p:h " Save a vim session! Useful if you want to save buffer states and so on command SaveSession :mksession! ~/.vim_last_session command LoadSession :source ~/.vim_last_session " This is a quick way to edit a persistent scratch buffer for me... command ScratchOpen :e scp://barak@barakmich.com//home/barak/notes/scratch " Sudo-make-me-a-sandwich write. For when I forget to be root. command Wdammit :w !sudo tee > /dev/null % " I can never remember markdown fully. Open me a cheatsheet command MarkdownCheatsheet :rightb vsplit ~/.vim/markdown_cheatsheet.md " Doesn't quite work right but can be a real savior if needed. " Oh-shit-what-was-this-like-before-I-changed-it? function! s:DiffWithSaved() let filetype=&ft diffthis vnew | r # | normal! 1Gdd diffthis exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype endfunction com! DiffSaved call s:DiffWithSaved() " Highlight lines that are longer than textwidth for the filetype, commonly 80 " characters. function! HighlightTooLongLines() highlight def link RightMargin Error if &textwidth != 0 exec 'match RightMargin /\%<' . (&textwidth + 3) . 'v.\%>' . (&textwidth + 1) . 'v/' endif endfunction " Toggles the quickfix window split. command -bang -nargs=? QFix call QFixToggle(0) function! QFixToggle(forced) if exists("g:qfix_win") && a:forced == 0 cclose else execute "copen " . 15 endif endfunction " Make the Quickfix window respond well to commands (for instance, q to close, " Enter to select, etc). In tandem with the above. augroup QFixToggle autocmd! autocmd BufWinEnter quickfix let g:qfix_win = bufnr("$") autocmd BufWinEnter quickfix exec "nnoremap q :QFix" autocmd BufWinLeave * if exists("g:qfix_win") && expand("") == g:qfix_win | unlet! g:qfix_win | endif augroup END " Execute a command that pipes output to window. Captures output into a new, " appropriately titled, buffer. function! s:ExecuteInShellOutput(command) let command = join(map(split(a:command), 'expand(v:val)')) let winnr = bufwinnr('^' . command . '$') silent! execute winnr < 0 ? 'botright new ' . fnameescape(command) : winnr . 'wincmd w' setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile wrap number echo 'Executing ' . command . '...' silent! execute 'silent %!'. command " uncomment this if you want the new buffer to try to grow to accommodate the output "silent! execute 'resize ' . line('$') silent! redraw silent! execute 'au BufUnload execute bufwinnr(' . bufnr('#') . ') . ''wincmd w''' silent! execute 'nnoremap r :call ExecuteInShell(''' . command . ''')' echo 'Execution of ' . command . ' complete.' endfunction " Same as above, doesn't capture output function! s:ExecuteInShell(command) let command = join(map(split(a:command), 'expand(v:val)')) silent! execute 'silent !'. command redraw! echo 'Execution of ' . command . ' complete.' endfunction command! -complete=shellcmd -nargs=+ Shell call s:ExecuteInShellOutput() command! -complete=shellcmd -nargs=+ Exec call s:ExecuteInShell() command! -nargs=* Make call s:ExecuteInShellOutput('make '.) command! -nargs=* PTW call s:ExecuteInShell('ptw post --client=vim "'..'"') " Highlight all instances of word under cursor, when idle. " Useful when studying strange source code. " Type z/ to toggle highlighting on/off. nnoremap z/ :if AutoHighlightToggle()set hlselseset nohlsendif function! AutoHighlightToggle() let @/ = '' if exists('#auto_highlight') au! auto_highlight augroup! auto_highlight setl updatetime=4000 echo 'Highlight current word: off' return 0 else augroup auto_highlight au! au CursorHold * let @/ = '\V\<'.escape(expand(''), '\').'\>' augroup end setl updatetime=500 echo 'Highlight current word: ON' return 1 endif endfunction " Removes trailing spaces function AutoTrimWhitespace() if exists("b:auto_trim_whitespace") if b:auto_trim_whitespace == 1 let l:winview = winsaveview() silent! %s/\s\+$// call winrestview(l:winview) endif endif endfunction " ** KEY REMAPPINGS ** " " I used to use tabs, but then I took an arrow to the knee. " Tabs in vim suck because they aren't what you want. Use tabbar. "nnoremap gc :tabnew "nnoremap gK :tabclose "nnoremap gn gt "nnoremap gp gT " I don't know how I came up with gt for opening the tree, but it stuck. nmap gt :NERDTreeToggle " The same for the TagList, useful for large C files. "nmap gb :TlistToggle nmap gb :TagbarToggle "nnoremap gx :Kwbd " :Kwbd (defined below) really kills a buffer dead, and closes the window. " gK is similar. nnoremap gc :Kwbd "nnoremap gc :bdelete nnoremap gK :bdelete! " I use gn/gp to cycle through open tabs/buffers nnoremap gn :bn nnoremap gp :bp nnoremap gz :pclose " The single most handy way to get around a file. Cursor over a word, and then " type g* -- you'll go to the next instance of that word in the file. Make it " easier to reach by calling it gw (go-word) instead of hidden away. nnoremap gw g* " Make shift-p like p except, put the line above instead of below. nmap P op " Line-based movement is cute, but it's tricky for files with lines that wrap. " Attune more to what you see on the screen instead of where the lines actually " are. nnoremap j gj nnoremap k gk xnoremap j gj xnoremap k gk nnoremap gj nnoremap gk xnoremap gj xnoremap gk inoremap gj inoremap gk nnoremap " Years of using bash and zsh have caused my fingers to expect these Emacs-like " mappings to exist. Make them exist in vim as well. But eye them with " suspicion, as they come from Emacs. nnoremap ^ nnoremap $ xnoremap ^ xnoremap $ inoremap ^ inoremap $ " Dealing with split windows is a pain. Make it less of a pain, by making " Ctrl-direction appropriate. nnoremap j nnoremap k nnoremap l nnoremap h "nnoremap w "nnoremap W inoremap j inoremap k inoremap l inoremap h " Better fold mappings nnoremap @=(foldlevel('.')?'za':'l') vnoremap zf " Just to be handy, Ctrl-C acts like escape. So does jj, which never really " comes up in practice. If you really need to type jj do so slowly. imap inoremap jj " Leader key functions " See quickfix. nnoremap ff :QFix " See quickfix. nnoremap ss :SyntasticSetLoclist " Next quickfix. nnoremap fn :cnext " Prev quickfix. nnoremap fp :cprev " Ack (grep) for the word under the cursor. nnoremap aw :exe 'Ack ' . expand('') " Ack prompt. nnoremap ac :Ack " For C++ -- A is a great plugin which allows you to jump from the c file to the " header and vice-versa. Mneumonic here is headerheader. nnoremap hh :A " CommandT is useful, but if I'm juggling lots of buffers, limit it to another " one I have open (instead of standard t). nnoremap o :CtrlPBuffer "nnoremap j "nnoremap p :PTW nnoremap p :LustyJugglePrevious nnoremap jd :YcmCompleter GoToDefinitionElseDeclaration nnoremap ii :GhcModInfo! " ** EXTRA INCLUDES ** " let s:extrarc = expand($HOME . '/.vimrc_google') if filereadable(s:extrarc) exec ':so ' . s:extrarc endif " ** SEE ALSO ** " filetype.vim