" General {{{ " use indentation for folds set foldmethod=indent set foldnestmax=5 set foldlevelstart=99 set foldcolumn=0 " Sets how many lines of history VIM has to remember set history=700 " Set to auto read when a file is changed from the outside set autoread " With a map leader it's possible to do extra key combinations " like w saves the current file let mapleader = "," let g:mapleader = "," " Leader key timeout set tm=2000 " Allow the normal use of "," by pressing it twice noremap ,, , " Use par for prettier line formatting set formatprg="PARINIT='rTbgqR B=.,?_A_a Q=_s>|' par\ -w72" " Use stylish haskell instead of par for haskell buffers autocmd FileType haskell let &formatprg="stylish-haskell" " Find custom built ghc-mod, codex etc let $PATH = $PATH . ':' . expand("~/.haskell-vim-now/bin") " Kill the damned Ex mode. nnoremap Q " }}} " Vundle {{{ set nocompatible filetype off set rtp+=~/.vim/bundle/Vundle.vim call vundle#rc() " let Vundle manage Vundle " required! Bundle 'gmarik/vundle' " Support bundles Bundle 'jgdavey/tslime.vim' Bundle 'Shougo/vimproc.vim' Bundle 'ervandew/supertab' Bundle 'scrooloose/syntastic' Bundle 'moll/vim-bbye' Bundle 'nathanaelkane/vim-indent-guides' Bundle 'vim-scripts/gitignore' " Git Bundle 'tpope/vim-fugitive' Bundle 'int3/vim-extradite' " Bars, panels, and files Bundle 'scrooloose/nerdtree' Bundle 'bling/vim-airline' Bundle 'kien/ctrlp.vim' Bundle 'majutsushi/tagbar' " Text manipulation Bundle 'vim-scripts/Align' Bundle 'vim-scripts/Gundo' Bundle 'tpope/vim-commentary' Bundle 'godlygeek/tabular' Bundle 'michaeljsmith/vim-indent-object' " Allow pane movement to jump out of vim into tmux Bundle 'christoomey/vim-tmux-navigator' " Haskell Bundle 'raichoo/haskell-vim' " Bundle 'enomsg/vim-haskellConcealPlus' " Bundle 'eagletmt/ghcmod-vim' Bundle 'eagletmt/neco-ghc' Bundle 'Twinside/vim-hoogle' " Other programming languages Bundle 'digitaltoad/vim-jade' Bundle 'zepto-lang/zepto-vim' Bundle 'hellerve/carp-vim' Bundle 'hellerve/luna-vim' Bundle 'tikhomirov/vim-glsl' Plugin 'rust-lang/rust.vim' Plugin 'kchmck/vim-coffee-script' Plugin 'isRuslan/vim-es6' " Custom bundles if filereadable(expand("~/.vim.local/bundles.vim")) source ~/.vim.local/bundles.vim endif " }}} " VIM user interface {{{ " Set 7 lines to the cursor - when moving vertically using j/k set so=7 " Turn on the WiLd menu set wildmenu " Tab-complete files up to longest unambiguous prefix set wildmode=list:longest,full " Always show current position set ruler " Show trailing whitespace set list " But only interesting whitespace if &listchars ==# 'eol:$' set listchars=tab:>\ ,trail:-,extends:>,precedes:<,nbsp:+ endif " Height of the command bar set cmdheight=1 " Configure backspace so it acts as it should act set backspace=eol,start,indent set whichwrap+=<,>,h,l " Ignore case when searching set ignorecase " When searching try to be smart about cases set smartcase " Highlight search results set hlsearch " Makes search act like search in modern browsers set incsearch " Don't redraw while executing macros (good performance config) set lazyredraw " For regular expressions turn magic on set magic " Show matching brackets when text indicator is over them set showmatch " How many tenths of a second to blink when matching brackets set mat=2 " No annoying sound on errors set noerrorbells set vb t_vb= if &term =~ '256color' " disable Background Color Erase (BCE) so that color schemes " render properly when inside 256-color tmux and GNU screen. " see also http://snk.tuxfamily.org/log/vim-256color-bce.html set t_ut= endif " Force redraw map r :redraw! " Turn mouse mode on nnoremap ma :set mouse=a " Turn mouse mode off nnoremap mo :set mouse= " Default to mouse mode on set mouse=a " }}} " Colors and Fonts {{{ Bundle 'vim-scripts/wombat256.vim' try colorscheme desert catch endtry " Enable syntax highlighting syntax enable " Adjust signscolumn and syntastic to match wombat hi! link SignColumn LineNr hi! link SyntasticErrorSign ErrorMsg hi! link SyntasticWarningSign WarningMsg " Use pleasant but very visible search hilighting hi Search ctermfg=white ctermbg=173 cterm=none guifg=#ffffff guibg=#e5786d gui=none hi! link Visual Search " Enable filetype plugins filetype plugin on filetype indent on " Match wombat colors in nerd tree hi Directory guifg=#8ac6f2 " Searing red very visible cursor hi Cursor guibg=red " Use same color behind concealed unicode characters hi clear Conceal " Set paste mode and use system clipboard set paste set clipboard=unnamed " Don't blink normal mode cursor set guicursor=n-v-c:block-Cursor set guicursor+=n-v-c:blinkon0 " Set extra options when running in GUI mode if has("gui_running") set guioptions-=T set guioptions-=e set guitablabel=%M\ %t endif set t_Co=256 " Set utf8 as standard encoding and en_US as the standard language set encoding=utf8 " Use Unix as the standard file type set ffs=unix,dos,mac " Use large font by default in MacVim set gfn=Monaco:h19 " }}} " Files, backups and undo {{{ " Turn backup off, since most stuff is in Git anyway... set nobackup set nowb set noswapfile " Source the vimrc file after saving it augroup sourcing autocmd! autocmd bufwritepost .vimrc source $MYVIMRC augroup END " Map Ctrl-S to save noremap :update vnoremap :update inoremap :update " Open file prompt with current path nmap e :e =expand("%:p:h") . '/' " Show undo tree nmap u :GundoToggle " Fuzzy find files nnoremap :CtrlP let g:ctrlp_max_files=0 let g:ctrlp_show_hidden=1 let g:ctrlp_custom_ignore = { 'dir': '\v[\/](.git)$' } " }}} " Text, tab and indent related {{{ " Use spaces instead of tabs set expandtab " Be smart when using tabs ;) set smarttab " 1 tab == 2 spaces set shiftwidth=2 set tabstop=2 " Linebreak on 500 characters set lbr set tw=500 set ai "Auto indent set si "Smart indent set wrap "Wrap lines " Pretty unicode haskell symbols let g:haskell_conceal_wide = 1 let g:haskell_conceal_enumerations = 1 " }}} " Visual mode related {{{ " Visual mode pressing * or # searches for the current selection " Super useful! From an idea by Michael Naumann vnoremap * :call VisualSelection('f', '') vnoremap # :call VisualSelection('b', '') " }}} " Moving around, tabs, windows and buffers {{{ " Treat long lines as break lines (useful when moving around in them) nnoremap j gj nnoremap k gk noremap h noremap k noremap j noremap l " Disable highlight when is pressed " but preserve cursor coloring nmap :noh\|hi Cursor guibg=red augroup haskell autocmd! autocmd FileType haskell map :noh:GhcModTypeClear:SyntasticReset autocmd FileType haskell setlocal omnifunc=necoghc#omnifunc augroup END " Return to last edit position when opening files (You want this!) augroup last_edit autocmd! autocmd BufReadPost * \ if line("'\"") > 0 && line("'\"") <= line("$") | \ exe "normal! g`\"" | \ endif augroup END " Remember info about open buffers on close set viminfo^=% " Open window splits in various places nmap sh :leftabove vnew nmap sl :rightbelow vnew nmap sk :leftabove new nmap sj :rightbelow new " Manually create key mappings (to avoid rebinding C-\) let g:tmux_navigator_no_mappings = 1 nnoremap :TmuxNavigateLeft nnoremap :TmuxNavigateDown nnoremap :TmuxNavigateUp nnoremap :TmuxNavigateRight " don't close buffers when you aren't displaying them set hidden " previous buffer, next buffer nnoremap bp :bp nnoremap bn :bn " delete buffer without closing pane noremap bd :Bd " fuzzy find buffers noremap b :CtrlPBuffer " }}} " Status line {{{ " Always show the status line set laststatus=2 " }}} " Editing mappings {{{ " Delete trailing white space on save func! DeleteTrailingWS() exe "normal mz" %s/\s\+$//ge exe "normal `z" endfunc augroup whitespace autocmd! autocmd BufWrite *.hs :call DeleteTrailingWS() augroup END " }}} " Spell checking {{{ " Pressing ,ss will toggle and untoggle spell checking map ss :setlocal spell! " }}} " Helper functions {{{ function! CmdLine(str) exe "menu Foo.Bar :" . a:str emenu Foo.Bar unmenu Foo endfunction function! VisualSelection(direction, extra_filter) range let l:saved_reg = @" execute "normal! vgvy" let l:pattern = escape(@", '\\/.*$^~[]') let l:pattern = substitute(l:pattern, "\n$", "", "") if a:direction == 'b' execute "normal ?" . l:pattern . "^M" elseif a:direction == 'gv' call CmdLine("vimgrep " . '/'. l:pattern . '/' . ' **/*.' . a:extra_filter) elseif a:direction == 'replace' call CmdLine("%s" . '/'. l:pattern . '/') elseif a:direction == 'f' execute "normal /" . l:pattern . "^M" endif let @/ = l:pattern let @" = l:saved_reg endfunction " }}} " Slime {{{ vmap rs SendSelectionToTmux nmap rs NormalModeSendToTmux nmap rv SetTmuxVars " }}} " NERDTree {{{ " Close nerdtree after a file is selected let NERDTreeQuitOnOpen = 1 function! IsNERDTreeOpen() return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1) endfunction function! ToggleFindNerd() if IsNERDTreeOpen() exec ':NERDTreeToggle' else exec ':NERDTreeFind' endif endfunction " If nerd tree is closed, find current file, if open, close it nmap f :call ToggleFindNerd() nmap F :NERDTreeToggle " }}} " Alignment {{{ " Stop Align plugin from forcing its mappings on us let g:loaded_AlignMapsPlugin=1 " Align on equal signs map a= :Align = " Align on commas map a, :Align , " Align on pipes map a :Align " Prompt for align character map ap :Align " Enable some tabular presets for Haskell let g:haskell_tabular = 1 " }}} " Tags {{{ set tags=tags;/,codex.tags;/ let g:tagbar_type_haskell = { \ 'ctagsbin' : 'hasktags', \ 'ctagsargs' : '-x -c -o-', \ 'kinds' : [ \ 'm:modules:0:1', \ 'd:data: 0:1', \ 'd_gadt: data gadt:0:1', \ 't:type names:0:1', \ 'nt:new types:0:1', \ 'c:classes:0:1', \ 'cons:constructors:1:1', \ 'c_gadt:constructor gadt:1:1', \ 'c_a:constructor accessors:1:1', \ 'ft:function types:1:1', \ 'fi:function implementations:0:1', \ 'o:others:0:1' \ ], \ 'sro' : '.', \ 'kind2scope' : { \ 'm' : 'module', \ 'c' : 'class', \ 'd' : 'data', \ 't' : 'type' \ }, \ 'scope2kind' : { \ 'module' : 'm', \ 'class' : 'c', \ 'data' : 'd', \ 'type' : 't' \ } \ } " Generate haskell tags with codex and hscope map tg :!codex update --force:call system("git hscope -X TemplateHaskell"):call LoadHscope() map tt :TagbarToggle set csprg=~/.haskell-vim-now/bin/hscope set csto=1 " search codex tags first set cst set csverb nnoremap :cs find c =expand("") " Automatically make cscope connections function! LoadHscope() let db = findfile("hscope.out", ".;") if (!empty(db)) let path = strpart(db, 0, match(db, "/hscope.out$")) set nocscopeverbose " suppress 'duplicate connection' error exe "cs add " . db . " " . path set cscopeverbose endif endfunction au BufEnter /*.hs call LoadHscope() " }}} " Git {{{ let g:extradite_width = 60 " Hide messy Ggrep output and copen automatically function! NonintrusiveGitGrep(term) execute "copen" " Map 't' to open selected item in new tab execute "nnoremap t T" execute "silent! Ggrep " . a:term execute "redraw!" endfunction command! -nargs=1 GGrep call NonintrusiveGitGrep() nmap gs :Gstatus nmap gg :copen:GGrep nmap gl :Extradite! nmap gd :Gdiff nmap gb :Gblame function! CommittedFiles() " Clear quickfix list let qf_list = [] " Find files committed in HEAD let git_output = system("git diff-tree --no-commit-id --name-only -r HEAD\n") for committed_file in split(git_output, "\n") let qf_item = {'filename': committed_file} call add(qf_list, qf_item) endfor " Fill quickfix list with them call setqflist(qf_list, '') endfunction " Show list of last-committed files nnoremap g? :call CommittedFiles():copen " }}} " Haskell Interrogation {{{ set completeopt+=longest " Use buffer words as default tab completion let g:SuperTabDefaultCompletionType = '' " But provide (neco-ghc) omnicompletion if has("gui_running") imap =SuperTabAlternateCompletion("\c-x>\c-o>") else " no gui if has("unix") inoremap =SuperTabAlternateCompletion("\c-x>\c-o>") endif endif " Show types in completion suggestions let g:necoghc_enable_detailed_browse = 1 " Type of expression under cursor nmap ht :GhcModType " Insert type of expression under cursor nmap hT :GhcModTypeInsert " GHC errors and warnings nmap hc :SyntasticCheck ghc_mod " Haskell Lint let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['haskell'] } nmap hl :SyntasticCheck hlint " Hoogle the word under the cursor nnoremap hh :Hoogle " Hoogle and prompt for input nnoremap hH :Hoogle " Hoogle for detailed documentation (e.g. "Functor") nnoremap hi :HoogleInfo " Hoogle for detailed documentation and prompt for input nnoremap hI :HoogleInfo " Hoogle, close the Hoogle window nnoremap hz :HoogleClose " }}} " Conversion {{{ function! Pointfree() call setline('.', split(system('pointfree '.shellescape(join(getline(a:firstline, a:lastline), "\n"))), "\n")) endfunction vnoremap h. :call Pointfree() function! Pointful() call setline('.', split(system('pointful '.shellescape(join(getline(a:firstline, a:lastline), "\n"))), "\n")) endfunction vnoremap h> :call Pointful() " }}} " Customization {{{ if filereadable(expand("~/.vimrc.local")) source ~/.vimrc.local endif " }}} let g:syntastic_carp_checkers = ['carp']