OJ Reeves avatar OJ Reeves committed 6b8a37f

Initial commit of dotfiles

Comments (0)

Files changed (23)

+# bash completion for rebar
+
+_rebar()
+{
+    local cur prev sopts lopts cmdsnvars
+    COMPREPLY=()
+    cur="${COMP_WORDS[COMP_CWORD]}"
+    prev="${COMP_WORDS[COMP_CWORD-1]}"
+    sopts="-h -v -f -j"
+    lopts=" --help --verbose --force --jobs="
+    cmdsnvars="analyze build_plt check_plt clean compile \
+        create-app create-mod create-node \
+        eunit generate int_test perf_test test \
+        appid= case= force=1 jobs= modid= \
+        suite= verbose=1 appid="
+
+    if [[ ${cur} == --* ]] ; then
+        COMPREPLY=( $(compgen -W "${lopts}" -- ${cur}) )
+    elif [[ ${cur} == -* ]] ; then
+        COMPREPLY=( $(compgen -W "${sopts}" -- ${cur}) )
+    else
+        COMPREPLY=( $(compgen -W "${cmdsnvars}" -- ${cur}) )
+    fi
+
+    if [ -n "$COMPREPLY" ] ; then
+        # append space if matched
+        COMPREPLY="${COMPREPLY} "
+        # remove trailing space after equal sign
+        COMPREPLY=${COMPREPLY/%= /=}
+    fi
+    return 0
+}
+complete -o nospace -F _rebar rebar
+
+# Local variables:
+# mode: shell-script
+# sh-basic-offset: 4
+# sh-indent-comment: t
+# indent-tabs-mode: nil
+# End:
+# ex: ts=4 sw=4 et filetype=sh
+
+hg_ps3() {
+  hg prompt " {root|basename}{/{branch}}{ at {bookmark}}{status}" 2> /dev/null
+}
+
+hg_ps2() {
+  hg prompt " {branch}{ at {bookmark}}{status}" 2> /dev/null
+}
+
+hg_ps1() {
+    hg prompt "{hg: {branch}}{ {status}}" 2> /dev/null | sed -e "s/\(.*\)/\n\1/"
+}
+
+parse_git_dirty() {
+  [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*"
+}
+
+git_ps1() {
+  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ (git) \1$(parse_git_dirty)/"
+}
+
+# GIT_PS1_SHOWDIRTYSTATE=true
+
+if [ -f /home/oj/.git-completion.bash ]; then
+  . /home/oj/.git-completion.bash
+fi
+
+# export PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\]$(hg_ps2)$(__git_ps1)\n \w \$\[\033[00m\] '
+
+
+# if [ -d ~/bin ] ; then
+  # PATH=~/bin:"${PATH}"
+# fi
+
+function parse_git_dirty {
+  [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo " *"
+}
+function parse_git_branch {
+  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\ngit: \1$(parse_git_dirty)/"
+}
+
+export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w$(parse_git_branch)$(hg_ps1) \$\[\033[00m\] '
+
+alias untar='tar -xzf'
+[ui]
+username = OJ Reeves <oj@buffered.io>
+editor = vim
+merge = diffmerge
+
+[merge-tools]
+diffmerge.executable = /usr/bin/diffmerge
+diffmerge.binary = False
+diffmerge.args = --result=$output -t1="Local Version" -t2=$output -t3="Other Version" --caption=$output  $local $base $other
+diffmerge.symlinks = False
+diffmerge.gui = True
+diffmerge.premerge = True
+
+[extdiff]
+cmd.diffmerge = /usr/bin/diffmerge
+
+[defaults]
+addremove = -s 70
+#glog = -l10 --template 'changeset:   {rev}:{node|short} \032 {tags} \033 \032 {branches} \033\nauthor:      {author}\nsummary:     {desc|firstline|fill68|tabindent|tabindent}\n\n'
+glog = -l10 --style /home/oj/.hg-map-cmdline.sglog
+log = -l5 --style /home/oj/.hg-map-cmdline.nlog
+
+[extensions]
+hgext.extdiff =
+hgext.patchbomb =
+hgext.convert =
+hgext.bookmarks =
+hgext.mq =
+hgext.graphlog =
+hgext.purge =
+hgext.rebase =
+prompt = /home/oj/code/hg-prompt/prompt.py
+
+[diff]
+git=1
+
+[alias]
+qstatus = status --rev -2:.
+bpush = push --rev 
+dm = diffmerge
+. = glog -l10 --style /home/oj/.hg-map-cmdline.sglog
+bu = update -C
+s = status
+
+colorscheme digerati
+
+set ts=2
+set sw=2
+set expandtab
+set guioptions-=m
+set guioptions-=T
+set scrolloff=5
+set number
+set formatoptions=l
+set smarttab
+set wildmenu
+set wildmode=list:longest,full
+set foldmethod=syntax
+set foldlevel=99
+set lbr
+set showmatch
+set hlsearch
+set incsearch
+set ruler
+set lines=40 columns=90
+set wmh=0
+
+" spelling stuff
+map <F6> <Esc>:setlocal spell spelllang=en_au<CR>
+map <F7> <Esc>:setlocal nospell<CR>
+highlight clear SpellBad
+highlight SpellBad term=standout ctermfg=1 term=underline cterm=underline
+highlight clear SpellCap
+highlight SpellCap term=underline cterm=underline
+highlight clear SpellRare
+highlight SpellRare term=underline cterm=underline
+highlight clear SpellLocal
+highlight SpellLocal term=underline cterm=underline
+
+" don't show these files
+set wildignore=.svn,.git,.hg,*.o,*.a,*.class,*.mo,*.la,*.so,*.obj,*.swp,*~,*.*~
+
+" switch buffers without writing to disk
+set hidden
+
+" pattern matching
+set ignorecase
+set smartcase
+
+" terminal title
+set title
+
+" Intuitive backspacing in insert mode
+set backspace=indent,eol,start
+
+" longer history
+set history=1000
+
+" extended matching for %
+runtime macros/matchit.vim
+
+" remap the leader
+let mapleader=","
+
+syntax on
+filetype on
+filetype plugin on
+filetype indent on
+
+" get rid of annoying prompts
+set shortmess=atI
+
+" use [RO] for [readonly] to save space
+set shortmess+=r
+
+" use confirm instead of aborting the action
+set confirm
+
+" movement between window splits
+:nmap <silent> <A-k> :wincmd k<CR>
+:nmap <silent> <A-j> :wincmd j<CR>
+:nmap <silent> <A-h> :wincmd h<CR>
+:nmap <silent> <A-l> :wincmd l<CR>
+
+" search/replace word under cursor
+nnoremap <C-S> :,$s/\<<C-R><C-W>\>/
+"
+" turn off that fucking bell
+set noerrorbells
+
+" hide the mouse while doing stuff
+set mousehide
+
+" simple hex editing
+:map <Leader>hon :%!xxd<CR>
+:map <Leader>hoff :%!xxd -r<CR>
+
+" make escape ditch the highlight as well
+":nnoremap <esc> <esc>:nohl<return><esc>
+
+" set the working dir to the dir of the current file
+"set autochdir
+
+" shortcut for changing syntax
+:command! -nargs=1 -complete=option Syn set ft=<args>
+
+" buffer navigation
+:nmap <C-S-tab> :bprev<CR>
+:nmap <C-tab> :bnext<CR>
+:map <C-S-tab> :bprev<CR>
+:map <C-tab> :bnext<CR>
+:imap <C-S-tab> <ESC>:bprev<CR>i
+:imap <C-tab> <ESC>:bnext<CR>i
+
+" nerdtree stuff
+:map <F2> :NERDTreeToggle<CR>
+
+" haskell related stuff
+au Bufenter *.hs compiler ghc
+let g:haddock_browser = "/usr/bin/google-chrome"

vim/.vim/.VimballRecord

+haskellmode-20090430.vba: call delete('/home/oj/.vim/compiler/ghc.vim')|call delete('/home/oj/.vim/ftplugin/haskell.vim')|call delete('/home/oj/.vim/ftplugin/haskell_doc.vim')|call delete('/home/oj/.vim/ftplugin/haskell_hpaste.vim')|call delete('/home/oj/.vim/autoload/haskellmode.vim')|call delete('/home/oj/.vim/doc/haskellmode.txt')

vim/.vim/.netrwhist

+let g:netrw_dirhistmax  =10
+let g:netrw_dirhist_cnt =1
+let g:netrw_dirhist_1='/home/oj/blog/riak'

vim/.vim/autoload/haskellmode.vim

+"
+" utility functions for haskellmode plugins
+"
+" (Claus Reinke; last modified: 23/04/2009)
+" 
+" part of haskell plugins: http://projects.haskell.org/haskellmode-vim
+" please send patches to <claus.reinke@talk21.com>
+
+
+
+" find start/extent of name/symbol under cursor;
+" return start, symbolic flag, qualifier, unqualified id
+" (this is used in both haskell_doc.vim and in GHC.vim)
+function! haskellmode#GetNameSymbol(line,col,off)
+  let name    = "[a-zA-Z0-9_']"
+  let symbol  = "[-!#$%&\*\+/<=>\?@\\^|~:.]"
+  "let [line]  = getbufline(a:buf,a:lnum)
+  let line    = a:line
+
+  " find the beginning of unqualified id or qualified id component 
+  let start   = (a:col - 1) + a:off
+  if line[start] =~ name
+    let pattern = name
+  elseif line[start] =~ symbol
+    let pattern = symbol
+  else
+    return []
+  endif
+  while start > 0 && line[start - 1] =~ pattern
+    let start -= 1
+  endwhile
+  let id    = matchstr(line[start :],pattern.'*')
+  " call confirm(id)
+
+  " expand id to left and right, to get full id
+  let idPos = id[0] == '.' ? start+2 : start+1
+  let posA  = match(line,'\<\(\([A-Z]'.name.'*\.\)\+\)\%'.idPos.'c')
+  let start = posA>-1 ? posA+1 : idPos
+  let posB  = matchend(line,'\%'.idPos.'c\(\([A-Z]'.name.'*\.\)*\)\('.name.'\+\|'.symbol.'\+\)')
+  let end   = posB>-1 ? posB : idPos
+
+  " special case: symbolic ids starting with .
+  if id[0]=='.' && posA==-1 
+    let start = idPos-1
+    let end   = posB==-1 ? start : end
+  endif
+
+  " classify full id and split into qualifier and unqualified id
+  let fullid   = line[ (start>1 ? start-1 : 0) : (end-1) ]
+  let symbolic = fullid[-1:-1] =~ symbol  " might also be incomplete qualified id ending in .
+  let qualPos  = matchend(fullid, '\([A-Z]'.name.'*\.\)\+')
+  let qualifier = qualPos>-1 ? fullid[ 0 : (qualPos-2) ] : ''
+  let unqualId  = qualPos>-1 ? fullid[ qualPos : -1 ] : fullid
+  " call confirm(start.'/'.end.'['.symbolic.']:'.qualifier.' '.unqualId)
+
+  return [start,symbolic,qualifier,unqualId]
+endfunction
+
+function! haskellmode#GatherImports()
+  let imports={0:{},1:{}}
+  let i=1
+  while i<=line('$')
+    let res = haskellmode#GatherImport(i)
+    if !empty(res)
+      let [i,import] = res
+      let prefixPat = '^import\s*\(qualified\)\?\s\+'
+      let modulePat = '\([A-Z][a-zA-Z0-9_''.]*\)'
+      let asPat     = '\(\s\+as\s\+'.modulePat.'\)\?'
+      let hidingPat = '\(\s\+hiding\s*\((.*)\)\)\?'
+      let listPat   = '\(\s*\((.*)\)\)\?'
+      let importPat = prefixPat.modulePat.asPat.hidingPat.listPat ".'\s*$'
+
+      let ml = matchlist(import,importPat)
+      if ml!=[]
+        let [_,qualified,module,_,as,_,hiding,_,explicit;x] = ml
+        let what = as=='' ? module : as
+        let hidings   = split(hiding[1:-2],',')
+        let explicits = split(explicit[1:-2],',')
+        let empty = {'lines':[],'hiding':hidings,'explicit':[],'modules':[]}
+        let entry = has_key(imports[1],what) ? imports[1][what] : deepcopy(empty)
+        let imports[1][what] = haskellmode#MergeImport(deepcopy(entry),i,hidings,explicits,module)
+        if !(qualified=='qualified')
+          let imports[0][what] = haskellmode#MergeImport(deepcopy(entry),i,hidings,explicits,module)
+        endif
+      else
+        echoerr "haskellmode#GatherImports doesn't understand: ".import
+      endif
+    endif
+    let i+=1
+  endwhile
+  if !has_key(imports[1],'Prelude') 
+    let imports[0]['Prelude'] = {'lines':[],'hiding':[],'explicit':[],'modules':[]}
+    let imports[1]['Prelude'] = {'lines':[],'hiding':[],'explicit':[],'modules':[]}
+  endif
+  return imports
+endfunction
+
+function! haskellmode#ListElem(list,elem)
+  for e in a:list | if e==a:elem | return 1 | endif | endfor
+  return 0
+endfunction
+
+function! haskellmode#ListIntersect(list1,list2)
+  let l = []
+  for e in a:list1 | if index(a:list2,e)!=-1 | let l += [e] | endif | endfor
+  return l
+endfunction
+
+function! haskellmode#ListUnion(list1,list2)
+  let l = []
+  for e in a:list2 | if index(a:list1,e)==-1 | let l += [e] | endif | endfor
+  return a:list1 + l
+endfunction
+
+function! haskellmode#ListWithout(list1,list2)
+  let l = []
+  for e in a:list1 | if index(a:list2,e)==-1 | let l += [e] | endif | endfor
+  return l
+endfunction
+
+function! haskellmode#MergeImport(entry,line,hiding,explicit,module)
+  let lines    = a:entry['lines'] + [ a:line ]
+  let hiding   = a:explicit==[] ? haskellmode#ListIntersect(a:entry['hiding'], a:hiding) 
+                              \ : haskellmode#ListWithout(a:entry['hiding'],a:explicit)
+  let explicit = haskellmode#ListUnion(a:entry['explicit'], a:explicit)
+  let modules  = haskellmode#ListUnion(a:entry['modules'], [ a:module ])
+  return {'lines':lines,'hiding':hiding,'explicit':explicit,'modules':modules}
+endfunction
+
+" collect lines belonging to a single import statement;
+" return number of last line and collected import statement
+" (assume opening parenthesis, if any, is on the first line)
+function! haskellmode#GatherImport(lineno)
+  let lineno = a:lineno
+  let import = getline(lineno)
+  if !(import=~'^import\s') | return [] | endif
+  let open  = strlen(substitute(import,'[^(]','','g'))
+  let close = strlen(substitute(import,'[^)]','','g'))
+  while open!=close
+    let lineno += 1
+    let linecont = getline(lineno)
+    let open  += strlen(substitute(linecont,'[^(]','','g'))
+    let close += strlen(substitute(linecont,'[^)]','','g'))
+    let import .= linecont
+  endwhile
+  return [lineno,import]
+endfunction
+
+function! haskellmode#UrlEncode(string)
+  let pat  = '\([^[:alnum:]]\)'
+  let code = '\=printf("%%%02X",char2nr(submatch(1)))'
+  let url  = substitute(a:string,pat,code,'g')
+  return url
+endfunction
+

vim/.vim/colors/digerati.vim

+" Maintainer:	Henrique C. Alves (hcarvalhoalves@gmail.com)
+" Version:      1.0
+" Last Change:  October 05 2008
+
+set background=dark
+
+hi clear
+
+if exists("syntax_on")
+    syntax reset
+endif
+
+let colors_name = "digerati"
+
+" Vim >= 7.0 specific colors
+if version >= 700
+  hi CursorLine guibg=#4f4f4f
+  hi CursorColumn guibg=#2d2d2d
+  hi MatchParen guifg=#ffffff guibg=#4f4f4f gui=bold
+  hi Pmenu 		guifg=#404040 guibg=#dcdcdc
+  hi PmenuSel 	guifg=#ffffff guibg=#93b5bf
+endif
+
+" General colors
+hi Cursor 		guifg=NONE    guibg=#909090 gui=none
+hi Normal 		guifg=#f0f0f0 guibg=#444444 gui=none
+hi NonText 		guifg=#a0a0a0 guibg=#303030 gui=none
+hi LineNr 		guifg=#a0a0a0 guibg=#303030 gui=none
+hi StatusLine 	guifg=#444444 guibg=#e0e0e0 gui=italic
+hi StatusLineNC guifg=#303030 guibg=#606060 gui=none
+hi VertSplit 	guifg=#444444 guibg=#444444 gui=none
+hi Folded 		guibg=#384048 guifg=#a0a8b0 gui=none
+hi Title		guifg=#ffffff guibg=NONE	gui=bold
+hi Visual		guifg=#ffffff guibg=#b8b89f gui=none
+hi SpecialKey	guifg=#808080 guibg=#343434 gui=none
+
+" Syntax highlighting
+hi Comment 		guifg=#808080 gui=italic
+hi Todo 		guifg=#8f8f8f gui=italic
+hi Boolean      guifg=#cdff00 gui=none
+hi String 		guifg=#cdff00 gui=italic
+hi Identifier 	guifg=#cdff00 gui=none
+hi Function 	guifg=#ffffff gui=bold
+hi Type 		guifg=#77b4c7 gui=none
+hi Statement 	guifg=#77b4c7 gui=none
+hi Keyword		guifg=#ff3b77 gui=none
+hi Constant 	guifg=#ff3b77 gui=none
+hi Number		guifg=#ff3b77 gui=none
+hi Special		guifg=#ff3b77 gui=none
+hi PreProc 		guifg=#b8b89f gui=none
+hi Todo         guifg=NONE guibg=#ff3b77 gui=italic
+
+" Code-specific colors
+hi pythonOperator guifg=#77b4c7 gui=none
+hi htmlEndTag guifg=#ffffff gui=none 
+hi htmlLink guifg=#ff3b77 gui=underline

vim/.vim/compiler/ghc.vim

+
+" Vim Compiler File
+" Compiler:	GHC
+" Maintainer:	Claus Reinke <claus.reinke@talk21.com>
+" Last Change:	30/04/2009
+"
+" part of haskell plugins: http://projects.haskell.org/haskellmode-vim
+
+" ------------------------------ paths & quickfix settings first
+"
+
+if exists("current_compiler") && current_compiler == "ghc"
+  finish
+endif
+let current_compiler = "ghc"
+
+let s:scriptname = "ghc.vim"
+
+if (!exists("g:ghc") || !executable(g:ghc)) 
+  if !executable('ghc') 
+    echoerr s:scriptname.": can't find ghc. please set g:ghc, or extend $PATH"
+    finish
+  else
+    let g:ghc = 'ghc'
+  endif
+endif    
+let ghc_version = substitute(system(g:ghc . ' --numeric-version'),'\n','','')
+if (!exists("b:ghc_staticoptions"))
+  let b:ghc_staticoptions = ''
+endif
+
+" set makeprg (for quickfix mode) 
+execute 'setlocal makeprg=' . g:ghc . '\ ' . escape(b:ghc_staticoptions,' ') .'\ -e\ :q\ %'
+"execute 'setlocal makeprg=' . g:ghc .'\ -e\ :q\ %'
+"execute 'setlocal makeprg=' . g:ghc .'\ --make\ %'
+
+" quickfix mode: 
+" fetch file/line-info from error message
+" TODO: how to distinguish multiline errors from warnings?
+"       (both have the same header, and errors have no common id-tag)
+"       how to get rid of first empty message in result list?
+setlocal errorformat=
+                    \%-Z\ %#,
+                    \%W%f:%l:%c:\ Warning:\ %m,
+                    \%E%f:%l:%c:\ %m,
+                    \%E%>%f:%l:%c:,
+                    \%+C\ \ %#%m,
+                    \%W%>%f:%l:%c:,
+                    \%+C\ \ %#%tarning:\ %m,
+
+" oh, wouldn't you guess it - ghc reports (partially) to stderr..
+setlocal shellpipe=2>
+
+" ------------------------- but ghc can do a lot more for us..
+"
+
+" allow map leader override
+if !exists("maplocalleader")
+  let maplocalleader='_'
+endif
+
+" initialize map of identifiers to their types
+" associate type map updates to changedtick
+if !exists("b:ghc_types")
+  let b:ghc_types = {}
+  let b:my_changedtick = b:changedtick
+endif
+
+if exists("g:haskell_functions")
+  finish
+endif
+let g:haskell_functions = "ghc"
+
+" avoid hit-enter prompts
+set cmdheight=3
+
+" edit static GHC options
+" TODO: add completion for options/packages?
+command! GHCStaticOptions call GHC_StaticOptions()
+function! GHC_StaticOptions()
+  let b:ghc_staticoptions = input('GHC static options: ',b:ghc_staticoptions)
+  execute 'setlocal makeprg=' . g:ghc . '\ ' . escape(b:ghc_staticoptions,' ') .'\ -e\ :q\ %'
+  let b:my_changedtick -=1
+endfunction
+
+map <LocalLeader>T :call GHC_ShowType(1)<cr>
+map <LocalLeader>t :call GHC_ShowType(0)<cr>
+function! GHC_ShowType(addTypeDecl)
+  let namsym   = haskellmode#GetNameSymbol(getline('.'),col('.'),0)
+  if namsym==[]
+    redraw
+    echo 'no name/symbol under cursor!'
+    return 0
+  endif
+  let [_,symb,qual,unqual] = namsym
+  let name  = qual=='' ? unqual : qual.'.'.unqual
+  let pname = ( symb ? '('.name.')' : name ) 
+  call GHC_HaveTypes()
+  if !has_key(b:ghc_types,name)
+    redraw
+    echo pname "type not known"
+  else
+    redraw
+    for type in split(b:ghc_types[name],' -- ')
+      echo pname "::" type
+      if a:addTypeDecl
+        call append( line(".")-1, pname . " :: " . type )
+      endif
+    endfor
+  endif
+endfunction
+
+" show type of identifier under mouse pointer in balloon
+if has("balloon_eval")
+  set ballooneval
+  set balloondelay=600
+  set balloonexpr=GHC_TypeBalloon()
+  function! GHC_TypeBalloon()
+    if exists("b:current_compiler") && b:current_compiler=="ghc" 
+      let [line] = getbufline(v:beval_bufnr,v:beval_lnum)
+      let namsym = haskellmode#GetNameSymbol(line,v:beval_col,0)
+      if namsym==[]
+        return ''
+      endif
+      let [start,symb,qual,unqual] = namsym
+      let name  = qual=='' ? unqual : qual.'.'.unqual
+      let pname = name " ( symb ? '('.name.')' : name )
+      silent call GHC_HaveTypes()
+      if has("balloon_multiline")
+        return (has_key(b:ghc_types,pname) ? split(b:ghc_types[pname],' -- ') : '') 
+      else
+        return (has_key(b:ghc_types,pname) ? b:ghc_types[pname] : '') 
+      endif
+    else
+      return ''
+    endif
+  endfunction
+endif
+
+map <LocalLeader>si :call GHC_ShowInfo()<cr>
+function! GHC_ShowInfo()
+  let namsym   = haskellmode#GetNameSymbol(getline('.'),col('.'),0)
+  if namsym==[]
+    redraw
+    echo 'no name/symbol under cursor!'
+    return 0
+  endif
+  let [_,symb,qual,unqual] = namsym
+  let name = qual=='' ? unqual : (qual.'.'.unqual)
+  let output = GHC_Info(name)
+  pclose | new 
+  setlocal previewwindow
+  setlocal buftype=nofile
+  setlocal noswapfile
+  put =output
+  wincmd w
+  "redraw
+  "echo output
+endfunction
+
+" fill the type map, unless nothing has changed since the last attempt
+function! GHC_HaveTypes()
+  if b:ghc_types == {} && (b:my_changedtick != b:changedtick)
+    let b:my_changedtick = b:changedtick
+    return GHC_BrowseAll()
+  endif
+endfunction
+
+" update b:ghc_types after successful make
+au QuickFixCmdPost make if GHC_CountErrors()==0 | silent call GHC_BrowseAll() | endif
+
+" count only error entries in quickfix list, ignoring warnings
+function! GHC_CountErrors()
+  let c=0
+  for e in getqflist() | if e.type=='E' && e.text !~ "^[ \n]*Warning:" | let c+=1 | endif | endfor
+  return c
+endfunction
+
+command! GHCReload call GHC_BrowseAll()
+function! GHC_BrowseAll()
+  " let imports = haskellmode#GatherImports()
+  " let modules = keys(imports[0]) + keys(imports[1])
+  let imports = {} " no need for them at the moment
+  let current = GHC_NameCurrent()
+  let module = current==[] ? 'Main' : current[0]
+  if GHC_VersionGE([6,8,1])
+    return GHC_BrowseBangStar(module)
+  else
+    return GHC_BrowseMultiple(imports,['*'.module])
+  endif
+endfunction
+
+function! GHC_VersionGE(target)
+  let current = split(g:ghc_version, '\.' )
+  let target  = a:target
+  for i in current
+    if ((target==[]) || (i>target[0]))
+      return 1
+    elseif (i==target[0])
+      let target = target[1:]
+    else
+      return 0
+    endif
+  endfor
+  return 1
+endfunction
+
+function! GHC_NameCurrent()
+  let last = line("$")
+  let l = 1
+  while l<last
+    let ml = matchlist( getline(l), '^module\s*\([^ (]*\)')
+    if ml != []
+      let [_,module;x] = ml
+      return [module]
+    endif
+    let l += 1
+  endwhile
+  redraw
+  echo "cannot find module header for file " . expand("%")
+  return []
+endfunction
+
+function! GHC_BrowseBangStar(module)
+  redraw
+  echo "browsing module " a:module
+  let command = ":browse! *" . a:module
+  let orig_shellredir = &shellredir
+  let &shellredir = ">" " ignore error/warning messages, only output or lack of it
+  let output = system(g:ghc . ' ' . b:ghc_staticoptions . ' -v0 --interactive ' . expand("%") , command )
+  let &shellredir = orig_shellredir
+  return GHC_ProcessBang(a:module,output)
+endfunction
+
+function! GHC_BrowseMultiple(imports,modules)
+  redraw
+  echo "browsing modules " a:modules
+  let command = ":browse " . join( a:modules, " \n :browse ") 
+  let command = substitute(command,'\(:browse \(\S*\)\)','putStrLn "-- \2" \n \1','g')
+  let output = system(g:ghc . ' ' . b:ghc_staticoptions . ' -v0 --interactive ' . expand("%") , command )
+  return GHC_Process(a:imports,output)
+endfunction
+
+function! GHC_Info(what)
+  " call GHC_HaveTypes()
+  let output = system(g:ghc . ' ' . b:ghc_staticoptions . ' -v0 --interactive ' . expand("%"), ":i ". a:what)
+  return output
+endfunction
+
+function! GHC_ProcessBang(module,output)
+  let module      = a:module
+  let b           = a:output
+  let linePat     = '^\(.\{-}\)\n\(.*\)'
+  let contPat     = '\s\+\(.\{-}\)\n\(.*\)'
+  let typePat     = '^\(\)\(\S*\)\s*::\(.*\)'
+  let commentPat  = '^-- \(\S*\)'
+  let definedPat  = '^-- defined locally'
+  let importedPat = '^-- imported via \(.*\)'
+  if !(b=~commentPat)
+    echo s:scriptname.": GHCi reports errors (try :make?)"
+    return 0
+  endif
+  let b:ghc_types = {}
+  let ml = matchlist( b , linePat )
+  while ml != []
+    let [_,l,rest;x] = ml
+    let mlDecl = matchlist( l, typePat )
+    if mlDecl != []
+      let [_,indent,id,type;x] = mlDecl
+      let ml2 = matchlist( rest , '^'.indent.contPat )
+      while ml2 != []
+        let [_,c,rest;x] = ml2
+        let type .= c
+        let ml2 = matchlist( rest , '^'.indent.contPat )
+      endwhile
+      let id   = substitute( id, '^(\(.*\))$', '\1', '')
+      let type = substitute( type, '\s\+', " ", "g" )
+      " using :browse! *<current>, we get both unqualified and qualified ids
+      let qualified = (id =~ '\.') && (id =~ '[A-Z]')
+      let b:ghc_types[id] = type
+      if !qualified
+        for qual in qualifiers
+          let b:ghc_types[qual.'.'.id] = type
+        endfor
+      endif
+    else
+      let mlImported = matchlist( l, importedPat )
+      let mlDefined  = matchlist( l, definedPat )
+      if mlImported != []
+        let [_,modules;x] = mlImported
+        let qualifiers = split( modules, ', ' )
+      elseif mlDefined != []
+        let qualifiers = [module]
+      endif
+    endif
+    let ml = matchlist( rest , linePat )
+  endwhile
+  return 1
+endfunction
+
+function! GHC_Process(imports,output)
+  let b       = a:output
+  let imports = a:imports
+  let linePat = '^\(.\{-}\)\n\(.*\)'
+  let contPat = '\s\+\(.\{-}\)\n\(.*\)'
+  let typePat = '^\(\s*\)\(\S*\)\s*::\(.*\)'
+  let modPat  = '^-- \(\S*\)'
+  " add '-- defined locally' and '-- imported via ..'
+  if !(b=~modPat)
+    echo s:scriptname.": GHCi reports errors (try :make?)"
+    return 0
+  endif
+  let b:ghc_types = {}
+  let ml = matchlist( b , linePat )
+  while ml != []
+    let [_,l,rest;x] = ml
+    let mlDecl = matchlist( l, typePat )
+    if mlDecl != []
+      let [_,indent,id,type;x] = mlDecl
+      let ml2 = matchlist( rest , '^'.indent.contPat )
+      while ml2 != []
+        let [_,c,rest;x] = ml2
+        let type .= c
+        let ml2 = matchlist( rest , '^'.indent.contPat )
+      endwhile
+      let id   = substitute(id, '^(\(.*\))$', '\1', '')
+      let type = substitute( type, '\s\+', " ", "g" )
+      " using :browse *<current>, we get both unqualified and qualified ids
+      if current_module " || has_key(imports[0],module) 
+        if has_key(b:ghc_types,id) && !(matchstr(b:ghc_types[id],escape(type,'[].'))==type)
+          let b:ghc_types[id] .= ' -- '.type
+        else
+          let b:ghc_types[id] = type
+        endif
+      endif
+      if 0 " has_key(imports[1],module) 
+        let qualid = module.'.'.id
+        let b:ghc_types[qualid] = type
+      endif
+    else
+      let mlMod = matchlist( l, modPat )
+      if mlMod != []
+        let [_,module;x] = mlMod
+        let current_module = module[0]=='*'
+        let module = current_module ? module[1:] : module
+      endif
+    endif
+    let ml = matchlist( rest , linePat )
+  endwhile
+  return 1
+endfunction
+
+let s:ghc_templates = ["module _ () where","class _ where","class _ => _ where","instance _ where","instance _ => _ where","type family _","type instance _ = ","data _ = ","newtype _ = ","type _ = "]
+
+" use ghci :browse index for insert mode omnicompletion (CTRL-X CTRL-O)
+function! GHC_CompleteImports(findstart, base)
+  if a:findstart 
+    let namsym   = haskellmode#GetNameSymbol(getline('.'),col('.'),-1) " insert-mode: we're 1 beyond the text
+    if namsym==[]
+      redraw
+      echo 'no name/symbol under cursor!'
+      return -1
+    endif
+    let [start,symb,qual,unqual] = namsym
+    return (start-1)
+  else " find keys matching with "a:base"
+    let res = []
+    let l   = len(a:base)-1
+    call GHC_HaveTypes()
+    for key in keys(b:ghc_types) 
+      if key[0 : l]==a:base
+        let res += [{"word":key,"menu":":: ".b:ghc_types[key],"dup":1}]
+      endif
+    endfor
+    return res
+  endif
+endfunction
+set omnifunc=GHC_CompleteImports
+"
+" Vim's default completeopt is menu,preview
+" you probably want at least menu, or you won't see alternatives listed
+" setlocal completeopt+=menu
+
+" menuone is useful, but other haskellmode menus will try to follow your choice here in future
+" setlocal completeopt+=menuone
+
+" longest sounds useful, but doesn't seem to do what it says, and interferes with CTRL-E
+" setlocal completeopt-=longest
+
+map <LocalLeader>ct :call GHC_CreateTagfile()<cr>
+function! GHC_CreateTagfile()
+  redraw
+  echo "creating tags file" 
+  let output = system(g:ghc . ' ' . b:ghc_staticoptions . ' -e ":ctags" ' . expand("%"))
+  " for ghcs older than 6.6, you would need to call another program 
+  " here, such as hasktags
+  echo output
+endfunction
+
+command! -nargs=1 GHCi redraw | echo system(g:ghc. ' ' . b:ghc_staticoptions .' '.expand("%").' -e "'.escape(<f-args>,'"').'"')
+
+" use :make 'not in scope' errors to explicitly list imported ids
+" cursor needs to be on import line, in correctly loadable module
+map <LocalLeader>ie :call GHC_MkImportsExplicit()<cr>
+function! GHC_MkImportsExplicit()
+  let save_cursor = getpos(".")
+  let line   = getline('.')
+  let lineno = line('.')
+  let ml     = matchlist(line,'^import\(\s*qualified\)\?\s*\([^( ]\+\)')
+  if ml!=[]
+    let [_,q,mod;x] = ml
+    silent make
+    if getqflist()==[]
+      if line=~"import[^(]*Prelude"
+        call setline(lineno,substitute(line,"(.*","","").'()')
+      else
+        call setline(lineno,'-- '.line)
+      endif
+      silent write
+      silent make
+      let qflist = getqflist()
+      call setline(lineno,line)
+      silent write
+      let ids = {}
+      for d in qflist
+        let ml = matchlist(d.text,'Not in scope: \([^`]*\)`\([^'']*\)''')
+        if ml!=[]
+          let [_,what,qid;x] = ml
+          let id  = ( qid =~ "^[A-Z]" ? substitute(qid,'.*\.\([^.]*\)$','\1','') : qid )
+          let pid = ( id =~ "[a-zA-Z0-9_']\\+" ? id : '('.id.')' )
+          if what =~ "data"
+            call GHC_HaveTypes()
+            if has_key(b:ghc_types,id)
+              let pid = substitute(b:ghc_types[id],'^.*->\s*\(\S*\).*$','\1','').'('.pid.')'
+            else
+              let pid = '???('.pid.')'
+            endif
+          endif
+          let ids[pid] = 1
+        endif
+      endfor
+      call setline(lineno,'import'.q.' '.mod.'('.join(keys(ids),',').')')
+    else
+      copen
+    endif
+  endif
+  call setpos('.', save_cursor)
+endfunction
+
+if GHC_VersionGE([6,8,2])
+  let opts = filter(split(substitute(system(g:ghc . ' -v0 --interactive', ':set'), '  ', '','g'), '\n'), 'v:val =~ "-f"')
+else
+  let opts = ["-fglasgow-exts","-fallow-undecidable-instances","-fallow-overlapping-instances","-fno-monomorphism-restriction","-fno-mono-pat-binds","-fno-cse","-fbang-patterns","-funbox-strict-fields"]
+endif
+
+amenu ]OPTIONS_GHC.- :echo '-'<cr>
+aunmenu ]OPTIONS_GHC
+for o in opts
+  exe 'amenu ]OPTIONS_GHC.'.o.' :call append(0,"{-# OPTIONS_GHC '.o.' #-}")<cr>'
+endfor
+if has("gui_running")
+  map <LocalLeader>opt :popup ]OPTIONS_GHC<cr>
+else
+  map <LocalLeader>opt :emenu ]OPTIONS_GHC.
+endif
+
+amenu ]LANGUAGES_GHC.- :echo '-'<cr>
+aunmenu ]LANGUAGES_GHC
+if GHC_VersionGE([6,8])
+  let ghc_supported_languages = split(system(g:ghc . ' --supported-languages'),'\n')
+  for l in ghc_supported_languages
+    exe 'amenu ]LANGUAGES_GHC.'.l.' :call append(0,"{-# LANGUAGE '.l.' #-}")<cr>'
+  endfor
+  if has("gui_running")
+    map <LocalLeader>lang :popup ]LANGUAGES_GHC<cr>
+  else
+    map <LocalLeader>lang :emenu ]LANGUAGES_GHC.
+  endif
+endif

vim/.vim/doc/NERD_tree.txt

+*NERD_tree.txt*   A tree explorer plugin that owns your momma!
+
+
+
+    omg its ... ~
+
+    ________  ________   _   ____________  ____     __________  ____________~
+   /_  __/ / / / ____/  / | / / ____/ __ \/ __ \   /_  __/ __ \/ ____/ ____/~
+    / / / /_/ / __/    /  |/ / __/ / /_/ / / / /    / / / /_/ / __/ / __/   ~
+   / / / __  / /___   / /|  / /___/ _, _/ /_/ /    / / / _, _/ /___/ /___   ~
+  /_/ /_/ /_/_____/  /_/ |_/_____/_/ |_/_____/    /_/ /_/ |_/_____/_____/   ~
+
+
+                              Reference Manual~
+
+
+
+
+==============================================================================
+CONTENTS                                                   *NERDTree-contents*
+
+    1.Intro...................................|NERDTree|
+    2.Functionality provided..................|NERDTreeFunctionality|
+        2.1.Global commands...................|NERDTreeGlobalCommands|
+        2.2.Bookmarks.........................|NERDTreeBookmarks|
+            2.2.1.The bookmark table..........|NERDTreeBookmarkTable|
+            2.2.2.Bookmark commands...........|NERDTreeBookmarkCommands|
+            2.2.3.Invalid bookmarks...........|NERDTreeInvalidBookmarks|
+        2.3.NERD tree mappings................|NERDTreeMappings|
+        2.4.The NERD tree menu................|NERDTreeMenu|
+    3.Options.................................|NERDTreeOptions|
+        3.1.Option summary....................|NERDTreeOptionSummary|
+        3.2.Option details....................|NERDTreeOptionDetails|
+    4.The NERD tree API.......................|NERDTreeAPI|
+        4.1.Key map API.......................|NERDTreeKeymapAPI|
+        4.2.Menu API..........................|NERDTreeMenuAPI|
+    5.About...................................|NERDTreeAbout|
+    6.Changelog...............................|NERDTreeChangelog|
+    7.Credits.................................|NERDTreeCredits|
+    8.License.................................|NERDTreeLicense|
+
+==============================================================================
+1. Intro                                                            *NERDTree*
+
+What is this "NERD tree"??
+
+The NERD tree allows you to explore your filesystem and to open files and
+directories. It presents the filesystem to you in the form of a tree which you
+manipulate with the keyboard and/or mouse. It also allows you to perform
+simple filesystem operations.
+
+The following features and functionality are provided by the NERD tree:
+    * Files and directories are displayed in a hierarchical tree structure
+    * Different highlighting is provided for the following types of nodes:
+        * files
+        * directories
+        * sym-links
+        * windows .lnk files
+        * read-only files
+        * executable files
+    * Many (customisable) mappings are provided to manipulate the tree:
+        * Mappings to open/close/explore directory nodes
+        * Mappings to open files in new/existing windows/tabs
+        * Mappings to change the current root of the tree
+        * Mappings to navigate around the tree
+        * ...
+    * Directories and files can be bookmarked.
+    * Most NERD tree navigation can also be done with the mouse
+    * Filtering of tree content (can be toggled at runtime)
+        * custom file filters to prevent e.g. vim backup files being displayed
+        * optional displaying of hidden files (. files)
+        * files can be "turned off" so that only directories are displayed
+    * The position and size of the NERD tree window can be customised
+    * The order in which the nodes in the tree are listed can be customised.
+    * A model of your filesystem is created/maintained as you explore it. This
+      has several advantages:
+        * All filesystem information is cached and is only re-read on demand
+        * If you revisit a part of the tree that you left earlier in your
+          session, the directory nodes will be opened/closed as you left them
+    * The script remembers the cursor position and window position in the NERD
+      tree so you can toggle it off (or just close the tree window) and then
+      reopen it (with NERDTreeToggle) the NERD tree window will appear exactly
+      as you left it
+    * You can have a separate NERD tree for each tab, share trees across tabs,
+      or a mix of both.
+    * By default the script overrides the default file browser (netw), so if
+      you :edit a directory a (slighly modified) NERD tree will appear in the
+      current window
+    * A programmable menu system is provided (simulates right clicking on a
+      node)
+        * one default menu plugin is provided to perform basic filesytem
+          operations (create/delete/move/copy files/directories)
+    * There's an API for adding your own keymappings
+
+
+==============================================================================
+2. Functionality provided                              *NERDTreeFunctionality*
+
+------------------------------------------------------------------------------
+2.1. Global Commands                                  *NERDTreeGlobalCommands*
+
+:NERDTree [<start-directory> | <bookmark>]                         *:NERDTree*
+    Opens a fresh NERD tree. The root of the tree depends on the argument
+    given. There are 3 cases: If no argument is given, the current directory
+    will be used.  If a directory is given, that will be used. If a bookmark
+    name is given, the corresponding directory will be used.  For example: >
+        :NERDTree /home/marty/vim7/src
+        :NERDTree foo   (foo is the name of a bookmark)
+<
+:NERDTreeFromBookmark <bookmark>                       *:NERDTreeFromBookmark*
+    Opens a fresh NERD tree with the root initialized to the dir for
+    <bookmark>.  This only reason to use this command over :NERDTree is for
+    the completion (which is for bookmarks rather than directories).
+
+:NERDTreeToggle [<start-directory> | <bookmark>]             *:NERDTreeToggle*
+    If a NERD tree already exists for this tab, it is reopened and rendered
+    again.  If no NERD tree exists for this tab then this command acts the
+    same as the |:NERDTree| command.
+
+:NERDTreeMirror                                              *:NERDTreeMirror*
+    Shares an existing NERD tree, from another tab, in the current tab.
+    Changes made to one tree are reflected in both as they are actually the
+    same buffer.
+
+    If only one other NERD tree exists, that tree is automatically mirrored. If
+    more than one exists, the script will ask which tree to mirror.
+
+:NERDTreeClose                                                *:NERDTreeClose*
+    Close the NERD tree in this tab.
+
+:NERDTreeFind                                                  *:NERDTreeFind*
+    Find the current file in the tree. If no tree exists for the current tab,
+    or the file is not under the current root, then initialize a new tree where
+    the root is the directory of the current file.
+
+------------------------------------------------------------------------------
+2.2. Bookmarks                                             *NERDTreeBookmarks*
+
+Bookmarks in the NERD tree are a way to tag files or directories of interest.
+For example, you could use bookmarks to tag all of your project directories.
+
+------------------------------------------------------------------------------
+2.2.1. The Bookmark Table                              *NERDTreeBookmarkTable*
+
+If the bookmark table is active (see |NERDTree-B| and
+|'NERDTreeShowBookmarks'|), it will be rendered above the tree. You can double
+click bookmarks or use the |NERDTree-o| mapping to activate them. See also,
+|NERDTree-t| and |NERDTree-T|
+
+------------------------------------------------------------------------------
+2.2.2. Bookmark commands                            *NERDTreeBookmarkCommands*
+
+Note that the following commands are only available in the NERD tree buffer.
+
+:Bookmark <name>
+    Bookmark the current node as <name>. If there is already a <name>
+    bookmark, it is overwritten. <name> must not contain spaces.
+
+:BookmarkToRoot <bookmark>
+    Make the directory corresponding to <bookmark> the new root. If a treenode
+    corresponding to <bookmark> is already cached somewhere in the tree then
+    the current tree will be used, otherwise a fresh tree will be opened.
+    Note that if <bookmark> points to a file then its parent will be used
+    instead.
+
+:RevealBookmark <bookmark>
+    If the node is cached under the current root then it will be revealed
+    (i.e. directory nodes above it will be opened) and the cursor will be
+    placed on it.
+
+:OpenBookmark <bookmark>
+    <bookmark> must point to a file. The file is opened as though |NERDTree-o|
+    was applied. If the node is cached under the current root then it will be
+    revealed and the cursor will be placed on it.
+
+:ClearBookmarks [<bookmarks>]
+    Remove all the given bookmarks. If no bookmarks are given then remove all
+    bookmarks on the current node.
+
+:ClearAllBookmarks
+    Remove all bookmarks.
+
+:ReadBookmarks
+    Re-read the bookmarks in the |'NERDTreeBookmarksFile'|.
+
+See also |:NERDTree| and |:NERDTreeFromBookmark|.
+
+------------------------------------------------------------------------------
+2.2.3. Invalid Bookmarks                            *NERDTreeInvalidBookmarks*
+
+If invalid bookmarks are detected, the script will issue an error message and
+the invalid bookmarks will become unavailable for use.
+
+These bookmarks will still be stored in the bookmarks file (see
+|'NERDTreeBookmarksFile'|), down the bottom. There will always be a blank line
+after the valid bookmarks but before the invalid ones.
+
+Each line in the bookmarks file represents one bookmark. The proper format is:
+<bookmark name><space><full path to the bookmark location>
+
+After you have corrected any invalid bookmarks, either restart vim, or go
+:ReadBookmarks from the NERD tree window.
+
+------------------------------------------------------------------------------
+2.3. NERD tree Mappings                                     *NERDTreeMappings*
+
+Default  Description~                                             help-tag~
+Key~
+
+o.......Open files, directories and bookmarks....................|NERDTree-o|
+go......Open selected file, but leave cursor in the NERDTree.....|NERDTree-go|
+t.......Open selected node/bookmark in a new tab.................|NERDTree-t|
+T.......Same as 't' but keep the focus on the current tab........|NERDTree-T|
+i.......Open selected file in a split window.....................|NERDTree-i|
+gi......Same as i, but leave the cursor on the NERDTree..........|NERDTree-gi|
+s.......Open selected file in a new vsplit.......................|NERDTree-s|
+gs......Same as s, but leave the cursor on the NERDTree..........|NERDTree-gs|
+O.......Recursively open the selected directory..................|NERDTree-O|
+x.......Close the current nodes parent...........................|NERDTree-x|
+X.......Recursively close all children of the current node.......|NERDTree-X|
+e.......Edit the current dif.....................................|NERDTree-e|
+
+<CR>...............same as |NERDTree-o|.
+double-click.......same as the |NERDTree-o| map.
+middle-click.......same as |NERDTree-i| for files, same as
+                   |NERDTree-e| for dirs.
+
+D.......Delete the current bookmark .............................|NERDTree-D|
+
+P.......Jump to the root node....................................|NERDTree-P|
+p.......Jump to current nodes parent.............................|NERDTree-p|
+K.......Jump up inside directories at the current tree depth.....|NERDTree-K|
+J.......Jump down inside directories at the current tree depth...|NERDTree-J|
+<C-J>...Jump down to the next sibling of the current directory...|NERDTree-C-J|
+<C-K>...Jump up to the previous sibling of the current directory.|NERDTree-C-K|
+
+C.......Change the tree root to the selected dir.................|NERDTree-C|
+u.......Move the tree root up one directory......................|NERDTree-u|
+U.......Same as 'u' except the old root node is left open........|NERDTree-U|
+r.......Recursively refresh the current directory................|NERDTree-r|
+R.......Recursively refresh the current root.....................|NERDTree-R|
+m.......Display the NERD tree menu...............................|NERDTree-m|
+cd......Change the CWD to the dir of the selected node...........|NERDTree-cd|
+
+I.......Toggle whether hidden files displayed....................|NERDTree-I|
+f.......Toggle whether the file filters are used.................|NERDTree-f|
+F.......Toggle whether files are displayed.......................|NERDTree-F|
+B.......Toggle whether the bookmark table is displayed...........|NERDTree-B|
+
+q.......Close the NERDTree window................................|NERDTree-q|
+A.......Zoom (maximize/minimize) the NERDTree window.............|NERDTree-A|
+?.......Toggle the display of the quick help.....................|NERDTree-?|
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-o*
+Default key: o
+Map option: NERDTreeMapActivateNode
+Applies to: files and directories.
+
+If a file node is selected, it is opened in the previous window.
+
+If a directory is selected it is opened or closed depending on its current
+state.
+
+If a bookmark that links to a directory is selected then that directory
+becomes the new root.
+
+If a bookmark that links to a file is selected then that file is opened in the
+previous window.
+
+------------------------------------------------------------------------------
+                                                                 *NERDTree-go*
+Default key: go
+Map option: None
+Applies to: files.
+
+If a file node is selected, it is opened in the previous window, but the
+cursor does not move.
+
+The key combo for this mapping is always "g" + NERDTreeMapActivateNode (see
+|NERDTree-o|).
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-t*
+Default key: t
+Map option: NERDTreeMapOpenInTab
+Applies to: files and directories.
+
+Opens the selected file in a new tab. If a directory is selected, a fresh
+NERD Tree for that directory is opened in a new tab.
+
+If a bookmark which points to a directory is selected, open a NERD tree for
+that directory in a new tab. If the bookmark points to a file, open that file
+in a new tab.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-T*
+Default key: T
+Map option: NERDTreeMapOpenInTabSilent
+Applies to: files and directories.
+
+The same as |NERDTree-t| except that the focus is kept in the current tab.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-i*
+Default key: i
+Map option: NERDTreeMapOpenSplit
+Applies to: files.
+
+Opens the selected file in a new split window and puts the cursor in the new
+window.
+
+------------------------------------------------------------------------------
+                                                                 *NERDTree-gi*
+Default key: gi
+Map option: None
+Applies to: files.
+
+The same as |NERDTree-i| except that the cursor is not moved.
+
+The key combo for this mapping is always "g" + NERDTreeMapOpenSplit (see
+|NERDTree-i|).
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-s*
+Default key: s
+Map option: NERDTreeMapOpenVSplit
+Applies to: files.
+
+Opens the selected file in a new vertically split window and puts the cursor in
+the new window.
+
+------------------------------------------------------------------------------
+                                                                 *NERDTree-gs*
+Default key: gs
+Map option: None
+Applies to: files.
+
+The same as |NERDTree-s| except that the cursor is not moved.
+
+The key combo for this mapping is always "g" + NERDTreeMapOpenVSplit (see
+|NERDTree-s|).
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-O*
+Default key: O
+Map option: NERDTreeMapOpenRecursively
+Applies to: directories.
+
+Recursively opens the selelected directory.
+
+All files and directories are cached, but if a directory would not be
+displayed due to file filters (see |'NERDTreeIgnore'| |NERDTree-f|) or the
+hidden file filter (see |'NERDTreeShowHidden'|) then its contents are not
+cached. This is handy, especially if you have .svn directories.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-x*
+Default key: x
+Map option: NERDTreeMapCloseDir
+Applies to: files and directories.
+
+Closes the parent of the selected node.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-X*
+Default key: X
+Map option: NERDTreeMapCloseChildren
+Applies to: directories.
+
+Recursively closes all children of the selected directory.
+
+Tip: To quickly "reset" the tree, use |NERDTree-P| with this mapping.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-e*
+Default key: e
+Map option: NERDTreeMapOpenExpl
+Applies to: files and directories.
+
+|:edit|s the selected directory, or the selected file's directory. This could
+result in a NERD tree or a netrw being opened, depending on
+|'NERDTreeHijackNetrw'|.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-D*
+Default key: D
+Map option: NERDTreeMapDeleteBookmark
+Applies to: lines in the bookmarks table
+
+Deletes the currently selected bookmark.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-P*
+Default key: P
+Map option: NERDTreeMapJumpRoot
+Applies to: no restrictions.
+
+Jump to the tree root.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-p*
+Default key: p
+Map option: NERDTreeMapJumpParent
+Applies to: files and directories.
+
+Jump to the parent node of the selected node.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-K*
+Default key: K
+Map option: NERDTreeMapJumpFirstChild
+Applies to: files and directories.
+
+Jump to the first child of the current nodes parent.
+
+If the cursor is already on the first node then do the following:
+    * loop back thru the siblings of the current nodes parent until we find an
+      open dir with children
+    * go to the first child of that node
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-J*
+Default key: J
+Map option: NERDTreeMapJumpLastChild
+Applies to: files and directories.
+
+Jump to the last child of the current nodes parent.
+
+If the cursor is already on the last node then do the following:
+    * loop forward thru the siblings of the current nodes parent until we find
+      an open dir with children
+    * go to the last child of that node
+
+------------------------------------------------------------------------------
+                                                                *NERDTree-C-J*
+Default key: <C-J>
+Map option: NERDTreeMapJumpNextSibling
+Applies to: files and directories.
+
+Jump to the next sibling of the selected node.
+
+------------------------------------------------------------------------------
+                                                                *NERDTree-C-K*
+Default key: <C-K>
+Map option: NERDTreeMapJumpPrevSibling
+Applies to: files and directories.
+
+Jump to the previous sibling of the selected node.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-C*
+Default key: C
+Map option: NERDTreeMapChdir
+Applies to: directories.
+
+Make the selected directory node the new tree root. If a file is selected, its
+parent is used.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-u*
+Default key: u
+Map option: NERDTreeMapUpdir
+Applies to: no restrictions.
+
+Move the tree root up a dir (like doing a "cd ..").
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-U*
+Default key: U
+Map option: NERDTreeMapUpdirKeepOpen
+Applies to: no restrictions.
+
+Like |NERDTree-u| except that the old tree root is kept open.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-r*
+Default key: r
+Map option: NERDTreeMapRefresh
+Applies to: files and directories.
+
+If a dir is selected, recursively refresh that dir, i.e. scan the filesystem
+for changes and represent them in the tree.
+
+If a file node is selected then the above is done on it's parent.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-R*
+Default key: R
+Map option: NERDTreeMapRefreshRoot
+Applies to: no restrictions.
+
+Recursively refresh the tree root.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-m*
+Default key: m
+Map option: NERDTreeMapMenu
+Applies to: files and directories.
+
+Display the NERD tree menu. See |NERDTreeMenu| for details.
+
+------------------------------------------------------------------------------
+                                                                 *NERDTree-cd*
+Default key: cd
+Map option: NERDTreeMapChdir
+Applies to: files and directories.
+
+Change vims current working directory to that of the selected node.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-I*
+Default key: I
+Map option: NERDTreeMapToggleHidden
+Applies to: no restrictions.
+
+Toggles whether hidden files (i.e. "dot files") are displayed.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-f*
+Default key: f
+Map option: NERDTreeMapToggleFilters
+Applies to: no restrictions.
+
+Toggles whether file filters are used. See |'NERDTreeIgnore'| for details.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-F*
+Default key: F
+Map option: NERDTreeMapToggleFiles
+Applies to: no restrictions.
+
+Toggles whether file nodes are displayed.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-B*
+Default key: B
+Map option: NERDTreeMapToggleBookmarks
+Applies to: no restrictions.
+
+Toggles whether the bookmarks table is displayed.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-q*
+Default key: q
+Map option: NERDTreeMapQuit
+Applies to: no restrictions.
+
+Closes the NERDtree window.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-A*
+Default key: A
+Map option: NERDTreeMapToggleZoom
+Applies to: no restrictions.
+
+Maximize (zoom) and minimize the NERDtree window.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-?*
+Default key: ?
+Map option: NERDTreeMapHelp
+Applies to: no restrictions.
+
+Toggles whether the quickhelp is displayed.
+
+------------------------------------------------------------------------------
+2.3. The NERD tree menu                                         *NERDTreeMenu*
+
+The NERD tree has a menu that can be programmed via the an API (see
+|NERDTreeMenuAPI|). The idea is to simulate the "right click" menus that most
+file explorers have.
+
+The script comes with two default menu plugins: exec_menuitem.vim and
+fs_menu.vim. fs_menu.vim adds some basic filesystem operations to the menu for
+creating/deleting/moving/copying files and dirs. exec_menuitem.vim provides a
+menu item to execute executable files.
+
+Related tags: |NERDTree-m| |NERDTreeApi|
+
+==============================================================================
+3. Customisation                                             *NERDTreeOptions*
+
+
+------------------------------------------------------------------------------
+3.1. Customisation summary                             *NERDTreeOptionSummary*
+
+The script provides the following options that can customise the behaviour the
+NERD tree. These options should be set in your vimrc.
+
+|'loaded_nerd_tree'|            Turns off the script.
+
+|'NERDChristmasTree'|           Tells the NERD tree to make itself colourful
+                                and pretty.
+
+|'NERDTreeAutoCenter'|          Controls whether the NERD tree window centers
+                                when the cursor moves within a specified
+                                distance to the top/bottom of the window.
+|'NERDTreeAutoCenterThreshold'| Controls the sensitivity of autocentering.
+
+|'NERDTreeCaseSensitiveSort'|   Tells the NERD tree whether to be case
+                                sensitive or not when sorting nodes.
+
+|'NERDTreeChDirMode'|           Tells the NERD tree if/when it should change
+                                vim's current working directory.
+
+|'NERDTreeHighlightCursorline'| Tell the NERD tree whether to highlight the
+                                current cursor line.
+
+|'NERDTreeHijackNetrw'|         Tell the NERD tree whether to replace the netrw
+                                autocommands for exploring local directories.
+
+|'NERDTreeIgnore'|              Tells the NERD tree which files to ignore.
+
+|'NERDTreeBookmarksFile'|       Where the bookmarks are stored.
+
+|'NERDTreeMouseMode'|           Tells the NERD tree how to handle mouse
+                                clicks.
+
+|'NERDTreeQuitOnOpen'|          Closes the tree window after opening a file.
+
+|'NERDTreeShowBookmarks'|       Tells the NERD tree whether to display the
+                                bookmarks table on startup.
+
+|'NERDTreeShowFiles'|           Tells the NERD tree whether to display files
+                                in the tree on startup.
+
+|'NERDTreeShowHidden'|          Tells the NERD tree whether to display hidden
+                                files on startup.
+
+|'NERDTreeShowLineNumbers'|     Tells the NERD tree whether to display line
+                                numbers in the tree window.
+
+|'NERDTreeSortOrder'|           Tell the NERD tree how to sort the nodes in
+                                the tree.
+
+|'NERDTreeStatusline'|          Set a statusline for NERD tree windows.
+
+|'NERDTreeWinPos'|              Tells the script where to put the NERD tree
+                                window.
+
+|'NERDTreeWinSize'|             Sets the window size when the NERD tree is
+                                opened.
+
+------------------------------------------------------------------------------
+3.2. Customisation details                             *NERDTreeOptionDetails*
+
+To enable any of the below options you should put the given line in your
+~/.vimrc
+
+                                                          *'loaded_nerd_tree'*
+If this plugin is making you feel homicidal, it may be a good idea to turn it
+off with this line in your vimrc: >
+    let loaded_nerd_tree=1
+<
+------------------------------------------------------------------------------
+                                                         *'NERDChristmasTree'*
+Values: 0 or 1.
+Default: 1.
+
+If this option is set to 1 then some extra syntax highlighting elements are
+added to the nerd tree to make it more colourful.
+
+Set it to 0 for a more vanilla looking tree.
+
+------------------------------------------------------------------------------
+                                                        *'NERDTreeAutoCenter'*
+Values: 0 or 1.
+Default: 1
+
+If set to 1, the NERD tree window will center around the cursor if it moves to
+within |'NERDTreeAutoCenterThreshold'| lines of the top/bottom of the window.
+
+This is ONLY done in response to tree navigation mappings,
+i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-C-K| |NERDTree-p|
+|NERDTree-P|
+
+The centering is done with a |zz| operation.
+
+------------------------------------------------------------------------------
+                                               *'NERDTreeAutoCenterThreshold'*
+Values: Any natural number.
+Default: 3
+
+This option controls the "sensitivity" of the NERD tree auto centering. See
+|'NERDTreeAutoCenter'| for details.
+
+------------------------------------------------------------------------------
+                                                 *'NERDTreeCaseSensitiveSort'*
+Values: 0 or 1.
+Default: 0.
+
+By default the NERD tree does not sort nodes case sensitively, i.e. nodes
+could appear like this: >
+    bar.c
+    Baz.c
+    blarg.c
+    boner.c
+    Foo.c
+<
+But, if you set this option to 1 then the case of the nodes will be taken into
+account. The above nodes would then be sorted like this: >
+    Baz.c
+    Foo.c
+    bar.c
+    blarg.c
+    boner.c
+<
+------------------------------------------------------------------------------
+                                                         *'NERDTreeChDirMode'*
+
+Values: 0, 1 or 2.
+Default: 0.
+
+Use this option to tell the script when (if at all) to change the current
+working directory (CWD) for vim.
+
+If it is set to 0 then the CWD is never changed by the NERD tree.
+
+If set to 1 then the CWD is changed when the NERD tree is first loaded to the
+directory it is initialized in. For example, if you start the NERD tree with >
+    :NERDTree /home/marty/foobar
+<
+then the CWD will be changed to /home/marty/foobar and will not be changed
+again unless you init another NERD tree with a similar command.
+
+If the option is set to 2 then it behaves the same as if set to 1 except that
+the CWD is changed whenever the tree root is changed. For example, if the CWD
+is /home/marty/foobar and you make the node for /home/marty/foobar/baz the new
+root then the CWD will become /home/marty/foobar/baz.
+
+------------------------------------------------------------------------------
+                                               *'NERDTreeHighlightCursorline'*
+Values: 0 or 1.
+Default: 1.
+
+If set to 1, the current cursor line in the NERD tree buffer will be
+highlighted. This is done using the |'cursorline'| option.
+
+------------------------------------------------------------------------------
+                                                       *'NERDTreeHijackNetrw'*
+Values: 0 or 1.
+Default: 1.
+
+If set to 1, doing a >
+    :edit <some directory>
+<
+will open up a "secondary" NERD tree instead of a netrw in the target window.
+
+Secondary NERD trees behaves slighly different from a regular trees in the
+following respects:
+    1. 'o' will open the selected file in the same window as the tree,
+       replacing it.
+    2. you can have as many secondary tree as you want in the same tab.
+
+------------------------------------------------------------------------------
+                                                            *'NERDTreeIgnore'*
+Values: a list of regular expressions.
+Default: ['\~$'].
+
+This option is used to specify which files the NERD tree should ignore.  It
+must be a list of regular expressions. When the NERD tree is rendered, any
+files/dirs that match any of the regex's in 'NERDTreeIgnore' wont be
+displayed.
+
+For example if you put the following line in your vimrc: >
+    let NERDTreeIgnore=['\.vim$', '\~$']
+<
+then all files ending in .vim or ~ will be ignored.
+
+Note: to tell the NERD tree not to ignore any files you must use the following
+line: >
+    let NERDTreeIgnore=[]
+<
+
+The file filters can be turned on and off dynamically with the |NERDTree-f|
+mapping.
+
+------------------------------------------------------------------------------
+                                                     *'NERDTreeBookmarksFile'*
+Values: a path
+Default: $HOME/.NERDTreeBookmarks
+
+This is where bookmarks are saved. See |NERDTreeBookmarkCommands|.
+
+------------------------------------------------------------------------------
+                                                       *'NERDTreeMouseMode'*
+Values: 1, 2 or 3.
+Default: 1.
+
+If set to 1 then a double click on a node is required to open it.
+If set to 2 then a single click will open directory nodes, while a double
+click will still be required for file nodes.
+If set to 3 then a single click will open any node.
+
+Note: a double click anywhere on a line that a tree node is on will
+activate it, but all single-click activations must be done on name of the node
+itself. For example, if you have the following node: >
+    | | |-application.rb
+<
+then (to single click activate it) you must click somewhere in
+'application.rb'.
+
+------------------------------------------------------------------------------
+                                                        *'NERDTreeQuitOnOpen'*
+
+Values: 0 or 1.
+Default: 0
+
+If set to 1, the NERD tree window will close after opening a file with the
+|NERDTree-o|, |NERDTree-i|, |NERDTree-t| and |NERDTree-T| mappings.
+
+------------------------------------------------------------------------------
+                                                     *'NERDTreeShowBookmarks'*
+Values: 0 or 1.
+Default: 0.
+
+If this option is set to 1 then the bookmarks table will be displayed.
+
+This option can be toggled dynamically, per tree, with the |NERDTree-B|
+mapping.
+
+------------------------------------------------------------------------------
+                                                         *'NERDTreeShowFiles'*
+Values: 0 or 1.
+Default: 1.
+
+If this option is set to 1 then files are displayed in the NERD tree. If it is
+set to 0 then only directories are displayed.
+
+This option can be toggled dynamically, per tree, with the |NERDTree-F|
+mapping and is useful for drastically shrinking the tree when you are
+navigating to a different part of the tree.
+
+------------------------------------------------------------------------------
+                                                        *'NERDTreeShowHidden'*
+Values: 0 or 1.
+Default: 0.
+
+This option tells vim whether to display hidden files by default. This option
+can be dynamically toggled, per tree, with the |NERDTree-I| mapping.  Use one
+of the follow lines to set this option: >
+    let NERDTreeShowHidden=0
+    let NERDTreeShowHidden=1
+<
+
+------------------------------------------------------------------------------
+                                                   *'NERDTreeShowLineNumbers'*
+Values: 0 or 1.
+Default: 0.
+
+This option tells vim whether to display line numbers for the NERD tree
+window.  Use one of the follow lines to set this option: >
+    let NERDTreeShowLineNumbers=0
+    let NERDTreeShowLineNumbers=1
+<
+
+------------------------------------------------------------------------------
+                                                         *'NERDTreeSortOrder'*
+Values: a list of regular expressions.
+Default: ['\/$', '*', '\.swp$',  '\.bak$', '\~$']
+
+This option is set to a list of regular expressions which are used to
+specify the order of nodes under their parent.
+
+For example, if the option is set to: >
+    ['\.vim$', '\.c$', '\.h$', '*', 'foobar']
+<
+then all .vim files will be placed at the top, followed by all .c files then
+all .h files. All files containing the string 'foobar' will be placed at the
+end.  The star is a special flag: it tells the script that every node that
+doesnt match any of the other regexps should be placed here.
+
+If no star is present in 'NERDTreeSortOrder' then one is automatically
+appended to the array.
+
+The regex '\/$' should be used to match directory nodes.
+
+After this sorting is done, the files in each group are sorted alphabetically.
+
+Other examples: >
+    (1) ['*', '\/$']
+    (2) []
+    (3) ['\/$', '\.rb$', '\.php$', '*', '\.swp$',  '\.bak$', '\~$']
+<
+1. Directories will appear last, everything else will appear above.
+2. Everything will simply appear in alphabetical order.
+3. Dirs will appear first, then ruby and php. Swap files, bak files and vim
+   backup files will appear last with everything else preceding them.
+
+------------------------------------------------------------------------------
+                                                        *'NERDTreeStatusline'*
+Values: Any valid statusline setting.
+Default: %{b:NERDTreeRoot.path.strForOS(0)}
+
+Tells the script what to use as the |'statusline'| setting for NERD tree
+windows.
+
+Note that the statusline is set using |:let-&| not |:set| so escaping spaces
+isn't necessary.
+
+Setting this option to -1 will will deactivate it so that your global
+statusline setting is used instead.
+
+------------------------------------------------------------------------------
+                                                            *'NERDTreeWinPos'*
+Values: "left" or "right"
+Default: "left".
+
+This option is used to determine where NERD tree window is placed on the
+screen.
+
+This option makes it possible to use two different explorer plugins
+simultaneously. For example, you could have the taglist plugin on the left of
+the window and the NERD tree on the right.
+
+------------------------------------------------------------------------------
+                                                           *'NERDTreeWinSize'*
+Values: a positive integer.
+Default: 31.
+
+This option is used to change the size of the NERD tree when it is loaded.
+
+==============================================================================
+4. The NERD tree API                                             *NERDTreeAPI*
+
+The NERD tree script allows you to add custom key mappings and menu items via
+a set of API calls. Any scripts that use this API should be placed in
+~/.vim/nerdtree_plugin/ (*nix) or ~/vimfiles/nerdtree_plugin (windows).
+
+The script exposes some prototype objects that can be used to manipulate the
+tree and/or get information from it: >
+    g:NERDTreePath
+    g:NERDTreeDirNode
+    g:NERDTreeFileNode
+    g:NERDTreeBookmark
+<
+See the code/comments in NERD_tree.vim to find how to use these objects. The
+following code conventions are used:
+    * class members start with a capital letter
+    * instance members start with a lower case letter
+    * private members start with an underscore
+
+See this blog post for more details:
+ http://got-ravings.blogspot.com/2008/09/vim-pr0n-prototype-based-objects.html
+
+------------------------------------------------------------------------------
+4.1. Key map API                                           *NERDTreeKeymapAPI*
+
+NERDTreeAddKeyMap({options})                             *NERDTreeAddKeyMap()*
+    Adds a new keymapping for all NERD tree buffers.
+    {options} must be a dictionary, and must contain the following keys:
+    "key" - the trigger key for the new mapping
+    "callback" - the function the new mapping will be bound to
+    "quickhelpText" - the text that will appear in the quickhelp (see
+    |NERDTree-?|)
+
+    Example: >
+        call NERDTreeAddKeyMap({
+               \ 'key': 'b',
+               \ 'callback': 'NERDTreeEchoCurrentNode',
+               \ 'quickhelpText': 'echo full path of current node' })
+
+        function! NERDTreeEchoCurrentNode()
+            let n = g:NERDTreeFileNode.GetSelected()
+            if n != {}
+                echomsg 'Current node: ' . n.path.str()
+            endif
+        endfunction
+<
+    This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim.
+    It adds a (rather useless) mapping on 'b' which echos the full path to the
+    current node.
+
+------------------------------------------------------------------------------
+4.2. Menu API                                                *NERDTreeMenuAPI*
+
+NERDTreeAddSubmenu({options})                           *NERDTreeAddSubmenu()*
+    Creates and returns a new submenu.
+
+    {options} must be a dictionary and must contain the following keys:
+    "text" - the text of the submenu that the user will see
+    "shortcut" - a shortcut key for the submenu (need not be unique)
+
+    The following keys are optional:
+    "isActiveCallback" - a function that will be called to determine whether
+    this submenu item will be displayed or not. The callback function must return
+    0 or 1.
+    "parent" - the parent submenu of the new submenu (returned from a previous
+    invocation of NERDTreeAddSubmenu()). If this key is left out then the new
+    submenu will sit under the top level menu.
+
+    See below for an example.
+
+NERDTreeAddMenuItem({options})                         *NERDTreeAddMenuItem()*
+    Adds a new menu item to the NERD tree menu (see |NERDTreeMenu|).
+
+    {options} must be a dictionary and must contain the
+    following keys:
+    "text" - the text of the menu item which the user will see
+    "shortcut" - a shortcut key for the menu item (need not be unique)
+    "callback" - the function that will be called when the user activates the
+    menu item.
+
+    The following keys are optional:
+    "isActiveCallback" - a function that will be called to determine whether
+    this menu item will be displayed or not. The callback function must return
+    0 or 1.
+    "parent" - if the menu item belongs under a submenu then this key must be
+    specified. This value for this key will be the object that
+    was returned when the submenu was created with |NERDTreeAddSubmenu()|.
+
+    See below for an example.
+
+NERDTreeAddMenuSeparator([{options}])             *NERDTreeAddMenuSeparator()*
+    Adds a menu separator (a row of dashes).
+
+    {options} is an optional dictionary that may contain the following keys:
+    "isActiveCallback" - see description in |NERDTreeAddMenuItem()|.
+
+Below is an example of the menu API in action. >
+    call NERDTreeAddMenuSeparator()
+
+    call NERDTreeAddMenuItem({
+                \ 'text': 'a (t)op level menu item',
+                \ 'shortcut': 't',
+                \ 'callback': 'SomeFunction' })
+
+    let submenu = NERDTreeAddSubmenu({
+                \ 'text': 'a (s)ub menu',
+                \ 'shortcut': 's' })
+
+    call NERDTreeAddMenuItem({
+                \ 'text': '(n)ested item 1',
+                \ 'shortcut': 'n',
+                \ 'callback': 'SomeFunction',
+                \ 'parent': submenu })
+
+    call NERDTreeAddMenuItem({
+                \ 'text': '(n)ested item 2',
+                \ 'shortcut': 'n',
+                \ 'callback': 'SomeFunction',
+                \ 'parent': submenu })
+<
+This will create the following menu: >
+  --------------------
+  a (t)op level menu item
+  a (s)ub menu
+<
+Where selecting "a (s)ub menu" will lead to a second menu: >
+  (n)ested item 1
+  (n)ested item 2
+<
+When any of the 3 concrete menu items are selected the function "SomeFunction"
+will be called.
+
+------------------------------------------------------------------------------
+NERDTreeRender()                                            *NERDTreeRender()*
+    Re-renders the NERD tree buffer. Useful if you change the state of the
+    tree and you want to it to be reflected in the UI.
+
+==============================================================================
+5. About                                                       *NERDTreeAbout*
+
+The author of the NERD tree is a terrible terrible monster called Martyzilla
+who gobbles up small children with milk and sugar for breakfast.
+
+He can be reached at martin.grenfell at gmail dot com. He would love to hear
+from you, so feel free to send him suggestions and/or comments about this
+plugin.  Don't be shy --- the worst he can do is slaughter you and stuff you in
+the fridge for later ;)
+
+The latest stable versions can be found at
+    http://www.vim.org/scripts/script.php?script_id=1658
+
+The latest dev versions are on github
+    http://github.com/scrooloose/nerdtree
+
+
+==============================================================================
+6. Changelog                                               *NERDTreeChangelog*
+
+4.1.0
+    features:
+    - NERDTreeFind to reveal the node for the current buffer in the tree,
+      see |NERDTreeFind|. This effectively merges the FindInNERDTree plugin (by
+      Doug McInnes) into the script.
+    - make NERDTreeQuitOnOpen apply to the t/T keymaps too. Thanks to Stefan
+      Ritter and Rémi Prévost.
+    - truncate the root node if wider than the tree window. Thanks to Victor
+      Gonzalez.
+
+    bugfixes:
+    - really fix window state restoring
+    - fix some win32 path escaping issues. Thanks to Stephan Baumeister, Ricky,
+      jfilip1024, and Chris Chambers
+
+4.0.0
+    - add a new programmable menu system (see :help NERDTreeMenu).
+    - add new APIs to add menus/menu-items to the menu system as well as
+      custom key mappings to the NERD tree buffer (see :help NERDTreeAPI).
+    - removed the old API functions
+    - added a mapping to maximize/restore the size of nerd tree window, thanks
+      to Guillaume Duranceau for the patch. See :help NERDTree-A for details.
+
+    - fix a bug where secondary nerd trees (netrw hijacked trees) and
+      NERDTreeQuitOnOpen didnt play nicely, thanks to Curtis Harvey.
+    - fix a bug where the script ignored directories whose name ended in a dot,
+      thanks to Aggelos Orfanakos for the patch.
+    - fix a bug when using the x mapping on the tree root, thanks to Bryan
+      Venteicher for the patch.
+    - fix a bug where the cursor position/window size of the nerd tree buffer
+      wasnt being stored on closing the window, thanks to Richard Hart.
+    - fix a bug where NERDTreeMirror would mirror the wrong tree
+
+3.1.1
+    - fix a bug where a non-listed no-name buffer was getting created every
+      time the tree windows was created, thanks to Derek Wyatt and owen1
+    - make <CR> behave the same as the 'o' mapping
+    - some helptag fixes in the doc, thanks strull
+    - fix a bug when using :set nohidden and opening a file where the previous
+      buf was modified. Thanks iElectric
+    - other minor fixes
+
+3.1.0
+    New features:
+    - add mappings to open files in a vsplit, see :help NERDTree-s and :help
+      NERDTree-gs
+    - make the statusline for the nerd tree window default to something
+      hopefully more useful. See :help 'NERDTreeStatusline'
+    Bugfixes:
+    - make the hijack netrw functionality work when vim is started with "vim
+      <some dir>" (thanks to Alf Mikula for the patch).
+    - fix a bug where the CWD wasnt being changed for some operations even when
+      NERDTreeChDirMode==2 (thanks to Lucas S. Buchala)
+    - add -bar to all the nerd tree :commands so they can chain with other
+      :commands (thanks to tpope)
+    - fix bugs when ignorecase was set (thanks to nach)
+    - fix a bug with the relative path code (thanks to nach)
+    - fix a bug where doing a :cd would cause :NERDTreeToggle to fail (thanks nach)
+
+
+3.0.1
+    Bugfixes:
+    - fix bugs with :NERDTreeToggle and :NERDTreeMirror when 'hidden
+      was not set
+    - fix a bug where :NERDTree <path> would fail if <path> was relative and
+      didnt start with a ./ or ../  Thanks to James Kanze.
+    - make the q mapping work with secondary (:e <dir>  style) trees,
+      thanks to jamessan
+    - fix a bunch of small bugs with secondary trees
+
+    More insane refactoring.
+
+3.0.0
+    - hijack netrw so that doing an :edit <directory>  will put a NERD tree in
+      the window rather than a netrw browser. See :help 'NERDTreeHijackNetrw'
+    - allow sharing of trees across tabs, see :help :NERDTreeMirror
+    - remove "top" and "bottom" as valid settings for NERDTreeWinPos
+    - change the '<tab>' mapping to 'i'
+    - change the 'H' mapping to 'I'
+    - lots of refactoring
+
+==============================================================================
+7. Credits                                                   *NERDTreeCredits*
+
+Thanks to the following people for testing, bug reports, ideas etc. Without
+you I probably would have got bored of the hacking the NERD tree and
+just downloaded pr0n instead.
+
+    Tim Carey-Smith (halorgium)
+    Vigil
+    Nick Brettell
+    Thomas Scott Urban
+    Terrance Cohen
+    Yegappan Lakshmanan
+    Jason Mills
+    Michael Geddes (frogonwheels)
+    Yu Jun
+    Michael Madsen
+    AOYAMA Shotaro
+    Zhang Weiwu
+    Niels Aan de Brugh
+    Olivier Yiptong
+    Zhang Shuhan
+    Cory Echols
+    Piotr Czachur
+    Yuan Jiang
+    Matan Nassau
+    Maxim Kim
+    Charlton Wang
+    Matt Wozniski (godlygeek)
+    knekk
+    Sean Chou
+    Ryan Penn
+    Simon Peter Nicholls
+    Michael Foobar
+    Tomasz Chomiuk
+    Denis Pokataev
+    Tim Pope (tpope)
+    James Kanze
+    James Vega (jamessan)
+    Frederic Chanal (nach)
+    Alf Mikula
+    Lucas S. Buchala
+    Curtis Harvey
+    Guillaume Duranceau
+    Richard Hart (hates)
+    Doug McInnes
+    Stefan Ritter
+    Rémi Prévost
+    Victor Gonzalez
+    Stephan Baumeister
+    Ricky
+    jfilip1024
+    Chris Chambers
+
+==============================================================================
+8. License                                                   *NERDTreeLicense*
+
+The NERD tree is released under the wtfpl.
+See http://sam.zoy.org/wtfpl/COPYING.

vim/.vim/doc/haskellmode.txt

+*haskellmode.txt*	Haskell Mode Plugins	23/04/2009
+
+Authors:
+    Claus Reinke <claus.reinke@talk21.com> ~
+
+Homepage:
+    http://projects.haskell.org/haskellmode-vim
+
+CONTENTS                                                         *haskellmode*
+
+    1. Overview                                     |haskellmode-overview|
+        1.1 Runtime Requirements                    |haskellmode-requirements|
+        1.2 Quick Reference                         |haskellmode-quickref|
+    2. Settings                                     |haskellmode-settings|
+      2.1 GHC and web browser                       |haskellmode-settings-main|
+      2.2 Fine tuning - more configuration options  |haskellmode-settings-fine|
+    3. GHC Compiler Integration                     |haskellmode-compiler|
+    4. Haddock Integration                          |haskellmode-haddock|
+        4.1 Indexing                                |haskellmode-indexing|
+        4.2 Lookup                                  |haskellmode-lookup|