path = vim/bundle/vim-json
url = git://github.com/elzr/vim-json.git
-[submodule "vim-easymotion"]
- path = vim/bundle/vim-easymotion
- url = git://github.com/Lokaltog/vim-easymotion.git
-
-[submodule "LargeFile"]
- path = vim/bundle/LargeFile
- url = git://github.com/vim-scripts/LargeFile.git
+[submodule "vim/bundle/vim-easymotion"]
+ path = vim/bundle/vim-easymotion
+ url = git://github.com/Lokaltog/vim-easymotion.git
+[submodule "vim/bundle/LargeFile"]
+ path = vim/bundle/LargeFile
+ url = git://github.com/vim-scripts/LargeFile.git
+[submodule "vim/bundle/Align"]
+ path = vim/bundle/Align
+ url = https://github.com/vim-scripts/Align
+[submodule "vim/bundle/nerdcommenter"]
+ path = vim/bundle/nerdcommenter
+ url = git://github.com/scrooloose/nerdcommenter.git
+[submodule "vim/bundle/nerdtree"]
+ path = vim/bundle/nerdtree
+ url = git://github.com/scrooloose/nerdtree.git
+[submodule "vim/bundle/SearchComplete"]
+ path = vim/bundle/SearchComplete
+ url = git://github.com/vim-scripts/SearchComplete.git
+[submodule "vim/bundle/ZoomWin"]
+ path = vim/bundle/ZoomWin
+ url = git://github.com/vim-scripts/ZoomWin.git
+[submodule "vim/bundle/ag.vim"]
+ path = vim/bundle/ag.vim
+ url = git://github.com/rking/ag.vim.git
+[submodule "vim/bundle/Colour-Sampler-Pack"]
+ path = vim/bundle/Colour-Sampler-Pack
+ url = git://github.com/vim-scripts/Colour-Sampler-Pack.git
+[submodule "vim/bundle/delimitMate"]
+ path = vim/bundle/delimitMate
+ url = git://github.com/Raimondi/delimitMate.git
+[submodule "vim/bundle/vim-endwise"]
+ path = vim/bundle/vim-endwise
+ url = git://github.com/tpope/vim-endwise.git
--- /dev/null
+Subproject commit 9a1c6b12748fa807fbbe0c032e57fe85712a6d47
+++ /dev/null
-" Align: tool to align multiple fields based on one or more separators
-" Author: Charles E. Campbell, Jr.
-" Date: Mar 03, 2009
-" Version: 35
-" GetLatestVimScripts: 294 1 :AutoInstall: Align.vim
-" GetLatestVimScripts: 1066 1 :AutoInstall: cecutil.vim
-" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1
-" Permission is hereby granted to use and distribute this code,
-" with or without modifications, provided that this copyright
-" notice is copied with it. Like anything else that's free,
-" Align.vim is provided *as is* and comes with no warranty
-" of any kind, either expressed or implied. By using this
-" plugin, you agree that in no event will the copyright
-" holder be liable for any damages resulting from the use
-" of this software.
-"
-" Romans 1:16,17a : For I am not ashamed of the gospel of Christ, for it is {{{1
-" the power of God for salvation for everyone who believes; for the Jew first,
-" and also for the Greek. For in it is revealed God's righteousness from
-" faith to faith.
-
-" ---------------------------------------------------------------------
-" Load Once: {{{1
-if exists("g:loaded_Align") || &cp
- finish
-endif
-let g:loaded_Align = "v35"
-if v:version < 700
- echohl WarningMsg
- echo "***warning*** this version of Align needs vim 7.0"
- echohl Normal
- finish
-endif
-let s:keepcpo= &cpo
-set cpo&vim
-"DechoTabOn
-
-" ---------------------------------------------------------------------
-" Debugging Support: {{{1
-"if !exists("g:loaded_Decho") | runtime plugin/Decho.vim | endif
-
-" ---------------------------------------------------------------------
-" Options: {{{1
-if !exists("g:Align_xstrlen")
- if &enc == "latin1" || $LANG == "en_US.UTF-8" || !has("multi_byte")
- let g:Align_xstrlen= 0
- else
- let g:Align_xstrlen= 1
- endif
-endif
-
-" ---------------------------------------------------------------------
-" Align#AlignCtrl: enter alignment patterns here {{{1
-"
-" Styles = all alignment-break patterns are equivalent
-" C cycle through alignment-break pattern(s)
-" l left-justified alignment
-" r right-justified alignment
-" c center alignment
-" - skip separator, treat as part of field
-" : treat rest of line as field
-" + repeat previous [lrc] style
-" < left justify separators
-" > right justify separators
-" | center separators
-"
-" Builds = s:AlignPat s:AlignCtrl s:AlignPatQty
-" C s:AlignPat s:AlignCtrl s:AlignPatQty
-" p s:AlignPrePad
-" P s:AlignPostPad
-" w s:AlignLeadKeep
-" W s:AlignLeadKeep
-" I s:AlignLeadKeep
-" l s:AlignStyle
-" r s:AlignStyle
-" - s:AlignStyle
-" + s:AlignStyle
-" : s:AlignStyle
-" c s:AlignStyle
-" g s:AlignGPat
-" v s:AlignVPat
-" < s:AlignSep
-" > s:AlignSep
-" | s:AlignSep
-fun! Align#AlignCtrl(...)
-
-" call Dfunc("AlignCtrl(...) a:0=".a:0)
-
- " save options that will be changed
- let keep_search = @/
- let keep_ic = &ic
-
- " turn ignorecase off
- set noic
-
- " clear visual mode so that old visual-mode selections don't
- " get applied to new invocations of Align().
- if v:version < 602
- if !exists("s:Align_gavemsg")
- let s:Align_gavemsg= 1
- echomsg "Align needs at least Vim version 6.2 to clear visual-mode selection"
- endif
- elseif exists("s:dovisclear")
-" call Decho("clearing visual mode a:0=".a:0." a:1<".a:1.">")
- let clearvmode= visualmode(1)
- endif
-
- " set up a list akin to an argument list
- if a:0 > 0
- let A= s:QArgSplitter(a:1)
- else
- let A=[0]
- endif
-
- if A[0] > 0
- let style = A[1]
-
- " Check for bad separator patterns (zero-length matches)
- " (but zero-length patterns for g/v is ok)
- if style !~# '[gv]'
- let ipat= 2
- while ipat <= A[0]
- if "" =~ A[ipat]
- echoerr "AlignCtrl: separator<".A[ipat]."> matches zero-length string"
- let &ic= keep_ic
-" call Dret("AlignCtrl")
- return
- endif
- let ipat= ipat + 1
- endwhile
- endif
- endif
-
-" call Decho("AlignCtrl() A[0]=".A[0])
- if !exists("s:AlignStyle")
- let s:AlignStyle= "l"
- endif
- if !exists("s:AlignPrePad")
- let s:AlignPrePad= 0
- endif
- if !exists("s:AlignPostPad")
- let s:AlignPostPad= 0
- endif
- if !exists("s:AlignLeadKeep")
- let s:AlignLeadKeep= 'w'
- endif
-
- if A[0] == 0
- " ----------------------
- " List current selection
- " ----------------------
- if !exists("s:AlignPatQty")
- let s:AlignPatQty= 0
- endif
- echo "AlignCtrl<".s:AlignCtrl."> qty=".s:AlignPatQty." AlignStyle<".s:AlignStyle."> Padding<".s:AlignPrePad."|".s:AlignPostPad."> LeadingWS=".s:AlignLeadKeep." AlignSep=".s:AlignSep
-" call Decho("AlignCtrl<".s:AlignCtrl."> qty=".s:AlignPatQty." AlignStyle<".s:AlignStyle."> Padding<".s:AlignPrePad."|".s:AlignPostPad."> LeadingWS=".s:AlignLeadKeep." AlignSep=".s:AlignSep)
- if exists("s:AlignGPat") && !exists("s:AlignVPat")
- echo "AlignGPat<".s:AlignGPat.">"
- elseif !exists("s:AlignGPat") && exists("s:AlignVPat")
- echo "AlignVPat<".s:AlignVPat.">"
- elseif exists("s:AlignGPat") && exists("s:AlignVPat")
- echo "AlignGPat<".s:AlignGPat."> AlignVPat<".s:AlignVPat.">"
- endif
- let ipat= 1
- while ipat <= s:AlignPatQty
- echo "Pat".ipat."<".s:AlignPat_{ipat}.">"
-" call Decho("Pat".ipat."<".s:AlignPat_{ipat}.">")
- let ipat= ipat + 1
- endwhile
-
- else
- " ----------------------------------
- " Process alignment control settings
- " ----------------------------------
-" call Decho("process the alignctrl settings")
-" call Decho("style<".style.">")
-
- if style ==? "default"
- " Default: preserve initial leading whitespace, left-justified,
- " alignment on '=', one space padding on both sides
- if exists("s:AlignCtrlStackQty")
- " clear AlignCtrl stack
- while s:AlignCtrlStackQty > 0
- call Align#AlignPop()
- endwhile
- unlet s:AlignCtrlStackQty
- endif
- " Set AlignCtrl to its default value
- call Align#AlignCtrl("Ilp1P1=<",'=')
- call Align#AlignCtrl("g")
- call Align#AlignCtrl("v")
- let s:dovisclear = 1
- let &ic = keep_ic
- let @/ = keep_search
-" call Dret("AlignCtrl")
- return
- endif
-
- if style =~# 'm'
- " map support: Do an AlignPush now and the next call to Align()
- " will do an AlignPop at exit
-" call Decho("style case m: do AlignPush")
- call Align#AlignPush()
- let s:DoAlignPop= 1
- endif
-
- " = : record a list of alignment patterns that are equivalent
- if style =~# "="
-" call Decho("style case =: record list of equiv alignment patterns")
- let s:AlignCtrl = '='
- if A[0] >= 2
- let s:AlignPatQty= 1
- let s:AlignPat_1 = A[2]
- let ipat = 3
- while ipat <= A[0]
- let s:AlignPat_1 = s:AlignPat_1.'\|'.A[ipat]
- let ipat = ipat + 1
- endwhile
- let s:AlignPat_1= '\('.s:AlignPat_1.'\)'
-" call Decho("AlignCtrl<".s:AlignCtrl."> AlignPat<".s:AlignPat_1.">")
- endif
-
- "c : cycle through alignment pattern(s)
- elseif style =~# 'C'
-" call Decho("style case C: cycle through alignment pattern(s)")
- let s:AlignCtrl = 'C'
- if A[0] >= 2
- let s:AlignPatQty= A[0] - 1
- let ipat = 1
- while ipat < A[0]
- let s:AlignPat_{ipat}= A[ipat+1]
-" call Decho("AlignCtrl<".s:AlignCtrl."> AlignQty=".s:AlignPatQty." AlignPat_".ipat."<".s:AlignPat_{ipat}.">")
- let ipat= ipat + 1
- endwhile
- endif
- endif
-
- if style =~# 'p'
- let s:AlignPrePad= substitute(style,'^.*p\(\d\+\).*$','\1','')
-" call Decho("style case p".s:AlignPrePad.": pre-separator padding")
- if s:AlignPrePad == ""
- echoerr "AlignCtrl: 'p' needs to be followed by a numeric argument'
- let @/ = keep_search
- let &ic= keep_ic
-" call Dret("AlignCtrl")
- return
- endif
- endif
-
- if style =~# 'P'
- let s:AlignPostPad= substitute(style,'^.*P\(\d\+\).*$','\1','')
-" call Decho("style case P".s:AlignPostPad.": post-separator padding")
- if s:AlignPostPad == ""
- echoerr "AlignCtrl: 'P' needs to be followed by a numeric argument'
- let @/ = keep_search
- let &ic= keep_ic
-" call Dret("AlignCtrl")
- return
- endif
- endif
-
- if style =~# 'w'
-" call Decho("style case w: ignore leading whitespace")
- let s:AlignLeadKeep= 'w'
- elseif style =~# 'W'
-" call Decho("style case w: keep leading whitespace")
- let s:AlignLeadKeep= 'W'
- elseif style =~# 'I'
-" call Decho("style case w: retain initial leading whitespace")
- let s:AlignLeadKeep= 'I'
- endif
-
- if style =~# 'g'
- " first list item is a "g" selector pattern
-" call Decho("style case g: global selector pattern")
- if A[0] < 2
- if exists("s:AlignGPat")
- unlet s:AlignGPat
-" call Decho("unlet s:AlignGPat")
- endif
- else
- let s:AlignGPat= A[2]
-" call Decho("s:AlignGPat<".s:AlignGPat.">")
- endif
- elseif style =~# 'v'
- " first list item is a "v" selector pattern
-" call Decho("style case v: global selector anti-pattern")
- if A[0] < 2
- if exists("s:AlignVPat")
- unlet s:AlignVPat
-" call Decho("unlet s:AlignVPat")
- endif
- else
- let s:AlignVPat= A[2]
-" call Decho("s:AlignVPat<".s:AlignVPat.">")
- endif
- endif
-
- "[-lrc+:] : set up s:AlignStyle
- if style =~# '[-lrc+:]'
-" call Decho("style case [-lrc+:]: field justification")
- let s:AlignStyle= substitute(style,'[^-lrc:+]','','g')
-" call Decho("AlignStyle<".s:AlignStyle.">")
- endif
-
- "[<>|] : set up s:AlignSep
- if style =~# '[<>|]'
-" call Decho("style case [-lrc+:]: separator justification")
- let s:AlignSep= substitute(style,'[^<>|]','','g')
-" call Decho("AlignSep ".s:AlignSep)
- endif
- endif
-
- " sanity
- if !exists("s:AlignCtrl")
- let s:AlignCtrl= '='
- endif
-
- " restore search and options
- let @/ = keep_search
- let &ic= keep_ic
-
-" call Dret("AlignCtrl ".s:AlignCtrl.'p'.s:AlignPrePad.'P'.s:AlignPostPad.s:AlignLeadKeep.s:AlignStyle)
- return s:AlignCtrl.'p'.s:AlignPrePad.'P'.s:AlignPostPad.s:AlignLeadKeep.s:AlignStyle
-endfun
-
-" ---------------------------------------------------------------------
-" s:MakeSpace: returns a string with spacecnt blanks {{{1
-fun! s:MakeSpace(spacecnt)
-" call Dfunc("MakeSpace(spacecnt=".a:spacecnt.")")
- let str = ""
- let spacecnt = a:spacecnt
- while spacecnt > 0
- let str = str . " "
- let spacecnt = spacecnt - 1
- endwhile
-" call Dret("MakeSpace <".str.">")
- return str
-endfun
-
-" ---------------------------------------------------------------------
-" Align#Align: align selected text based on alignment pattern(s) {{{1
-fun! Align#Align(hasctrl,...) range
-" call Dfunc("Align#Align(hasctrl=".a:hasctrl.",...) a:0=".a:0)
-
- " sanity checks
- if string(a:hasctrl) != "0" && string(a:hasctrl) != "1"
- echohl Error|echo 'usage: Align#Align(hasctrl<'.a:hasctrl.'> (should be 0 or 1),"separator(s)" (you have '.a:0.') )'|echohl None
-" call Dret("Align#Align")
- return
- endif
- if exists("s:AlignStyle") && s:AlignStyle == ":"
- echohl Error |echo '(Align#Align) your AlignStyle is ":", which implies "do-no-alignment"!'|echohl None
-" call Dret("Align#Align")
- return
- endif
-
- " set up a list akin to an argument list
- if a:0 > 0
- let A= s:QArgSplitter(a:1)
- else
- let A=[0]
- endif
-
- " if :Align! was used, then the first argument is (should be!) an AlignCtrl string
- " Note that any alignment control set this way will be temporary.
- let hasctrl= a:hasctrl
-" call Decho("hasctrl=".hasctrl)
- if a:hasctrl && A[0] >= 1
-" call Decho("Align! : using A[1]<".A[1]."> for AlignCtrl")
- if A[1] =~ '[gv]'
- let hasctrl= hasctrl + 1
- call Align#AlignCtrl('m')
- call Align#AlignCtrl(A[1],A[2])
-" call Decho("Align! : also using A[2]<".A[2]."> for AlignCtrl")
- elseif A[1] !~ 'm'
- call Align#AlignCtrl(A[1]."m")
- else
- call Align#AlignCtrl(A[1])
- endif
- endif
-
- " Check for bad separator patterns (zero-length matches)
- let ipat= 1 + hasctrl
- while ipat <= A[0]
- if "" =~ A[ipat]
- echoerr "Align: separator<".A[ipat]."> matches zero-length string"
-" call Dret("Align#Align")
- return
- endif
- let ipat= ipat + 1
- endwhile
-
- " record current search pattern for subsequent restoration
- let keep_search= @/
- let keep_ic = &ic
- let keep_report= &report
- set noic report=10000
-
- if A[0] > hasctrl
- " Align will accept a list of separator regexps
-" call Decho("A[0]=".A[0].": accepting list of separator regexp")
-
- if s:AlignCtrl =~# "="
- "= : consider all separators to be equivalent
-" call Decho("AlignCtrl: record list of equivalent alignment patterns")
- let s:AlignCtrl = '='
- let s:AlignPat_1 = A[1 + hasctrl]
- let s:AlignPatQty= 1
- let ipat = 2 + hasctrl
- while ipat <= A[0]
- let s:AlignPat_1 = s:AlignPat_1.'\|'.A[ipat]
- let ipat = ipat + 1
- endwhile
- let s:AlignPat_1= '\('.s:AlignPat_1.'\)'
-" call Decho("AlignCtrl<".s:AlignCtrl."> AlignPat<".s:AlignPat_1.">")
-
- elseif s:AlignCtrl =~# 'C'
- "c : cycle through alignment pattern(s)
-" call Decho("AlignCtrl: cycle through alignment pattern(s)")
- let s:AlignCtrl = 'C'
- let s:AlignPatQty= A[0] - hasctrl
- let ipat = 1
- while ipat <= s:AlignPatQty
- let s:AlignPat_{ipat}= A[(ipat + hasctrl)]
-" call Decho("AlignCtrl<".s:AlignCtrl."> AlignQty=".s:AlignPatQty." AlignPat_".ipat."<".s:AlignPat_{ipat}.">")
- let ipat= ipat + 1
- endwhile
- endif
- endif
-
- " Initialize so that begline<endline and begcol<endcol.
- " Ragged right: check if the column associated with '< or '>
- " is greater than the line's string length -> ragged right.
- " Have to be careful about visualmode() -- it returns the last visual
- " mode used whether or not it was used currently.
- let begcol = virtcol("'<")-1
- let endcol = virtcol("'>")-1
- if begcol > endcol
- let begcol = virtcol("'>")-1
- let endcol = virtcol("'<")-1
- endif
-" call Decho("begcol=".begcol." endcol=".endcol)
- let begline = a:firstline
- let endline = a:lastline
- if begline > endline
- let begline = a:lastline
- let endline = a:firstline
- endif
-" call Decho("begline=".begline." endline=".endline)
- let fieldcnt = 0
- if (begline == line("'>") && endline == line("'<")) || (begline == line("'<") && endline == line("'>"))
- let vmode= visualmode()
-" call Decho("vmode=".vmode)
- if vmode == "\<c-v>"
- if exists("g:Align_xstrlen") && g:Align_xstrlen
- let ragged = ( col("'>") > s:Strlen(getline("'>")) || col("'<") > s:Strlen(getline("'<")) )
- else
- let ragged = ( col("'>") > strlen(getline("'>")) || col("'<") > strlen(getline("'<")) )
- endif
- else
- let ragged= 1
- endif
- else
- let ragged= 1
- endif
- if ragged
- let begcol= 0
- endif
-" call Decho("lines[".begline.",".endline."] col[".begcol.",".endcol."] ragged=".ragged." AlignCtrl<".s:AlignCtrl.">")
-
- " Keep user options
- let etkeep = &l:et
- let pastekeep= &l:paste
- setlocal et paste
-
- " convert selected range of lines to use spaces instead of tabs
- " but if first line's initial white spaces are to be retained
- " then use 'em
- if begcol <= 0 && s:AlignLeadKeep == 'I'
- " retain first leading whitespace for all subsequent lines
- let bgntxt= substitute(getline(begline),'^\(\s*\).\{-}$','\1','')
-" call Decho("retaining 1st leading whitespace: bgntxt<".bgntxt.">")
- set noet
- endif
- exe begline.",".endline."ret"
-
- " Execute two passes
- " First pass: collect alignment data (max field sizes)
- " Second pass: perform alignment
- let pass= 1
- while pass <= 2
-" call Decho(" ")
-" call Decho("---- Pass ".pass.": ----")
-
- let line= begline
- while line <= endline
- " Process each line
- let txt = getline(line)
-" call Decho(" ")
-" call Decho("Pass".pass.": Line ".line." <".txt.">")
-
- " AlignGPat support: allows a selector pattern (akin to g/selector/cmd )
- if exists("s:AlignGPat")
-" call Decho("Pass".pass.": AlignGPat<".s:AlignGPat.">")
- if match(txt,s:AlignGPat) == -1
-" call Decho("Pass".pass.": skipping")
- let line= line + 1
- continue
- endif
- endif
-
- " AlignVPat support: allows a selector pattern (akin to v/selector/cmd )
- if exists("s:AlignVPat")
-" call Decho("Pass".pass.": AlignVPat<".s:AlignVPat.">")
- if match(txt,s:AlignVPat) != -1
-" call Decho("Pass".pass.": skipping")
- let line= line + 1
- continue
- endif
- endif
-
- " Always skip blank lines
- if match(txt,'^\s*$') != -1
-" call Decho("Pass".pass.": skipping")
- let line= line + 1
- continue
- endif
-
- " Extract visual-block selected text (init bgntxt, endtxt)
- if exists("g:Align_xstrlen") && g:Align_xstrlen
- let txtlen= s:Strlen(txt)
- else
- let txtlen= strlen(txt)
- endif
- if begcol > 0
- " Record text to left of selected area
- let bgntxt= strpart(txt,0,begcol)
-" call Decho("Pass".pass.": record text to left: bgntxt<".bgntxt.">")
- elseif s:AlignLeadKeep == 'W'
- let bgntxt= substitute(txt,'^\(\s*\).\{-}$','\1','')
-" call Decho("Pass".pass.": retaining all leading ws: bgntxt<".bgntxt.">")
- elseif s:AlignLeadKeep == 'w' || !exists("bgntxt")
- " No beginning text
- let bgntxt= ""
-" call Decho("Pass".pass.": no beginning text")
- endif
- if ragged
- let endtxt= ""
- else
- " Elide any text lying outside selected columnar region
- let endtxt= strpart(txt,endcol+1,txtlen-endcol)
- let txt = strpart(txt,begcol,endcol-begcol+1)
- endif
-" call Decho(" ")
-" call Decho("Pass".pass.": bgntxt<".bgntxt.">")
-" call Decho("Pass".pass.": txt<". txt .">")
-" call Decho("Pass".pass.": endtxt<".endtxt.">")
- if !exists("s:AlignPat_{1}")
- echohl Error|echo "no separators specified!"|echohl None
-" call Dret("Align#Align")
- return
- endif
-
- " Initialize for both passes
- let seppat = s:AlignPat_{1}
- let ifield = 1
- let ipat = 1
- let bgnfield = 0
- let endfield = 0
- let alignstyle = s:AlignStyle
- let doend = 1
- let newtxt = ""
- let alignprepad = s:AlignPrePad
- let alignpostpad= s:AlignPostPad
- let alignsep = s:AlignSep
- let alignophold = " "
- let alignop = "l"
-" call Decho("Pass".pass.": initial alignstyle<".alignstyle."> seppat<".seppat.">")
-
- " Process each field on the line
- while doend > 0
-
- " C-style: cycle through pattern(s)
- if s:AlignCtrl == 'C' && doend == 1
- let seppat = s:AlignPat_{ipat}
-" call Decho("Pass".pass.": processing field: AlignCtrl=".s:AlignCtrl." ipat=".ipat." seppat<".seppat.">")
- let ipat = ipat + 1
- if ipat > s:AlignPatQty
- let ipat = 1
- endif
- endif
-
- " cyclic alignment/justification operator handling
- let alignophold = alignop
- let alignop = strpart(alignstyle,0,1)
- if alignop == '+' || doend == 2
- let alignop= alignophold
- else
- let alignstyle = strpart(alignstyle,1).strpart(alignstyle,0,1)
- let alignopnxt = strpart(alignstyle,0,1)
- if alignop == ':'
- let seppat = '$'
- let doend = 2
-" call Decho("Pass".pass.": alignop<:> case: setting seppat<$> doend==2")
- endif
- endif
-
- " cylic separator alignment specification handling
- let alignsepop= strpart(alignsep,0,1)
- let alignsep = strpart(alignsep,1).alignsepop
-
- " mark end-of-field and the subsequent end-of-separator.
- " Extend field if alignop is '-'
- let endfield = match(txt,seppat,bgnfield)
- let sepfield = matchend(txt,seppat,bgnfield)
- let skipfield= sepfield
-" call Decho("Pass".pass.": endfield=match(txt<".txt.">,seppat<".seppat.">,bgnfield=".bgnfield.")=".endfield)
- while alignop == '-' && endfield != -1
- let endfield = match(txt,seppat,skipfield)
- let sepfield = matchend(txt,seppat,skipfield)
- let skipfield = sepfield
- let alignop = strpart(alignstyle,0,1)
- let alignstyle= strpart(alignstyle,1).strpart(alignstyle,0,1)
-" call Decho("Pass".pass.": extend field: endfield<".strpart(txt,bgnfield,endfield-bgnfield)."> alignop<".alignop."> alignstyle<".alignstyle.">")
- endwhile
- let seplen= sepfield - endfield
-" call Decho("Pass".pass.": seplen=[sepfield=".sepfield."] - [endfield=".endfield."]=".seplen)
-
- if endfield != -1
- if pass == 1
- " ---------------------------------------------------------------------
- " Pass 1: Update FieldSize to max
-" call Decho("Pass".pass.": before lead/trail remove: field<".strpart(txt,bgnfield,endfield-bgnfield).">")
- let field = substitute(strpart(txt,bgnfield,endfield-bgnfield),'^\s*\(.\{-}\)\s*$','\1','')
- if s:AlignLeadKeep == 'W'
- let field = bgntxt.field
- let bgntxt= ""
- endif
- if exists("g:Align_xstrlen") && g:Align_xstrlen
- let fieldlen = s:Strlen(field)
- else
- let fieldlen = strlen(field)
- endif
- let sFieldSize = "FieldSize_".ifield
- if !exists(sFieldSize)
- let FieldSize_{ifield}= fieldlen
-" call Decho("Pass".pass.": set FieldSize_{".ifield."}=".FieldSize_{ifield}." <".field.">")
- elseif fieldlen > FieldSize_{ifield}
- let FieldSize_{ifield}= fieldlen
-" call Decho("Pass".pass.": oset FieldSize_{".ifield."}=".FieldSize_{ifield}." <".field.">")
- endif
- let sSepSize= "SepSize_".ifield
- if !exists(sSepSize)
- let SepSize_{ifield}= seplen
-" call Decho(" set SepSize_{".ifield."}=".SepSize_{ifield}." <".field.">")
- elseif seplen > SepSize_{ifield}
- let SepSize_{ifield}= seplen
-" call Decho("Pass".pass.": oset SepSize_{".ifield."}=".SepSize_{ifield}." <".field.">")
- endif
-
- else
- " ---------------------------------------------------------------------
- " Pass 2: Perform Alignment
- let prepad = strpart(alignprepad,0,1)
- let postpad = strpart(alignpostpad,0,1)
- let alignprepad = strpart(alignprepad,1).strpart(alignprepad,0,1)
- let alignpostpad = strpart(alignpostpad,1).strpart(alignpostpad,0,1)
- let field = substitute(strpart(txt,bgnfield,endfield-bgnfield),'^\s*\(.\{-}\)\s*$','\1','')
- if s:AlignLeadKeep == 'W'
- let field = bgntxt.field
- let bgntxt= ""
- endif
- if doend == 2
- let prepad = 0
- let postpad= 0
- endif
- if exists("g:Align_xstrlen") && g:Align_xstrlen
- let fieldlen = s:Strlen(field)
- else
- let fieldlen = strlen(field)
- endif
- let sep = s:MakeSpace(prepad).strpart(txt,endfield,sepfield-endfield).s:MakeSpace(postpad)
- if seplen < SepSize_{ifield}
- if alignsepop == "<"
- " left-justify separators
- let sep = sep.s:MakeSpace(SepSize_{ifield}-seplen)
- elseif alignsepop == ">"
- " right-justify separators
- let sep = s:MakeSpace(SepSize_{ifield}-seplen).sep
- else
- " center-justify separators
- let sepleft = (SepSize_{ifield} - seplen)/2
- let sepright = SepSize_{ifield} - seplen - sepleft
- let sep = s:MakeSpace(sepleft).sep.s:MakeSpace(sepright)
- endif
- endif
- let spaces = FieldSize_{ifield} - fieldlen
-" call Decho("Pass".pass.": Field #".ifield."<".field."> spaces=".spaces." be[".bgnfield.",".endfield."] pad=".prepad.','.postpad." FS_".ifield."<".FieldSize_{ifield}."> sep<".sep."> ragged=".ragged." doend=".doend." alignop<".alignop.">")
-
- " Perform alignment according to alignment style justification
- if spaces > 0
- if alignop == 'c'
- " center the field
- let spaceleft = spaces/2
- let spaceright= FieldSize_{ifield} - spaceleft - fieldlen
- let newtxt = newtxt.s:MakeSpace(spaceleft).field.s:MakeSpace(spaceright).sep
- elseif alignop == 'r'
- " right justify the field
- let newtxt= newtxt.s:MakeSpace(spaces).field.sep
- elseif ragged && doend == 2
- " left justify rightmost field (no trailing blanks needed)
- let newtxt= newtxt.field
- else
- " left justfiy the field
- let newtxt= newtxt.field.s:MakeSpace(spaces).sep
- endif
- elseif ragged && doend == 2
- " field at maximum field size and no trailing blanks needed
- let newtxt= newtxt.field
- else
- " field is at maximum field size already
- let newtxt= newtxt.field.sep
- endif
-" call Decho("Pass".pass.": newtxt<".newtxt.">")
- endif " pass 1/2
-
- " bgnfield indexes to end of separator at right of current field
- " Update field counter
- let bgnfield= sepfield
- let ifield = ifield + 1
- if doend == 2
- let doend= 0
- endif
- " handle end-of-text as end-of-field
- elseif doend == 1
- let seppat = '$'
- let doend = 2
- else
- let doend = 0
- endif " endfield != -1
- endwhile " doend loop (as well as regularly separated fields)
-
- if pass == 2
- " Write altered line to buffer
-" call Decho("Pass".pass.": bgntxt<".bgntxt."> line=".line)
-" call Decho("Pass".pass.": newtxt<".newtxt.">")
-" call Decho("Pass".pass.": endtxt<".endtxt.">")
- call setline(line,bgntxt.newtxt.endtxt)
- endif
-
- let line = line + 1
- endwhile " line loop
-
- let pass= pass + 1
- endwhile " pass loop
-" call Decho("end of two pass loop")
-
- " Restore user options
- let &l:et = etkeep
- let &l:paste = pastekeep
-
- if exists("s:DoAlignPop")
- " AlignCtrl Map support
- call Align#AlignPop()
- unlet s:DoAlignPop
- endif
-
- " restore current search pattern
- let @/ = keep_search
- let &ic = keep_ic
- let &report = keep_report
-
-" call Dret("Align#Align")
- return
-endfun
-
-" ---------------------------------------------------------------------
-" Align#AlignPush: this command/function pushes an alignment control string onto a stack {{{1
-fun! Align#AlignPush()
-" call Dfunc("AlignPush()")
-
- " initialize the stack
- if !exists("s:AlignCtrlStackQty")
- let s:AlignCtrlStackQty= 1
- else
- let s:AlignCtrlStackQty= s:AlignCtrlStackQty + 1
- endif
-
- " construct an AlignCtrlStack entry
- if !exists("s:AlignSep")
- let s:AlignSep= ''
- endif
- let s:AlignCtrlStack_{s:AlignCtrlStackQty}= s:AlignCtrl.'p'.s:AlignPrePad.'P'.s:AlignPostPad.s:AlignLeadKeep.s:AlignStyle.s:AlignSep
-" call Decho("AlignPush: AlignCtrlStack_".s:AlignCtrlStackQty."<".s:AlignCtrlStack_{s:AlignCtrlStackQty}.">")
-
- " push [GV] patterns onto their own stack
- if exists("s:AlignGPat")
- let s:AlignGPat_{s:AlignCtrlStackQty}= s:AlignGPat
- else
- let s:AlignGPat_{s:AlignCtrlStackQty}= ""
- endif
- if exists("s:AlignVPat")
- let s:AlignVPat_{s:AlignCtrlStackQty}= s:AlignVPat
- else
- let s:AlignVPat_{s:AlignCtrlStackQty}= ""
- endif
-
-" call Dret("AlignPush")
-endfun
-
-" ---------------------------------------------------------------------
-" Align#AlignPop: this command/function pops an alignment pattern from a stack {{{1
-" and into the AlignCtrl variables.
-fun! Align#AlignPop()
-" call Dfunc("Align#AlignPop()")
-
- " sanity checks
- if !exists("s:AlignCtrlStackQty")
- echoerr "AlignPush needs to be used prior to AlignPop"
-" call Dret("Align#AlignPop <> : AlignPush needs to have been called first")
- return ""
- endif
- if s:AlignCtrlStackQty <= 0
- unlet s:AlignCtrlStackQty
- echoerr "AlignPush needs to be used prior to AlignPop"
-" call Dret("Align#AlignPop <> : AlignPop needs to have been called first")
- return ""
- endif
-
- " pop top of AlignCtrlStack and pass value to AlignCtrl
- let retval=s:AlignCtrlStack_{s:AlignCtrlStackQty}
- unlet s:AlignCtrlStack_{s:AlignCtrlStackQty}
- call Align#AlignCtrl(retval)
-
- " pop G pattern stack
- if s:AlignGPat_{s:AlignCtrlStackQty} != ""
- call Align#AlignCtrl('g',s:AlignGPat_{s:AlignCtrlStackQty})
- else
- call Align#AlignCtrl('g')
- endif
- unlet s:AlignGPat_{s:AlignCtrlStackQty}
-
- " pop V pattern stack
- if s:AlignVPat_{s:AlignCtrlStackQty} != ""
- call Align#AlignCtrl('v',s:AlignVPat_{s:AlignCtrlStackQty})
- else
- call Align#AlignCtrl('v')
- endif
-
- unlet s:AlignVPat_{s:AlignCtrlStackQty}
- let s:AlignCtrlStackQty= s:AlignCtrlStackQty - 1
-
-" call Dret("Align#AlignPop <".retval."> : AlignCtrlStackQty=".s:AlignCtrlStackQty)
- return retval
-endfun
-
-" ---------------------------------------------------------------------
-" Align#AlignReplaceQuotedSpaces: {{{1
-fun! Align#AlignReplaceQuotedSpaces()
-" call Dfunc("AlignReplaceQuotedSpaces()")
-
- let l:line = getline(line("."))
- if exists("g:Align_xstrlen") && g:Align_xstrlen
- let l:linelen = s:Strlen(l:line)
- else
- let l:linelen = strlen(l:line)
- endif
- let l:startingPos = 0
- let l:startQuotePos = 0
- let l:endQuotePos = 0
- let l:spacePos = 0
- let l:quoteRe = '\\\@<!"'
-
-" "call Decho("in replace spaces. line=" . line('.'))
- while (1)
- let l:startQuotePos = match(l:line, l:quoteRe, l:startingPos)
- if (l:startQuotePos < 0)
-" "call Decho("No more quotes to the end of line")
- break
- endif
- let l:endQuotePos = match(l:line, l:quoteRe, l:startQuotePos + 1)
- if (l:endQuotePos < 0)
-" "call Decho("Mismatched quotes")
- break
- endif
- let l:spaceReplaceRe = '^.\{' . (l:startQuotePos + 1) . '}.\{-}\zs\s\ze.*.\{' . (linelen - l:endQuotePos) . '}$'
-" "call Decho('spaceReplaceRe="' . l:spaceReplaceRe . '"')
- let l:newStr = substitute(l:line, l:spaceReplaceRe, '%', '')
- while (l:newStr != l:line)
-" "call Decho('newstr="' . l:newStr . '"')
- let l:line = l:newStr
- let l:newStr = substitute(l:line, l:spaceReplaceRe, '%', '')
- endwhile
- let l:startingPos = l:endQuotePos + 1
- endwhile
- call setline(line('.'), l:line)
-
-" call Dret("AlignReplaceQuotedSpaces")
-endfun
-
-" ---------------------------------------------------------------------
-" s:QArgSplitter: to avoid \ processing by <f-args>, <q-args> is needed. {{{1
-" However, <q-args> doesn't split at all, so this function returns a list
-" of arguments which has been:
-" * split at whitespace
-" * unless inside "..."s. One may escape characters with a backslash inside double quotes.
-" along with a leading length-of-list.
-"
-" Examples: %Align "\"" will align on "s
-" %Align " " will align on spaces
-"
-" The resulting list: qarglist[0] corresponds to a:0
-" qarglist[i] corresponds to a:{i}
-fun! s:QArgSplitter(qarg)
-" call Dfunc("s:QArgSplitter(qarg<".a:qarg.">)")
-
- if a:qarg =~ '".*"'
- " handle "..." args, which may include whitespace
- let qarglist = []
- let args = a:qarg
-" call Decho("handle quoted arguments: args<".args.">")
- while args != ""
- let iarg = 0
- let arglen = strlen(args)
-" call Decho("args[".iarg."]<".args[iarg]."> arglen=".arglen)
- " find index to first not-escaped '"'
- while args[iarg] != '"' && iarg < arglen
- if args[iarg] == '\'
- let args= strpart(args,1)
- endif
- let iarg= iarg + 1
- endwhile
-" call Decho("args<".args."> iarg=".iarg." arglen=".arglen)
-
- if iarg > 0
- " handle left of quote or remaining section
-" call Decho("handle left of quote or remaining section")
- if args[iarg] == '"'
- let qarglist= qarglist + split(strpart(args,0,iarg-1))
- else
- let qarglist= qarglist + split(strpart(args,0,iarg))
- endif
- let args = strpart(args,iarg)
- let arglen = strlen(args)
-
- elseif iarg < arglen && args[0] == '"'
- " handle "quoted" section
-" call Decho("handle quoted section")
- let iarg= 1
- while args[iarg] != '"' && iarg < arglen
- if args[iarg] == '\'
- let args= strpart(args,1)
- endif
- let iarg= iarg + 1
- endwhile
-" call Decho("args<".args."> iarg=".iarg." arglen=".arglen)
- if args[iarg] == '"'
- call add(qarglist,strpart(args,1,iarg-1))
- let args= strpart(args,iarg+1)
- else
- let qarglist = qarglist + split(args)
- let args = ""
- endif
- endif
-" call Decho("qarglist".string(qarglist)." iarg=".iarg." args<".args.">")
- endwhile
-
- else
- " split at all whitespace
- let qarglist= split(a:qarg)
- endif
-
- let qarglistlen= len(qarglist)
- let qarglist = insert(qarglist,qarglistlen)
-" call Dret("s:QArgSplitter ".string(qarglist))
- return qarglist
-endfun
-
-" ---------------------------------------------------------------------
-" s:Strlen: this function returns the length of a string, even if its {{{1
-" using two-byte etc characters.
-" Currently, its only used if g:Align_xstrlen is set to a
-" nonzero value. Solution from Nicolai Weibull, vim docs
-" (:help strlen()), Tony Mechelynck, and my own invention.
-fun! s:Strlen(x)
-" call Dfunc("s:Strlen(x<".a:x.">")
- if g:Align_xstrlen == 1
- " number of codepoints (Latin a + combining circumflex is two codepoints)
- " (comment from TM, solution from NW)
- let ret= strlen(substitute(a:x,'.','c','g'))
-
- elseif g:Align_xstrlen == 2
- " number of spacing codepoints (Latin a + combining circumflex is one spacing
- " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
- " (comment from TM, solution from TM)
- let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
-
- elseif g:Align_xstrlen == 3
- " virtual length (counting, for instance, tabs as anything between 1 and
- " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
- " preceded by lam, one otherwise, etc.)
- " (comment from TM, solution from me)
- let modkeep= &l:mod
- exe "norm! o\<esc>"
- call setline(line("."),a:x)
- let ret= virtcol("$") - 1
- d
- let &l:mod= modkeep
-
- else
- " at least give a decent default
- ret= strlen(a:x)
- endif
-" call Dret("s:Strlen ".ret)
- return ret
-endfun
-
-" ---------------------------------------------------------------------
-" Set up default values: {{{1
-"call Decho("-- Begin AlignCtrl Initialization --")
-call Align#AlignCtrl("default")
-"call Decho("-- End AlignCtrl Initialization --")
-
-" ---------------------------------------------------------------------
-" Restore: {{{1
-let &cpo= s:keepcpo
-unlet s:keepcpo
-" vim: ts=4 fdm=marker
+++ /dev/null
-" AlignMaps.vim : support functions for AlignMaps
-" Author: Charles E. Campbell, Jr.
-" Date: Mar 03, 2009
-" Version: 41
-" ---------------------------------------------------------------------
-" Load Once: {{{1
-if &cp || exists("g:loaded_AlignMaps")
- finish
-endif
-let g:loaded_AlignMaps= "v41"
-let s:keepcpo = &cpo
-set cpo&vim
-
-" =====================================================================
-" Functions: {{{1
-
-" ---------------------------------------------------------------------
-" AlignMaps#WrapperStart: {{{2
-fun! AlignMaps#WrapperStart(vis) range
-" call Dfunc("AlignMaps#WrapperStart(vis=".a:vis.")")
-
- if a:vis
- norm! '<ma'>
- endif
-
- if line("'y") == 0 || line("'z") == 0 || !exists("s:alignmaps_wrapcnt") || s:alignmaps_wrapcnt <= 0
-" call Decho("wrapper initialization")
- let s:alignmaps_wrapcnt = 1
- let s:alignmaps_keepgd = &gdefault
- let s:alignmaps_keepsearch = @/
- let s:alignmaps_keepch = &ch
- let s:alignmaps_keepmy = SaveMark("'y")
- let s:alignmaps_keepmz = SaveMark("'z")
- let s:alignmaps_posn = SaveWinPosn(0)
- " set up fencepost blank lines
- put =''
- norm! mz'a
- put! =''
- ky
- let s:alignmaps_zline = line("'z")
- exe "'y,'zs/@/\177/ge"
- else
-" call Decho("embedded wrapper")
- let s:alignmaps_wrapcnt = s:alignmaps_wrapcnt + 1
- norm! 'yjma'zk
- endif
-
- " change some settings to align-standard values
- set nogd
- set ch=2
- AlignPush
- norm! 'zk
-" call Dret("AlignMaps#WrapperStart : alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
-endfun
-
-" ---------------------------------------------------------------------
-" AlignMaps#WrapperEnd: {{{2
-fun! AlignMaps#WrapperEnd() range
-" call Dfunc("AlignMaps#WrapperEnd() alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
-
- " remove trailing white space introduced by whatever in the modification zone
- 'y,'zs/ \+$//e
-
- " restore AlignCtrl settings
- AlignPop
-
- let s:alignmaps_wrapcnt= s:alignmaps_wrapcnt - 1
- if s:alignmaps_wrapcnt <= 0
- " initial wrapper ending
- exe "'y,'zs/\177/@/ge"
-
- " if the 'z line hasn't moved, then go ahead and restore window position
- let zstationary= s:alignmaps_zline == line("'z")
-
- " remove fencepost blank lines.
- " restore 'a
- norm! 'yjmakdd'zdd
-
- " restore original 'y, 'z, and window positioning
- call RestoreMark(s:alignmaps_keepmy)
- call RestoreMark(s:alignmaps_keepmz)
- if zstationary > 0
- call RestoreWinPosn(s:alignmaps_posn)
-" call Decho("restored window positioning")
- endif
-
- " restoration of options
- let &gd= s:alignmaps_keepgd
- let &ch= s:alignmaps_keepch
- let @/ = s:alignmaps_keepsearch
-
- " remove script variables
- unlet s:alignmaps_keepch
- unlet s:alignmaps_keepsearch
- unlet s:alignmaps_keepmy
- unlet s:alignmaps_keepmz
- unlet s:alignmaps_keepgd
- unlet s:alignmaps_posn
- endif
-
-" call Dret("AlignMaps#WrapperEnd : alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
-endfun
-
-" ---------------------------------------------------------------------
-" AlignMaps#StdAlign: some semi-standard align calls {{{2
-fun! AlignMaps#StdAlign(mode) range
-" call Dfunc("AlignMaps#StdAlign(mode=".a:mode.")")
- if a:mode == 1
- " align on @
-" call Decho("align on @")
- AlignCtrl mIp1P1=l @
- 'a,.Align
- elseif a:mode == 2
- " align on @, retaining all initial white space on each line
-" call Decho("align on @, retaining all initial white space on each line")
- AlignCtrl mWp1P1=l @
- 'a,.Align
- elseif a:mode == 3
- " like mode 2, but ignore /* */-style comments
-" call Decho("like mode 2, but ignore /* */-style comments")
- AlignCtrl v ^\s*/[/*]
- AlignCtrl mWp1P1=l @
- 'a,.Align
- else
- echoerr "(AlignMaps) AlignMaps#StdAlign doesn't support mode#".a:mode
- endif
-" call Dret("AlignMaps#StdAlign")
-endfun
-
-" ---------------------------------------------------------------------
-" AlignMaps#CharJoiner: joins lines which end in the given character (spaces {{{2
-" at end are ignored)
-fun! AlignMaps#CharJoiner(chr)
-" call Dfunc("AlignMaps#CharJoiner(chr=".a:chr.")")
- let aline = line("'a")
- let rep = line(".") - aline
- while rep > 0
- norm! 'a
- while match(getline(aline),a:chr . "\s*$") != -1 && rep >= 0
- " while = at end-of-line, delete it and join with next
- norm! 'a$
- j!
- let rep = rep - 1
- endwhile
- " update rep(eat) count
- let rep = rep - 1
- if rep <= 0
- " terminate loop if at end-of-block
- break
- endif
- " prepare for next line
- norm! jma
- let aline = line("'a")
- endwhile
-" call Dret("AlignMaps#CharJoiner")
-endfun
-
-" ---------------------------------------------------------------------
-" AlignMaps#Equals: supports \t= and \T= {{{2
-fun! AlignMaps#Equals() range
-" call Dfunc("AlignMaps#Equals()")
- 'a,'zs/\s\+\([*/+\-%|&\~^]\==\)/ \1/e
- 'a,'zs@ \+\([*/+\-%|&\~^]\)=@\1=@ge
- 'a,'zs/==/\="\<Char-0x0f>\<Char-0x0f>"/ge
- 'a,'zs/\([!<>:]\)=/\=submatch(1)."\<Char-0x0f>"/ge
- norm g'zk
- AlignCtrl mIp1P1=l =
- AlignCtrl g =
- 'a,'z-1Align
- 'a,'z-1s@\([*/+\-%|&\~^!=]\)\( \+\)=@\2\1=@ge
- 'a,'z-1s/\( \+\);/;\1/ge
- if &ft == "c" || &ft == "cpp"
-" call Decho("exception for ".&ft)
- 'a,'z-1v/^\s*\/[*/]/s/\/[*/]/@&@/e
- 'a,'z-1v/^\s*\/[*/]/s/\*\//@&/e
- if exists("g:mapleader")
- exe "norm 'zk"
- call AlignMaps#StdAlign(1)
- else
- exe "norm 'zk"
- call AlignMaps#StdAlign(1)
- endif
- 'y,'zs/^\(\s*\) @/\1/e
- endif
- 'a,'z-1s/\%x0f/=/ge
- 'y,'zs/ @//eg
-" call Dret("AlignMaps#Equals")
-endfun
-
-" ---------------------------------------------------------------------
-" AlignMaps#Afnc: useful for splitting one-line function beginnings {{{2
-" into one line per argument format
-fun! AlignMaps#Afnc()
-" call Dfunc("AlignMaps#Afnc()")
-
- " keep display quiet
- let chkeep = &ch
- let gdkeep = &gd
- let vekeep = &ve
- set ch=2 nogd ve=
-
- " will use marks y,z ; save current values
- let mykeep = SaveMark("'y")
- let mzkeep = SaveMark("'z")
-
- " Find beginning of function -- be careful to skip over comments
- let cmmntid = synIDtrans(hlID("Comment"))
- let stringid = synIDtrans(hlID("String"))
- exe "norm! ]]"
- while search(")","bW") != 0
-" call Decho("line=".line(".")." col=".col("."))
- let parenid= synIDtrans(synID(line("."),col("."),1))
- if parenid != cmmntid && parenid != stringid
- break
- endif
- endwhile
- norm! %my
- s/(\s*\(\S\)/(\r \1/e
- exe "norm! `y%"
- s/)\s*\(\/[*/]\)/)\r\1/e
- exe "norm! `y%mz"
- 'y,'zs/\s\+$//e
- 'y,'zs/^\s\+//e
- 'y+1,'zs/^/ /
-
- " insert newline after every comma only one parenthesis deep
- sil! exe "norm! `y\<right>h"
- let parens = 1
- let cmmnt = 0
- let cmmntline= -1
- while parens >= 1
-" call Decho("parens=".parens." @a=".@a)
- exe 'norm! ma "ay`a '
- if @a == "("
- let parens= parens + 1
- elseif @a == ")"
- let parens= parens - 1
-
- " comment bypass: /* ... */ or //...
- elseif cmmnt == 0 && @a == '/'
- let cmmnt= 1
- elseif cmmnt == 1
- if @a == '/'
- let cmmnt = 2 " //...
- let cmmntline= line(".")
- elseif @a == '*'
- let cmmnt= 3 " /*...
- else
- let cmmnt= 0
- endif
- elseif cmmnt == 2 && line(".") != cmmntline
- let cmmnt = 0
- let cmmntline= -1
- elseif cmmnt == 3 && @a == '*'
- let cmmnt= 4
- elseif cmmnt == 4
- if @a == '/'
- let cmmnt= 0 " ...*/
- elseif @a != '*'
- let cmmnt= 3
- endif
-
- elseif @a == "," && parens == 1 && cmmnt == 0
- exe "norm! i\<CR>\<Esc>"
- endif
- endwhile
- norm! `y%mz%
- sil! 'y,'zg/^\s*$/d
-
- " perform substitutes to mark fields for Align
- sil! 'y+1,'zv/^\//s/^\s\+\(\S\)/ \1/e
- sil! 'y+1,'zv/^\//s/\(\S\)\s\+/\1 /eg
- sil! 'y+1,'zv/^\//s/\* \+/*/ge
- sil! 'y+1,'zv/^\//s/\w\zs\s*\*/ */ge
- " func
- " ws <- declaration -> <-ptr -> <-var-> <-[array][] -> <-glop-> <-end->
- sil! 'y+1,'zv/^\//s/^\s*\(\(\K\k*\s*\)\+\)\s\+\([(*]*\)\s*\(\K\k*\)\s*\(\(\[.\{-}]\)*\)\s*\(.\{-}\)\=\s*\([,)]\)\s*$/ \1@#\3@\4\5@\7\8/e
- sil! 'y+1,'z+1g/^\s*\/[*/]/norm! kJ
- sil! 'y+1,'z+1s%/[*/]%@&@%ge
- sil! 'y+1,'z+1s%*/%@&%ge
- AlignCtrl mIp0P0=l @
- sil! 'y+1,'zAlign
- sil! 'y,'zs%@\(/[*/]\)@%\t\1 %e
- sil! 'y,'zs%@\*/% */%e
- sil! 'y,'zs/@\([,)]\)/\1/
- sil! 'y,'zs/@/ /
- AlignCtrl mIlrp0P0= # @
- sil! 'y+1,'zAlign
- sil! 'y+1,'zs/#/ /
- sil! 'y+1,'zs/@//
- sil! 'y+1,'zs/\(\s\+\)\([,)]\)/\2\1/e
-
- " Restore
- call RestoreMark(mykeep)
- call RestoreMark(mzkeep)
- let &ch= chkeep
- let &gd= gdkeep
- let &ve= vekeep
-
-" call Dret("AlignMaps#Afnc")
-endfun
-
-" ---------------------------------------------------------------------
-" AlignMaps#FixMultiDec: converts a type arg,arg,arg; line to multiple lines {{{2
-fun! AlignMaps#FixMultiDec()
-" call Dfunc("AlignMaps#FixMultiDec()")
-
- " save register x
- let xkeep = @x
- let curline = getline(".")
-" call Decho("curline<".curline.">")
-
- " Get the type. I'm assuming one type per line (ie. int x; double y; on one line will not be handled properly)
- let @x=substitute(curline,'^\(\s*[a-zA-Z_ \t][a-zA-Z0-9_ \t]*\)\s\+[(*]*\h.*$','\1','')
-" call Decho("@x<".@x.">")
-
- " transform line
- exe 's/,/;\r'.@x.' /ge'
-
- "restore register x
- let @x= xkeep
-
-" call Dret("AlignMaps#FixMultiDec : my=".line("'y")." mz=".line("'z"))
-endfun
-
-" ---------------------------------------------------------------------
-" Restore: {{{1
-let &cpo= s:keepcpo
-unlet s:keepcpo
-" vim: ts=4 fdm=marker
+++ /dev/null
-" ZoomWin: Brief-like ability to zoom into/out-of a window
-" Author: Charles Campbell
-" original version by Ron Aaron
-" Date: Jan 26, 2009
-" Version: 23
-" History: see :help zoomwin-history {{{1
-" GetLatestVimScripts: 508 1 :AutoInstall: ZoomWin.vim
-
-" ---------------------------------------------------------------------
-" Load Once: {{{1
-if &cp || exists("g:loaded_ZoomWin")
- finish
-endif
-if v:version < 702
- echohl WarningMsg
- echo "***warning*** this version of ZoomWin needs vim 7.2"
- echohl Normal
- finish
-endif
-let s:keepcpo = &cpo
-let g:loaded_ZoomWin = "v23"
-set cpo&vim
-"DechoTabOn
-
-" =====================================================================
-" Functions: {{{1
-
-" ---------------------------------------------------------------------
-" ZoomWin#ZoomWin: toggles between a single-window and a multi-window layout {{{2
-" The original version was by Ron Aaron.
-fun! ZoomWin#ZoomWin()
-" let g:decho_hide= 1 "Decho
-" call Dfunc("ZoomWin#ZoomWin() winbufnr(2)=".winbufnr(2))
-
- " if the vim doesn't have +mksession, only a partial zoom is available {{{3
- if !has("mksession")
- if !exists("s:partialzoom")
- echomsg "missing the +mksession feature; only a partial zoom is available"
- let s:partialzoom= 0
- endif
- if v:version < 630
- echoerr "***sorry*** you need an updated vim, preferably with +mksession"
- elseif s:partialzoom
- " partial zoom out
- let s:partialzoom= 0
- exe s:winrestore
- else
- " partial zoom in
- let s:partialzoom= 1
- let s:winrestore = winrestcmd()
- res
- endif
-" call Dret("ZoomWin#ZoomWin : partialzoom=".s:partialzoom)
- return
- endif
-
- " Close certain windows {{{3
- call s:ZoomWinPreserve(0)
-
- " save options. Force window minimum height/width to be >= 1 {{{3
- let keep_hidden = &hidden
- let keep_write = &write
-
- if v:version < 603
- if &wmh == 0 || &wmw == 0
- let keep_wmh = &wmh
- let keep_wmw = &wmw
- silent! set wmh=1 wmw=1
- endif
- endif
- set hidden write
-
- if winbufnr(2) == -1
- " there's only one window - restore to multiple-windows mode {{{3
-" call Decho("there's only one window - restore to multiple windows")
-
- if exists("s:sessionfile") && filereadable(s:sessionfile)
- " save position in current one-window-only
-" call Decho("save position in current one-window-only in sponly")
- let sponly = s:SavePosn(0)
- let s:origline = line(".")
- let s:origcol = virtcol(".")
-
- " source session file to restore window layout
- let ei_keep= &ei
- set ei=all
- exe 'silent! so '.fnameescape(s:sessionfile)
-" Decho("@@<".@@.">")
- let v:this_session= s:sesskeep
-
- if exists("s:savedposn1")
- " restore windows' positioning and buffers
-" call Decho("restore windows, positions, buffers")
- windo call s:RestorePosn(s:savedposn{winnr()})|unlet s:savedposn{winnr()}
- call s:GotoWinNum(s:winkeep)
- unlet s:winkeep
- endif
-
- if line(".") != s:origline || virtcol(".") != s:origcol
- " If the cursor hasn't moved from the original position,
- " then let the position remain what it was in the original
- " multi-window layout.
-" call Decho("restore position using sponly")
- call s:RestorePosn(sponly)
- endif
-
- " delete session file and variable holding its name
-" call Decho("delete session file")
- call delete(s:sessionfile)
- unlet s:sessionfile
- let &ei=ei_keep
- endif
-
- else " there's more than one window - go to only-one-window mode {{{3
-" call Decho("there's multiple windows - goto one-window-only")
-
- let s:winkeep = winnr()
- let s:sesskeep = v:this_session
-
- " doesn't work with the command line window (normal mode q:)
- if &bt == "nofile" && expand("%") == (v:version < 702 ? 'command-line' : '[Command Line]')
- echoerr "***error*** ZoomWin#ZoomWin doesn't work with the ".expand("%")." window"
-" call Dret("ZoomWin#ZoomWin : ".expand('%')." window error")
- return
- endif
-" call Decho("1: @@<".@@.">")
-
- " disable all events (autocmds)
-" call Decho("disable events")
- let ei_keep= &ei
- set ei=all
-" call Decho("2: @@<".@@.">")
-
- " save window positioning commands
-" call Decho("save window positioning commands")
- windo let s:savedposn{winnr()}= s:SavePosn(1)
- call s:GotoWinNum(s:winkeep)
-
- " set up name of session file
-" call Decho("3: @@<".@@.">")
- let s:sessionfile= tempname()
-" call Decho("4: @@<".@@.">")
-
- " save session
-" call Decho("save session")
- let ssop_keep = &ssop
- let &ssop = 'blank,help,winsize,folds,globals,localoptions,options'
-" call Decho("5: @@<".@@.">")
- exe 'mksession! '.fnameescape(s:sessionfile)
-" call Decho("6: @@<".@@.">")
- let keepyy= @@
- let keepy0= @0
- let keepy1= @1
- let keepy2= @2
- let keepy3= @3
- let keepy4= @4
- let keepy5= @5
- let keepy6= @6
- let keepy7= @7
- let keepy8= @8
- let keepy9= @9
- set lz ei=all bh=
- if v:version >= 700
- try
- exe "keepalt keepmarks new! ".fnameescape(s:sessionfile)
- catch /^Vim\%((\a\+)\)\=:E/
- echoerr "Too many windows"
- silent! call delete(s:sessionfile)
- unlet s:sessionfile
-" call Dret("ZoomWin#ZoomWin : too many windows")
- return
- endtry
- silent! keepjumps keepmarks v/wincmd\|split\|resize/d
- keepalt w!
- keepalt bw!
- else
- exe "new! ".fnameescape(s:sessionfile)
- v/wincmd\|split\|resize/d
- w!
- bw!
- endif
- let @@= keepyy
- let @0= keepy0
- let @1= keepy1
- let @2= keepy2
- let @3= keepy3
- let @4= keepy4
- let @5= keepy5
- let @6= keepy6
- let @7= keepy7
- let @8= keepy8
- let @9= keepy9
- call histdel('search', -1)
- let @/ = histget('search', -1)
-" call Decho("7: @@<".@@.">")
-
- " restore user's session options and restore event handling
-" call Decho("restore user session options and event handling")
- set nolz
- let &ssop = ssop_keep
- silent! only!
-" call Decho("8: @@<".@@.">")
- let &ei = ei_keep
- echomsg expand("%")
-" call Decho("9: @@<".@@.">")
- endif
-
- " restore user option settings {{{3
-" call Decho("restore user option settings")
- let &hidden= keep_hidden
- let &write = keep_write
- if v:version < 603
- if exists("keep_wmw")
- let &wmh= keep_wmh
- let &wmw= keep_wmw
- endif
- endif
-
- " Re-open certain windows {{{3
- call s:ZoomWinPreserve(1)
-
-" call Dret("ZoomWin#ZoomWin")
-endfun
-
-" ---------------------------------------------------------------------
-" SavePosn: this function sets up a savedposn variable that {{{2
-" has the commands necessary to restore the view
-" of the current window.
-fun! s:SavePosn(savewinhoriz)
-" call Dfunc("SavePosn(savewinhoriz=".a:savewinhoriz.") file<".expand("%").">")
- let swline = line(".")
- if swline == 1 && getline(1) == ""
- " empty buffer
- let savedposn= "silent b ".winbufnr(0)
-" call Dret("SavePosn savedposn<".savedposn.">")
- return savedposn
- endif
- let swcol = col(".")
- let swwline = winline()-1
- let swwcol = virtcol(".") - wincol()
- let savedposn = "silent b ".winbufnr(0)."|".swline."|silent norm! z\<cr>"
- if swwline > 0
- let savedposn= savedposn.":silent norm! ".swwline."\<c-y>\<cr>:silent norm! zs\<cr>"
- endif
- let savedposn= savedposn.":silent call cursor(".swline.",".swcol.")\<cr>"
-
- if a:savewinhoriz
- if swwcol > 0
- let savedposn= savedposn.":silent norm! ".swwcol."zl\<cr>"
- endif
-
- " handle certain special settings for the multi-window savedposn call
- " bufhidden buftype buflisted
- let settings= ""
- if &bh != ""
- let settings="bh=".&bh
- setlocal bh=hide
- endif
- if !&bl
- let settings= settings." nobl"
- setlocal bl
- endif
- if &bt != ""
- let settings= settings." bt=".&bt
- setlocal bt=
- endif
- if settings != ""
- let savedposn= savedposn.":setlocal ".settings."\<cr>"
- endif
-
- endif
-" call Dret("SavePosn savedposn<".savedposn.">")
- return savedposn
-endfun
-
-" ---------------------------------------------------------------------
-" s:RestorePosn: this function restores noname and scratch windows {{{2
-fun! s:RestorePosn(savedposn)
-" call Dfunc("RestorePosn(savedposn<".a:savedposn.">) file<".expand("%").">")
- if &scb
- setlocal noscb
- exe a:savedposn
- setlocal scb
- else
- exe a:savedposn
- endif
-" call Dret("RestorePosn")
-endfun
-
-" ---------------------------------------------------------------------
-" CleanupSessionFile: if you exit Vim before cleaning up the {{{2
-" supposed-to-be temporary session file
-fun! ZoomWin#CleanupSessionFile()
-" call Dfunc("ZoomWin#CleanupSessionFile()")
- if exists("s:sessionfile") && filereadable(s:sessionfile)
-" call Decho("sessionfile exists and is readable; deleting it")
- silent! call delete(s:sessionfile)
- unlet s:sessionfile
- endif
-" call Dret("ZoomWin#CleanupSessionFile")
-endfun
-
-" ---------------------------------------------------------------------
-" GotoWinNum: this function puts cursor into specified window {{{2
-fun! s:GotoWinNum(winnum)
-" call Dfunc("GotoWinNum(winnum=".a:winnum.") winnr=".winnr())
- if a:winnum != winnr()
- exe a:winnum."wincmd w"
- endif
-" call Dret("GotoWinNum")
-endfun
-
-
-" ---------------------------------------------------------------------
-" ZoomWinPreserve: This function, largely written by David Fishburn, {{{2
-" allows ZoomWin to "preserve" certain windows:
-"
-" TagList, by Yegappan Lakshmanan
-" http://vim.sourceforge.net/scripts/script.php?script_id=273
-"
-" WinManager, by Srinath Avadhanula
-" http://vim.sourceforge.net/scripts/script.php?script_id=95
-"
-" It does so by closing the associated window upon entry to ZoomWin
-" and re-opening it upon exit by using commands provided by the
-" utilities themselves.
-fun! s:ZoomWinPreserve(open)
-" call Dfunc("ZoomWinPreserve(open=".a:open.")")
-
- if a:open == 0
-
- " Close Taglist
- if exists('g:zoomwin_preserve_taglist') && exists('g:loaded_taglist')
- " If taglist window is open then close it.
- let s:taglist_winnum = bufwinnr(g:TagList_title)
- if s:taglist_winnum != -1
- " Close the window
- exec "silent! Tlist"
- endif
- endif
-
- " Close Winmanager
- if exists('g:zoomwin_preserve_winmanager') && exists('g:loaded_winmanager')
- " If the winmanager window is open then close it.
- let s:is_winmgr_vis = IsWinManagerVisible()
- if s:is_winmgr_vis == 1
- exec "WMClose"
- endif
- endif
-
- else
-
- " Re-open Taglist
- if exists('g:zoomwin_preserve_taglist') && exists('g:loaded_taglist')
- " If taglist window was open, open it again
- if s:taglist_winnum != -1
- exec "silent! Tlist"
- endif
- endif
-
- " Re-Open Winmanager
- if exists('g:zoomwin_preserve_winmanager') && exists('g:loaded_winmanager')
- " If the winmanager window is open then close it.
- if s:is_winmgr_vis == 1
- exec "WManager"
- endif
- endif
- endif
-
-" call Dret("ZoomWinPreserve")
-endfun
-
-" =====================================================================
-" Restore: {{{1
-let &cpo= s:keepcpo
-unlet s:keepcpo
-
-" ---------------------------------------------------------------------
-" Modelines: {{{1
-" vim: ts=4 fdm=marker
+++ /dev/null
-" File: autoload/delimitMate.vim
-" Version: 2.6
-" Modified: 2011-01-14
-" Description: This plugin provides auto-completion for quotes, parens, etc.
-" Maintainer: Israel Chauca F. <israelchauca@gmail.com>
-" Manual: Read ":help delimitMate".
-" ============================================================================
-
-" Utilities {{{
-
-let delimitMate_loaded = 1
-
-function! delimitMate#ShouldJump() "{{{
- " Returns 1 if the next character is a closing delimiter.
- let col = col('.')
- let lcol = col('$')
- let char = getline('.')[col - 1]
-
- " Closing delimiter on the right.
- for cdel in b:_l_delimitMate_right_delims + b:_l_delimitMate_quotes_list
- if char == cdel
- return 1
- endif
- endfor
-
- " Closing delimiter with space expansion.
- let nchar = getline('.')[col]
- if b:_l_delimitMate_expand_space && char == " "
- for cdel in b:_l_delimitMate_right_delims + b:_l_delimitMate_quotes_list
- if nchar == cdel
- return 1
- endif
- endfor
- endif
-
- " Closing delimiter with CR expansion.
- let uchar = getline(line('.') + 1)[0]
- if b:_l_delimitMate_expand_cr && char == ""
- for cdel in b:_l_delimitMate_right_delims + b:_l_delimitMate_quotes_list
- if uchar == cdel
- return 1
- endif
- endfor
- endif
-
- return 0
-endfunction "}}}
-
-function! delimitMate#IsEmptyPair(str) "{{{
- for pair in b:_l_delimitMate_matchpairs_list
- if a:str == join( split( pair, ':' ),'' )
- return 1
- endif
- endfor
- for quote in b:_l_delimitMate_quotes_list
- if a:str == quote . quote
- return 1
- endif
- endfor
- return 0
-endfunction "}}}
-
-function! delimitMate#IsCRExpansion() " {{{
- let nchar = getline(line('.')-1)[-1:]
- let schar = getline(line('.')+1)[:0]
- let isEmpty = getline('.') == ""
- if index(b:_l_delimitMate_left_delims, nchar) > -1 &&
- \ index(b:_l_delimitMate_left_delims, nchar) == index(b:_l_delimitMate_right_delims, schar) &&
- \ isEmpty
- return 1
- elseif index(b:_l_delimitMate_quotes_list, nchar) > -1 &&
- \ index(b:_l_delimitMate_quotes_list, nchar) == index(b:_l_delimitMate_quotes_list, schar) &&
- \ isEmpty
- return 1
- else
- return 0
- endif
-endfunction " }}} delimitMate#IsCRExpansion()
-
-function! delimitMate#IsSpaceExpansion() " {{{
- let line = getline('.')
- let col = col('.')-2
- if col > 0
- let pchar = line[col - 1]
- let nchar = line[col + 2]
- let isSpaces = (line[col] == line[col+1] && line[col] == " ")
-
- if index(b:_l_delimitMate_left_delims, pchar) > -1 &&
- \ index(b:_l_delimitMate_left_delims, pchar) == index(b:_l_delimitMate_right_delims, nchar) &&
- \ isSpaces
- return 1
- elseif index(b:_l_delimitMate_quotes_list, pchar) > -1 &&
- \ index(b:_l_delimitMate_quotes_list, pchar) == index(b:_l_delimitMate_quotes_list, nchar) &&
- \ isSpaces
- return 1
- endif
- endif
- return 0
-endfunction " }}} IsSpaceExpansion()
-
-function! delimitMate#WithinEmptyPair() "{{{
- let cur = strpart( getline('.'), col('.')-2, 2 )
- return delimitMate#IsEmptyPair( cur )
-endfunction "}}}
-
-function! delimitMate#WriteBefore(str) "{{{
- let len = len(a:str)
- let line = getline('.')
- let col = col('.')-2
- if col < 0
- call setline('.',line[(col+len+1):])
- else
- call setline('.',line[:(col)].line[(col+len+1):])
- endif
- return a:str
-endfunction " }}}
-
-function! delimitMate#WriteAfter(str) "{{{
- let len = len(a:str)
- let line = getline('.')
- let col = col('.')-2
- if (col) < 0
- call setline('.',a:str.line)
- else
- call setline('.',line[:(col)].a:str.line[(col+len):])
- endif
- return ''
-endfunction " }}}
-
-function! delimitMate#GetSyntaxRegion(line, col) "{{{
- return synIDattr(synIDtrans(synID(a:line, a:col, 1)), 'name')
-endfunction " }}}
-
-function! delimitMate#GetCurrentSyntaxRegion() "{{{
- let col = col('.')
- if col == col('$')
- let col = col - 1
- endif
- return delimitMate#GetSyntaxRegion(line('.'), col)
-endfunction " }}}
-
-function! delimitMate#GetCurrentSyntaxRegionIf(char) "{{{
- let col = col('.')
- let origin_line = getline('.')
- let changed_line = strpart(origin_line, 0, col - 1) . a:char . strpart(origin_line, col - 1)
- call setline('.', changed_line)
- let region = delimitMate#GetSyntaxRegion(line('.'), col)
- call setline('.', origin_line)
- return region
-endfunction "}}}
-
-function! delimitMate#IsForbidden(char) "{{{
- if b:_l_delimitMate_excluded_regions_enabled == 0
- return 0
- endif
- "let result = index(b:_l_delimitMate_excluded_regions_list, delimitMate#GetCurrentSyntaxRegion()) >= 0
- if index(b:_l_delimitMate_excluded_regions_list, delimitMate#GetCurrentSyntaxRegion()) >= 0
- "echom "Forbidden 1!"
- return 1
- endif
- let region = delimitMate#GetCurrentSyntaxRegionIf(a:char)
- "let result = index(b:_l_delimitMate_excluded_regions_list, region) >= 0
- "return result || region == 'Comment'
- "echom "Forbidden 2!"
- return index(b:_l_delimitMate_excluded_regions_list, region) >= 0
-endfunction "}}}
-
-function! delimitMate#FlushBuffer() " {{{
- let b:_l_delimitMate_buffer = []
- return ''
-endfunction " }}}
-
-function! delimitMate#BalancedParens(char) "{{{
- " Returns:
- " = 0 => Parens balanced.
- " > 0 => More opening parens.
- " < 0 => More closing parens.
-
- let line = getline('.')
- let col = col('.') - 2
- let col = col >= 0 ? col : 0
- let list = split(line, '\zs')
- let left = b:_l_delimitMate_left_delims[index(b:_l_delimitMate_right_delims, a:char)]
- let right = a:char
- let opening = 0
- let closing = 0
-
- " If the cursor is not at the beginning, count what's behind it.
- if col > 0
- " Find the first opening paren:
- let start = index(list, left)
- " Must be before cursor:
- let start = start < col ? start : col - 1
- " Now count from the first opening until the cursor, this will prevent
- " extra closing parens from being counted.
- let opening = count(list[start : col - 1], left)
- let closing = count(list[start : col - 1], right)
- " I don't care if there are more closing parens than opening parens.
- let closing = closing > opening ? opening : closing
- endif
-
- " Evaluate parens from the cursor to the end:
- let opening += count(list[col :], left)
- let closing += count(list[col :], right)
-
- "echom "–––––––––"
- "echom line
- "echom col
- ""echom left.":".a:char
- "echom string(list)
- "echom string(list[start : col - 1]) . " : " . string(list[col :])
- "echom opening . " - " . closing . " = " . (opening - closing)
-
- " Return the found balance:
- return opening - closing
-endfunction "}}}
-
-function! delimitMate#RmBuffer(num) " {{{
- if len(b:_l_delimitMate_buffer) > 0
- call remove(b:_l_delimitMate_buffer, 0, (a:num-1))
- endif
- return ""
-endfunction " }}}
-
-" }}}
-
-" Doers {{{
-function! delimitMate#SkipDelim(char) "{{{
- if delimitMate#IsForbidden(a:char)
- return a:char
- endif
- let col = col('.') - 1
- let line = getline('.')
- if col > 0
- let cur = line[col]
- let pre = line[col-1]
- else
- let cur = line[col]
- let pre = ""
- endif
- if pre == "\\"
- " Escaped character
- return a:char
- elseif cur == a:char
- " Exit pair
- "return delimitMate#WriteBefore(a:char)
- return a:char . delimitMate#Del()
- elseif delimitMate#IsEmptyPair( pre . a:char )
- " Add closing delimiter and jump back to the middle.
- call insert(b:_l_delimitMate_buffer, a:char)
- return delimitMate#WriteAfter(a:char)
- else
- " Nothing special here, return the same character.
- return a:char
- endif
-endfunction "}}}
-
-function! delimitMate#ParenDelim(char) " {{{
- if delimitMate#IsForbidden(a:char)
- return ''
- endif
- " Try to balance matchpairs
- if b:_l_delimitMate_balance_matchpairs &&
- \ delimitMate#BalancedParens(a:char) <= 0
- return ''
- endif
- let line = getline('.')
- let col = col('.')-2
- let left = b:_l_delimitMate_left_delims[index(b:_l_delimitMate_right_delims,a:char)]
- let smart_matchpairs = substitute(b:_l_delimitMate_smart_matchpairs, '\\!', left, 'g')
- let smart_matchpairs = substitute(smart_matchpairs, '\\#', a:char, 'g')
- "echom left.':'.smart_matchpairs . ':' . matchstr(line[col+1], smart_matchpairs)
- if b:_l_delimitMate_smart_matchpairs != '' &&
- \ line[col+1:] =~ smart_matchpairs
- return ''
- elseif (col) < 0
- call setline('.',a:char.line)
- call insert(b:_l_delimitMate_buffer, a:char)
- else
- "echom string(col).':'.line[:(col)].'|'.line[(col+1):]
- call setline('.',line[:(col)].a:char.line[(col+1):])
- call insert(b:_l_delimitMate_buffer, a:char)
- endif
- return ''
-endfunction " }}}
-
-function! delimitMate#QuoteDelim(char) "{{{
- if delimitMate#IsForbidden(a:char)
- return a:char
- endif
- let line = getline('.')
- let col = col('.') - 2
- if line[col] == "\\"
- " Seems like a escaped character, insert one quotation mark.
- return a:char
- elseif line[col + 1] == a:char &&
- \ index(b:_l_delimitMate_nesting_quotes, a:char) < 0
- " Get out of the string.
- return a:char . delimitMate#Del()
- elseif (line[col] =~ '\w' && a:char == "'") ||
- \ (b:_l_delimitMate_smart_quotes &&
- \ (line[col] =~ '\w' ||
- \ line[col + 1] =~ '\w'))
- " Seems like an apostrophe or a smart quote case, insert a single quote.
- return a:char
- elseif (line[col] == a:char && line[col + 1 ] != a:char) && b:_l_delimitMate_smart_quotes
- " Seems like we have an unbalanced quote, insert one quotation mark and jump to the middle.
- call insert(b:_l_delimitMate_buffer, a:char)
- return delimitMate#WriteAfter(a:char)
- else
- " Insert a pair and jump to the middle.
- call insert(b:_l_delimitMate_buffer, a:char)
- call delimitMate#WriteAfter(a:char)
- return a:char
- endif
-endfunction "}}}
-
-function! delimitMate#JumpOut(char) "{{{
- if delimitMate#IsForbidden(a:char)
- return a:char
- endif
- let line = getline('.')
- let col = col('.')-2
- if line[col+1] == a:char
- return a:char . delimitMate#Del()
- else
- return a:char
- endif
-endfunction " }}}
-
-function! delimitMate#JumpAny(key) " {{{
- if delimitMate#IsForbidden('')
- return a:key
- endif
- if !delimitMate#ShouldJump()
- return a:key
- endif
- " Let's get the character on the right.
- let char = getline('.')[col('.')-1]
- if char == " "
- " Space expansion.
- "let char = char . getline('.')[col('.')] . delimitMate#Del()
- return char . getline('.')[col('.')] . delimitMate#Del() . delimitMate#Del()
- "call delimitMate#RmBuffer(1)
- elseif char == ""
- " CR expansion.
- "let char = "\<CR>" . getline(line('.') + 1)[0] . "\<Del>"
- let b:_l_delimitMate_buffer = []
- return "\<CR>" . getline(line('.') + 1)[0] . "\<Del>"
- else
- "call delimitMate#RmBuffer(1)
- return char . delimitMate#Del()
- endif
-endfunction " delimitMate#JumpAny() }}}
-
-function! delimitMate#JumpMany() " {{{
- let line = getline('.')[col('.') - 1 : ]
- let len = len(line)
- let rights = ""
- let found = 0
- let i = 0
- while i < len
- let char = line[i]
- if index(b:_l_delimitMate_quotes_list, char) >= 0 ||
- \ index(b:_l_delimitMate_right_delims, char) >= 0
- let rights .= "\<Right>"
- let found = 1
- elseif found == 0
- let rights .= "\<Right>"
- else
- break
- endif
- let i += 1
- endwhile
- if found == 1
- return rights
- else
- return ''
- endif
-endfunction " delimitMate#JumpMany() }}}
-
-function! delimitMate#ExpandReturn() "{{{
- if delimitMate#IsForbidden("")
- return "\<CR>"
- endif
- if delimitMate#WithinEmptyPair()
- " Expand:
- call delimitMate#FlushBuffer()
- "return "\<Esc>a\<CR>x\<CR>\<Esc>k$\"_xa"
- return "\<CR>\<UP>\<Esc>o"
- else
- return "\<CR>"
- endif
-endfunction "}}}
-
-function! delimitMate#ExpandSpace() "{{{
- if delimitMate#IsForbidden("\<Space>")
- return "\<Space>"
- endif
- if delimitMate#WithinEmptyPair()
- " Expand:
- call insert(b:_l_delimitMate_buffer, 's')
- return delimitMate#WriteAfter(' ') . "\<Space>"
- else
- return "\<Space>"
- endif
-endfunction "}}}
-
-function! delimitMate#BS() " {{{
- if delimitMate#IsForbidden("")
- return "\<BS>"
- endif
- if delimitMate#WithinEmptyPair()
- "call delimitMate#RmBuffer(1)
- return "\<BS>" . delimitMate#Del()
-" return "\<Right>\<BS>\<BS>"
- elseif delimitMate#IsSpaceExpansion()
- "call delimitMate#RmBuffer(1)
- return "\<BS>" . delimitMate#Del()
- elseif delimitMate#IsCRExpansion()
- return "\<BS>\<Del>"
- else
- return "\<BS>"
- endif
-endfunction " }}} delimitMate#BS()
-
-function! delimitMate#Del() " {{{
- if len(b:_l_delimitMate_buffer) > 0
- let line = getline('.')
- let col = col('.') - 2
- call delimitMate#RmBuffer(1)
- call setline('.', line[:col] . line[col+2:])
- return ''
- else
- return "\<Del>"
- endif
-endfunction " }}}
-
-function! delimitMate#Finish(move_back) " {{{
- let len = len(b:_l_delimitMate_buffer)
- if len > 0
- let buffer = join(b:_l_delimitMate_buffer, '')
- let len2 = len(buffer)
- " Reset buffer:
- let b:_l_delimitMate_buffer = []
- let line = getline('.')
- let col = col('.') -2
- "echom 'col: ' . col . '-' . line[:col] . "|" . line[col+len+1:] . '%' . buffer
- if col < 0
- call setline('.', line[col+len2+1:])
- else
- call setline('.', line[:col] . line[col+len2+1:])
- endif
- let i = 1
- let lefts = ""
- while i <= len && a:move_back
- let lefts = lefts . "\<Left>"
- let i += 1
- endwhile
- return substitute(buffer, "s", "\<Space>", 'g') . lefts
- endif
- return ''
-endfunction " }}}
-
-" }}}
-
-" Tools: {{{
-function! delimitMate#TestMappings() "{{{
- let options = sort(keys(delimitMate#OptionsList()))
- let optoutput = ['delimitMate Report', '==================', '', '* Options: ( ) default, (g) global, (b) buffer','']
- for option in options
- exec 'call add(optoutput, ''('.(exists('b:delimitMate_'.option) ? 'b' : exists('g:delimitMate_'.option) ? 'g' : ' ').') delimitMate_''.option.'' = ''.string(b:_l_delimitMate_'.option.'))'
- endfor
- call append(line('$'), optoutput + ['--------------------',''])
-
- " Check if mappings were set. {{{
- let imaps = b:_l_delimitMate_right_delims
- let imaps = imaps + ( b:_l_delimitMate_autoclose ? b:_l_delimitMate_left_delims : [] )
- let imaps = imaps +
- \ b:_l_delimitMate_quotes_list +
- \ b:_l_delimitMate_apostrophes_list +
- \ ['<BS>', '<S-BS>', '<Del>', '<S-Tab>', '<Esc>'] +
- \ ['<Up>', '<Down>', '<Left>', '<Right>', '<LeftMouse>', '<RightMouse>'] +
- \ ['<Home>', '<End>', '<PageUp>', '<PageDown>', '<S-Down>', '<S-Up>', '<C-G>g']
- let imaps = imaps + ( b:_l_delimitMate_expand_cr ? ['<CR>'] : [] )
- let imaps = imaps + ( b:_l_delimitMate_expand_space ? ['<Space>'] : [] )
-
- let vmaps =
- \ b:_l_delimitMate_right_delims +
- \ b:_l_delimitMate_left_delims +
- \ b:_l_delimitMate_quotes_list
-
- let ibroken = []
- for map in imaps
- if maparg(map, "i") !~? 'delimitMate'
- let output = ''
- if map == '|'
- let map = '<Bar>'
- endif
- redir => output | execute "verbose imap ".map | redir END
- let ibroken = ibroken + [map.": is not set:"] + split(output, '\n')
- endif
- endfor
-
- unlet! output
- if ibroken == []
- let output = ['* Mappings:', '', 'All mappings were set-up.', '--------------------', '', '']
- else
- let output = ['* Mappings:', ''] + ibroken + ['--------------------', '']
- endif
- call append('$', output+['* Showcase:', ''])
- " }}}
- if b:_l_delimitMate_autoclose
- " {{{
- for i in range(len(b:_l_delimitMate_left_delims))
- exec "normal Go0\<C-D>Open: " . b:_l_delimitMate_left_delims[i]. "|"
- exec "normal o0\<C-D>Delete: " . b:_l_delimitMate_left_delims[i] . "\<BS>|"
- exec "normal o0\<C-D>Exit: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "|"
- if b:_l_delimitMate_expand_space == 1
- exec "normal o0\<C-D>Space: " . b:_l_delimitMate_left_delims[i] . " |"
- exec "normal o0\<C-D>Delete space: " . b:_l_delimitMate_left_delims[i] . " \<BS>|"
- endif
- if b:_l_delimitMate_expand_cr == 1
- exec "normal o0\<C-D>Car return: " . b:_l_delimitMate_left_delims[i] . "\<CR>|"
- exec "normal Go0\<C-D>Delete car return: " . b:_l_delimitMate_left_delims[i] . "\<CR>0\<C-D>\<BS>|"
- endif
- call append(line('$'), '')
- endfor
- for i in range(len(b:_l_delimitMate_quotes_list))
- exec "normal Go0\<C-D>Open: " . b:_l_delimitMate_quotes_list[i] . "|"
- exec "normal o0\<C-D>Delete: " . b:_l_delimitMate_quotes_list[i] . "\<BS>|"
- exec "normal o0\<C-D>Exit: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "|"
- if b:_l_delimitMate_expand_space == 1
- exec "normal o0\<C-D>Space: " . b:_l_delimitMate_quotes_list[i] . " |"
- exec "normal o0\<C-D>Delete space: " . b:_l_delimitMate_quotes_list[i] . " \<BS>|"
- endif
- if b:_l_delimitMate_expand_cr == 1
- exec "normal o0\<C-D>Car return: " . b:_l_delimitMate_quotes_list[i] . "\<CR>|"
- exec "normal Go0\<C-D>Delete car return: " . b:_l_delimitMate_quotes_list[i] . "\<CR>\<BS>|"
- endif
- call append(line('$'), '')
- endfor
- "}}}
- else
- "{{{
- for i in range(len(b:_l_delimitMate_left_delims))
- exec "normal GoOpen & close: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "|"
- exec "normal oDelete: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "\<BS>|"
- exec "normal oExit: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . b:_l_delimitMate_right_delims[i] . "|"
- if b:_l_delimitMate_expand_space == 1
- exec "normal oSpace: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . " |"
- exec "normal oDelete space: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . " \<BS>|"
- endif
- if b:_l_delimitMate_expand_cr == 1
- exec "normal oCar return: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "\<CR>|"
- exec "normal GoDelete car return: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "\<CR>\<BS>|"
- endif
- call append(line('$'), '')
- endfor
- for i in range(len(b:_l_delimitMate_quotes_list))
- exec "normal GoOpen & close: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "|"
- exec "normal oDelete: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "\<BS>|"
- exec "normal oExit: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "|"
- if b:_l_delimitMate_expand_space == 1
- exec "normal oSpace: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . " |"
- exec "normal oDelete space: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . " \<BS>|"
- endif
- if b:_l_delimitMate_expand_cr == 1
- exec "normal oCar return: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "\<CR>|"
- exec "normal GoDelete car return: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "\<CR>\<BS>|"
- endif
- call append(line('$'), '')
- endfor
- endif "}}}
- redir => setoptions | set | filetype | redir END
- call append(line('$'), split(setoptions,"\n")
- \ + ['--------------------'])
- setlocal nowrap
-endfunction "}}}
-
-function! delimitMate#OptionsList() "{{{
- return {'autoclose' : 1,'matchpairs': &matchpairs, 'quotes' : '" '' `', 'nesting_quotes' : [], 'expand_cr' : 0, 'expand_space' : 0, 'smart_quotes' : 1, 'smart_matchpairs' : '\w', 'balance_matchpairs' : 0, 'excluded_regions' : 'Comment', 'excluded_ft' : '', 'apostrophes' : ''}
-endfunction " delimitMate#OptionsList }}}
-"}}}
-
-" vim:foldmethod=marker:foldcolumn=4
--- /dev/null
+Subproject commit 787662fe90cd057942bc5b682fd70c87e1a9dd77
--- /dev/null
+Subproject commit 05cded87b2ef29aaa9e930230bb88e23abff4441
--- /dev/null
+Subproject commit 2b654cad2c8e253f844b87e4b768db3a205da280
--- /dev/null
+Subproject commit d85ccf8c6c1fa88feff0c56b8fe271b7d91bd292
--- /dev/null
+Subproject commit cf21ce1f4bfec10fe7e446c08e9e647a2a234e03
--- /dev/null
+Subproject commit b0d50730dbf692168307adef625f1378553730df
--- /dev/null
+Subproject commit f2efe4331b74a4e1157729106cd7950ed6bbf4a8
--- /dev/null
+Subproject commit 0b3d928dce8262dedfc2f83b9aeb59a94e4f0ae4
--- /dev/null
+Subproject commit b0bb781fc73ef40365e4c996a16f04368d64fc9d
--- /dev/null
+Subproject commit 667a668e114e9ec0e5d4cbcb0962d835b23614c4
--- /dev/null
+Subproject commit 9f05e4c0c6163ec52010b0e1e6f66605ae42302d
+++ /dev/null
-*align.txt* The Alignment Tool Mar 04, 2009
-
-Author: Charles E. Campbell, Jr. <NdrOchip@ScampbellPfamily.AbizM>
- (remove NOSPAM from Campbell's email first)
-Copyright: (c) 2004-2008 by Charles E. Campbell, Jr. *Align-copyright*
- The VIM LICENSE applies to Align.vim, AlignMaps.vim, and Align.txt
- (see |copyright|) except use "Align and AlignMaps" instead of "Vim"
- NO WARRANTY, EXPRESS OR IMPLIED. USE AT-YOUR-OWN-RISK.
-
-==============================================================================
-1. Contents *align* *align-contents* {{{1
-
- 1. Contents.................: |align-contents|
- 2. Alignment Manual.........: |align-manual|
- 3. Alignment Usage..........: |align-usage|
- Alignment Concepts.......: |align-concepts|
- Alignment Commands.......: |align-commands|
- Alignment Control........: |align-control|
- Separators.............: |alignctrl-separators|
- Initial Whitespace.....: |alignctrl-w| |alignctrl-W| |alignctrl-I|
- Justification..........: |alignctrl-l| |alignctrl-r| |alignctrl-c|
- Justification Control..: |alignctrl--| |alignctrl-+| |alignctrl-:|
- Cyclic/Sequential......: |alignctrl-=| |alignctrl-C|
- Separator Justification: |alignctrl-<| |alignctrl->| |alignctrl-||
- Line (de)Selection.....: |alignctrl-g| |alignctrl-v|
- Temporary Settings.....: |alignctrl-m|
- Padding................: |alignctrl-p| |alignctrl-P|
- Current Options........: |alignctrl-settings| |alignctrl-|
- Alignment................: |align-align|
- 4. Alignment Maps...........: |align-maps|
- \a,....................: |alignmap-a,|
- \a?....................: |alignmap-a?|
- \a<....................: |alignmap-a<|
- \abox..................: |alignmap-abox|
- \acom..................: |alignmap-acom|
- \anum..................: |alignmap-anum|
- \ascom.................: |alignmap-ascom|
- \adec..................: |alignmap-adec|
- \adef..................: |alignmap-adef|
- \afnc..................: |alignmap-afnc|
- \adcom.................: |alignmap-adcom|
- \aocom.................: |alignmap-aocom|
- \tsp...................: |alignmap-tsp|
- \tsq...................: |alignmap-tsq|
- \tt....................: |alignmap-tt|
- \t=....................: |alignmap-t=|
- \T=....................: |alignmap-T=|
- \Htd...................: |alignmap-Htd|
- 5. Alignment Tool History...: |align-history|
-
-==============================================================================
-2. Align Manual *alignman* *alignmanual* *align-manual* {{{1
-
- Align comes as a vimball; simply typing >
- vim Align.vba.gz
- :so %
-< should put its components where they belong. The components are: >
- .vim/plugin/AlignPlugin.vim
- .vim/plugin/AlignMapsPlugin.vim
- .vim/plugin/cecutil.vim
- .vim/autoload/Align.vim
- .vim/autoload/AlignMaps.vim
- .vim/doc/Align.txt
-< To see a user's guide, see |align-userguide|
- To see examples, see |alignctrl| and |alignmaps|
->
-/=============+=========+=====================================================\
-|| \ Default/ ||
-|| Commands \ Value/ Explanation ||
-|| | | ||
-++==============+====+=======================================================++
-|| AlignCtrl | | =Clrc-+:pPIWw [..list-of-separator-patterns..] ||
-|| | +-------------------------------------------------------+|
-|| | | may be called as a command or as a function: ||
-|| | | :AlignCtrl =lp0P0W & \\ ||
-|| | | :call Align#AlignCtrl('=lp0P0W','&','\\') ||
-|| | | ||
-|| | +-------------------------------------------------------++
-|| 1st arg | = | = all separator patterns are equivalent and are ||
-|| | | simultaneously active. Patterns are |regexp|. ||
-|| | | C cycle through separator patterns. Patterns are ||
-|| | | |regexp| and are active sequentially. ||
-|| | | ||
-|| | < | < left justify separator Separators are justified, ||
-|| | | > right justify separator too. Separator styles ||
-|| | | | center separator are cyclic. ||
-|| | | ||
-|| | l | l left justify Justification styles are always ||
-|| | | r right justify cyclic (ie. lrc would mean left j., ||
-|| | | c center then right j., then center, repeat. ||
-|| | | - skip this separator ||
-|| | | + re-use last justification method ||
-|| | | : treat rest of text as a field ||
-|| | | ||
-|| | p1 | p### pad separator on left by # blanks ||
-|| | P1 | P### pad separator on right by # blanks ||
-|| | | ||
-|| | I | I preserve and apply first line's leading white ||
-|| | | space to all lines ||
-|| | | W preserve leading white space on every line, even ||
-|| | | if it varies from line to line ||
-|| | | w don't preserve leading white space ||
-|| | | ||
-|| | | g second argument is a selection pattern -- only ||
-|| | | align on lines that have a match (inspired by ||
-|| | | :g/selection pattern/command) ||
-|| | | v second argument is a selection pattern -- only ||
-|| | | align on lines that _don't_ have a match (inspired ||
-|| | | by :v/selection pattern/command) ||
-|| | | ||
-|| | | m Map support: AlignCtrl will immediately do an ||
-|| | | AlignPush() and the next call to Align() will do ||
-|| | | an AlignPop at the end. This feature allows maps ||
-|| | | to preserve user settings. ||
-|| | | ||
-|| | | default ||
-|| | | AlignCtrl default ||
-|| | | will clear the AlignCtrl ||
-|| | | stack & set the default: AlignCtrl "Ilp1P1=" '=' ||
-|| | | ||
-|| +----+-------------------------------------------------------+|
-|| More args | More arguments are interpreted as describing separators ||
-|| +------------------------------------------------------------+|
-|| No args | AlignCtrl will display its current settings ||
-||==============+============================================================+|
-||[range]Align | [..list-of-separators..] ||
-||[range]Align! | [AlignCtrl settings] [..list-of-separators..] ||
-|| +------------------------------------------------------------+|
-|| | Aligns text over the given range. The range may be ||
-|| | selected via visual mode (v, V, or ctrl-v) or via ||
-|| | the command line. The Align operation may be invoked ||
-|| | as a command or as a function; as a function, the first ||
-|| | argument is 0=separators only, 1=AlignCtrl option string ||
-|| | followed by a list of separators. ||
-|| | :[range]Align ||
-|| | :[range]Align [list of separators] ||
-|| | :[range]call Align#Align(0) ||
-|| | :[range]call Align#Align(0,"list","of","separators",...) ||
-\=============================================================================/
-
-==============================================================================
-3. Alignment Usage *alignusage* *align-usage* *align-userguide* {{{1
-
-
-ALIGNMENT CONCEPTS *align-concept* *align-concepts* {{{2
-
- The typical text to be aligned is considered to be:
-
- * composed of two or more fields
- * separated by one or more separator pattern(s):
- * two or more lines
->
- ws field ws separator ws field ws separator ...
- ws field ws separator ws field ws separator ...
-<
- where "ws" stands for "white space" such as blanks and/or tabs,
- and "fields" are arbitrary text. For example, consider >
-
- x= y= z= 3;
- xx= yy= zz= 4;
- zzz= yyy= zzz= 5;
- a= b= c= 3;
-<
- Assume that it is desired to line up all the "=" signs; these,
- then, are the separators. The fields are composed of all the
- alphameric text. Assuming they lie on lines 1-4, one may align
- those "=" signs with: >
- :AlignCtrl l
- :1,4Align =
-< The result is: >
- x = y = z = 3;
- xx = yy = zz = 4;
- zzz = yyy = zzz = 5;
- a = b = c = 3;
-
-< Note how each "=" sign is surrounded by a single space; the
- default padding is p1P1 (p1 means one space before the separator,
- and P1 means one space after it). If you wish to change the
- padding, say to no padding, use (see |alignctrl-p|) >
- :AlignCtrl lp0P0
-
-< Next, note how each field is left justified; that's what the "l"
- (a small letter "ell") does. If right-justification of the fields
- had been desired, an "r" could've been used: >
- :AlignCtrl r
-< yielding >
- x = y = z = 3;
- xx = yy = zz = 4;
- zzz = yyy = zzz = 5;
- a = b = c = 3;
-< There are many more options available for field justification: see
- |alignctrl-c| and |alignctrl--|.
-
- Separators, although commonly only one character long, are actually
- specified by regular expressions (see |regexp|), and one may left
- justify, right justify, or center them, too (see |alignctrl-<|).
-
- Assume that for some reason a left-right-left-right-... justification
- sequence was wished. This wish is simply achieved with >
- :AlignCtrl lr
- :1,4Align =
-< because the justification commands are considered to be "cylic"; ie.
- lr is the same as lrlrlrlrlrlrlr...
-
- There's a lot more discussed under |alignctrl|; hopefully the examples
- there will help, too.
-
-
-ALIGNMENT COMMANDS *align-command* *align-commands* {{{2
-
- The <Align.vim> script includes two primary commands and two
- minor commands:
-
- AlignCtrl : this command/function sets up alignment options
- which persist until changed for later Align calls.
- It controls such things as: how to specify field
- separators, initial white space, padding about
- separators, left/right/center justification, etc. >
- ex. AlignCtrl wp0P1
- Interpretation: during subsequent alignment
- operations, preserve each line's initial
- whitespace. Use no padding before separators
- but provide one padding space after separators.
-<
- Align : this command/function operates on the range given it to
- align text based on one or more separator patterns. The
- patterns may be provided via AlignCtrl or via Align
- itself. >
-
- ex. :%Align ,
- Interpretation: align all commas over the entire
- file.
-< The :Align! format permits alignment control commands
- to precede the alignment patterns. >
- ex. :%Align! p2P2 =
-< This will align all "=" in the file with two padding
- spaces on both sides of each "=" sign.
-
- NOTE ON USING PATTERNS WITH ALIGN:~
- Align and AlignCtrl use |<q-args>| to obtain their
- input patterns and they use an internal function to
- split arguments at whitespace unless inside "..."s.
- One may escape characters inside a double-quote string
- by preceding such characters with a backslash.
-
- AlignPush : this command/function pushes the current AlignCtrl
- state onto an internal stack. >
- ex. :AlignPush
- Interpretation: save the current AlignCtrl
- settings, whatever they may be. They'll
- also remain as the current settings until
- AlignCtrl is used to change them.
-<
- AlignPop : this command/function pops the current AlignCtrl
- state from an internal stack. >
- ex. :AlignPop
- Interpretation: presumably AlignPush was
- used (at least once) previously; this command
- restores the AlignCtrl settings when AlignPush
- was last used.
-< Also see |alignctrl-m| for a way to automatically do
- an AlignPop after an Align (primarily this is for maps).
-
-ALIGNMENT OPTIONS *align-option* *align-options* {{{2
- *align-utf8* *align-utf* *align-codepoint* *align-strlen* *align-multibyte*
-
- For those of you who are using 2-byte (or more) characters such as are
- available with utf-8, Align now provides a special option which you
- may choose based upon your needs:
-
- Use Built-in strlen() ~
->
- let g:Align_xstrlen= 0
-
-< This is the fastest method, but it doesn't handle multibyte characters
- well. It is the default for:
-
- enc=latin1
- vim compiled without multi-byte support
- $LANG is en_US.UTF-8 (assuming USA english)
-
- Number of codepoints (Latin a + combining circumflex is two codepoints)~
->
- let g:Align_xstrlen= 1 (default)
-<
- Number of spacing codepoints (Latin a + combining circumflex is one~
- spacing codepoint; a hard tab is one; wide and narrow CJK are one~
- each; etc.)~
->
- let g:Align_xstrlen= 2
-<
- Virtual length (counting, for instance, tabs as anything between 1 and~
- 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when~
- immediately preceded by lam, one otherwise, etc.)~
->
- let g:Align_xstrlen= 3
-<
- By putting one of these settings into your <.vimrc>, Align will use an
- internal (interpreted) function to determine a string's length instead
- of the Vim's built-in |strlen()| function. Since the function is
- interpreted, Align will run a bit slower but will handle such strings
- correctly. The last setting (g:Align_xstrlen= 3) probably will run
- the slowest but be the most accurate. (thanks to Tony Mechelynck for
- these)
-
-
-ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
-
- This command doesn't do the alignment operation itself; instead, it
- controls subsequent alignment operation(s).
-
- The first argument to AlignCtrl is a string which may contain one or
- more alignment control settings. Most of the settings are specified
- by single letters; the exceptions are the p# and P# commands which
- interpret a digit following the p or P as specifying padding about the
- separator.
-
- The typical text line is considered to be composed of two or more
- fields separated by one or more separator pattern(s): >
-
- ws field ws separator ws field ws separator ...
-<
- where "ws" stands for "white space" such as blanks and/or tabs.
-
-
- SEPARATORS *alignctrl-separators* {{{3
-
- As a result, separators may not have white space (tabs or blanks) on
- their outsides (ie. ": :" is fine as a separator, but " :: " is
- not). Usually such separators are not needed, although a map has been
- provided which works around this limitation and aligns on whitespace
- (see |alignmap-tsp|).
-
- However, if you really need to have separators with leading or
- trailing whitespace, consider handling them by performing a substitute
- first (ie. s/ :: /@/g), do the alignment on the temporary pattern
- (ie. @), and then perform a substitute to revert the separators back
- to their desired condition (ie. s/@/ :: /g).
-
- The Align#Align() function will first convert tabs over the region into
- spaces and then apply alignment control. Except for initial white
- space, white space surrounding the fields is ignored. One has three
- options just for handling initial white space:
-
-
- --- *alignctrl-w*
- wWI INITIAL WHITE SPACE *alignctrl-W* {{{3
- --- *alignctrl-I*
- w : ignore all selected lines' initial white space
- W : retain all selected lines' initial white space
- I : retain only the first line's initial white space and
- re-use it for subsequent lines
-
- Example: Leading white space options: >
- +---------------+-------------------+-----------------+
- |AlignCtrl w= :=| AlignCtrl W= := | AlignCtrl I= := |
- +------------------+---------------+-------------------+-----------------+
- | Original | w option | W option | I option |
- +------------------+---------------+-------------------+-----------------+
- | a := baaa |a := baaa | a : = baaa | a := baaa |
- | caaaa := deeee |caaaa := deeee | caaaa : = deeee| caaaa := deeee|
- | ee := f |ee := f | ee : = f | ee := f |
- +------------------+---------------+-------------------+-----------------+
-<
- The original has at least one leading white space on every line.
- Using Align with w eliminated each line's leading white space.
- Using Align with W preserved each line's leading white space.
- Using Align with I applied the first line's leading white space
- (three spaces) to each line.
-
-
- ------ *alignctrl-l*
- lrc-+: FIELD JUSTIFICATION *alignctrl-r* {{{3
- ------ *alignctrl-c*
-
- With "lrc", the fields will be left-justified, right-justified, or
- centered as indicated by the justification specifiers (lrc). The
- "lrc" options are re-used by cycling through them as needed:
-
- l means llllll....
- r means rrrrrr....
- lr means lrlrlr....
- llr means llrllr....
-
- Example: Justification options: Align = >
- +------------+-------------------+-------------------+-------------------+
- | Original | AlignCtrl l | AlignCtrl r | AlignCtrl lr |
- +------------+-------------------+-------------------+-------------------+
- | a=bb=ccc=1 |a = bb = ccc = 1| a = bb = ccc = 1|a = bb = ccc = 1|
- | ccc=a=bb=2 |ccc = a = bb = 2|ccc = a = bb = 2|ccc = a = bb = 2|
- | dd=eee=f=3 |dd = eee = f = 3| dd = eee = f = 3|dd = eee = f = 3|
- +------------+-------------------+-------------------+-------------------+
- | Alignment |l l l l| r r r r|l r l r|
- +------------+-------------------+-------------------+-------------------+
-<
- AlignCtrl l : The = separator is repeatedly re-used, as the
- cycle only consists of one character (the "l").
- Every time left-justification is used for fields.
- AlignCtrl r : The = separator is repeatedly re-used, as the
- cycle only consists of one character (the "l").
- Every time right-justification is used for fields
- AlignCtrl lr: Again, the "=" separator is repeatedly re-used,
- but the fields are justified alternately between
- left and right.
-
- Even more separator control is available. With "-+:":
-
- - : skip treating the separator as a separator. *alignctrl--*
- + : repeat use of the last "lrc" justification *alignctrl-+*
- : : treat the rest of the line as a single field *alignctrl-:*
-
- Example: More justification options: Align = >
- +------------+---------------+--------------------+---------------+
- | Original | AlignCtrl -l | AlignCtrl rl+ | AlignCtrl l: |
- +------------+---------------+--------------------+---------------+
- | a=bb=ccc=1 |a=bb = ccc=1 | a = bb = ccc = 1 |a = bb=ccc=1 |
- | ccc=a=bb=2 |ccc=a = bb=2 |ccc = a = bb = 2 |ccc = a=bb=2 |
- | dd=eee=f=3 |dd=eee = f=3 | dd = eee = f = 3 |dd = eee=f=3 |
- +------------+---------------+--------------------+---------------+
- | Alignment |l l | r l l l |l l |
- +------------+---------------+--------------------+---------------+
-<
- In the first example in "More justification options":
-
- The first "=" separator is skipped by the "-" specification,
- and so "a=bb", "ccc=a", and "dd=eee" are considered as single fields.
-
- The next "=" separator has its (left side) field left-justified.
- Due to the cyclic nature of separator patterns, the "-l"
- specification is equivalent to "-l-l-l ...".
-
- Hence the next specification is a "skip", so "ccc=1", etc are fields.
-
- In the second example in "More justification options":
-
- The first field is right-justified, the second field is left
- justified, and all remaining fields repeat the last justification
- command (ie. they are left justified, too).
-
- Hence rl+ is equivalent to rlllllllll ...
- (whereas plain rl is equivalent to rlrlrlrlrl ... ).
-
- In the third example in "More justification options":
-
- The text following the first separator is treated as a single field.
-
- Thus using the - and : operators one can apply justification to a
- single separator.
-
- ex. 1st separator only: AlignCtrl l:
- 2nd separator only: AlignCtrl -l:
- 3rd separator only: AlignCtrl --l:
- etc.
-
-
- --- *alignctrl-=*
- =C CYCLIC VS ALL-ACTIVE SEPARATORS *alignctrl-C* {{{3
- ---
-
- The separators themselves may be considered as equivalent and
- simultaneously active ("=") or sequentially cycled through ("C").
- Separators are regular expressions (|regexp|) and are specified as the
- second, third, etc arguments. When the separator patterns are
- equivalent and simultaneously active, there will be one pattern
- constructed: >
-
- AlignCtrl ... pat1 pat2 pat3
- \(pat1\|pat2\|pat3\)
-<
- Each separator pattern is thus equivalent and simultaneously active.
- The cyclic separator AlignCtrl option stores a list of patterns, only
- one of which is active for each field at a time.
-
- Example: Equivalent/Simultaneously-Active vs Cyclic Separators >
- +-------------+------------------+---------------------+----------------------+
- | Original | AlignCtrl = = + -| AlignCtrl = = | AlignCtrl C = + - |
- +-------------+------------------+---------------------+----------------------+
- |a = b + c - d|a = b + c - d |a = b + c - d |a = b + c - d |
- |x = y = z + 2|x = y = z + 2 |x = y = z + 2|x = y = z + 2 |
- |w = s - t = 0|w = s - t = 0 |w = s - t = 0 |w = s - t = 0 |
- +-------------+------------------+---------------------+----------------------+
-<
- The original is initially aligned with all operators (=+-) being
- considered as equivalent and simultaneously active field separators.
- Thus the "AlignCtrl = = + -" example shows no change.
-
- The second example only accepts the '=' as a field separator;
- consequently "b + c - d" is now a single field.
-
- The third example illustrates cyclic field separators and is analyzed
- in the following illustration: >
-
- field1 separator field2 separator field3 separator field4
- a = b + c - d
- x = y = z + 2
- w = s - t = 0
-<
- The word "cyclic" is used because the patterns form a cycle of use; in
- the above case, its = + - = + - = + - = + -...
-
- Example: Cyclic separators >
- Label : this is some text discussing ":"s | ex. abc:def:ghi
- Label : this is some text with a ":" in it | ex. abc:def
-<
- apply AlignCtrl lWC : | |
- (select lines)Align >
- Label : this is some text discussing ":"s | ex. abc:def:ghi
- Label : this is some text with a ":" in it | ex. abcd:efg
-<
- In the current example,
- : is the first separator So the first ":"s are aligned
- | is the second separator but subsequent ":"s are not.
- | is the third separator The "|"s are aligned, too.
- : is the fourth separator Since there aren't two bars,
- | is the fifth separator the subsequent potential cycles
- | is the sixth separator don't appear.
- ...
-
- In this case it would probably have been a better idea to have used >
- AlignCtrl WCl: : |
-< as that alignment control would guarantee that no more cycling
- would be used after the vertical bar.
-
- Example: Cyclic separators
-
- Original: >
- a| b&c | (d|e) & f-g-h
- aa| bb&cc | (dd|ee) & ff-gg-hh
- aaa| bbb&ccc | (ddd|eee) & fff-ggg-hhh
-<
- AlignCtrl C | | & - >
- a | b&c | (d|e) & f - g-h
- aa | bb&cc | (dd|ee) & ff - gg-hh
- aaa | bbb&ccc | (ddd|eee) & fff - ggg-hhh
-<
- In this example,
- the first and second separators are "|",
- the third separator is "&", and
- the fourth separator is "-",
-
- (cycling)
- the fifth and sixth separators are "|",
- the seventh separator is "&", and
- the eighth separator is "-", etc.
-
- Thus the first "&"s are (not yet) separators, and hence are treated as
- part of the field. Ignoring white space for the moment, the AlignCtrl
- shown here means that Align will work with >
-
- field | field | field & field - field | field | field & field - ...
-<
-
- --- *alignctrl-<*
- <>| SEPARATOR JUSTIFICATION *alignctrl->* {{{3
- --- *alignctrl-|*
-
- Separators may be of differing lengths as shown in the example below.
- Hence they too may be justified left, right, or centered.
- Furthermore, separator justification specifications are cyclic:
-
- < means <<<<<... justify separator(s) to the left
- > means >>>>>... justify separator(s) to the right
- | means |||||... center separator(s)
-
- Example: Separator Justification: Align -\+ >
- +-----------------+
- | Original |
- +-----------------+
- | a - bbb - c |
- | aa -- bb -- ccc |
- | aaa --- b --- cc|
- +---------------------+-+-----------------+-+---------------------+
- | AlignCtrl < | AlignCtrl > | AlignCtrl | |
- +---------------------+---------------------+---------------------+
- | a - bbb - c | a - bbb - c | a - bbb - c |
- | aa -- bb -- ccc | aa -- bb -- ccc | aa -- bb -- ccc |
- | aaa --- b --- cc | aaa --- b --- cc | aaa --- b --- cc |
- +---------------------+---------------------+---------------------+
-<
-
- --- *alignctrl-g*
- gv SELECTIVE APPLICATION *alignctrl-v* {{{3
- ---
-
-
- These two options provide a way to select (g) or to deselect (v) lines
- based on a pattern. Ideally :g/pat/Align would work; unfortunately
- it results in Align#Align() being called on each line satisfying the
- pattern separately. >
-
- AlignCtrl g pattern
-<
- Align will only consider those lines which have the given pattern. >
-
- AlignCtrl v pattern
-<
- Align will only consider those lines without the given pattern. As an
- example of use, consider the following example: >
-
- :AlignCtrl v ^\s*/\*
- Original :Align = :Align =
- +----------------+------------------+----------------+
- |one= 2; |one = 2; |one = 2; |
- |three= 4; |three = 4; |three = 4; |
- |/* skip=this */ |/* skip = this */ |/* skip=this */ |
- |five= 6; |five = 6; |five = 6; |
- +----------------+------------------+----------------+
-<
- The first "Align =" aligned with all "="s, including that one in the
- "skip=this" comment.
-
- The second "Align =" had a AlignCtrl v-pattern which caused it to skip
- (ignore) the "skip=this" line when aligning.
-
- To remove AlignCtrl's g and v patterns, use (as appropriate) >
-
- AlignCtrl g
- AlignCtrl v
-<
- To see what g/v patterns are currently active, just use the reporting
- capability of an unadorned call to AlignCtrl: >
-
- AlignCtrl
-<
-
- ---
- m MAP SUPPORT *alignctrl-m* {{{3
- ---
-
- This option primarily supports the development of maps. The
- Align#AlignCtrl() call will first do an Align#AlignPush() (ie. retain
- current alignment control settings). The next Align#Align() will, in
- addition to its alignment job, finish up with an Align#AlignPop().
- Thus the Align#AlignCtrl settings that follow the "m" are only
- temporarily in effect for just the next Align#Align().
-
-
- ---
- p### *alignctrl-p*
- P### PADDING *alignctrl-P* {{{3
- ---
-
- These two options control pre-padding and post-padding with blanks
- about the separator. One may pad separators with zero to nine spaces;
- the padding number(s) is/are treated as a cyclic parameter. Thus one
- may specify padding separately for each field or re-use a padding
- pattern. >
-
- Example: AlignCtrl p102P0
- +---------+----------------------------------+
- | Original| a=b=c=d=e=f=g=h=1 |
- | Align = | a =b=c =d =e=f =g =h=1 |
- +---------+----------------------------------+
- | prepad | 1 0 2 1 0 2 1 0 |
- +---------+----------------------------------+
-<
- This example will cause Align to:
-
- pre-pad the first "=" with a single blank,
- pre-pad the second "=" with no blanks,
- pre-pad the third "=" with two blanks,
- pre-pad the fourth "=" with a single blank,
- pre-pad the fifth "=" with no blanks,
- pre-pad the sixth "=" with two blanks,
- etc.
-
- --------------- *alignctrl-settings*
- No option given DISPLAY STATUS *alignctrl-* {{{3
- --------------- *alignctrl-no-option*
-
- AlignCtrl, when called with no arguments, will display the current
- alignment control settings. A typical display is shown below: >
-
- AlignCtrl<=> qty=1 AlignStyle<l> Padding<1|1>
- Pat1<\(=\)>
-<
- Interpreting, this means that the separator patterns are all
- equivalent; in this case, there's only one (qty=1). Fields will be
- padded on the right with spaces (left justification), and separators
- will be padded on each side with a single space.
-
- To change one of these items, see:
-
- AlignCtrl......|alignctrl|
- qty............|align-concept|
- AlignStyle.....|alignctrl--| |alignctrl-+| |alignctrl-:||alignctrl-c|
- Padding........|alignctrl-p| |alignctrl-P|
-
- One may get a string which can be fed back into AlignCtrl: >
-
- :let alignctrl= Align#AlignCtrl()
-<
- This form will put a string describing the current AlignCtrl options,
- except for the "g" and "v" patterns, into a variable. The
- Align#AlignCtrl() function will still echo its settings, however. One
- can feed any non-supported "option" to AlignCtrl() to prevent this,
- however: >
-
- :let alignctrl= Align#AlignCtrl("d")
-<
-
-ALIGNMENT *align-align* {{{2
-
- Once the alignment control has been determined, the user specifies a
- range of lines for the Align command/function to do its thing.
- Alignment is often done on a line-range basis, but one may also
- restrict alignment to a visual block using ctrl-v. For any visual
- mode, one types the colon (:) and then "Align". One may, of course,
- specify a range of lines: >
-
- :[range]Align [list-of-separators]
-<
- where the |:range| is the usual Vim-powered set of possibilities; the
- list of separators is the same as the AlignCtrl capability. There is
- only one list of separators, but either AlignCtrl or Align can be used
- to specify that list.
-
- An alternative form of the Align command can handle both alignment
- control and the separator list: >
-
- :[range]Align! [alignment-control-string] [list-of-separators]
-<
- The alignment control string will be applied only for this particular
- application of Align (it uses |alignctrl-m|). The "g pattern" and
- "v pattern" alignment controls (see |alignctrl-g| and |alignctrl-v|)
- are also available via this form of the Align command.
-
- Align makes two passes over the text to be aligned. The first pass
- determines how many fields there are and determines the maximum sizes
- of each field; these sizes are then stored in a vector. The second
- pass pads the field (left/right/centered as specified) to bring its
- length up to the maximum size of the field. Then the separator and
- its AlignCtrl-specified padding is appended.
-
- Pseudo-Code:~
- During pass 1
- | For all fields in the current line
- || Determine current separator
- || Examine field specified by current separator
- || Determine length of field and save if largest thus far
- Initialize newline based on initial whitespace option (wWI)
- During pass 2
- | For all fields in current line
- || Determine current separator
- || Extract field specified by current separator
- || Prepend/append padding as specified by AlignCtrl
- || (right/left/center)-justify to fit field into max-size field
- || Append separator with AlignCtrl-specified separator padding
- || Delete current line, install newly aligned line
-
- The g and v AlignCtrl patterns cause the passes not to consider lines
- for alignment, either by requiring that the g-pattern be present or
- that the v-pattern not be present.
-
- The whitespace on either side of a separator is ignored.
-
-
-==============================================================================
-4. Alignment Maps *alignmaps* *align-maps* {{{1
-
- There are a number of maps using Align#AlignCtrl() and Align#Align()
- in the <AlignMapsPlugin.vim> file. This file may also be put into the
- plugins subdirectory. Since AlignCtrl and Align supercede textab and
- its <ttalign.vim> file, the maps either have a leading "t" (for
- "textab") or the more complicated ones an "a" (for "alignment") for
- backwards compatibility.
-
- The maps are shown below with a leading backslash (\). Actually, the
- <Leader> construct is used (see |mapleader|), so the maps' leading
- kick-off character is easily customized.
-
- Furthermore, all AlignMapsPlugin.vim maps use the <Plug> construct (see
- |<Plug>|and |usr_41.txt|). Hence, if one wishes to override the
- mapping entirely, one may do that, too. As an example: >
- map <Leader>ACOM <Plug>AM_acom
-< would have \ACOM do what \acom previously did (assuming that the
- mapleader has been left at its default value of a backslash).
-
- \a, : useful for breaking up comma-separated
- declarations prior to \adec |alignmap-a,|
- \a( : aligns ( and , (useful for prototypes) *alignmap-a(*
- \a? : aligns (...)? ...:... expressions on ? and : |alignmap-a?|
- \a< : aligns << and >> for c++ |alignmap-a<|
- \a= : aligns := assignments |alignmap-a=|
- \abox : draw a C-style comment box around text lines |alignmap-abox|
- \acom : useful for aligning comments |alignmap-acom|
- \adcom: useful for aligning comments in declarations |alignmap-adcom|
- \anum : useful for aligning numbers |alignmap-anum|
- NOTE: For the visual-mode use of \anum, <vis.vim> is needed!
- See http://mysite.verizon.net/astronaut/vim/index.html#VIS
- \aenum: align a European-style number |alignmap-anum|
- \aunum: align a USA-style number |alignmap-anum|
- \adec : useful for aligning declarations |alignmap-adec|
- \adef : useful for aligning definitions |alignmap-adef|
- \afnc : useful for aligning ansi-c style functions'
- argument lists |alignmap-afnc|
- \adcom: a variant of \acom, restricted to comment |alignmap-adcom|
- containing lines only, but also only for
- those which don't begin with a comment.
- Good for certain declaration styles.
- \aocom: a variant of \acom, restricted to comment |alignmap-aocom|
- containing lines only
- \tab : align a table based on tabs *alignmap-tab*
- (converts to spaces)
- \tml : useful for aligning the trailing backslashes |alignmap-tml|
- used to continue lines (shell programming, etc)
- \tsp : use Align to make a table separated by blanks |alignmap-tsp|
- (left justified)
- \ts, : like \t, but swaps whitespace on the right of *alignmap-ts,*
- the commas to their left
- \ts: : like \t: but swaps whitespace on the right of *alignmap-ts:*
- the colons to their left
- \ts< : like \t< but swaps whitespace on the right of *alignmap-ts<*
- the less-than signs to their left
- \ts= : like \t= but swaps whitespace on the right of *alignmap-ts=*
- the equals signs to their left
- \Tsp : use Align to make a table separated by blanks |alignmap-Tsp|
- (right justified)
- \tsq : use Align to make a table separated by blanks |alignmap-tsq|
- (left justified) -- "strings" are not split up
- \tt : useful for aligning LaTeX tabular tables |alignmap-tt|
- \Htd : tabularizes html tables: |alignmap-Htd|
- <TR><TD> ...field... </TD><TD> ...field... </TD></TR>
-
- *alignmap-t|* *alignmap-t#* *alignmap-t,* *alignmap-t:*
- *alignmap-t;* *alignmap-t<* *alignmap-t?* *alignmap-t~*
- *alignmap-m=*
- \tx : make a left-justified alignment on
- character "x" where "x" is: ,:<=@|# |alignmap-t=|
- \Tx : make a right-justified alignment on
- character "x" where "x" is: ,:<=@# |alignmap-T=|
- \m= : like \t= but aligns with %... style comments
-
- The leading backslash is actually <leader> (see |mapleader| for how to
- customize the leader to be whatever you like). These maps use the
- <Align.vim> package and are defined in the <AlignMaps.vim> file.
- Although the maps use AlignCtrl options, they typically use the "m"
- option which pushes the options (AlignPush). The associated Align
- call which follows will then AlignPop the user's original options
- back.
-
- ALIGNMENT MAP USE WITH MARK AND MOVE~
- In the examples below, one may select the text with a "ma" at the
- first line, move to the last line, then execute the map.
-
- ALIGNMENT MAP USE WITH VISUAL MODE~
- Alternatively, one may select the text with the "V" visual mode
- command.
-
- ALIGNMENT MAP USE WITH MENUS~
- One may use the mark-and-move style (ma, move, use the menu) or
- the visual mode style (use the V visual mode, move, then select
- the alignment map with menu selection). The alignment map menu
- items are under DrChip.AlignMaps .
-
- One may even change the top level menu name to whatever is wished; by
- default, its >
- let g:DrChipTopLvlMenu= "DrChip."
-< If you set the variable to the empty string (""), then no menu items
- will be produced. Of course, one must have a vim with +menu, the gui
- must be running, and |'go'| must have the menu bar suboption (ie. m
- must be included).
-
- COMPLEX ALIGNMENT MAP METHOD~
-
- For those complex alignment maps which do alignment on constructs
- (e.g. \acom, \adec, etc), a series of substitutes is used to insert
- "@" symbols in appropriate locations. Align#Align() is then used to
- do alignment directly on "@"s; then it is followed by further
- substitutes to do clean-up. However, the maps \WS and \WE, used by
- every map supported by AlignMaps, protect any original embedded "@"
- symbols by first converting them to <DEL> characters, doing the
- requested job, and then converting them back. >
-
- \WS calls AlignMaps#WrapperStart()
- \WE calls AlignMaps#WrapperEnd()
-<
-
- ---------------------------
- Alignment Map Examples: \a, *alignmap-a,* {{{3
- ---------------------------
-
- Original: illustrates comma-separated declaration splitting: >
- int a,b,c;
- struct ABC_str abc,def;
-<
- Becomes: >
- int a;
- int b;
- int c;
- struct ABC_str abc;
- struct ABC_str def;
-<
-
- ---------------------------
- Alignment Map Examples: \a? *alignmap-a?* {{{3
- ---------------------------
-
- Original: illustrates ()?: aligning >
- printf("<%s>\n",
- (x == ABC)? "abc" :
- (x == DEFG)? "defg" :
- (x == HIJKL)? "hijkl" : "???");
-<
- Becomes: select "(x == ..." lines, then \a? >
- printf("<%s>\n",
- (x == ABC)? "abc" :
- (x == DEFG)? "defg" :
- (x == HIJKL)? "hijkl" : "???");
-<
-
- ---------------------------
- Alignment Map Examples: \a< *alignmap-a<* {{{3
- ---------------------------
-
- Original: illustrating aligning of << and >> >
- cin << x;
- cin << y;
- cout << "this is x=" << x;
- cout << "but y=" << y << "is not";
-<
- Becomes: select "(x == ..." lines, then \a< >
- cin << x;
- cin << y;
- cout << "this is x=" << x;
- cout << "but y=" << y << "is not";
-<
-
- ---------------------------
- Alignment Map Examples: \a= *alignmap-a=* {{{3
- ---------------------------
-
- Original: illustrates how to align := assignments >
- aa:=bb:=cc:=1;
- a:=b:=c:=1;
- aaa:=bbb:=ccc:=1;
-<
- Bcomes: select the three assignment lines, then \a:= >
- aa := bb := cc := 1;
- a := b := c := 1;
- aaa := bbb := ccc := 1;
-<
-
- ---------------------------
- Alignment Map Examples: \abox *alignmap-abox* {{{3
- ---------------------------
-
- Original: illustrates how to comment-box some text >
- This is some plain text
- which will
- soon be surrounded by a
- comment box.
-<
- Becomes: Select "This..box." with ctrl-v, press \abox >
- /***************************
- * This is some plain text *
- * which will *
- * soon be surrounded by a *
- * comment box. *
- ***************************/
-<
-
- ---------------------------
- Alignment Map Examples: \acom *alignmap-acom* {{{3
- ---------------------------
-
- Original: illustrates aligning C-style comments (works for //, too) >
- if(itworks) { /* this */
- then= dothis; /* is a */
- } /* set of three comments */
-<
- Becomes: Select the three lines, press \acom >
- if(itworks) { /* this */
- then= dothis; /* is a */
- } /* set of three comments */
-<
- Also see |alignmap-aocom|
-
-
- ---------------------------
- Alignment Map Examples: \anum *alignmap-anum* {{{3
- ---------------------------
-
- Original: illustrates how to get numbers lined up >
- -1.234 .5678 -.901e-4
- 1.234 5.678 9.01e-4
- 12.34 56.78 90.1e-4
- 123.4 567.8 901.e-4
-<
- Becomes: Go to first line, ma. Go to last line, press \anum >
- -1.234 .5678 -.901e-4
- 1.234 5.678 9.01e-4
- 12.34 56.78 90.1e-4
- 123.4 567.8 901.e-4
-<
- Original: >
- | -1.234 .5678 -.901e-4 |
- | 1.234 5.678 9.01e-4 |
- | 12.34 56.78 90.1e-4 |
- | 123.4 567.8 901.e-4 |
-<
- Becomes: Select the numbers with ctrl-v (visual-block mode), >
- press \anum
- | -1.234 .5678 -.901e-4 |
- | 1.234 5.678 9.01e-4 |
- | 12.34 56.78 90.1e-4 |
- | 123.4 567.8 901.e-4 |
-<
- Original: >
- -1,234 ,5678 -,901e-4
- 1,234 5,678 9,01e-4
- 12,34 56,78 90,1e-4
- 123,4 567,8 901,e-4
-<
- Becomes: Go to first line, ma. Go to last line, press \anum >
- -1,234 ,5678 -,901e-4
- 1,234 5,678 9,01e-4
- 12,34 56,78 90,1e-4
- 123,4 567,8 901,e-4
-<
- In addition:
- \aenum is provided to support European-style numbers
- \aunum is provided to support USA-style numbers
-
- One may get \aenum behavior for \anum >
- let g:alignmaps_euronumber= 1
-< or \aunum behavior for \anum if one puts >
- let g:alignmaps_usanumber= 1
-< in one's <.vimrc>.
-
-
- ---------------------------
- Alignment Map Examples: \ascom *alignmap-ascom* {{{3
- ---------------------------
-
- Original: >
- /* A Title */
- int x; /* this is a comment */
- int yzw; /* this is another comment*/
-<
- Becomes: Select the three lines, press \ascom >
- /* A Title */
- int x; /* this is a comment */
- int yzw; /* this is another comment */
-<
-
- ---------------------------
- Alignment Map Examples: \adec *alignmap-adec* {{{3
- ---------------------------
-
- Original: illustrates how to clean up C/C++ declarations >
- int a;
- float b;
- double *c=NULL;
- char x[5];
- struct abc_str abc;
- struct abc_str *pabc;
- int a; /* a */
- float b; /* b */
- double *c=NULL; /* b */
- char x[5]; /* x[5] */
- struct abc_str abc; /* abc */
- struct abc_str *pabc; /* pabc */
- static int a; /* a */
- static float b; /* b */
- static double *c=NULL; /* b */
- static char x[5]; /* x[5] */
- static struct abc_str abc; /* abc */
- static struct abc_str *pabc; /* pabc */
-<
- Becomes: Select the declarations text, then \adec >
- int a;
- float b;
- double *c = NULL;
- char x[5];
- struct abc_str abc;
- struct abc_str *pabc;
- int a; /* a */
- float b; /* b */
- double *c = NULL; /* b */
- char x[5]; /* x[5] */
- struct abc_str abc; /* abc */
- struct abc_str *pabc; /* pabc */
- static int a; /* a */
- static float b; /* b */
- static double *c = NULL; /* b */
- static char x[5]; /* x[5] */
- static struct abc_str abc; /* abc */
- static struct abc_str *pabc; /* pabc */
-<
-
- ---------------------------
- Alignment Map Examples: \adef *alignmap-adef* {{{3
- ---------------------------
-
- Original: illustrates how to line up #def'initions >
- #define ONE 1
- #define TWO 22
- #define THREE 333
- #define FOUR 4444
-<
- Becomes: Select four definition lines, apply \adef >
- # define ONE 1
- # define TWO 22
- # define THREE 333
- # define FOUR 4444
-<
-
- ---------------------------
- Alignment Map Examples: \afnc *alignmap-afnc* {{{3
- ---------------------------
-
- This map is an exception to the usual selection rules.
- It uses "]]" to find the function body's leading "{".
- Just put the cursor anywhere in the function arguments and
- the entire function declaration should be processed.
-
- Because "]]" looks for that "{" in the first column, the
- "original" and "becomes" examples are in the first column,
- too.
-
- Original: illustrates lining up ansi-c style function definitions >
- int f(
- struct abc_str ***a, /* one */
- long *b, /* two */
- int c) /* three */
- {
- }
-<
- Becomes: put cursor anywhere before the '{', press \afnc >
- int f(
- struct abc_str ***a, /* one */
- long *b, /* two */
- int c) /* three */
- {
- }
-<
-
- ---------------------------
- Alignment Map Examples: \adcom *alignmap-adcom* {{{3
- ---------------------------
-
- Original: illustrates aligning comments that don't begin
- lines (optionally after some whitespace). >
- struct {
- /* this is a test */
- int x; /* of how */
- double y; /* to use adcom */
- };
-<
- Becomes: Select the inside lines of the structure,
- then press \adcom. The comment-only
- line is ignored but the other two comments
- get aligned. >
- struct {
- /* this is a test */
- int x; /* of how */
- double y; /* to use adcom */
- };
-<
-
- ---------------------------
- Alignment Map Examples: \aocom *alignmap-aocom* {{{3
- ---------------------------
-
- Original: illustrates how to align C-style comments (works for //, too)
- but restricted only to aligning with those lines containing
- comments. See the difference from \acom (|alignmap-acom|). >
- if(itworks) { /* this comment */
- then= dothis;
- } /* only appears on two lines */
-<
- Becomes: Select the three lines, press \aocom >
- if(itworks) { /* this comment */
- then= dothis;
- } /* only appears on two lines */
-<
- Also see |alignmap-acom|
-
-
- --------------------------- *alignmap-Tsp*
- Alignment Map Examples: \tsp *alignmap-tsp* {{{3
- ---------------------------
-
- Normally Align can't use white spaces for field separators as such
- characters are ignored surrounding field separators. The \tsp and
- \Tsp maps get around this limitation.
-
- Original: >
- one two three four five
- six seven eight nine ten
- eleven twelve thirteen fourteen fifteen
-<
- Becomes: Select the lines, \tsp >
- one two three four five
- six seven eight nine ten
- eleven twelve thirteen fourteen fifteen
-<
- Becomes: Select the lines, \Tsp >
- one two three four five
- six seven eight nine ten
- eleven twelve thirteen fourteen fifteen
-<
-
- ---------------------------
- Alignment Map Examples: \tsq *alignmap-tsq* {{{3
- ---------------------------
-
- The \tsp map is useful for aligning tables based on white space,
- but sometimes one wants double-quoted strings to act as a single
- object in spite of embedded spaces. The \tsq map was invented
- to support this. (thanks to Leif Wickland)
-
- Original: >
- "one two" three
- four "five six"
-<
- Becomes: Select the lines, \tsq >
- "one two" three
- four "five six"
-<
-
- ---------------------------
- Alignment Map Examples: \tt *alignmap-tt* {{{3
- ---------------------------
-
- Original: illustrates aligning a LaTex Table >
- \begin{tabular}{||c|l|r||}
- \hline\hline
- one&two&three\\ \hline
- four&five&six\\
- seven&eight&nine\\
- \hline\hline
- \end{tabular}
-<
- Becomes: Select the three lines inside the table >
- (ie. one..,four..,seven..) and press \tt
- \begin{tabular}{||c|l|r||}
- \hline\hline
- one & two & three \\ \hline
- four & five & six \\
- seven & eight & nine \\
- \hline\hline
- \end{tabular}
-<
-
- ----------------------------
- Alignment Map Examples: \tml *alignmap-tml* {{{3
- ----------------------------
-
- Original: illustrates aligning multi-line continuation marks >
- one \
- two three \
- four five six \
- seven \\ \
- eight \nine \
- ten \
-<
- Becomes: >
- one \
- two three \
- four five six \
- seven \\ \
- eight \nine \
- ten \
-<
-
- ---------------------------
- Alignment Map Examples: \t= *alignmap-t=* {{{3
- ---------------------------
-
- Original: illustrates left-justified aligning of = >
- aa=bb=cc=1;/*one*/
- a=b=c=1;/*two*/
- aaa=bbb=ccc=1;/*three*/
-<
- Becomes: Select the three equations, press \t= >
- aa = bb = cc = 1; /* one */
- a = b = c = 1; /* two */
- aaa = bbb = ccc = 1; /* three */
-<
-
- ---------------------------
- Alignment Map Examples: \T= *alignmap-T=* {{{3
- ---------------------------
-
- Original: illustrates right-justified aligning of = >
- aa=bb=cc=1; /* one */
- a=b=c=1; /* two */
- aaa=bbb=ccc=1; /* three */
-<
- Becomes: Select the three equations, press \T= >
- aa = bb = cc = 1; /* one */
- a = b = c = 1; /* two */
- aaa = bbb = ccc = 1; /* three */
-<
-
- ---------------------------
- Alignment Map Examples: \Htd *alignmap-Htd* {{{3
- ---------------------------
-
- Original: for aligning tables with html >
- <TR><TD>...field one...</TD><TD>...field two...</TD></TR>
- <TR><TD>...field three...</TD><TD>...field four...</TD></TR>
-<
- Becomes: Select <TR>... lines, press \Htd >
- <TR><TD> ...field one... </TD><TD> ...field two... </TD></TR>
- <TR><TD> ...field three... </TD><TD> ...field four... </TD></TR>
-<
-==============================================================================
-4. Alignment Tools' History *align-history* {{{1
-
-ALIGN HISTORY {{{2
- 35 : Nov 02, 2008 * g:loaded_AlignPlugin testing to prevent re-loading
- installed
- Nov 19, 2008 * new sanity check for an AlignStyle of just ":"
- Jan 08, 2009 * save&restore of |'mod'| now done with local
- variant
- 34 : Jul 08, 2008 * using :AlignCtrl before entering any alignment
- control commands was causing an error.
- 33 : Sep 20, 2007 * s:Strlen() introduced to support various ways
- used to represent characters and their effects
- on string lengths. See |align-strlen|.
- * Align now accepts "..." -- so it can accept
- whitespace as separators.
- 32 : Aug 18, 2007 * uses |<q-args>| instead of |<f-args>| plus a
- custom argument splitter to allow patterns with
- backslashes to slide in unaltered.
- 31 : Aug 06, 2007 * :[range]Align! [AlignCtrl settings] pattern(s)
- implemented.
- 30 : Feb 12, 2007 * now uses |setline()|
- 29 : Jan 18, 2006 * cecutil updated to use keepjumps
- Feb 23, 2006 * Align now converted to vim 7.0 style using
- auto-loading functions.
- 28 : Aug 17, 2005 * report option workaround
- Oct 24, 2005 * AlignCtrl l: wasn't behaving as expected; fixed
- 27 : Apr 15, 2005 : cpo workaround
- ignorecase workaround
- 26 : Aug 20, 2004 : loaded_align now also indicates version number
- GetLatestVimScripts :AutoInstall: now supported
- 25 : Jul 27, 2004 : For debugging, uses Dfunc(), Dret(), and Decho()
- 24 : Mar 03, 2004 : (should've done this earlier!) visualmode(1)
- not supported until v6.2, now Align will avoid
- calling it for earlier versions. Visualmode
- clearing won't take place then, of course.
- 23 : Oct 07, 2003 : Included Leif Wickland's ReplaceQuotedSpaces()
- function which supports \tsq
- 22 : Jan 29, 2003 : Now requires 6.1.308 or later to clear visualmode()
- 21 : Jan 10, 2003 : BugFix: similar problem to #19; new code
- bypasses "norm! v\<Esc>" until initialization
- is over.
- 20 : Dec 30, 2002 : BugFix: more on "unable to highlight" fixed
- 19 : Nov 21, 2002 : BugFix: some terminals gave an "unable to highlight"
- message at startup; Hari Krishna Dara tracked it
- down; a silent! now included to prevent noise.
- 18 : Nov 04, 2002 : BugFix: re-enabled anti-repeated-loading
- 17 : Nov 04, 2002 : BugFix: forgot to have AlignPush() push s:AlignSep
- AlignCtrl now clears visual-block mode when used so
- that Align won't try to use old visual-block
- selection marks '< '>
- 16 : Sep 18, 2002 : AlignCtrl <>| options implemented (separator
- justification)
- 15 : Aug 22, 2002 : bug fix: AlignCtrl's ":" now acts as a modifier of
- the preceding alignment operator (lrc)
- 14 : Aug 20, 2002 : bug fix: AlignCtrl default now keeps &ic unchanged
- bug fix: Align, on end-field, wasn't using correct
- alignop bug fix: Align, on end-field, was appending
- padding
- 13 : Aug 19, 2002 : bug fix: zero-length g/v patterns are accepted
- bug fix: always skip blank lines
- bug fix: AlignCtrl default now also clears g and v
- patterns
- 12 : Aug 16, 2002 : moved keep_ic above zero-length pattern checks
- added "AlignCtrl default"
- fixed bug with last field getting separator spaces
- at end line
- 11 : Jul 08, 2002 : prevent separator patterns which match zero length
- -+: included as additional alignment/justification
- styles
- 10 : Jun 26, 2002 : =~# used instead of =~ (for matching case)
- ignorecase option handled
- 9 : Jun 25, 2002 : implemented cyclic padding
-
-ALIGNMENT MAP HISTORY *alignmap-history* {{{2
- v41 Nov 02, 2008 * g:loaded_AlignMapsPlugin testing to prevent
- re-loading installed
- * AlignMaps now use 0x0f (ctrl-p) for special
- character substitutions (instead of 0xff).
- Seems to avoid some problems with having to
- use Strlen().
- * bug fixed with \ts,
- * new maps: \ts; \ts, \ts: \ts< \ts= \a(
- v40 Oct 21, 2008 * Modified AlignMaps so that its maps use <Plug>s
- and <script>s. \t@ and related maps have been
- changed to call StdAlign() instead. The
- WrapperStart function now takes an argument and
- handles being called via visual mode. The
- former nmaps and vmaps have thus been replaced
- with a simple map.
- Oct 24, 2008 * broke AlignMaps into a plugin and autoload
- pair of scripts.
- v39 Mar 06, 2008 : * \t= only does /* ... */ aligning when in *.c
- *.cpp files.
- v38 Aug 18, 2007 : * \tt altered so that it works with the new
- use of |<q-args>| plus a custom argument
- splitter
- v36 Sep 27, 2006 : * AlignWrapperStart() now has tests that marks
- y and z are not set
- May 15, 2007 * \anum and variants improved
- v35 Sep 01, 2006 : * \t= and cousins used "`"s. They now use \xff
- characters.
- * \acom now works with doxygen style /// comments
- * <char-0xff> used in \t= \T= \w= and \m= instead
- of backquotes.
- v34 Feb 23, 2006 : * AlignMaps now converted to vim 7.0 style using
- auto-loading functions.
- v33 Oct 12, 2005 : * \ts, now uses P1 in its AlignCtrl call
- v32 Jun 28, 2005 : * s:WrapperStart() changed to AlignWrapperStart()
- s:WrapperEnd() changed to AlignWrapperEnd()
- These changes let the AlignWrapper...()s to be
- used outside of AlignMaps.vim
- v31 Feb 01, 2005 : * \adcom included, with help
- * \a, now works across multiple lines with
- different types
- * AlignMaps now uses <cecutil.vim> for its mark and
- window-position saving and restoration
- Mar 04, 2005 * improved \a,
- Apr 06, 2005 * included \aenum, \aunum, and provided
- g:alignmaps_{usa|euro]number} options
- v30 Aug 20, 2004 : * \a, : handles embedded assignments and does \adec
- * \acom now can handle Doxygen-style comments
- * g:loaded_alignmaps now also indicates version
- * internal maps \WE and \WS are now re-entrant
- v29 Jul 27, 2004 : * \tml aligns trailing multi-line single
- backslashes (thanks to Raul Benavente!)
- v28 May 13, 2004 : * \a, had problems with leading blanks; fixed!
- v27 Mar 31, 2004 : * \T= was having problems with == and !=
- * Fixed more problems with \adec
- v26 Dec 09, 2003 : * \ascom now also ignores lines without comments
- * \tt \& now not matched
- * \a< handles both << and >>
- v25 Nov 14, 2003 : * included \anum (aligns numbers with periods and
- commas). \anum also supported with ctrl-v mode.
- * \ts, \Ts, : (aligns on commas, then swaps leading
- spaces with commas)
- * \adec ignores preprocessor lines and lines with
- with comments-only
- v23 Sep 10, 2003 : * Bugfix for \afnc - no longer overwrites marks y,z
- * fixed bug in \tsp, \tab, \Tsp, and \Tab - lines
- containing backslashes were having their
- backslashes removed. Included Leif Wickland's
- patch for \tsq.
- * \adef now ignores lines holding comments only
- v18 Aug 22, 2003 : \a< lines up C++'s << operators
- saves/restores gdefault option (sets to nogd)
- all b:..varname.. are now b:alignmaps_..varname..
- v17 Nov 04, 2002 : \afnc now handles // comments correctly and
- commas within comments
- v16 Sep 10, 2002 : changed : to :silent! for \adec
- v15 Aug 27, 2002 : removed some <c-v>s
- v14 Aug 20, 2002 : \WS, \WE mostly moved to functions, marks y and z
- now restored
- v11 Jul 08, 2002 : \abox bug fix
- v9 Jun 25, 2002 : \abox now handles leading initial whitespace
- : various bugfixes to \afnc, \T=, etc
-
-==============================================================================
-Modelines: {{{1
-vim:tw=78:ts=8:ft=help:fdm=marker:
+++ /dev/null
-*NERD_commenter.txt* Plugin for commenting code
-
-
- NERD COMMENTER REFERENCE MANUAL~
-
-
-
-
-
-==============================================================================
-CONTENTS *NERDCommenterContents*
-
- 1.Intro...................................|NERDCommenter|
- 2.Installation............................|NERDComInstallation|
- 3.Functionality provided..................|NERDComFunctionality|
- 3.1 Functionality Summary.............|NERDComFunctionalitySummary|
- 3.2 Functionality Details.............|NERDComFunctionalityDetails|
- 3.2.1 Comment map.................|NERDComComment|
- 3.2.2 Nested comment map..........|NERDComNestedComment|
- 3.2.3 Toggle comment map..........|NERDComToggleComment|
- 3.2.4 Minimal comment map.........|NERDComMinimalComment|
- 3.2.5 Invert comment map..........|NERDComInvertComment|
- 3.2.6 Sexy comment map............|NERDComSexyComment|
- 3.2.7 Yank comment map............|NERDComYankComment|
- 3.2.8 Comment to EOL map..........|NERDComEOLComment|
- 3.2.9 Append com to line map......|NERDComAppendComment|
- 3.2.10 Insert comment map.........|NERDComInsertComment|
- 3.2.11 Use alternate delims map...|NERDComAltDelim|
- 3.2.12 Comment aligned maps.......|NERDComAlignedComment|
- 3.2.13 Uncomment line map.........|NERDComUncommentLine|
- 3.4 Sexy Comments.....................|NERDComSexyComments|
- 3.5 The NERDComment function..........|NERDComNERDComment|
- 4.Options.................................|NERDComOptions|
- 4.1 Options summary...................|NERDComOptionsSummary|
- 4.2 Options details...................|NERDComOptionsDetails|
- 4.3 Default delimiter Options.........|NERDComDefaultDelims|
- 5. Customising key mappings...............|NERDComMappings|
- 6. Issues with the script.................|NERDComIssues|
- 6.1 Delimiter detection heuristics....|NERDComHeuristics|
- 6.2 Nesting issues....................|NERDComNesting|
- 7.About.. ............................|NERDComAbout|
- 8.Changelog...............................|NERDComChangelog|
- 9.Credits.................................|NERDComCredits|
- 10.License................................|NERDComLicense|
-
-==============================================================================
-1. Intro *NERDCommenter*
-
-The NERD commenter provides many different commenting operations and styles
-which are invoked via key mappings and a menu. These operations are available
-for most filetypes.
-
-There are also options that allow to tweak the commenting engine to your
-taste.
-
-==============================================================================
-2. Installation *NERDComInstallation*
-
-The NERD Commenter requires Vim 7 or higher.
-
-Extract the plugin files in your ~/.vim (*nix) or ~/vimfiles (Windows). You
-should have 2 files: >
- plugin/NERD_commenter.vim
- doc/NERD_commenter.txt
-<
-Next, to finish installing the help file run: >
- :helptags ~/.vim/doc
-<
-See |add-local-help| for more details.
-
-Make sure that you have filetype plugins enabled, as the script makes use of
-|'commentstring'| where possible (which is usually set in a filetype plugin).
-See |filetype-plugin-on| for details, but basically, stick this in your vimrc >
- filetype plugin on
-<
-
-==============================================================================
-3. Functionality provided *NERDComFunctionality*
-
-------------------------------------------------------------------------------
-3.1 Functionality summary *NERDComFunctionalitySummary*
-
-The following key mappings are provided by default (there is also a menu
-with items corresponding to all the mappings below):
-
-[count]<leader>cc |NERDComComment|
-Comment out the current line or text selected in visual mode.
-
-
-[count]<leader>cn |NERDComNestedComment|
-Same as <leader>cc but forces nesting.
-
-
-[count]<leader>c<space> |NERDComToggleComment|
-Toggles the comment state of the selected line(s). If the topmost selected
-line is commented, all selected lines are uncommented and vice versa.
-
-
-[count]<leader>cm |NERDComMinimalComment|
-Comments the given lines using only one set of multipart delimiters.
-
-
-[count]<leader>ci |NERDComInvertComment|
-Toggles the comment state of the selected line(s) individually.
-
-
-[count]<leader>cs |NERDComSexyComment|
-Comments out the selected lines ``sexily''
-
-
-[count]<leader>cy |NERDComYankComment|
-Same as <leader>cc except that the commented line(s) are yanked first.
-
-
-<leader>c$ |NERDComEOLComment|
-Comments the current line from the cursor to the end of line.
-
-
-<leader>cA |NERDComAppendComment|
-Adds comment delimiters to the end of line and goes into insert mode between
-them.
-
-
-|NERDComInsertComment|
-Adds comment delimiters at the current cursor position and inserts between.
-Disabled by default.
-
-
-<leader>ca |NERDComAltDelim|
-Switches to the alternative set of delimiters.
-
-
-[count]<leader>cl
-[count]<leader>cb |NERDComAlignedComment|
-Same as |NERDComComment| except that the delimiters are aligned down the
-left side (<leader>cl) or both sides (<leader>cb).
-
-
-[count]<leader>cu |NERDComUncommentLine|
-Uncomments the selected line(s).
-
-------------------------------------------------------------------------------
-3.2 Functionality details *NERDComFunctionalityDetails*
-
-------------------------------------------------------------------------------
-3.2.1 Comment map *NERDComComment*
-
-Default mapping: [count]<leader>cc
-Mapped to: <plug>NERDCommenterComment
-Applicable modes: normal visual visual-line visual-block.
-
-
-Comments out the current line. If multiple lines are selected in visual-line
-mode, they are all commented out. If some text is selected in visual or
-visual-block mode then the script will try to comment out the exact text that
-is selected using multi-part delimiters if they are available.
-
-If a [count] is given in normal mode, the mapping works as though that many
-lines were selected in visual-line mode.
-
-------------------------------------------------------------------------------
-3.2.2 Nested comment map *NERDComNestedComment*
-
-Default mapping: [count]<leader>cn
-Mapped to: <plug>NERDCommenterNest
-Applicable modes: normal visual visual-line visual-block.
-
-Performs nested commenting. Works the same as <leader>cc except that if a line
-is already commented then it will be commented again.
-
-If |'NERDUsePlaceHolders'| is set then the previous comment delimiters will
-be replaced by place-holder delimiters if needed. Otherwise the nested
-comment will only be added if the current commenting delimiters have no right
-delimiter (to avoid syntax errors)
-
-If a [count] is given in normal mode, the mapping works as though that many
-lines were selected in visual-line mode.
-
-Related options:
-|'NERDDefaultNesting'|
-
-------------------------------------------------------------------------------
-3.2.3 Toggle comment map *NERDComToggleComment*
-
-Default mapping: [count]<leader>c<space>
-Mapped to: <plug>NERDCommenterToggle
-Applicable modes: normal visual-line.
-
-Toggles commenting of the lines selected. The behaviour of this mapping
-depends on whether the first line selected is commented or not. If so, all
-selected lines are uncommented and vice versa.
-
-With this mapping, a line is only considered to be commented if it starts with
-a left delimiter.
-
-If a [count] is given in normal mode, the mapping works as though that many
-lines were selected in visual-line mode.
-
-------------------------------------------------------------------------------
-3.2.4 Minimal comment map *NERDComMinimalComment*
-
-Default mapping: [count]<leader>cm
-Mapped to: <plug>NERDCommenterMinimal
-Applicable modes: normal visual-line.
-
-Comments the selected lines using one set of multipart delimiters if possible.
-
-For example: if you are programming in c and you select 5 lines and press
-<leader>cm then a '/*' will be placed at the start of the top line and a '*/'
-will be placed at the end of the last line.
-
-Sets of multipart comment delimiters that are between the top and bottom
-selected lines are replaced with place holders (see |'NERDLPlace'|) if
-|'NERDUsePlaceHolders'| is set for the current filetype. If it is not, then
-the comment will be aborted if place holders are required to prevent illegal
-syntax.
-
-If a [count] is given in normal mode, the mapping works as though that many
-lines were selected in visual-line mode.
-
-------------------------------------------------------------------------------
-3.2.5 Invert comment map *NERDComInvertComment*
-
-Default mapping: <leader>ci
-Mapped to: <plug>NERDCommenterInvert
-Applicable modes: normal visual-line.
-
-Inverts the commented state of each selected line. If the a selected line is
-commented then it is uncommented and vice versa. Each line is examined and
-commented/uncommented individually.
-
-With this mapping, a line is only considered to be commented if it starts with
-a left delimiter.
-
-If a [count] is given in normal mode, the mapping works as though that many
-lines were selected in visual-line mode.
-
-------------------------------------------------------------------------------
-3.2.6 Sexy comment map *NERDComSexyComment*
-
-Default mapping: [count]<leader>cs
-Mapped to: <plug>NERDCommenterSexy
-Applicable modes: normal, visual-line.
-
-Comments the selected line(s) ``sexily''... see |NERDComSexyComments| for
-a description of what sexy comments are. Can only be done on filetypes for
-which there is at least one set of multipart comment delimiters specified.
-
-Sexy comments cannot be nested and lines inside a sexy comment cannot be
-commented again.
-
-If a [count] is given in normal mode, the mapping works as though that many
-lines were selected in visual-line mode.
-
-Related options:
-|'NERDCompactSexyComs'|
-
-------------------------------------------------------------------------------
-3.2.7 Yank comment map *NERDComYankComment*
-
-Default mapping: [count]<leader>cy
-Mapped to: <plug>NERDCommenterYank
-Applicable modes: normal visual visual-line visual-block.
-
-Same as <leader>cc except that it yanks the line(s) that are commented first.
-
-------------------------------------------------------------------------------
-3.2.8 Comment to EOL map *NERDComEOLComment*
-
-Default mapping: <leader>c$
-Mapped to: <plug>NERDCommenterToEOL
-Applicable modes: normal.
-
-Comments the current line from the current cursor position up to the end of
-the line.
-
-------------------------------------------------------------------------------
-3.2.9 Append com to line map *NERDComAppendComment*
-
-Default mapping: <leader>cA
-Mapped to: <plug>NERDCommenterAppend
-Applicable modes: normal.
-
-Appends comment delimiters to the end of the current line and goes
-to insert mode between the new delimiters.
-
-------------------------------------------------------------------------------
-3.2.10 Insert comment map *NERDComInsertComment*
-
-Default mapping: disabled by default.
-Map it to: <plug>NERDCommenterInInsert
-Applicable modes: insert.
-
-Adds comment delimiters at the current cursor position and inserts
-between them.
-
-NOTE: prior to version 2.1.17 this was mapped to ctrl-c. To restore this
-mapping add >
- let NERDComInsertMap='<c-c>'
-<
-to your vimrc.
-
-------------------------------------------------------------------------------
-3.2.11 Use alternate delims map *NERDComAltDelim*
-
-Default mapping: <leader>ca
-Mapped to: <plug>NERDCommenterAltDelims
-Applicable modes: normal.
-
-Changes to the alternative commenting style if one is available. For example,
-if the user is editing a c++ file using // comments and they hit <leader>ca
-then they will be switched over to /**/ comments.
-
-See also |NERDComDefaultDelims|
-
-------------------------------------------------------------------------------
-3.2.12 Comment aligned maps *NERDComAlignedComment*
-
-Default mappings: [count]<leader>cl [count]<leader>cb
-Mapped to: <plug>NERDCommenterAlignLeft
- <plug>NERDCommenterAlignBoth
-Applicable modes: normal visual-line.
-
-Same as <leader>cc except that the comment delimiters are aligned on the left
-side or both sides respectively. These comments are always nested if the
-line(s) are already commented.
-
-If a [count] is given in normal mode, the mapping works as though that many
-lines were selected in visual-line mode.
-
-------------------------------------------------------------------------------
-3.2.13 Uncomment line map *NERDComUncommentLine*
-
-Default mapping: [count]<leader>cu
-Mapped to: <plug>NERDCommenterUncomment
-Applicable modes: normal visual visual-line visual-block.
-
-Uncomments the current line. If multiple lines are selected in
-visual mode then they are all uncommented.
-
-When uncommenting, if the line contains multiple sets of delimiters then the
-``outtermost'' pair of delimiters will be removed.
-
-The script uses a set of heurisics to distinguish ``real'' delimiters from
-``fake'' ones when uncommenting. See |NERDComIssues| for details.
-
-If a [count] is given in normal mode, the mapping works as though that many
-lines were selected in visual-line mode.
-
-Related options:
-|'NERDRemoveAltComs'|
-|'NERDRemoveExtraSpaces'|
-
-------------------------------------------------------------------------------
-3.3 Sexy Comments *NERDComSexyComments*
-These are comments that use one set of multipart comment delimiters as well as
-one other marker symbol. For example: >
- /*
- * This is a c style sexy comment
- * So there!
- */
-
- /* This is a c style sexy comment
- * So there!
- * But this one is ``compact'' style */
-<
-Here the multipart delimiters are /* and */ and the marker is *.
-
-------------------------------------------------------------------------------
-3.4 The NERDComment function *NERDComNERDComment*
-
-All of the NERD commenter mappings and menu items invoke a single function
-which delegates the commenting work to other functions. This function is
-public and has the prototype: >
- function! NERDComment(isVisual, type)
-<
-The arguments to this function are simple:
- - isVisual: if you wish to do any kind of visual comment then set this to
- 1 and the function will use the '< and '> marks to find the comment
- boundries. If set to 0 then the function will operate on the current
- line.
- - type: is used to specify what type of commenting operation is to be
- performed, and it can be one of the following: "sexy", "invert",
- "minimal", "toggle", "alignLeft", "alignBoth", "norm", "nested",
- "toEOL", "append", "insert", "uncomment", "yank"
-
-For example, if you typed >
- :call NERDComment(1, 'sexy')
-<
-then the script would do a sexy comment on the last visual selection.
-
-
-==============================================================================
-4. Options *NERDComOptions*
-
-------------------------------------------------------------------------------
-4.1 Options summary *NERDComOptionsSummary*
-
-|'loaded_nerd_comments'| Turns off the script.
-|'NERDAllowAnyVisualDelims'| Allows multipart alternative delims to
- be used when commenting in
- visual/visual-block mode.
-|'NERDBlockComIgnoreEmpty'| Forces right delims to be placed when
- doing visual-block comments.
-|'NERDCommentWholeLinesInVMode'| Changes behaviour of visual comments.
-|'NERDCreateDefaultMappings'| Turn the default mappings on/off.
-|'NERDDefaultNesting'| Tells the script to use nested comments
- by default.
-|'NERDMenuMode'| Specifies how the NERD commenter menu
- will appear (if at all).
-|'NERDLPlace'| Specifies what to use as the left
- delimiter placeholder when nesting
- comments.
-|'NERDUsePlaceHolders'| Specifies which filetypes may use
- placeholders when nesting comments.
-|'NERDRemoveAltComs'| Tells the script whether to remove
- alternative comment delimiters when
- uncommenting.
-|'NERDRemoveExtraSpaces'| Tells the script to always remove the
- extra spaces when uncommenting
- (regardless of whether NERDSpaceDelims
- is set)
-|'NERDRPlace'| Specifies what to use as the right
- delimiter placeholder when nesting
- comments.
-|'NERDSpaceDelims'| Specifies whether to add extra spaces
- around delimiters when commenting, and
- whether to remove them when
- uncommenting.
-|'NERDCompactSexyComs'| Specifies whether to use the compact
- style sexy comments.
-
-------------------------------------------------------------------------------
-4.3 Options details *NERDComOptionsDetails*
-
-To enable any of the below options you should put the given line in your
-~/.vimrc
-
- *'loaded_nerd_comments'*
-If this script is driving you insane you can turn it off by setting this
-option >
- let loaded_nerd_comments=1
-<
-------------------------------------------------------------------------------
- *'NERDAllowAnyVisualDelims'*
-Values: 0 or 1.
-Default: 1.
-
-If set to 1 then, when doing a visual or visual-block comment (but not a
-visual-line comment), the script will choose the right delimiters to use for
-the comment. This means either using the current delimiters if they are
-multipart or using the alternative delimiters if THEY are multipart. For
-example if we are editing the following java code: >
- float foo = 1221;
- float bar = 324;
- System.out.println(foo * bar);
-<
-If we are using // comments and select the "foo" and "bar" in visual-block
-mode, as shown left below (where '|'s are used to represent the visual-block
-boundary), and comment it then the script will use the alternative delims as
-shown on the right: >
-
- float |foo| = 1221; float /*foo*/ = 1221;
- float |bar| = 324; float /*bar*/ = 324;
- System.out.println(foo * bar); System.out.println(foo * bar);
-<
-------------------------------------------------------------------------------
- *'NERDBlockComIgnoreEmpty'*
-Values: 0 or 1.
-Default: 1.
-
-This option affects visual-block mode commenting. If this option is turned
-on, lines that begin outside the right boundary of the selection block will be
-ignored.
-
-For example, if you are commenting this chunk of c code in visual-block mode
-(where the '|'s are used to represent the visual-block boundary) >
- #include <sys/types.h>
- #include <unistd.h>
- #include <stdio.h>
- |int| main(){
- | | printf("SUCK THIS\n");
- | | while(1){
- | | fork();
- | | }
- |} |
-<
-If NERDBlockComIgnoreEmpty=0 then this code will become: >
- #include <sys/types.h>
- #include <unistd.h>
- #include <stdio.h>
- /*int*/ main(){
- /* */ printf("SUCK THIS\n");
- /* */ while(1){
- /* */ fork();
- /* */ }
- /*} */
-<
-Otherwise, the code block would become: >
- #include <sys/types.h>
- #include <unistd.h>
- #include <stdio.h>
- /*int*/ main(){
- printf("SUCK THIS\n");
- while(1){
- fork();
- }
- /*} */
-<
-------------------------------------------------------------------------------
- *'NERDCommentWholeLinesInVMode'*
-Values: 0, 1 or 2.
-Default: 0.
-
-By default the script tries to comment out exactly what is selected in visual
-mode (v). For example if you select and comment the following c code (using |
-to represent the visual boundary): >
- in|t foo = 3;
- int bar =| 9;
- int baz = foo + bar;
-<
-This will result in: >
- in/*t foo = 3;*/
- /*int bar =*/ 9;
- int baz = foo + bar;
-<
-But some people prefer it if the whole lines are commented like: >
- /*int foo = 3;*/
- /*int bar = 9;*/
- int baz = foo + bar;
-<
-If you prefer the second option then stick this line in your vimrc: >
- let NERDCommentWholeLinesInVMode=1
-<
-
-If the filetype you are editing only has no multipart delimiters (for example
-a shell script) and you hadnt set this option then the above would become >
- in#t foo = 3;
- #int bar = 9;
-<
-(where # is the comment delimiter) as this is the closest the script can
-come to commenting out exactly what was selected. If you prefer for whole
-lines to be commented out when there is no multipart delimiters but the EXACT
-text that was selected to be commented out if there IS multipart delimiters
-then stick the following line in your vimrc: >
- let NERDCommentWholeLinesInVMode=2
-<
-
-Note that this option does not affect the behaviour of commenting in
-|visual-block| mode.
-
-------------------------------------------------------------------------------
- *'NERDCreateDefaultMappings'*
-Values: 0 or 1.
-Default: 1.
-
-If set to 0, none of the default mappings will be created.
-
-See also |NERDComMappings|.
-
-------------------------------------------------------------------------------
- *'NERDRemoveAltComs'*
-Values: 0 or 1.
-Default: 1.
-
-When uncommenting a line (for a filetype with an alternative commenting style)
-this option tells the script whether to look for, and remove, comment
-delimiters of the alternative style.
-
-For example, if you are editing a c++ file using // style comments and you go
-<leader>cu on this line: >
- /* This is a c++ comment baby! */
-<
-It will not be uncommented if the NERDRemoveAltComs is set to 0.
-
-------------------------------------------------------------------------------
- *'NERDRemoveExtraSpaces'*
-Values: 0 or 1.
-Default: 1.
-
-By default, the NERD commenter will remove spaces around comment delimiters if
-either:
-1. |'NERDSpaceDelims'| is set to 1.
-2. NERDRemoveExtraSpaces is set to 1.
-
-This means that if we have the following lines in a c code file: >
- /* int foo = 5; */
- /* int bar = 10; */
- int baz = foo + bar
-<
-If either of the above conditions hold then if these lines are uncommented
-they will become: >
- int foo = 5;
- int bar = 10;
- int baz = foo + bar
-<
-Otherwise they would become: >
- int foo = 5;
- int bar = 10;
- int baz = foo + bar
-<
-If you want the spaces to be removed only if |'NERDSpaceDelims'| is set then
-set NERDRemoveExtraSpaces to 0.
-
-------------------------------------------------------------------------------
- *'NERDLPlace'*
- *'NERDRPlace'*
-Values: arbitrary string.
-Default:
- NERDLPlace: "[>"
- NERDRPlace: "<]"
-
-These options are used to control the strings used as place-holder delimiters.
-Place holder delimiters are used when performing nested commenting when the
-filetype supports commenting styles with both left and right delimiters.
-To set these options use lines like: >
- let NERDLPlace="FOO"
- let NERDRPlace="BAR"
-<
-Following the above example, if we have line of c code: >
- /* int horse */
-<
-and we comment it with <leader>cn it will be changed to: >
- /*FOO int horse BAR*/
-<
-When we uncomment this line it will go back to what it was.
-
-------------------------------------------------------------------------------
- *'NERDMenuMode'*
-Values: 0, 1, 2, 3.
-Default: 3
-
-This option can take 4 values:
- "0": Turns the menu off.
- "1": Turns the 'comment' menu on with no menu shortcut.
- "2": Turns the 'comment 'menu on with <alt>-c as the shortcut.
- "3": Turns the 'Plugin -> comment' menu on with <alt>-c as the shortcut.
-
-------------------------------------------------------------------------------
- *'NERDUsePlaceHolders'*
-Values: 0 or 1.
-Default 1.
-
-This option is used to specify whether place-holder delimiters should be used
-when creating a nested comment.
-
-------------------------------------------------------------------------------
- *'NERDSpaceDelims'*
-Values: 0 or 1.
-Default 0.
-
-Some people prefer a space after the left delimiter and before the right
-delimiter like this: >
- /* int foo=2; */
-<
-as opposed to this: >
- /*int foo=2;*/
-<
-If you want spaces to be added then set NERDSpaceDelims to 1 in your vimrc.
-
-See also |'NERDRemoveExtraSpaces'|.
-
-------------------------------------------------------------------------------
- *'NERDCompactSexyComs'*
-Values: 0 or 1.
-Default 0.
-
-Some people may want their sexy comments to be like this: >
- /* Hi There!
- * This is a sexy comment
- * in c */
-<
-As opposed to like this: >
- /*
- * Hi There!
- * This is a sexy comment
- * in c
- */
-<
-If this option is set to 1 then the top style will be used.
-
-------------------------------------------------------------------------------
- *'NERDDefaultNesting'*
-Values: 0 or 1.
-Default 1.
-
-When this option is set to 1, comments are nested automatically. That is, if
-you hit <leader>cc on a line that is already commented it will be commented
-again.
-
-------------------------------------------------------------------------------
-3.3 Default delimiter customisation *NERDComDefaultDelims*
-
-If you want the NERD commenter to use the alternative delimiters for a
-specific filetype by default then put a line of this form into your vimrc: >
- let NERD_<filetype>_alt_style=1
-<
-Example: java uses // style comments by default, but you want it to default to
-/* */ style comments instead. You would put this line in your vimrc: >
- let NERD_java_alt_style=1
-<
-
-See |NERDComAltDelim| for switching commenting styles at runtime.
-
-==============================================================================
-5. Key mapping customisation *NERDComMappings*
-
-To change a mapping just map another key combo to the internal <plug> mapping.
-For example, to remap the |NERDComComment| mapping to ",omg" you would put
-this line in your vimrc: >
- map ,omg <plug>NERDCommenterComment
-<
-This will stop the corresponding default mappings from being created.
-
-See the help for the mapping in question to see which <plug> mapping to
-map to.
-
-See also |'NERDCreateDefaultMappings'|.
-
-==============================================================================
-6. Issues with the script *NERDComIssues*
-
-
-------------------------------------------------------------------------------
-6.1 Delimiter detection heuristics *NERDComHeuristics*
-
-Heuristics are used to distinguish the real comment delimiters
-
-Because we have comment mappings that place delimiters in the middle of lines,
-removing comment delimiters is a bit tricky. This is because if comment
-delimiters appear in a line doesnt mean they really ARE delimiters. For
-example, Java uses // comments but the line >
- System.out.println("//");
-<
-clearly contains no real comment delimiters.
-
-To distinguish between ``real'' comment delimiters and ``fake'' ones we use a
-set of heuristics. For example, one such heuristic states that any comment
-delimiter that has an odd number of non-escaped " characters both preceding
-and following it on the line is not a comment because it is probably part of a
-string. These heuristics, while usually pretty accurate, will not work for all
-cases.
-
-------------------------------------------------------------------------------
-6.2 Nesting issues *NERDComNesting*
-
-If we have some line of code like this: >
- /*int foo */ = /*5 + 9;*/
-<
-This will not be uncommented legally. The NERD commenter will remove the
-"outter most" delimiters so the line will become: >
- int foo */ = /*5 + 9;
-<
-which almost certainly will not be what you want. Nested sets of comments will
-uncomment fine though. Eg: >
- /*int/* foo =*/ 5 + 9;*/
-<
-will become: >
- int/* foo =*/ 5 + 9;
-<
-(Note that in the above examples I have deliberately not used place holders
-for simplicity)
-
-==============================================================================
-7. About *NERDComAbout*
-
-The author of the NERD commenter is Martyzillatron --- the half robot, half
-dinosaur bastard son of Megatron and Godzilla. He enjoys destroying
-metropolises and eating tourist busses.
-
-Drop him a line at martin_grenfell at msn.com. He would love to hear from you.
-its a lonely life being the worlds premier terror machine. How would you feel
-if your face looked like a toaster and a t-rex put together? :(
-
-The latest stable versions can be found at
- http://www.vim.org/scripts/script.php?script_id=1218
-
-The latest dev versions are on github
- http://github.com/scrooloose/nerdcommenter
-
-==============================================================================
-8. Changelog *NERDComChangelog*
-
-2.3.0
- - remove all filetypes which have a &commentstring in the standard vim
- runtime for vim > 7.0 unless the script stores an alternate set of
- delimiters
- - make the script complain if the user doesnt have filetype plugins enabled
- - use <leader> instead of comma to start the default mappings
- - fix a couple of bugs with sexy comments - thanks to Tim Smart
- - lots of refactoring
-
-2.2.2
- - remove the NERDShutup option and the message is suppresses, this makes
- the plugin silently rely on &commentstring for unknown filetypes.
- - add support for dhcpd, limits, ntp, resolv, rgb, sysctl, udevconf and
- udevrules. Thanks to Thilo Six.
- - match filetypes case insensitively
- - add support for mp (metapost), thanks to Andrey Skvortsov.
- - add support for htmlcheetah, thanks to Simon Hengel.
- - add support for javacc, thanks to Matt Tolton.
- - make <%# %> the default delims for eruby, thanks to tpope.
- - add support for javascript.jquery, thanks to Ivan Devat.
- - add support for cucumber and pdf. Fix sass and railslog delims,
- thanks to tpope
-
-2.2.1
- - add support for newlisp and clojure, thanks to Matthew Lee Hinman.
- - fix automake comments, thanks to Elias Pipping
- - make haml comments default to -# with / as the alternative delimiter,
- thanks to tpope
- - add support for actionscript and processing thanks to Edwin Benavides
- - add support for ps1 (powershell), thanks to Jason Mills
- - add support for hostsaccess, thanks to Thomas Rowe
- - add support for CVScommit
- - add support for asciidoc, git and gitrebase. Thanks to Simon Ruderich.
- - use # for gitcommit comments, thanks to Simon Ruderich.
- - add support for mako and genshi, thanks to Keitheis.
- - add support for conkyrc, thanks to David
- - add support for SVNannotate, thanks to Miguel Jaque Barbero.
- - add support for sieve, thanks to Stefan Walk
- - add support for objj, thanks to Adam Thorsen.
-
-2.2.0
- - rewrote the mappings system to be more "standard".
- - removed all the mapping options. Now, mappings to <plug> mappings are
- used
- - see :help NERDComMappings, and :help NERDCreateDefaultMappings for
- more info
- - remove "prepend comments" and "right aligned comments".
- - add support for applescript, calbire, man, SVNcommit, potwiki, txt2tags and SVNinfo.
- Thanks to nicothakis, timberke, sgronblo, mntnoe, Bernhard Grotz, John
- O'Shea, François and Giacomo Mariani respectively.
- - bugfix for haskell delimiters. Thanks to mntnoe.
-2.1.18
- - add support for llvm. Thanks to nicothakis.
- - add support for xquery. Thanks to Phillip Kovalev.
-2.1.17
- - fixed haskell delimiters (hackily). Thanks to Elias Pipping.
- - add support for mailcap. Thanks to Pascal Brueckner.
- - add support for stata. Thanks to Jerónimo Carballo.
- - applied a patch from ewfalor to fix an error in the help file with the
- NERDMapleader doc
- - disable the insert mode ctrl-c mapping by default, see :help
- NERDComInsertComment if you wish to restore it
-
-==============================================================================
-9. Credits *NERDComCredits*
-
-Thanks to the follow people for suggestions and patches:
-
-Nick Brettell
-Matthew Hawkins
-Mathieu Clabaut
-Greg Searle
-Nguyen
-Litchi
-Jorge Scandaliaris
-Shufeng Zheng
-Martin Stubenschrott
-Markus Erlmann
-Brent Rice
-Richard Willis
-Igor Prischepoff
-Harry
-David Bourgeois
-Eike Von Seggern
-Torsten Blix
-Alexander Bosecke
-Stefano Zacchiroli
-Norick Chen
-Joseph Barker
-Gary Church
-Tim Carey-Smith
-Markus Klinik
-Anders
-Seth Mason
-James Hales
-Heptite
-Cheng Fang
-Yongwei Wu
-David Miani
-Jeremy Hinegardner
-Marco
-Ingo Karkat
-Zhang Shuhan
-tpope
-Ben Schmidt
-David Fishburn
-Erik Falor
-JaGoTerr
-Elias Pipping
-mntnoe
-Mark S.
-
-
-Thanks to the following people for sending me new filetypes to support:
-
-The hackers The filetypes~
-Sam R verilog
-Jonathan Derque context, plaintext and mail
-Vigil fetchmail
-Michael Brunner kconfig
-Antono Vasiljev netdict
-Melissa Reid omlet
-Ilia N Ternovich quickfix
-John O'Shea RTF, SVNcommitlog and vcscommit, SVNCommit
-Anders occam
-Mark Woodward csv
-fREW gentoo-package-mask,
- gentoo-package-keywords,
- gentoo-package-use, and vo_base
-Alexey verilog_systemverilog, systemverilog
-Lizendir fstab
-Michael Böhler autoit, autohotkey and docbk
-Aaron Small cmake
-Ramiro htmldjango and django
-Stefano Zacchiroli debcontrol, debchangelog, mkd
-Alex Tarkovsky ebuild and eclass
-Jorge Rodrigues gams
-Rainer Müller Objective C
-Jason Mills Groovy, ps1
-Normandie Azucena vera
-Florian Apolloner ldif
-David Fishburn lookupfile
-Niels Aan de Brugh rst
-Don Hatlestad ahk
-Christophe Benz Desktop and xsd
-Eyolf Østrem lilypond, bbx and lytex
-Ingo Karkat dosbatch
-Nicolas Weber markdown, objcpp
-tinoucas gentoo-conf-d
-Greg Weber D, haml
-Bruce Sherrod velocity
-timberke cobol, calibre
-Aaron Schaefer factor
-Mr X asterisk, mplayerconf
-Kuchma Michael plsql
-Brett Warneke spectre
-Pipp lhaskell
-Renald Buter scala
-Vladimir Lomov asymptote
-Marco mrxvtrc, aap
-nicothakis SVNAnnotate, CVSAnnotate, SVKAnnotate,
- SVNdiff, gitAnnotate, gitdiff, dtrace
- llvm, applescript
-Chen Xing Wikipedia
-Jacobo Diaz dakota, patran
-Li Jin gentoo-env-d, gentoo-init-d,
- gentoo-make-conf, grub, modconf, sudoers
-SpookeyPeanut rib
-Greg Jandl pyrex/cython
-Christophe Benz services, gitcommit
-A Pontus vimperator
-Stromnov slice, bzr
-Martin Kustermann pamconf
-Indriði Einarsson mason
-Chris map
-Krzysztof A. Adamski group
-Pascal Brueckner mailcap
-Jerónimo Carballo stata
-Phillip Kovalev xquery
-Bernhard Grotz potwiki
-sgronblo man
-François txt2tags
-Giacomo Mariani SVNinfo
-Matthew Lee Hinman newlisp, clojure
-Elias Pipping automake
-Edwin Benavides actionscript, processing
-Thomas Rowe hostsaccess
-Simon Ruderich asciidoc, git, gitcommit, gitrebase
-Keitheis mako, genshi
-David conkyrc
-Miguel Jaque Barbero SVNannotate
-Stefan Walk sieve
-Adam Thorsen objj
-Thilo Six dhcpd, limits, ntp, resolv, rgb, sysctl,
- udevconf, udevrules
-Andrey Skvortsov mp
-Simon Hengel htmlcheetah
-Matt Tolton javacc
-Ivan Devat javascript.jquery
-tpope cucumber,pdf
-==============================================================================
-10. License *NERDComLicense*
-
-The NERD commenter is released under the wtfpl.
-See http://sam.zoy.org/wtfpl/COPYING.
+++ /dev/null
-*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.x.x
- - Fix a bug with :NERDTreeFind and symlinks. Thanks to Vitaly Bogdanov.
-
-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
- Vitaly Bogdanov
-
-==============================================================================
-8. License *NERDTreeLicense*
-
-The NERD tree is released under the wtfpl.
-See http://sam.zoy.org/wtfpl/COPYING.
+++ /dev/null
-*ZoomWin.txt* Zoom into/out-of a window Jan 26, 2009
-Authors: Charles E. Campbell, Jr. *zoomwin*
- Ron Aaron
-Copyright: (c) 2004-2008 by Charles E. Campbell, Jr. *zoomwin-copyright*
- The VIM LICENSE applies to ZoomWin.vim and ZoomWin.txt
- (see |copyright|) except use "ZoomWin" instead of "Vim"
- No warranty, express or implied. Use At-Your-Own-Risk.
-
-==============================================================================
-1. Usage *zoomwin-usage*
-
- :call ZoomWin()
- :ZoomWin
- <c-w>o
-
- Either of the two commands or the normal mode <c-w>o will toggle between
- * selecting the current window for display as the only window or
- * to restore the original multiple-window view.
-
-==============================================================================
-2. Setup *zoomwin-setup*
-
- Simply put ZoomWin.vim into your .vim/plugin directory (you may need to
- make such a directory first). Under Windows that should be
- vimfiles\plugin. ZoomWin now uses the HelpExtractor method to
- automatically extract help and to make it known to vim by running helptags
- on it.
-
-==============================================================================
-3. History *zoomwin-history*
-
- v23 Apr 24, 2008 : * when |'scrollbind'| was activated: when ZoomWin
- attempted to restore multiple-windows, the cursor
- position was incorrect. Fixed.
- Jan 02, 2009 * included some more things in the session file
- * broke ZoomWin into an plugin + autoload pair
- * (Ingo Karkat) contributed a patch to retain the
- the search pattern before zooming
- * (Ingo Karkat) contributed a patch to detect the
- vim 7.2 name for the command line window
- v22 Apr 10, 2006 : * "only" was occasionally issuing an "Already one
- window" message, which is now prevented
- * SavePosn() issued error message when handling an
- empty buffer
- * saves yank registers and restores them on each
- zoom/unzoom
- v21 Oct 12, 2004 : * v14 fixed a bug when wmw and/or wmv equal to 0;
- v21 will invoke the patch only if the version <= 603.
- For vim version 6.3 users, this fix allows more files
- to be handled by ZoomWin.
- May 10, 2005 * When :version shows -mksession, and the vim version
- is at least 6.3, ZoomWin will now do a partial zoom
- v20 Jul 26, 2004 : * bugfix - ZoomWin didn't always retain the
- position in the former zoomed-in window after
- the window layout was restored. It was restoring
- the position when the zoom-in occurred.
- v19 May 26, 2004 : * bugfix - winmanager has events firing that,
- amongst other things, reset the bufhidden
- option to delete for some windows while
- ZoomWin worked. ZoomWin now works
- successfully with winmanager.
- v18 May 20, 2004 : * bugfix - didn't adversely affect anything, but
- ZoomWin was deleting its session file twice.
- * bugfix -- a multi-source file + minibufexplorer
- + Taglist interaction bug -- minibufexplorer's
- autocmd events were firing, generating a new
- window while ZoomWin was attempting to restore
- the display. ZoomWin didn't have restoration
- information for the new window and so reported
- an error. Events are now temporarily disabled
- while ZoomWin is restoring the layout.
- v17 Mar 26, 2004 : * ZoomWin command installed. Works nicely with
- taglist: vim +Tlist +ZoomWin filename
- v16 Dec 22, 2003 : * handles bufhidden and nobl windows (TagList support).
- * Now also works with quickfix window (:copen) but
- still not with |cmdline-window| (q:)
- v15 Dec 19, 2003 : * SavePosn()/RestorePosn() needed to be preceded
- by s: to prevent clashes
- v14 Dec 18, 2003 : * works around a restoration-bug with mksession
- when either wmw or wmh settings are zero
- * Bwipes internal temporary buffers
- * Known bugs: will not work with command-line
- * Editing window (|cmdline-window|) nor the
- quickfix window (|copen|).
- v13 Dec 18, 2003 : Uses eventignore to prevent events/autocmds from
- firing while changing the mksession results.
- v12 Dec 12, 2003 : uses hidden and a minimalist mksession save
- v11 Oct 14, 2003 : bug fix: apparently RestorePosn()'s variables,
- which were b:, weren't always defined, so s:
- ones are now used.
- v10 Sep 22, 2003 : Bug fix: when a single window is showing, the user
- moves the cursor, then <c-w>o used to restore
- screen, the current cursor position wasn't retained
- Restores v:this_session.
- Bug fix: change a window, use <c-w>o, then write.
- Was saving file only to temporary file instead of
- actual file, but when the actual file was brought back,
- the changes were lost.
- v9 Aug 15, 2003 : v8 managed to trash syntax highlighting on
- reload, this one removes the eventignore
- handling. Will need more pondering...
- v8 Aug 14, 2003 : now handles not-modified but not filereadable
- buffers, nowrite buffers uses eventignore to
- bypass autocmd firing
- v7 May 23, 2003 : bugfix - GotoWinNum() didn't always get the
- cursor into the correct window
- v6 Mar 25, 2003 : more cleanup included
- v5 Mar 14, 2003 : includes support for handling scratch buffers,
- no-name buffer windows, and modified-buffer
- windows. All windows' contents will be saved to
- temporary buffers
- v4 Dec 12, 2002 : Zak Beck contributed code to clean up temporary
- session files if one leaves vim while zoomed-in
- v3 Dec 11, 2002 : plugin-ized
- v2 Nov 08, 2002 : A guaranteed-to-be-unique to this
- session file is used for session information.
- Modified but not yet saved files are made hidden
- during zoom in.
- v1 the epoch : Ron Aaron's original
-
-vim:tw=78:ts=8:ft=help
+++ /dev/null
-*ack.txt* Plugin that integrates ack with Vim
-
-==============================================================================
-Author: Antoine Imbert <antoine.imbert+ackvim@gmail.com> *ack-author*
-License: Same terms as Vim itself (see |license|)
-
-==============================================================================
-INTRODUCTION *ack*
-
-This plugin is a front for the Perl module App::Ack. Ack can be used as a
-replacement for grep. This plugin will allow you to run ack from vim, and
-shows the results in a split window.
-
-:Ack[!] [options] {pattern} [{directory}] *:Ack*
-
- Search recursively in {directory} (which defaults to the current
- directory) for the {pattern}. Behaves just like the |:grep| command, but
- will open the |Quickfix| window for you. If [!] is not given the first
- error is jumped to.
-
-:AckAdd [options] {pattern} [{directory}] *:AckAdd*
-
- Just like |:Ack|, but instead of making a new list, the matches are
- appended to the current |quickfix| list.
-
-:AckFromSearch [{directory}] *:AckFromSearch*
-
- Just like |:Ack| but the pattern is from previous search.
-
-:LAck [options] {pattern} [{directory}] *:LAck*
-
- Just like |:Ack| but instead of the |quickfix| list, matches are placed in
- the current |location-list|.
-
-:LAckAdd [options] {pattern} [{directory}] *:LAckAdd*
-
- Just like |:AckAdd| but instead of the |quickfix| list, matches are added
- to the current |location-list|
-
-:AckFile [options] {pattern} [{directory}] *:AckFile*
-
- Search recursively in {directory} (which defaults to the current
- directory) for filenames matching the {pattern}. Behaves just like the
- |:grep| command, but will open the |Quickfix| window for you.
-
-Files containing the search term will be listed in the split window, along
-with the line number of the occurrence, once for each occurrence. <Enter> on
-a line in this window will open the file, and place the cursor on the matching
-line.
-
-See http://betterthangrep.com/ for more information.
+++ /dev/null
-*delimitMate.txt* Trying to keep those beasts at bay! v2.6 *delimitMate*
-
-
-
- MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
- MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMM MMMMM MMMMMMMMMMMMMMMMMMMMM ~
- MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMM MMM MMMMMMMMMMMMMMMMMMMMM
- MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMM MMM M M MMMMMMMMMM MMMMMMMMM ~
- MMMM MMM MMM MM MM M M MMM MM MM MM MM MMM MMM MMM MM
- MM MM M MM MMMMMM MMMMMMM MMM MMMMM MM M MMM MMM M M ~
- M M MM MM MM MM M M MM MMM MMM MMMMM MMMMM MMM MMM M
- M M MM MMMMM MM MM M M MM MMM MMM MMMMM MMM MMM MMM MMMM ~
- M M MM M MM MM MM M M MM MMM MMM MMMMM MM M MMM MMM M M
- MM MMM MMM MM MM M M MM MMM MM MMMMM MMM MMM MMM MM ~
- MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
-
-
-
-==============================================================================
- 0.- CONTENTS *delimitMate-contents*
-
- 1. Introduction____________________________|delimitMateIntro|
- 2. Customization___________________________|delimitMateOptions|
- 2.1 Options summary____________________|delimitMateOptionSummary|
- 2.2 Options details____________________|delimitMateOptionDetails|
- 3. Functionality___________________________|delimitMateFunctionality|
- 3.1 Automatic closing & exiting________|delimitMateAutoClose|
- 3.2 Expansion of space and CR__________|delimitMateExpansion|
- 3.3 Backspace__________________________|delimitMateBackspace|
- 3.4 Smart Quotes_______________________|delimitMateSmartQuotes|
- 3.5 Balancing matching pairs___________|delimitMateBalance|
- 3.6 FileType based configuration_______|delimitMateFileType|
- 3.7 Syntax awareness___________________|delimitMateSyntax|
- 4. Commands________________________________|delimitMateCommands|
- 5. Mappings________________________________|delimitMateMappings|
- 6. Functions_______________________________|delimitMateFunctions|
- 7. TODO list_______________________________|delimitMateTodo|
- 8. Maintainer______________________________|delimitMateMaintainer|
- 9. Credits_________________________________|delimitMateCredits|
- 10. History_________________________________|delimitMateHistory|
-
-==============================================================================
- 1.- INTRODUCTION *delimitMateIntro*
-
-This plug-in provides automatic closing of quotes, parenthesis, brackets,
-etc.; besides some other related features that should make your time in insert
-mode a little bit easier.
-
-Most of the features can be modified or disabled permanently, using global
-variables, or on a FileType basis, using autocommands. With a couple of
-exceptions and limitations, this features don't brake undo, redo or history.
-
-NOTE 1: If you have any trouble with this plugin, please run |:DelimitMateTest|
-in a new buffer to see what is not working.
-
-NOTE 2: |'timeout'| needs to be set when working in the terminal, otherwise you
-might find weird behaviour with mappings including <Esc> or arrow keys.
-
-NOTE 3: Abbreiations set with |:iabbrev| will not be expanded by delimiters
-used on delimitMate, you should use <C-]> (read |i_CTRL-]|) to expand them on
-the go.
-
-==============================================================================
- 2. CUSTOMIZATION *delimitMateOptions*
-
-You can create your own mappings for some features using the global functions.
-Read |DelimitMateFunctions| for more info.
-
-------------------------------------------------------------------------------
- 2.1 OPTIONS SUMMARY *delimitMateOptionSummary*
-
-The behaviour of this script can be customized setting the following options
-in your vimrc file. You can use local options to set the configuration for
-specific file types, see |delimitMateOptionDetails| for examples.
-
-|'loaded_delimitMate'| Turns off the script.
-
-|'delimitMate_autoclose'| Tells delimitMate whether to automagically
- insert the closing delimiter.
-
-|'delimitMate_matchpairs'| Tells delimitMate which characters are
- matching pairs.
-
-|'delimitMate_quotes'| Tells delimitMate which quotes should be
- used.
-
-|'delimitMate_nesting_quotes'| Tells delimitMate which quotes should be
- allowed to be nested.
-
-|'delimitMate_expand_cr'| Turns on/off the expansion of <CR>.
-
-|'delimitMate_expand_space'| Turns on/off the expansion of <Space>.
-
-|'delimitMate_smart_quotes'| Turns on/off the "smart quotes" feature.
-
-|'delimitMate_smart_matchpairs'| Turns on/off the "smart matchpairs" feature.
-
-|'delimitMate_balance_matchpairs'|Turns on/off the "balance matching pairs"
- feature.
-
-|'delimitMate_excluded_regions'| Turns off the script for the given regions or
- syntax group names.
-
-|'delimitMate_excluded_ft'| Turns off the script for the given file types.
-
-|'delimitMate_apostrophes'| Tells delimitMate how it should "fix"
- balancing of single quotes when used as
- apostrophes. NOTE: Not needed any more, kept
- for compatibility with older versions.
-
-------------------------------------------------------------------------------
- 2.2 OPTIONS DETAILS *delimitMateOptionDetails*
-
-Add the shown lines to your vimrc file in order to set the below options.
-Buffer variables take precedence over global ones and can be used along with
-autocmd to modify delimitMate's behavior for specific file types, read more in
-|delimitMateFileType|.
-
-Note: Use buffer variables only to set options for specific file types using
-:autocmd, use global variables to set options for every buffer. Read more in
-|g:var| and |b:var|.
-
-------------------------------------------------------------------------------
- *'loaded_delimitMate'*
- *'b:loaded_delimitMate'*
-This option prevents delimitMate from loading.
-e.g.: >
- let loaded_delimitMate = 1
- au FileType mail let b:loaded_delimitMate = 1
-<
-------------------------------------------------------------------------------
- *'delimitMate_autoclose'*
- *'b:delimitMate_autoclose'*
-Values: 0 or 1. ~
-Default: 1 ~
-
-If this option is set to 0, delimitMate will not add a closing delimiter
-automagically. See |delimitMateAutoClose| for details.
-e.g.: >
- let delimitMate_autoclose = 0
- au FileType mail let b:delimitMate_autoclose = 0
-<
-------------------------------------------------------------------------------
- *'delimitMate_matchpairs'*
- *'b:delimitMate_matchpairs'*
-Values: A string with |'matchpairs'| syntax, plus support for multi-byte~
- characters.~
-Default: &matchpairs ~
-
-Use this option to tell delimitMate which characters should be considered
-matching pairs. Read |delimitMateAutoClose| for details.
-e.g: >
- let delimitMate_matchpairs = "(:),[:],{:},<:>"
- au FileType vim,html let b:delimitMate_matchpairs = "(:),[:],{:},<:>"
-<
-------------------------------------------------------------------------------
- *'delimitMate_quotes'*
- *'b:delimitMate_quotes'*
-Values: A string of characters separated by spaces. ~
-Default: "\" ' `" ~
-
-Use this option to tell delimitMate which characters should be considered as
-quotes. Read |delimitMateAutoClose| for details.
-e.g.: >
- let delimitMate_quotes = "\" ' ` *"
- au FileType html let b:delimitMate_quotes = "\" '"
-<
-------------------------------------------------------------------------------
- *'delimitMate_nesting_quotes'*
- *'b:delimitMate_nesting_quotes'*
-Values: A list of quotes. ~
-Default: [] ~
-
-Quotes listed here will not be able to jump out of the empty pair, thus
-allowing the autoclosed quotes to be nested.
-e.g.: >
- let delimitMate_nesting_quotes = ['"','`']
- au FileType python let b:delimitMate_nesting_quotes = ['"']
-<
-------------------------------------------------------------------------------
- *'delimitMate_expand_cr'*
- *'b:delimitMate_expand_cr'*
-Values: 1 or 0 ~
-Default: 0 ~
-
-This option turns on/off the expansion of <CR>. Read |delimitMateExpansion|
-for details. NOTE This feature requires that 'backspace' is either set to 2 or
-has "eol" and "start" as part of its value.
-e.g.: >
- let delimitMate_expand_cr = 1
- au FileType mail let b:delimitMate_expand_cr = 1
-<
-------------------------------------------------------------------------------
- *'delimitMate_expand_space'*
- *'b:delimitMate_expand_space'*
-Values: 1 or 0 ~
-Default: 0 ~
-This option turns on/off the expansion of <Space>. Read |delimitMateExpansion|
-for details.
-e.g.: >
- let delimitMate_expand_space = 1
- au FileType tcl let b:delimitMate_expand_space = 1
-<
-------------------------------------------------------------------------------
- *'delimitMate_smart_quotes'*
- *'b:delimitMate_smart_quotes'*
-Values: 1 or 0 ~
-Default: 1 ~
-
-This option turns on/off the smart quotes feature. Read
-|delimitMateSmartQuotes| for details.
-e.g.: >
- let delimitMate_smart_quotes = 0
- au FileType tcl let b:delimitMate_smart_quotes = 1
-<
-------------------------------------------------------------------------------
- *'delimitMate_smart_matchpairs'*
- *'b:delimitMate_smart_matchpairs'*
-Values: Regexp ~
-Default: '^\%(\w\|\!\|£\|\$\|_\|["'']\s*\S\)' ~
-
-This regex is matched against the text to the right of cursor, if it's not
-empty and there is a match delimitMate will not autoclose the pair. At the
-moment to match the text, an escaped bang (\!) in the regex will be replaced
-by the character being inserted, while an escaped number symbol (\#) will be
-replaced by the closing pair.
-e.g.: >
- let delimitMate_smart_matchpairs = ''
- au FileType tcl let b:delimitMate_smart_matchpairs = '^\%(\w\|\$\)'
-<
-------------------------------------------------------------------------------
- *'delimitMate_balance_matchpairs'*
- *'b:delimitMate_balance_matchpairs'*
-Values: 1 or 0 ~
-Default: 0 ~
-
-This option turns on/off the balancing of matching pairs. Read
-|delimitMateBalance| for details.
-e.g.: >
- let delimitMate_balance_matchpairs = 1
- au FileType tcl let b:delimitMate_balance_matchpairs = 1
-<
-------------------------------------------------------------------------------
- *'delimitMate_excluded_regions'*
-Values: A string of syntax group names names separated by single commas. ~
-Default: Comment ~
-
-This options turns delimitMate off for the listed regions, read |group-name|
-for more info about what is a region.
-e.g.: >
- let delimitMate_excluded_regions = "Comments,String"
-<
-------------------------------------------------------------------------------
- *'delimitMate_excluded_ft'*
-Values: A string of file type names separated by single commas. ~
-Default: Empty. ~
-
-This options turns delimitMate off for the listed file types, use this option
-only if you don't want any of the features it provides on those file types.
-e.g.: >
- let delimitMate_excluded_ft = "mail,txt"
-<
-------------------------------------------------------------------------------
- *'delimitMate_apostrophes'*
-Values: Strings separated by ":". ~
-Default: No longer used. ~
-
-NOTE: This feature is turned off by default, it's been kept for compatibility
-with older version, read |delimitMateSmartQuotes| for details.
-If auto-close is enabled, this option tells delimitMate how to try to fix the
-balancing of single quotes when used as apostrophes. The values of this option
-are strings of text where a single quote would be used as an apostrophe (e.g.:
-the "n't" of wouldn't or can't) separated by ":". Set it to an empty string to
-disable this feature.
-e.g.: >
- let delimitMate_apostrophes = ""
- au FileType tcl let delimitMate_apostrophes = ""
-<
-==============================================================================
- 3. FUNCTIONALITY *delimitMateFunctionality*
-
-------------------------------------------------------------------------------
- 3.1 AUTOMATIC CLOSING AND EXITING *delimitMateAutoClose*
-
-With automatic closing enabled, if an opening delimiter is inserted the plugin
-inserts the closing delimiter and places the cursor between the pair. With
-automatic closing disabled, no closing delimiters is inserted by delimitMate,
-but when a pair of delimiters is typed, the cursor is placed in the middle.
-
-When the cursor is inside an empty pair or located next to the left of a
-closing delimiter, the cursor is placed outside the pair to the right of the
-closing delimiter.
-
-When |'delimitMate_smart_matchpairs'| is not empty and it matches the text to
-the right of the cursor, delimitMate will not automatically insert the closing
-pair.
-
-Unless |'delimitMate_matchpairs'| or |'delimitMate_quotes'| are set, this
-script uses the values in '&matchpairs' to identify the pairs, and ", ' and `
-for quotes respectively.
-
-<S-Tab> will jump over a single closing delimiter or quote, <C-G>g will jump
-over contiguous delimiters and/or quotes.
-
-The following table shows the behaviour, this applies to quotes too (the final
-position of the cursor is represented by a "|"):
-
-With auto-close: >
- Type | You get
- =======================
- ( | (|)
- –––––––––––|–––––––––––
- () | ()|
- –––––––––––|–––––––––––
- (<S-Tab> | ()|
- –––––––––––|–––––––––––
- {("<C-G>g | {("")}|
-<
-Without auto-close: >
-
- Type | You get
- =========================
- () | (|)
- –––––––––-----|––––––––––
- ()) | ()|
- –––––––––-----|––––––––––
- ()<S-Tab> | ()|
- ––––––––––––––|–––––––––––
- {}()""<C-G>g | {("")}|
-<
-NOTE: Abbreviations will not be expanded by delimiters used on delimitMate,
-you should use <C-]> (read |i_CTRL-]|) to expand them on the go.
-
-------------------------------------------------------------------------------
- 3.2 EXPANSION OF SPACE AND CAR RETURN *delimitMateExpansion*
-
-When the cursor is inside an empty pair of delimiters, <Space> and <CR> can be
-expanded, see |'delimitMate_expand_space'| and
-|'delimitMate_expand_cr'|:
-
-Expand <Space> to: >
-
- <Space><Space><Left> | You get
- ====================================
- (|) | ( | )
-<
-Expand <CR> to: >
-
- <CR><CR><Up> | You get
- ============================
- (|) | (
- | |
- | )
-<
-
-NOTE that the expansion of <CR> will brake the redo command.
-
-Since <Space> and <CR> are used everywhere, I have made the functions involved
-in expansions global, so they can be used to make custom mappings. Read
-|delimitMateFunctions| for more details.
-
-------------------------------------------------------------------------------
- 3.3 BACKSPACE *delimitMateBackspace*
-
-If you press backspace inside an empty pair, both delimiters are deleted. When
-expansions are enabled, <BS> will also delete the expansions. NOTE that
-deleting <CR> expansions will brake the redo command.
-
-If you type <S-BS> (shift + backspace) instead, only the closing delimiter
-will be deleted. NOTE that this will not usually work when using Vim from the
-terminal, see 'delimitMate#JumpAny()' below to see how to fix it.
-
-e.g. typing at the "|": >
-
- What | Before | After
- ==============================================
- <BS> | call expand(|) | call expand|
- ---------|-------------------|-----------------
- <BS> | call expand( | ) | call expand(|)
- ---------|-------------------|-----------------
- <BS> | call expand( | call expand(|)
- | | |
- | ) |
- ---------|-------------------|-----------------
- <S-BS> | call expand(|) | call expand(|
-<
-
-------------------------------------------------------------------------------
- 3.4 SMART QUOTES *delimitMateSmartQuotes*
-
-Only one quote will be inserted following a quote, a "\" or, following or
-preceding a keyword character. This should cover closing quotes after a
-string, opening quotes before a string, escaped quotes and apostrophes. Except
-for apostrophes, this feature can be disabled setting the option
-|'delimitMate_smart_quotes'| to 0.
-
-e.g. typing at the "|": >
-
- What | Before | After
- =======================================
- " | Text | | Text "|"
- " | "String| | "String"|
- " | let i = "| | let i = "|"
- 'm | I| | I'm|
-<
-------------------------------------------------------------------------------
- 3.4 SMART MATCHPAIRS *delimitMateSmartMatchpairs*
-
-This is similar to "smart quotes", but applied to the characters in
-|'delimitMate_matchpairs'|. The difference is that delimitMate will not
-auto-close the pair when the regex matches the text on the right of the
-cursor. See |'delimitMate_smart_matchpairs'| for more details.
-
-
-e.g. typing at the "|": >
-
- What | Before | After
- =======================================
- ( | function| | function(|)
- ( | |var | (|var
-<
-------------------------------------------------------------------------------
- 3.5 BALANCING MATCHING PAIRS *delimitMateBalance*
-
-When inserting an opening paren and |'delimitMate_balance_matchpairs'| is
-enabled, delimitMate will try to balance the closing pairs in the current
-line.
-
-e.g. typing at the "|": >
-
- What | Before | After
- =======================================
- ( | | | (|)
- ( | |) | (|)
- (( | |) | ((|))
-<
-------------------------------------------------------------------------------
- 3.6 FILE TYPE BASED CONFIGURATION *delimitMateFileType*
-
-delimitMate options can be set globally for all buffers using global
-("regular") variables in your |vimrc| file. But |:autocmd| can be used to set
-options for specific file types (see |'filetype'|) using buffer variables in
-the following way: >
-
- au FileType mail,text let b:delimitMate_autoclose = 0
- ^ ^ ^ ^ ^
- | | | | |
- | | | | - Option value.
- | | | - Option name.
- | | - Buffer variable.
- | - File types for which the option will be set.
- - Don't forget to put this event.
-<
-NOTE that you should use buffer variables (|b:var|) only to set options with
-|:autocmd|, for global options use regular variables (|g:var|) in your vimrc.
-
-------------------------------------------------------------------------------
- 3.7 SYNTAX AWARENESS *delimitMateSyntax*
-
-The features of this plug-in might not be always helpful, comments and strings
-usualy don't need auto-completion. delimitMate monitors which region is being
-edited and if it detects that the cursor is in a comment it'll turn itself off
-until the cursor leaves the comment. The excluded regions can be set using the
-option |'delimitMate_excluded_regions'|. Read |group-name| for a list of
-regions or syntax group names.
-
-NOTE that this feature relies on a proper syntax file for the current file
-type, if the appropiate syntax file doesn't define a region, delimitMate won't
-know about it.
-
-==============================================================================
- 4. COMMANDS *delimitMateCommands*
-
-------------------------------------------------------------------------------
-:DelimitMateReload *:DelimitMateReload*
-
-Re-sets all the mappings used for this script, use it if any option has been
-changed or if the filetype option hasn't been set yet.
-
-------------------------------------------------------------------------------
-:DelimitMateSwitch *:DelimitMateSwitch*
-
-Switches the plug-in on and off.
-
-------------------------------------------------------------------------------
-:DelimitMateTest *:DelimitMateTest*
-
-This command tests every mapping set-up for this script, useful for testing
-custom configurations.
-
-The following output corresponds to the default values, it will be different
-depending on your configuration. "Open & close:" represents the final result
-when the closing delimiter has been inserted, either manually or
-automatically, see |delimitMateExpansion|. "Delete:" typing backspace in an
-empty pair, see |delimitMateBackspace|. "Exit:" typing a closing delimiter
-inside a pair of delimiters, see |delimitMateAutoclose|. "Space:" the
-expansion, if any, of space, see |delimitMateExpansion|. "Visual-L",
-"Visual-R" and "Visual" shows visual wrapping, see
-|delimitMateVisualWrapping|. "Car return:" the expansion of car return, see
-|delimitMateExpansion|. The cursor's position at the end of every test is
-represented by an "|": >
-
- * AUTOCLOSE:
- Open & close: (|)
- Delete: |
- Exit: ()|
- Space: ( |)
- Visual-L: (v)
- Visual-R: (v)
- Car return: (
- |)
-
- Open & close: {|}
- Delete: |
- Exit: {}|
- Space: { |}
- Visual-L: {v}
- Visual-R: {v}
- Car return: {
- |}
-
- Open & close: [|]
- Delete: |
- Exit: []|
- Space: [ |]
- Visual-L: [v]
- Visual-R: [v]
- Car return: [
- |]
-
- Open & close: "|"
- Delete: |
- Exit: ""|
- Space: " |"
- Visual: "v"
- Car return: "
- |"
-
- Open & close: '|'
- Delete: |
- Exit: ''|
- Space: ' |'
- Visual: 'v'
- Car return: '
- |'
-
- Open & close: `|`
- Delete: |
- Exit: ``|
- Space: ` |`
- Visual: `v`
- Car return: `
- |`
-<
-
-==============================================================================
- 5. MAPPINGS *delimitMateMappings*
-
-delimitMate doesn't override any existing map, so you may encounter that it
-doesn't work as expected because a mapping is missing. In that case, the
-conflicting mappings should be resolved by either disabling the conflicting
-mapping or creating a custom mappings.
-
-In order to make custom mappings easier and prevent overwritting existing
-ones, delimitMate uses the |<Plug>| + |hasmapto()| (|usr_41.txt|) construct
-for its mappings.
-
-These are the default mappings:
-
-<BS> is mapped to <Plug>delimitMateBS
-<S-BS> is mapped to <Plug>delimitMateS-BS
-<S-Tab> is mapped to <Plug>delimitMateS-Tab
-<C-G>g is mapped to <Plug>delimitMateJumpMany
-<Del> is mapped to <Plug>delimitMateDel
-<Esc> is mapped to <Plug>delimitMateEsc
-<Left> is mapped to <Plug>delimitMateLeft
-<Right> is mapped to <Plug>delimitMateRight
-<Home> is mapped to <Plug>delimitMateHome
-<End> is mapped to <Plug>delimitMateEnd
-<Up> is mapped to <Plug>delimitMateUp
-<Down> is mapped to <Plug>delimitMateDown
-<PageUp> is mapped to <Plug>delimitMatePageUp
-<PageDown> is mapped to <Plug>delimitMatePageDown
-<S-Down> is mapped to <Plug>delimitMateS-Down
-<S-Up> is mapped to <Plug>delimitMateS-Up
-<LeftMouse> is mapped to <Plug>delimitMateMLeftMouse
-<RightMouse> is mapped to <Plug>delimitMateMRightMouse
-
-The rest of the mappings correspond to parens, quotes, CR, Space, etc. and they
-depend on the values of the delimitMate options, they have the following form:
-
-<Plug>delimitMate + char
-
-e.g.: for "(":
-
-( is mapped to <Plug>delimitMate(
-
-e.g.: If you have <CR> expansion enabled, you might want to skip it on pop-up
-menus:
-
- imap <expr> <CR> pumvisible() ?
- \"\<c-y>" :
- \ "<Plug>delimitMateCR"
-
-
-==============================================================================
- 6. FUNCTIONS *delimitMateFunctions*
-
-------------------------------------------------------------------------------
-delimitMate#WithinEmptyPair() *delimitMate#WithinEmptyPair()*
-
-Returns 1 if the cursor is inside an empty pair, 0 otherwise.
-e.g.: >
-
- inoremap <expr> <CR> delimitMate#WithinEmptyPair() ?
- \ "\<C-R>=delimitMate#ExpandReturn()\<CR>" :
- \ "external_mapping"
-<
-
-------------------------------------------------------------------------------
-delimitMate#ShouldJump() *delimitMate#ShouldJump()*
-
-Returns 1 if there is a closing delimiter or a quote to the right of the
-cursor, 0 otherwise.
-
-------------------------------------------------------------------------------
-delimitMate#JumpAny(key) *delimitMate#JumpAny()*
-
-This function returns a mapping that will make the cursor jump to the right
-when delimitMate#ShouldJump() returns 1, returns the argument "key" otherwise.
-e.g.: You can use this to create your own mapping to jump over any delimiter.
->
- inoremap <C-Tab> <C-R>=delimitMate#JumpAny("\<C-Tab>")<CR>
-<
-
-==============================================================================
- 7. TODO LIST *delimitMateTodo*
-
-- Automatic set-up by file type.
-- Make block-wise visual wrapping work on un-even regions.
-
-==============================================================================
- 8. MAINTAINER *delimitMateMaintainer*
-
-Hi there! My name is Israel Chauca F. and I can be reached at:
- mailto:israelchauca@gmail.com
-
-Feel free to send me any suggestions and/or comments about this plugin, I'll
-be very pleased to read them.
-
-==============================================================================
- 9. CREDITS *delimitMateCredits*
-
-Contributors: ~
-
- - Kim Silkebækken ~
- Fixed mappings being echoed in the terminal.
-
- - Eric Van Dewoestine ~
- Implemented smart matchpairs.
-
-Some of the code that makes this script was modified or just shamelessly
-copied from the following sources:
-
- - Ian McCracken ~
- Post titled: Vim, Part II: Matching Pairs:
- http://concisionandconcinnity.blogspot.com/
-
- - Aristotle Pagaltzis ~
- From the comments on the previous blog post and from:
- http://gist.github.com/144619
-
- - Karl Guertin ~
- AutoClose:
- http://www.vim.org/scripts/script.php?script_id=1849
-
- - Thiago Alves ~
- AutoClose:
- http://www.vim.org/scripts/script.php?script_id=2009
-
- - Edoardo Vacchi ~
- ClosePairs:
- http://www.vim.org/scripts/script.php?script_id=2373
-
-This script was inspired by the auto-completion of delimiters on TextMate.
-
-==============================================================================
- 10. HISTORY *delimitMateHistory*
-
- Version Date Release notes ~
-|---------|------------|-----------------------------------------------------|
- 2.6 2011-01-14 * Current release:
- - Add smart_matchpairs feature.
- - Add mapping to jump over contiguous delimiters.
- - Fix behaviour of b:loaded_delimitMate.
-|---------|------------|-----------------------------------------------------|
- 2.5.1 2010-09-30 * - Remove visual wrapping. Surround.vim offers a much
- better implementation.
- - Minor mods to DelimitMateTest.
-|---------|------------|-----------------------------------------------------|
- 2.5 2010-09-22 * - Better handling of mappings.
- - Add report for mappings in |:DelimitMateTest|.
- - Allow the use of "|" and multi-byte characters in
- |'delimitMate_quotes'| and |'delimitMate_matchpairs'|.
- - Allow commands to be concatenated using |.
-|---------|------------|-----------------------------------------------------|
- 2.4.1 2010-07-31 * - Fix problem with <Home> and <End>.
- - Add missing doc on |'delimitMate_smart_quotes'|,
- |delimitMateBalance| and
- |'delimitMate_balance_matchpairs'|.
-|---------|------------|-----------------------------------------------------|
- 2.4 2010-07-29 * - Unbalanced parens: see :help delimitMateBalance.
- - Visual wrapping now works on block-wise visual
- with some limitations.
- - Arrow keys didn't work on terminal.
- - Added option to allow nested quotes.
- - Expand Smart Quotes to look for a string on the
- right of the cursor.
-
-|---------|------------|-----------------------------------------------------|
- 2.3.1 2010-06-06 * - Fix: an extra <Space> is inserted after <Space>
- expansion.
-
-|---------|------------|-----------------------------------------------------|
- 2.3 2010-06-06 * - Syntax aware: Will turn off when editing comments
- or other regions, customizable.
- - Changed format of most mappings.
- - Fix: <CR> expansion doesn't brake automatic
- indentation adjustments anymore.
- - Fix: Arrow keys would insert A, B, C or D instead
- of moving the cursor when using Vim on a terminal.
-
-|---------|------------|-----------------------------------------------------|
- 2.2 2010-05-16 * - Added command to switch the plug-in on and off.
- - Fix: some problems with <Left>, <Right> and <CR>.
- - Fix: A small problem when inserting a delimiter at
- the beginning of the line.
-
-|---------|------------|-----------------------------------------------------|
- 2.1 2010-05-10 * - Most of the functions have been moved to an
- autoload script to avoid loading unnecessary ones.
- - Fixed a problem with the redo command.
- - Many small fixes.
-
-|---------|------------|-----------------------------------------------------|
- 2.0 2010-04-01 * New features:
- - All features are redo/undo-wise safe.
- - A single quote typed after an alphanumeric
- character is considered an apostrophe and one
- single quote is inserted.
- - A quote typed after another quote inserts a single
- quote and the cursor jumps to the middle.
- - <S-Tab> jumps out of any empty pair.
- - <CR> and <Space> expansions are fixed, but the
- functions used for it are global and can be used in
- custom mappings. The previous system is still
- active if you have any of the expansion options
- set.
- - <S-Backspace> deletes the closing delimiter.
- * Fixed bug:
- - s:vars were being used to store buffer options.
-
-|---------|------------|-----------------------------------------------------|
- 1.6 2009-10-10 * Now delimitMate tries to fix the balancing of single
- quotes when used as apostrophes. You can read
- |delimitMate_apostrophes| for details.
- Fixed an error when |b:delimitMate_expand_space|
- wasn't set but |delimitMate_expand_space| wasn't.
-
-|---------|------------|-----------------------------------------------------|
- 1.5 2009-10-05 * Fix: delimitMate should work correctly for files
- passed as arguments to Vim. Thanks to Ben Beuchler
- for helping to nail this bug.
-
-|---------|------------|-----------------------------------------------------|
- 1.4 2009-09-27 * Fix: delimitMate is now enabled on new buffers even
- if they don't have set the file type option or were
- opened directly from the terminal.
-
-|---------|------------|-----------------------------------------------------|
- 1.3 2009-09-24 * Now local options can be used along with autocmd
- for specific file type configurations.
- Fixes:
- - Unnamed register content is not lost on visual
- mode.
- - Use noremap where appropiate.
- - Wrapping a single empty line works as expected.
-
-|---------|------------|-----------------------------------------------------|
- 1.2 2009-09-07 * Fixes:
- - When inside nested empty pairs, deleting the
- innermost left delimiter would delete all right
- contiguous delimiters.
- - When inside an empty pair, inserting a left
- delimiter wouldn't insert the right one, instead
- the cursor would jump to the right.
- - New buffer inside the current window wouldn't
- have the mappings set.
-
-|---------|------------|-----------------------------------------------------|
- 1.1 2009-08-25 * Fixed an error that ocurred when mapleader wasn't
- set and added support for GetLatestScripts
- auto-detection.
-
-|---------|------------|-----------------------------------------------------|
- 1.0 2009-08-23 * Initial upload.
-
-|---------|------------|-----------------------------------------------------|
-
-
- `\|||/´ MMM \|/ www __^__ ~
- (o o) (o o) @ @ (O-O) /(o o)\\ ~
-ooO_(_)_Ooo__ ooO_(_)_Ooo___oOO_(_)_OOo___oOO__(_)__OOo___oOO__(_)__OOo_____ ~
-_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~
-__|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_ ~
-_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~
-
-vim:tw=78:et:ts=2:sw=2:ft=help:norl:formatoptions+=tcroqn:autoindent:
+++ /dev/null
-" ============================================================================
-" File: exec_menuitem.vim
-" Description: plugin for NERD Tree that provides an execute file menu item
-" Maintainer: Martin Grenfell <martin.grenfell at gmail dot com>
-" Last Change: 22 July, 2009
-" License: This program is free software. It comes without any warranty,
-" to the extent permitted by applicable law. You can redistribute
-" it and/or modify it under the terms of the Do What The Fuck You
-" Want To Public License, Version 2, as published by Sam Hocevar.
-" See http://sam.zoy.org/wtfpl/COPYING for more details.
-"
-" ============================================================================
-if exists("g:loaded_nerdtree_exec_menuitem")
- finish
-endif
-let g:loaded_nerdtree_exec_menuitem = 1
-
-call NERDTreeAddMenuItem({
- \ 'text': '(!)Execute file',
- \ 'shortcut': '!',
- \ 'callback': 'NERDTreeExecFile',
- \ 'isActiveCallback': 'NERDTreeExecFileActive' })
-
-function! NERDTreeExecFileActive()
- let node = g:NERDTreeFileNode.GetSelected()
- return !node.path.isDirectory && node.path.isExecutable
-endfunction
-
-function! NERDTreeExecFile()
- let treenode = g:NERDTreeFileNode.GetSelected()
- echo "==========================================================\n"
- echo "Complete the command to execute (add arguments etc):\n"
- let cmd = treenode.path.str({'escape': 1})
- let cmd = input(':!', cmd . ' ')
-
- if cmd != ''
- exec ':!' . cmd
- else
- echo "Aborted"
- endif
-endfunction
+++ /dev/null
-" ============================================================================
-" File: fs_menu.vim
-" Description: plugin for the NERD Tree that provides a file system menu
-" Maintainer: Martin Grenfell <martin.grenfell at gmail dot com>
-" Last Change: 17 July, 2009
-" License: This program is free software. It comes without any warranty,
-" to the extent permitted by applicable law. You can redistribute
-" it and/or modify it under the terms of the Do What The Fuck You
-" Want To Public License, Version 2, as published by Sam Hocevar.
-" See http://sam.zoy.org/wtfpl/COPYING for more details.
-"
-" ============================================================================
-if exists("g:loaded_nerdtree_fs_menu")
- finish
-endif
-let g:loaded_nerdtree_fs_menu = 1
-
-call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callback': 'NERDTreeAddNode'})
-call NERDTreeAddMenuItem({'text': '(m)ove the curent node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'})
-call NERDTreeAddMenuItem({'text': '(d)elete the curent node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'})
-if g:NERDTreePath.CopyingSupported()
- call NERDTreeAddMenuItem({'text': '(c)copy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'})
-endif
-
-"FUNCTION: s:echo(msg){{{1
-function! s:echo(msg)
- redraw
- echomsg "NERDTree: " . a:msg
-endfunction
-
-"FUNCTION: s:echoWarning(msg){{{1
-function! s:echoWarning(msg)
- echohl warningmsg
- call s:echo(a:msg)
- echohl normal
-endfunction
-
-"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{1
-"prints out the given msg and, if the user responds by pushing 'y' then the
-"buffer with the given bufnum is deleted
-"
-"Args:
-"bufnum: the buffer that may be deleted
-"msg: a message that will be echoed to the user asking them if they wish to
-" del the buffer
-function! s:promptToDelBuffer(bufnum, msg)
- echo a:msg
- if nr2char(getchar()) ==# 'y'
- exec "silent bdelete! " . a:bufnum
- endif
-endfunction
-
-"FUNCTION: NERDTreeAddNode(){{{1
-function! NERDTreeAddNode()
- let curDirNode = g:NERDTreeDirNode.GetSelected()
-
- let newNodeName = input("Add a childnode\n".
- \ "==========================================================\n".
- \ "Enter the dir/file name to be created. Dirs end with a '/'\n" .
- \ "", curDirNode.path.str({'format': 'Glob'}) . g:NERDTreePath.Slash())
-
- if newNodeName ==# ''
- call s:echo("Node Creation Aborted.")
- return
- endif
-
- try
- let newPath = g:NERDTreePath.Create(newNodeName)
- let parentNode = b:NERDTreeRoot.findNode(newPath.getParent())
-
- let newTreeNode = g:NERDTreeFileNode.New(newPath)
- if parentNode.isOpen || !empty(parentNode.children)
- call parentNode.addChild(newTreeNode, 1)
- call NERDTreeRender()
- call newTreeNode.putCursorHere(1, 0)
- endif
- catch /^NERDTree/
- call s:echoWarning("Node Not Created.")
- endtry
-endfunction
-
-"FUNCTION: NERDTreeMoveNode(){{{1
-function! NERDTreeMoveNode()
- let curNode = g:NERDTreeFileNode.GetSelected()
- let newNodePath = input("Rename the current node\n" .
- \ "==========================================================\n" .
- \ "Enter the new path for the node: \n" .
- \ "", curNode.path.str())
-
- if newNodePath ==# ''
- call s:echo("Node Renaming Aborted.")
- return
- endif
-
- try
- let bufnum = bufnr(curNode.path.str())
-
- call curNode.rename(newNodePath)
- call NERDTreeRender()
-
- "if the node is open in a buffer, ask the user if they want to
- "close that buffer
- if bufnum != -1
- let prompt = "\nNode renamed.\n\nThe old file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)"
- call s:promptToDelBuffer(bufnum, prompt)
- endif
-
- call curNode.putCursorHere(1, 0)
-
- redraw
- catch /^NERDTree/
- call s:echoWarning("Node Not Renamed.")
- endtry
-endfunction
-
-" FUNCTION: NERDTreeDeleteNode() {{{1
-function! NERDTreeDeleteNode()
- let currentNode = g:NERDTreeFileNode.GetSelected()
- let confirmed = 0
-
- if currentNode.path.isDirectory
- let choice =input("Delete the current node\n" .
- \ "==========================================================\n" .
- \ "STOP! To delete this entire directory, type 'yes'\n" .
- \ "" . currentNode.path.str() . ": ")
- let confirmed = choice ==# 'yes'
- else
- echo "Delete the current node\n" .
- \ "==========================================================\n".
- \ "Are you sure you wish to delete the node:\n" .
- \ "" . currentNode.path.str() . " (yN):"
- let choice = nr2char(getchar())
- let confirmed = choice ==# 'y'
- endif
-
-
- if confirmed
- try
- call currentNode.delete()
- call NERDTreeRender()
-
- "if the node is open in a buffer, ask the user if they want to
- "close that buffer
- let bufnum = bufnr(currentNode.path.str())
- if buflisted(bufnum)
- let prompt = "\nNode deleted.\n\nThe file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)"
- call s:promptToDelBuffer(bufnum, prompt)
- endif
-
- redraw
- catch /^NERDTree/
- call s:echoWarning("Could not remove node")
- endtry
- else
- call s:echo("delete aborted")
- endif
-
-endfunction
-
-" FUNCTION: NERDTreeCopyNode() {{{1
-function! NERDTreeCopyNode()
- let currentNode = g:NERDTreeFileNode.GetSelected()
- let newNodePath = input("Copy the current node\n" .
- \ "==========================================================\n" .
- \ "Enter the new path to copy the node to: \n" .
- \ "", currentNode.path.str())
-
- if newNodePath != ""
- "strip trailing slash
- let newNodePath = substitute(newNodePath, '\/$', '', '')
-
- let confirmed = 1
- if currentNode.path.copyingWillOverwrite(newNodePath)
- call s:echo("Warning: copying may overwrite files! Continue? (yN)")
- let choice = nr2char(getchar())
- let confirmed = choice ==# 'y'
- endif
-
- if confirmed
- try
- let newNode = currentNode.copy(newNodePath)
- call NERDTreeRender()
- call newNode.putCursorHere(0, 0)
- catch /^NERDTree/
- call s:echoWarning("Could not copy node")
- endtry
- endif
- else
- call s:echo("Copy aborted.")
- endif
- redraw
-endfunction
-
-" vim: set sw=4 sts=4 et fdm=marker:
+++ /dev/null
-" AlignMapsPlugin: Alignment maps based upon <Align.vim> and <AlignMaps.vim>
-" Maintainer: Dr. Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz>
-" Date: Mar 03, 2009
-"
-" NOTE: the code herein needs vim 6.0 or later
-" needs <Align.vim> v6 or later
-" needs <cecutil.vim> v5 or later
-" Copyright: Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1
-" Permission is hereby granted to use and distribute this code,
-" with or without modifications, provided that this copyright
-" notice is copied with it. Like anything else that's free,
-" AlignMaps.vim is provided *as is* and comes with no warranty
-" of any kind, either expressed or implied. By using this
-" plugin, you agree that in no event will the copyright
-" holder be liable for any damages resulting from the use
-" of this software.
-"
-" Usage: {{{1
-" Use 'a to mark beginning of to-be-aligned region, Alternative: use V
-" move cursor to end of region, and execute map. (linewise visual mode) to
-" The maps also set up marks 'y and 'z, and retain mark region, execute same
-" 'a at the beginning of region. map. Uses 'a, 'y, and 'z.
-"
-" The start/end wrappers save and restore marks 'y and 'z.
-"
-" Although the comments indicate the maps use a leading backslash,
-" actually they use <Leader> (:he mapleader), so the user can
-" specify that the maps start how he or she prefers.
-"
-" Note: these maps all use <Align.vim>.
-"
-" Romans 1:20 For the invisible things of Him since the creation of the {{{1
-" world are clearly seen, being perceived through the things that are
-" made, even His everlasting power and divinity; that they may be
-" without excuse.
-
-" ---------------------------------------------------------------------
-" Load Once: {{{1
-if &cp || exists("g:loaded_AlignMapsPlugin")
- finish
-endif
-let s:keepcpo = &cpo
-let g:loaded_AlignMapsPlugin = "v41"
-set cpo&vim
-
-" =====================================================================
-" Maps: {{{1
-
-" ---------------------------------------------------------------------
-" WS: wrapper start map (internal) {{{2
-" Produces a blank line above and below, marks with 'y and 'z
-if !hasmapto('<Plug>WrapperStart')
- map <unique> <SID>WS <Plug>AlignMapsWrapperStart
-endif
-nmap <silent> <script> <Plug>AlignMapsWrapperStart :set lz<CR>:call AlignMaps#WrapperStart(0)<CR>
-vmap <silent> <script> <Plug>AlignMapsWrapperStart :<c-u>set lz<CR>:call AlignMaps#WrapperStart(1)<CR>
-
-" ---------------------------------------------------------------------
-" WE: wrapper end (internal) {{{2
-" Removes guard lines, restores marks y and z, and restores search pattern
-if !hasmapto('<Plug>WrapperEnd')
- nmap <unique> <SID>WE <Plug>AlignMapsWrapperEnd
-endif
-nmap <silent> <script> <Plug>AlignMapsWrapperEnd :call AlignMaps#WrapperEnd()<CR>:set nolz<CR>
-
-" ---------------------------------------------------------------------
-" Complex C-code alignment maps: {{{2
-if !hasmapto('<Plug>AM_a?') |map <unique> <Leader>a? <Plug>AM_a?|endif
-if !hasmapto('<Plug>AM_a,') |map <unique> <Leader>a, <Plug>AM_a,|endif
-if !hasmapto('<Plug>AM_a<') |map <unique> <Leader>a< <Plug>AM_a<|endif
-if !hasmapto('<Plug>AM_a=') |map <unique> <Leader>a= <Plug>AM_a=|endif
-if !hasmapto('<Plug>AM_a(') |map <unique> <Leader>a( <Plug>AM_a(|endif
-if !hasmapto('<Plug>AM_abox') |map <unique> <Leader>abox <Plug>AM_abox|endif
-if !hasmapto('<Plug>AM_acom') |map <unique> <Leader>acom <Plug>AM_acom|endif
-if !hasmapto('<Plug>AM_adcom')|map <unique> <Leader>adcom <Plug>AM_adcom|endif
-if !hasmapto('<Plug>AM_aocom')|map <unique> <Leader>aocom <Plug>AM_aocom|endif
-if !hasmapto('<Plug>AM_ascom')|map <unique> <Leader>ascom <Plug>AM_ascom|endif
-if !hasmapto('<Plug>AM_adec') |map <unique> <Leader>adec <Plug>AM_adec|endif
-if !hasmapto('<Plug>AM_adef') |map <unique> <Leader>adef <Plug>AM_adef|endif
-if !hasmapto('<Plug>AM_afnc') |map <unique> <Leader>afnc <Plug>AM_afnc|endif
-if !hasmapto('<Plug>AM_afnc') |map <unique> <Leader>afnc <Plug>AM_afnc|endif
-if !hasmapto('<Plug>AM_aunum')|map <unique> <Leader>aunum <Plug>AM_aenum|endif
-if !hasmapto('<Plug>AM_aenum')|map <unique> <Leader>aenum <Plug>AM_aunum|endif
-if exists("g:alignmaps_euronumber") && !exists("g:alignmaps_usanumber")
- if !hasmapto('<Plug>AM_anum')|map <unique> <Leader>anum <Plug>AM_aenum|endif
-else
- if !hasmapto('<Plug>AM_anum')|map <unique> <Leader>anum <Plug>AM_aunum|endif
-endif
-
-map <silent> <script> <Plug>AM_a? <SID>WS:AlignCtrl mIp1P1lC ? : : : : <CR>:'a,.Align<CR>:'a,'z-1s/\(\s\+\)? /?\1/e<CR><SID>WE
-map <silent> <script> <Plug>AM_a, <SID>WS:'y,'zs/\(\S\)\s\+/\1 /ge<CR>'yjma'zk:call AlignMaps#CharJoiner(",")<cr>:silent 'y,'zg/,/call AlignMaps#FixMultiDec()<CR>'z:exe "norm \<Plug>AM_adec"<cr><SID>WE
-map <silent> <script> <Plug>AM_a< <SID>WS:AlignCtrl mIp1P1=l << >><CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_a( <SID>WS:AlignCtrl mIp0P1=l<CR>:'a,.Align [(,]<CR>:sil 'y+1,'z-1s/\(\s\+\),/,\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_a= <SID>WS:AlignCtrl mIp1P1=l<CR>:AlignCtrl g :=<CR>:'a,'zAlign :\==<CR><SID>WE
-map <silent> <script> <Plug>AM_abox <SID>WS:let g:alignmaps_iws=substitute(getline("'a"),'^\(\s*\).*$','\1','e')<CR>:'a,'z-1s/^\s\+//e<CR>:'a,'z-1s/^.*$/@&@/<CR>:AlignCtrl m=p01P0w @<CR>:'a,.Align<CR>:'a,'z-1s/@/ * /<CR>:'a,'z-1s/@$/*/<CR>'aYP:s/./*/g<CR>0r/'zkYp:s/./*/g<CR>0r A/<Esc>:exe "'a-1,'z-1s/^/".g:alignmaps_iws."/e"<CR><SID>WE
-map <silent> <script> <Plug>AM_acom <SID>WS:'a,.s/\/[*/]\/\=/@&@/e<CR>:'a,.s/\*\//@&/e<CR>:'y,'zs/^\( *\) @/\1@/e<CR>'zk:call AlignMaps#StdAlign(2)<CR>:'y,'zs/^\(\s*\) @/\1/e<CR>:'y,'zs/ @//eg<CR><SID>WE
-map <silent> <script> <Plug>AM_adcom <SID>WS:'a,.v/^\s*\/[/*]/s/\/[*/]\*\=/@&@/e<CR>:'a,.v/^\s*\/[/*]/s/\*\//@&/e<CR>:'y,'zv/^\s*\/[/*]/s/^\( *\) @/\1@/e<CR>'zk:call AlignMaps#StdAlign(3)<cr>:'y,'zv/^\s*\/[/*]/s/^\(\s*\) @/\1/e<CR>:'y,'zs/ @//eg<CR><SID>WE
-map <silent> <script> <Plug>AM_aocom <SID>WS:AlignPush<CR>:AlignCtrl g /[*/]<CR>:exe "norm \<Plug>AM_acom"<cr>:AlignPop<CR><SID>WE
-map <silent> <script> <Plug>AM_ascom <SID>WS:'a,.s/\/[*/]/@&@/e<CR>:'a,.s/\*\//@&/e<CR>:silent! 'a,.g/^\s*@\/[*/]/s/@//ge<CR>:AlignCtrl v ^\s*\/[*/]<CR>:AlignCtrl g \/[*/]<CR>'zk:call AlignMaps#StdAlign(2)<cr>:'y,'zs/^\(\s*\) @/\1/e<CR>:'y,'zs/ @//eg<CR><SID>WE
-map <silent> <script> <Plug>AM_adec <SID>WS:'a,'zs/\([^ \t/(]\)\([*&]\)/\1 \2/e<CR>:'y,'zv/^\//s/\([^ \t]\)\s\+/\1 /ge<CR>:'y,'zv/^\s*[*/]/s/\([^/][*&]\)\s\+/\1/ge<CR>:'y,'zv/^\s*[*/]/s/^\(\s*\%(\K\k*\s\+\%([a-zA-Z_*(&]\)\@=\)\+\)\([*(&]*\)\s*\([a-zA-Z0-9_()]\+\)\s*\(\(\[.\{-}]\)*\)\s*\(=\)\=\s*\(.\{-}\)\=\s*;/\1@\2#@\3\4@\6@\7;@/e<CR>:'y,'zv/^\s*[*/]/s/\*\/\s*$/@*\//e<CR>:'y,'zv/^\s*[*/]/s/^\s\+\*/@@@@@* /e<CR>:'y,'zv/^\s*[*/]/s/^@@@@@\*\(.*[^*/]\)$/&@*/e<CR>'yjma'zk:AlignCtrl v ^\s*[*/#]<CR>:call AlignMaps#StdAlign(1)<cr>:'y,'zv/^\s*[*/]/s/@ //ge<CR>:'y,'zv/^\s*[*/]/s/\(\s*\);/;\1/e<CR>:'y,'zv/^#/s/# //e<CR>:'y,'zv/^\s\+[*/#]/s/\([^/*]\)\(\*\+\)\( \+\)/\1\3\2/e<CR>:'y,'zv/^\s\+[*/#]/s/\((\+\)\( \+\)\*/\2\1*/e<CR>:'y,'zv/^\s\+[*/#]/s/^\(\s\+\) \*/\1*/e<CR>:'y,'zv/^\s\+[*/#]/s/[ \t@]*$//e<CR>:'y,'zs/^[*]/ */e<CR><SID>WE
-map <silent> <script> <Plug>AM_adef <SID>WS:AlignPush<CR>:AlignCtrl v ^\s*\(\/\*\<bar>\/\/\)<CR>:'a,.v/^\s*\(\/\*\<bar>\/\/\)/s/^\(\s*\)#\(\s\)*define\s*\(\I[a-zA-Z_0-9(),]*\)\s*\(.\{-}\)\($\<Bar>\/\*\)/#\1\2define @\3@\4@\5/e<CR>:'a,.v/^\s*\(\/\*\<bar>\/\/\)/s/\($\<Bar>\*\/\)/@&/e<CR>'zk:call AlignMaps#StdAlign(1)<cr>'yjma'zk:'a,.v/^\s*\(\/\*\<bar>\/\/\)/s/ @//g<CR><SID>WE
-map <silent> <script> <Plug>AM_afnc :<c-u>set lz<CR>:silent call AlignMaps#Afnc()<CR>:set nolz<CR>
-map <silent> <script> <Plug>AM_aunum <SID>WS:'a,'zs/\%([0-9.]\)\s\+\zs\([-+.]\=\d\)/@\1/ge<CR>:'a,'zs/\(\(^\|\s\)\d\+\)\(\s\+\)@/\1@\3@/ge<CR>:'a,'zs/\.@/\.0@/ge<CR>:AlignCtrl wmp0P0r<CR>:'a,'zAlign [.@]<CR>:'a,'zs/@/ /ge<CR>:'a,'zs/\(\.\)\(\s\+\)\([0-9.,eE+]\+\)/\1\3\2/ge<CR>:'a,'zs/\([eE]\)\(\s\+\)\([0-9+\-+]\+\)/\1\3\2/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_aenum <SID>WS:'a,'zs/\%([0-9.]\)\s\+\([-+]\=\d\)/\1@\2/ge<CR>:'a,'zs/\.@/\.0@/ge<CR>:AlignCtrl wmp0P0r<CR>:'a,'zAlign [,@]<CR>:'a,'zs/@/ /ge<CR>:'a,'zs/\(,\)\(\s\+\)\([-0-9.,eE+]\+\)/\1\3\2/ge<CR>:'a,'zs/\([eE]\)\(\s\+\)\([0-9+\-+]\+\)/\1\3\2/ge<CR><SID>WE
-
-" ---------------------------------------------------------------------
-" html table alignment {{{2
-if !hasmapto('<Plug>AM_Htd')|map <unique> <Leader>Htd <Plug>AM_Htd|endif
-map <silent> <script> <Plug>AM_Htd <SID>WS:'y,'zs%<[tT][rR]><[tT][dD][^>]\{-}>\<Bar></[tT][dD]><[tT][dD][^>]\{-}>\<Bar></[tT][dD]></[tT][rR]>%@&@%g<CR>'yjma'zk:AlignCtrl m=Ilp1P0 @<CR>:'a,.Align<CR>:'y,'zs/ @/@/<CR>:'y,'zs/@ <[tT][rR]>/<[tT][rR]>/ge<CR>:'y,'zs/@//ge<CR><SID>WE
-
-" ---------------------------------------------------------------------
-" character-based right-justified alignment maps {{{2
-if !hasmapto('<Plug>AM_T\16|')|map <unique> <Leader>T\16| <Plug>AM_T\16||endif
-if !hasmapto('<Plug>AM_T#') |map <unique> <Leader>T# <Plug>AM_T#|endif
-if !hasmapto('<Plug>AM_T,') |map <unique> <Leader>T, <Plug>AM_T,o|endif
-if !hasmapto('<Plug>AM_Ts,') |map <unique> <Leader>Ts, <Plug>AM_Ts,|endif
-if !hasmapto('<Plug>AM_T:') |map <unique> <Leader>T: <Plug>AM_T:|endif
-if !hasmapto('<Plug>AM_T;') |map <unique> <Leader>T; <Plug>AM_T;|endif
-if !hasmapto('<Plug>AM_T<') |map <unique> <Leader>T< <Plug>AM_T<|endif
-if !hasmapto('<Plug>AM_T=') |map <unique> <Leader>T= <Plug>AM_T=|endif
-if !hasmapto('<Plug>AM_T?') |map <unique> <Leader>T? <Plug>AM_T?|endif
-if !hasmapto('<Plug>AM_T@') |map <unique> <Leader>T@ <Plug>AM_T@|endif
-if !hasmapto('<Plug>AM_Tab') |map <unique> <Leader>Tab <Plug>AM_Tab|endif
-if !hasmapto('<Plug>AM_Tsp') |map <unique> <Leader>Tsp <Plug>AM_Tsp|endif
-if !hasmapto('<Plug>AM_T~') |map <unique> <Leader>T~ <Plug>AM_T~|endif
-
-map <silent> <script> <Plug>AM_T\16| <SID>WS:AlignCtrl mIp0P0=r <Bar><CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_T# <SID>WS:AlignCtrl mIp0P0=r #<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_T, <SID>WS:AlignCtrl mIp0P1=r ,<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_Ts, <SID>WS:AlignCtrl mIp0P1=r ,<CR>:'a,.Align<CR>:'a,.s/\(\s*\),/,\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_T: <SID>WS:AlignCtrl mIp1P1=r :<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_T; <SID>WS:AlignCtrl mIp0P0=r ;<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_T< <SID>WS:AlignCtrl mIp0P0=r <<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_T= <SID>WS:'a,'z-1s/\s\+\([*/+\-%<Bar>&\~^]\==\)/ \1/e<CR>:'a,'z-1s@ \+\([*/+\-%<Bar>&\~^]\)=@\1=@ge<CR>:'a,'z-1s/; */;@/e<CR>:'a,'z-1s/==/\="\<Char-0x0f>\<Char-0x0f>"/ge<CR>:'a,'z-1s/!=/\x="!\<Char-0x0f>"/ge<CR>:AlignCtrl mIp1P1=r = @<CR>:AlignCtrl g =<CR>:'a,'z-1Align<CR>:'a,'z-1s/; *@/;/e<CR>:'a,'z-1s/; *$/;/e<CR>:'a,'z-1s@\([*/+\-%<Bar>&\~^]\)\( \+\)=@\2\1=@ge<CR>:'a,'z-1s/\( \+\);/;\1/ge<CR>:'a,'z-1s/\xff/=/ge<CR><SID>WE:exe "norm <Plug>acom"
-map <silent> <script> <Plug>AM_T? <SID>WS:AlignCtrl mIp0P0=r ?<CR>:'a,.Align<CR>:'y,'zs/ \( *\);/;\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_T@ <SID>WS:AlignCtrl mIp0P0=r @<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_Tab <SID>WS:'a,.s/^\(\t*\)\(.*\)/\=submatch(1).escape(substitute(submatch(2),'\t','@','g'),'\')/<CR>:AlignCtrl mI=r @<CR>:'a,.Align<CR>:'y+1,'z-1s/@/ /g<CR><SID>WE
-map <silent> <script> <Plug>AM_Tsp <SID>WS:'a,.s/^\(\s*\)\(.*\)/\=submatch(1).escape(substitute(submatch(2),'\s\+','@','g'),'\')/<CR>:AlignCtrl mI=r @<CR>:'a,.Align<CR>:'y+1,'z-1s/@/ /g<CR><SID>WE
-map <silent> <script> <Plug>AM_T~ <SID>WS:AlignCtrl mIp0P0=r ~<CR>:'a,.Align<CR>:'y,'zs/ \( *\);/;\1/ge<CR><SID>WE
-
-" ---------------------------------------------------------------------
-" character-based left-justified alignment maps {{{2
-if !hasmapto('<Plug>AM_t\16|') |map <unique> <Leader>t\16| <Plug>AM_t\16||endif
-if !hasmapto('<Plug>AM_t#') |map <unique> <Leader>t# <Plug>AM_t#|endif
-if !hasmapto('<Plug>AM_t,') |map <unique> <Leader>t, <Plug>AM_t,|endif
-if !hasmapto('<Plug>AM_t:') |map <unique> <Leader>t: <Plug>AM_t:|endif
-if !hasmapto('<Plug>AM_t;') |map <unique> <Leader>t; <Plug>AM_t;|endif
-if !hasmapto('<Plug>AM_t<') |map <unique> <Leader>t< <Plug>AM_t<|endif
-if !hasmapto('<Plug>AM_t=') |map <unique> <Leader>t= <Plug>AM_t=|endif
-if !hasmapto('<Plug>AM_ts,') |map <unique> <Leader>ts, <Plug>AM_ts,|endif
-if !hasmapto('<Plug>AM_ts:') |map <unique> <Leader>ts: <Plug>AM_ts:|endif
-if !hasmapto('<Plug>AM_ts;') |map <unique> <Leader>ts; <Plug>AM_ts;|endif
-if !hasmapto('<Plug>AM_ts<') |map <unique> <Leader>ts< <Plug>AM_ts<|endif
-if !hasmapto('<Plug>AM_ts=') |map <unique> <Leader>ts= <Plug>AM_ts=|endif
-if !hasmapto('<Plug>AM_w=') |map <unique> <Leader>w= <Plug>AM_w=|endif
-if !hasmapto('<Plug>AM_t?') |map <unique> <Leader>t? <Plug>AM_t?|endif
-if !hasmapto('<Plug>AM_t~') |map <unique> <Leader>t~ <Plug>AM_t~|endif
-if !hasmapto('<Plug>AM_t@') |map <unique> <Leader>t@ <Plug>AM_t@|endif
-if !hasmapto('<Plug>AM_m=') |map <unique> <Leader>m= <Plug>AM_m=|endif
-if !hasmapto('<Plug>AM_tab') |map <unique> <Leader>tab <Plug>AM_tab|endif
-if !hasmapto('<Plug>AM_tml') |map <unique> <Leader>tml <Plug>AM_tml|endif
-if !hasmapto('<Plug>AM_tsp') |map <unique> <Leader>tsp <Plug>AM_tsp|endif
-if !hasmapto('<Plug>AM_tsq') |map <unique> <Leader>tsq <Plug>AM_tsq|endif
-if !hasmapto('<Plug>AM_tt') |map <unique> <Leader>tt <Plug>AM_tt|endif
-
-map <silent> <script> <Plug>AM_t\16| <SID>WS:AlignCtrl mIp0P0=l <Bar><CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_t# <SID>WS:AlignCtrl mIp0P0=l #<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_t, <SID>WS:AlignCtrl mIp0P1=l ,<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_t: <SID>WS:AlignCtrl mIp1P1=l :<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_t; <SID>WS:AlignCtrl mIp0P1=l ;<CR>:'a,.Align<CR>:sil 'y,'zs/\( *\);/;\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_t< <SID>WS:AlignCtrl mIp0P0=l <<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_t= <SID>WS:call AlignMaps#Equals()<CR><SID>WE
-map <silent> <script> <Plug>AM_ts, <SID>WS:AlignCtrl mIp0P1=l #<CR>:'a,.Align<CR>:sil 'y+1,'z-1s/\(\s*\)#/,\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_ts, <SID>WS:AlignCtrl mIp0P1=l ,<CR>:'a,.Align<CR>:sil 'y+1,'z-1s/\(\s*\),/,\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_ts: <SID>WS:AlignCtrl mIp1P1=l :<CR>:'a,.Align<CR>:sil 'y+1,'z-1s/\(\s*\):/:\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_ts; <SID>WS:AlignCtrl mIp1P1=l ;<CR>:'a,.Align<CR>:sil 'y+1,'z-1s/\(\s*\);/;\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_ts< <SID>WS:AlignCtrl mIp1P1=l <<CR>:'a,.Align<CR>:sil 'y+1,'z-1s/\(\s*\)</<\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_ts= <SID>WS:AlignCtrl mIp1P1=l =<CR>:'a,.Align<CR>:sil 'y+1,'z-1s/\(\s*\)=/=\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_w= <SID>WS:'a,'zg/=/s/\s\+\([*/+\-%<Bar>&\~^]\==\)/ \1/e<CR>:'a,'zg/=/s@ \+\([*/+\-%<Bar>&\~^]\)=@\1=@ge<CR>:'a,'zg/=/s/==/\="\<Char-0x0f>\<Char-0x0f>"/ge<CR>:'a,'zg/=/s/!=/\="!\<Char-0x0f>"/ge<CR>'zk:AlignCtrl mWp1P1=l =<CR>:AlignCtrl g =<CR>:'a,'z-1g/=/Align<CR>:'a,'z-1g/=/s@\([*/+\-%<Bar>&\~^!=]\)\( \+\)=@\2\1=@ge<CR>:'a,'z-1g/=/s/\( \+\);/;\1/ge<CR>:'a,'z-1v/^\s*\/[*/]/s/\/[*/]/@&@/e<CR>:'a,'z-1v/^\s*\/[*/]/s/\*\//@&/e<CR>'zk:call AlignMaps#StdAlign(1)<cr>:'y,'zs/^\(\s*\) @/\1/e<CR>:'a,'z-1g/=/s/\xff/=/ge<CR>:'y,'zg/=/s/ @//eg<CR><SID>WE
-map <silent> <script> <Plug>AM_t? <SID>WS:AlignCtrl mIp0P0=l ?<CR>:'a,.Align<CR>:.,'zs/ \( *\);/;\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_t~ <SID>WS:AlignCtrl mIp0P0=l ~<CR>:'a,.Align<CR>:'y,'zs/ \( *\);/;\1/ge<CR><SID>WE
-map <silent> <script> <Plug>AM_t@ <SID>WS::call AlignMaps#StdAlign(1)<cr>:<SID>WE
-map <silent> <script> <Plug>AM_m= <SID>WS:'a,'zs/\s\+\([*/+\-%<Bar>&\~^]\==\)/ \1/e<CR>:'a,'zs@ \+\([*/+\-%<Bar>&\~^]\)=@\1=@ge<CR>:'a,'zs/==/\="\<Char-0x0f>\<Char-0x0f>"/ge<CR>:'a,'zs/!=/\="!\<Char-0x0f>"/ge<CR>'zk:AlignCtrl mIp1P1=l =<CR>:AlignCtrl g =<CR>:'a,'z-1Align<CR>:'a,'z-1s@\([*/+\-%<Bar>&\~^!=]\)\( \+\)=@\2\1=@ge<CR>:'a,'z-1s/\( \+\);/;\1/ge<CR>:'a,'z-s/%\ze[^=]/ @%@ /e<CR>'zk:call AlignMaps#StdAlign(1)<cr>:'y,'zs/^\(\s*\) @/\1/e<CR>:'a,'z-1s/\xff/=/ge<CR>:'y,'zs/ @//eg<CR><SID>WE
-map <silent> <script> <Plug>AM_tab <SID>WS:'a,.s/^\(\t*\)\(.*\)$/\=submatch(1).escape(substitute(submatch(2),'\t',"\<Char-0x0f>",'g'),'\')/<CR>:if &ts == 1<bar>exe "AlignCtrl mI=lp0P0 \<Char-0x0f>"<bar>else<bar>exe "AlignCtrl mI=l \<Char-0x0f>"<bar>endif<CR>:'a,.Align<CR>:exe "'y+1,'z-1s/\<Char-0x0f>/".((&ts == 1)? '\t' : ' ')."/g"<CR><SID>WE
-map <silent> <script> <Plug>AM_tml <SID>WS:AlignCtrl mWp1P0=l \\\@<!\\\s*$<CR>:'a,.Align<CR><SID>WE
-map <silent> <script> <Plug>AM_tsp <SID>WS:'a,.s/^\(\s*\)\(.*\)/\=submatch(1).escape(substitute(submatch(2),'\s\+','@','g'),'\')/<CR>:AlignCtrl mI=lp0P0 @<CR>:'a,.Align<CR>:'y+1,'z-1s/@/ /g<CR><SID>WE
-map <silent> <script> <Plug>AM_tsq <SID>WS:'a,.AlignReplaceQuotedSpaces<CR>:'a,.s/^\(\s*\)\(.*\)/\=submatch(1).substitute(submatch(2),'\s\+','@','g')/<CR>:AlignCtrl mIp0P0=l @<CR>:'a,.Align<CR>:'y+1,'z-1s/[%@]/ /g<CR><SID>WE
-map <silent> <script> <Plug>AM_tt <SID>WS:AlignCtrl mIp1P1=l \\\@<!& \\\\<CR>:'a,.Align<CR><SID>WE
-
-" =====================================================================
-" Menu Support: {{{1
-" ma ..move.. use menu
-" v V or ctrl-v ..move.. use menu
-if has("menu") && has("gui_running") && &go =~ 'm' && !exists("s:firstmenu")
- let s:firstmenu= 1
- if !exists("g:DrChipTopLvlMenu")
- let g:DrChipTopLvlMenu= "DrChip."
- endif
- if g:DrChipTopLvlMenu != ""
- let s:mapleader = exists("g:mapleader")? g:mapleader : '\'
- let s:emapleader= escape(s:mapleader,'\ ')
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.<<\ and\ >><tab>'.s:emapleader.'a< '.s:mapleader.'a<'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Assignment\ =<tab>'.s:emapleader.'t= '.s:mapleader.'t='
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Assignment\ :=<tab>'.s:emapleader.'a= '.s:mapleader.'a='
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Backslashes<tab>'.s:emapleader.'tml '.s:mapleader.'tml'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Breakup\ Comma\ Declarations<tab>'.s:emapleader.'a, '.s:mapleader.'a,'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.C\ Comment\ Box<tab>'.s:emapleader.'abox '.s:mapleader.'abox'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Commas<tab>'.s:emapleader.'t, '.s:mapleader.'t,'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Commas<tab>'.s:emapleader.'ts, '.s:mapleader.'ts,'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Commas\ With\ Strings<tab>'.s:emapleader.'tsq '.s:mapleader.'tsq'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Comments<tab>'.s:emapleader.'acom '.s:mapleader.'acom'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Comments\ Only<tab>'.s:emapleader.'aocom '.s:mapleader.'aocom'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Declaration\ Comments<tab>'.s:emapleader.'adcom '.s:mapleader.'adcom'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Declarations<tab>'.s:emapleader.'adec '.s:mapleader.'adec'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Definitions<tab>'.s:emapleader.'adef '.s:mapleader.'adef'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Function\ Header<tab>'.s:emapleader.'afnc '.s:mapleader.'afnc'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Html\ Tables<tab>'.s:emapleader.'Htd '.s:mapleader.'Htd'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.(\.\.\.)?\.\.\.\ :\ \.\.\.<tab>'.s:emapleader.'a? '.s:mapleader.'a?'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Numbers<tab>'.s:emapleader.'anum '.s:mapleader.'anum'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Numbers\ (American-Style)<tab>'.s:emapleader.'aunum <Leader>aunum '.s:mapleader.'aunum <Leader>aunum'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Numbers\ (Euro-Style)<tab>'.s:emapleader.'aenum '.s:mapleader.'aenum'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Spaces\ (Left\ Justified)<tab>'.s:emapleader.'tsp '.s:mapleader.'tsp'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Spaces\ (Right\ Justified)<tab>'.s:emapleader.'Tsp '.s:mapleader.'Tsp'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Statements\ With\ Percent\ Style\ Comments<tab>'.s:emapleader.'m= '.s:mapleader.'m='
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Symbol\ <<tab>'.s:emapleader.'t< '.s:mapleader.'t<'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Symbol\ \|<tab>'.s:emapleader.'t\| '.s:mapleader.'t|'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Symbol\ @<tab>'.s:emapleader.'t@ '.s:mapleader.'t@'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Symbol\ #<tab>'.s:emapleader.'t# '.s:mapleader.'t#'
- exe 'menu '.g:DrChipTopLvlMenu.'AlignMaps.Tabs<tab>'.s:emapleader.'tab '.s:mapleader.'tab'
- unlet s:mapleader
- unlet s:emapleader
- endif
-endif
-
-" =====================================================================
-" Restore: {{{1
-let &cpo= s:keepcpo
-unlet s:keepcpo
-
-" ==============================================================================
-" Modelines: {{{1
-" vim: ts=4 nowrap fdm=marker
+++ /dev/null
-" AlignPlugin: tool to align multiple fields based on one or more separators
-" Author: Charles E. Campbell, Jr.
-" Date: Nov 02, 2008
-" GetLatestVimScripts: 294 1 :AutoInstall: Align.vim
-" GetLatestVimScripts: 1066 1 :AutoInstall: cecutil.vim
-" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1
-" Permission is hereby granted to use and distribute this code,
-" with or without modifications, provided that this copyright
-" notice is copied with it. Like anything else that's free,
-" Align.vim is provided *as is* and comes with no warranty
-" of any kind, either expressed or implied. By using this
-" plugin, you agree that in no event will the copyright
-" holder be liable for any damages resulting from the use
-" of this software.
-"
-" Romans 1:16,17a : For I am not ashamed of the gospel of Christ, for it is {{{1
-" the power of God for salvation for everyone who believes; for the Jew first,
-" and also for the Greek. For in it is revealed God's righteousness from
-" faith to faith.
-" ---------------------------------------------------------------------
-" Load Once: {{{1
-if &cp || exists("g:loaded_AlignPlugin")
- finish
-endif
-let g:loaded_AlignPlugin = "v35"
-let s:keepcpo = &cpo
-set cpo&vim
-
-" ---------------------------------------------------------------------
-" Public Interface: {{{1
-com! -bang -range -nargs=* Align <line1>,<line2>call Align#Align(<bang>0,<q-args>)
-com! -range -nargs=0 AlignReplaceQuotedSpaces <line1>,<line2>call Align#AlignReplaceQuotedSpaces()
-com! -nargs=* AlignCtrl call Align#AlignCtrl(<q-args>)
-com! -nargs=0 AlignPush call Align#AlignPush()
-com! -nargs=0 AlignPop call Align#AlignPop()
-
-" ---------------------------------------------------------------------
-" Restore: {{{1
-let &cpo= s:keepcpo
-unlet s:keepcpo
-" vim: ts=4 fdm=marker
+++ /dev/null
-" ============================================================================
-" File: NERD_commenter.vim
-" Description: vim global plugin that provides easy code commenting
-" Maintainer: Martin Grenfell <martin.grenfell at gmail dot com>
-" Version: 2.3.0
-" Last Change: 08th December, 2010
-" License: This program is free software. It comes without any warranty,
-" to the extent permitted by applicable law. You can redistribute
-" it and/or modify it under the terms of the Do What The Fuck You
-" Want To Public License, Version 2, as published by Sam Hocevar.
-" See http://sam.zoy.org/wtfpl/COPYING for more details.
-"
-" ============================================================================
-
-" Section: script init stuff {{{1
-if exists("loaded_nerd_comments")
- finish
-endif
-if v:version < 700
- echoerr "NERDCommenter: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!"
- finish
-endif
-let loaded_nerd_comments = 1
-
-" Function: s:InitVariable() function {{{2
-" This function is used to initialise a given variable to a given value. The
-" variable is only initialised if it does not exist prior
-"
-" Args:
-" -var: the name of the var to be initialised
-" -value: the value to initialise var to
-"
-" Returns:
-" 1 if the var is set, 0 otherwise
-function s:InitVariable(var, value)
- if !exists(a:var)
- exec 'let ' . a:var . ' = ' . "'" . a:value . "'"
- return 1
- endif
- return 0
-endfunction
-
-" Section: space string init{{{2
-" When putting spaces after the left delim and before the right we use
-" s:spaceStr for the space char. This way we can make it add anything after
-" the left and before the right by modifying this variable
-let s:spaceStr = ' '
-let s:lenSpaceStr = strlen(s:spaceStr)
-
-" Section: variable init calls {{{2
-call s:InitVariable("g:NERDAllowAnyVisualDelims", 1)
-call s:InitVariable("g:NERDBlockComIgnoreEmpty", 0)
-call s:InitVariable("g:NERDCommentWholeLinesInVMode", 0)
-call s:InitVariable("g:NERDCompactSexyComs", 0)
-call s:InitVariable("g:NERDCreateDefaultMappings", 1)
-call s:InitVariable("g:NERDDefaultNesting", 1)
-call s:InitVariable("g:NERDMenuMode", 3)
-call s:InitVariable("g:NERDLPlace", "[>")
-call s:InitVariable("g:NERDUsePlaceHolders", 1)
-call s:InitVariable("g:NERDRemoveAltComs", 1)
-call s:InitVariable("g:NERDRemoveExtraSpaces", 1)
-call s:InitVariable("g:NERDRPlace", "<]")
-call s:InitVariable("g:NERDSpaceDelims", 0)
-call s:InitVariable("g:NERDDelimiterRequests", 1)
-
-let s:NERDFileNameEscape="[]#*$%'\" ?`!&();<>\\"
-"vf ;;dA:\ehcs"'A {\ej^f(lyi(k$p0f{a \eA }\e0f{a 'left':\ejdd^
-
-let s:delimiterMap = {
- \ 'aap': { 'left': '#' },
- \ 'abc': { 'left': '%' },
- \ 'acedb': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'actionscript': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'ada': { 'left': '--', 'leftAlt': '-- ' },
- \ 'ahdl': { 'left': '--' },
- \ 'ahk': { 'left': ';', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'amiga': { 'left': ';' },
- \ 'aml': { 'left': '/*' },
- \ 'ampl': { 'left': '#' },
- \ 'apache': { 'left': '#' },
- \ 'apachestyle': { 'left': '#' },
- \ 'asciidoc': { 'left': '//' },
- \ 'applescript': { 'left': '--', 'leftAlt': '(*', 'rightAlt': '*)' },
- \ 'asm68k': { 'left': ';' },
- \ 'asm': { 'left': ';', 'leftAlt': '#' },
- \ 'asn': { 'left': '--' },
- \ 'aspvbs': { 'left': '''' },
- \ 'asterisk': { 'left': ';' },
- \ 'asy': { 'left': '//' },
- \ 'atlas': { 'left': 'C', 'right': '$' },
- \ 'autohotkey': { 'left': ';' },
- \ 'autoit': { 'left': ';' },
- \ 'ave': { 'left': "'" },
- \ 'awk': { 'left': '#' },
- \ 'basic': { 'left': "'", 'leftAlt': 'REM ' },
- \ 'bbx': { 'left': '%' },
- \ 'bc': { 'left': '#' },
- \ 'bib': { 'left': '%' },
- \ 'bindzone': { 'left': ';' },
- \ 'bst': { 'left': '%' },
- \ 'btm': { 'left': '::' },
- \ 'caos': { 'left': '*' },
- \ 'calibre': { 'left': '//' },
- \ 'catalog': { 'left': '--', 'right': '--' },
- \ 'c': { 'left': '/*','right': '*/', 'leftAlt': '//' },
- \ 'cfg': { 'left': '#' },
- \ 'cg': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'ch': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'cl': { 'left': '#' },
- \ 'clean': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'clipper': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'clojure': { 'left': ';' },
- \ 'cmake': { 'left': '#' },
- \ 'conkyrc': { 'left': '#' },
- \ 'cpp': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'crontab': { 'left': '#' },
- \ 'cs': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'csp': { 'left': '--' },
- \ 'cterm': { 'left': '*' },
- \ 'cucumber': { 'left': '#' },
- \ 'cvs': { 'left': 'CVS:' },
- \ 'd': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'dcl': { 'left': '$!' },
- \ 'dakota': { 'left': '#' },
- \ 'debcontrol': { 'left': '#' },
- \ 'debsources': { 'left': '#' },
- \ 'def': { 'left': ';' },
- \ 'desktop': { 'left': '#' },
- \ 'dhcpd': { 'left': '#' },
- \ 'diff': { 'left': '#' },
- \ 'django': { 'left': '<!--','right': '-->', 'leftAlt': '{#', 'rightAlt': '#}' },
- \ 'docbk': { 'left': '<!--', 'right': '-->' },
- \ 'dns': { 'left': ';' },
- \ 'dosbatch': { 'left': 'REM ', 'leftAlt': '::' },
- \ 'dosini': { 'left': ';' },
- \ 'dot': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'dracula': { 'left': ';' },
- \ 'dsl': { 'left': ';' },
- \ 'dtml': { 'left': '<dtml-comment>', 'right': '</dtml-comment>' },
- \ 'dylan': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'ebuild': { 'left': '#' },
- \ 'ecd': { 'left': '#' },
- \ 'eclass': { 'left': '#' },
- \ 'eiffel': { 'left': '--' },
- \ 'elf': { 'left': "'" },
- \ 'elmfilt': { 'left': '#' },
- \ 'erlang': { 'left': '%' },
- \ 'eruby': { 'left': '<%#', 'right': '%>', 'leftAlt': '<!--', 'rightAlt': '-->' },
- \ 'expect': { 'left': '#' },
- \ 'exports': { 'left': '#' },
- \ 'factor': { 'left': '! ', 'leftAlt': '!# ' },
- \ 'fgl': { 'left': '#' },
- \ 'focexec': { 'left': '-*' },
- \ 'form': { 'left': '*' },
- \ 'foxpro': { 'left': '*' },
- \ 'fstab': { 'left': '#' },
- \ 'fvwm': { 'left': '#' },
- \ 'fx': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'gams': { 'left': '*' },
- \ 'gdb': { 'left': '#' },
- \ 'gdmo': { 'left': '--' },
- \ 'geek': { 'left': 'GEEK_COMMENT:' },
- \ 'genshi': { 'left': '<!--','right': '-->', 'leftAlt': '{#', 'rightAlt': '#}' },
- \ 'gentoo-conf-d': { 'left': '#' },
- \ 'gentoo-env-d': { 'left': '#' },
- \ 'gentoo-init-d': { 'left': '#' },
- \ 'gentoo-make-conf': { 'left': '#' },
- \ 'gentoo-package-keywords': { 'left': '#' },
- \ 'gentoo-package-mask': { 'left': '#' },
- \ 'gentoo-package-use': { 'left': '#' },
- \ 'gitcommit': { 'left': '#' },
- \ 'gitconfig': { 'left': ';' },
- \ 'gitrebase': { 'left': '#' },
- \ 'gnuplot': { 'left': '#' },
- \ 'groovy': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'gsp': { 'left': '<%--', 'right': '--%>' },
- \ 'gtkrc': { 'left': '#' },
- \ 'haskell': { 'left': '{-','right': '-}', 'leftAlt': '--' },
- \ 'hb': { 'left': '#' },
- \ 'h': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'haml': { 'left': '-#', 'leftAlt': '/' },
- \ 'hercules': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'hog': { 'left': '#' },
- \ 'hostsaccess': { 'left': '#' },
- \ 'htmlcheetah': { 'left': '##' },
- \ 'htmldjango': { 'left': '<!--','right': '-->', 'leftAlt': '{#', 'rightAlt': '#}' },
- \ 'htmlos': { 'left': '#', 'right': '/#' },
- \ 'ia64': { 'left': '#' },
- \ 'icon': { 'left': '#' },
- \ 'idlang': { 'left': ';' },
- \ 'idl': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'inform': { 'left': '!' },
- \ 'inittab': { 'left': '#' },
- \ 'ishd': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'iss': { 'left': ';' },
- \ 'ist': { 'left': '%' },
- \ 'java': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'javacc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'javascript': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'javascript.jquery': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'jess': { 'left': ';' },
- \ 'jgraph': { 'left': '(*', 'right': '*)' },
- \ 'jproperties': { 'left': '#' },
- \ 'jsp': { 'left': '<%--', 'right': '--%>' },
- \ 'kix': { 'left': ';' },
- \ 'kscript': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'lace': { 'left': '--' },
- \ 'ldif': { 'left': '#' },
- \ 'lilo': { 'left': '#' },
- \ 'lilypond': { 'left': '%' },
- \ 'liquid': { 'left': '{%', 'right': '%}' },
- \ 'lisp': { 'left': ';', 'leftAlt': '#|', 'rightAlt': '|#' },
- \ 'llvm': { 'left': ';' },
- \ 'lotos': { 'left': '(*', 'right': '*)' },
- \ 'lout': { 'left': '#' },
- \ 'lprolog': { 'left': '%' },
- \ 'lscript': { 'left': "'" },
- \ 'lss': { 'left': '#' },
- \ 'lua': { 'left': '--', 'leftAlt': '--[[', 'rightAlt': ']]' },
- \ 'lynx': { 'left': '#' },
- \ 'lytex': { 'left': '%' },
- \ 'mail': { 'left': '> ' },
- \ 'mako': { 'left': '##' },
- \ 'man': { 'left': '."' },
- \ 'map': { 'left': '%' },
- \ 'maple': { 'left': '#' },
- \ 'markdown': { 'left': '<!--', 'right': '-->' },
- \ 'masm': { 'left': ';' },
- \ 'mason': { 'left': '<% #', 'right': '%>' },
- \ 'master': { 'left': '$' },
- \ 'matlab': { 'left': '%' },
- \ 'mel': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'mib': { 'left': '--' },
- \ 'mkd': { 'left': '>' },
- \ 'mma': { 'left': '(*', 'right': '*)' },
- \ 'model': { 'left': '$', 'right': '$' },
- \ 'moduala.': { 'left': '(*', 'right': '*)' },
- \ 'modula2': { 'left': '(*', 'right': '*)' },
- \ 'modula3': { 'left': '(*', 'right': '*)' },
- \ 'monk': { 'left': ';' },
- \ 'mush': { 'left': '#' },
- \ 'named': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'nasm': { 'left': ';' },
- \ 'nastran': { 'left': '$' },
- \ 'natural': { 'left': '/*' },
- \ 'ncf': { 'left': ';' },
- \ 'newlisp': { 'left': ';' },
- \ 'nroff': { 'left': '\"' },
- \ 'nsis': { 'left': '#' },
- \ 'ntp': { 'left': '#' },
- \ 'objc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'objcpp': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'objj': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'ocaml': { 'left': '(*', 'right': '*)' },
- \ 'occam': { 'left': '--' },
- \ 'omlet': { 'left': '(*', 'right': '*)' },
- \ 'omnimark': { 'left': ';' },
- \ 'openroad': { 'left': '//' },
- \ 'opl': { 'left': "REM" },
- \ 'ora': { 'left': '#' },
- \ 'ox': { 'left': '//' },
- \ 'pascal': { 'left': '{','right': '}', 'leftAlt': '(*', 'rightAlt': '*)' },
- \ 'patran': { 'left': '$', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'pcap': { 'left': '#' },
- \ 'pccts': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'pdf': { 'left': '%' },
- \ 'pfmain': { 'left': '//' },
- \ 'php': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'pic': { 'left': ';' },
- \ 'pike': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'pilrc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'pine': { 'left': '#' },
- \ 'plm': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'plsql': { 'left': '--', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'po': { 'left': '#' },
- \ 'postscr': { 'left': '%' },
- \ 'pov': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'povini': { 'left': ';' },
- \ 'ppd': { 'left': '%' },
- \ 'ppwiz': { 'left': ';;' },
- \ 'processing': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'prolog': { 'left': '%', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'ps1': { 'left': '#' },
- \ 'psf': { 'left': '#' },
- \ 'ptcap': { 'left': '#' },
- \ 'python': { 'left': '#' },
- \ 'radiance': { 'left': '#' },
- \ 'ratpoison': { 'left': '#' },
- \ 'r': { 'left': '#' },
- \ 'rc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'rebol': { 'left': ';' },
- \ 'registry': { 'left': ';' },
- \ 'remind': { 'left': '#' },
- \ 'resolv': { 'left': '#' },
- \ 'rgb': { 'left': '!' },
- \ 'rib': { 'left': '#' },
- \ 'robots': { 'left': '#' },
- \ 'sa': { 'left': '--' },
- \ 'samba': { 'left': ';', 'leftAlt': '#' },
- \ 'sass': { 'left': '//', 'leftAlt': '/*' },
- \ 'sather': { 'left': '--' },
- \ 'scala': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'scilab': { 'left': '//' },
- \ 'scsh': { 'left': ';' },
- \ 'sed': { 'left': '#' },
- \ 'sgmldecl': { 'left': '--', 'right': '--' },
- \ 'sgmllnx': { 'left': '<!--', 'right': '-->' },
- \ 'sicad': { 'left': '*' },
- \ 'simula': { 'left': '%', 'leftAlt': '--' },
- \ 'sinda': { 'left': '$' },
- \ 'skill': { 'left': ';' },
- \ 'slang': { 'left': '%' },
- \ 'slice': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'slrnrc': { 'left': '%' },
- \ 'sm': { 'left': '#' },
- \ 'smarty': { 'left': '{*', 'right': '*}' },
- \ 'smil': { 'left': '<!', 'right': '>' },
- \ 'smith': { 'left': ';' },
- \ 'sml': { 'left': '(*', 'right': '*)' },
- \ 'snnsnet': { 'left': '#' },
- \ 'snnspat': { 'left': '#' },
- \ 'snnsres': { 'left': '#' },
- \ 'snobol4': { 'left': '*' },
- \ 'spec': { 'left': '#' },
- \ 'specman': { 'left': '//' },
- \ 'spectre': { 'left': '//', 'leftAlt': '*' },
- \ 'spice': { 'left': '$' },
- \ 'sql': { 'left': '--' },
- \ 'sqlforms': { 'left': '--' },
- \ 'sqlj': { 'left': '--' },
- \ 'sqr': { 'left': '!' },
- \ 'squid': { 'left': '#' },
- \ 'st': { 'left': '"' },
- \ 'stp': { 'left': '--' },
- \ 'systemverilog': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'tads': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'tags': { 'left': ';' },
- \ 'tak': { 'left': '$' },
- \ 'tasm': { 'left': ';' },
- \ 'tcl': { 'left': '#' },
- \ 'texinfo': { 'left': "@c " },
- \ 'texmf': { 'left': '%' },
- \ 'tf': { 'left': ';' },
- \ 'tidy': { 'left': '#' },
- \ 'tli': { 'left': '#' },
- \ 'tmux': { 'left': '#' },
- \ 'trasys': { 'left': "$" },
- \ 'tsalt': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'tsscl': { 'left': '#' },
- \ 'tssgm': { 'left': "comment = '", 'right': "'" },
- \ 'txt2tags': { 'left': '%' },
- \ 'uc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'uil': { 'left': '!' },
- \ 'vb': { 'left': "'" },
- \ 'velocity': { 'left': "##", 'right': "", 'leftAlt': '#*', 'rightAlt': '*#' },
- \ 'vera': { 'left': '/*','right': '*/', 'leftAlt': '//' },
- \ 'verilog': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'verilog_systemverilog': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' },
- \ 'vgrindefs': { 'left': '#' },
- \ 'vhdl': { 'left': '--' },
- \ 'vimperator': { 'left': '"' },
- \ 'virata': { 'left': '%' },
- \ 'vrml': { 'left': '#' },
- \ 'vsejcl': { 'left': '/*' },
- \ 'webmacro': { 'left': '##' },
- \ 'wget': { 'left': '#' },
- \ 'Wikipedia': { 'left': '<!--', 'right': '-->' },
- \ 'winbatch': { 'left': ';' },
- \ 'wml': { 'left': '#' },
- \ 'wvdial': { 'left': ';' },
- \ 'xdefaults': { 'left': '!' },
- \ 'xkb': { 'left': '//' },
- \ 'xmath': { 'left': '#' },
- \ 'xpm2': { 'left': '!' },
- \ 'xquery': { 'left': '(:', 'right': ':)' },
- \ 'z8a': { 'left': ';' }
- \ }
-
-" Section: Comment mapping functions, autocommands and commands {{{1
-" ============================================================================
-" Section: Comment enabler autocommands {{{2
-" ============================================================================
-
-augroup commentEnablers
-
- "if the user enters a buffer or reads a buffer then we gotta set up
- "the comment delimiters for that new filetype
- autocmd BufEnter,BufRead * :call s:SetUpForNewFiletype(&filetype, 0)
-
- "if the filetype of a buffer changes, force the script to reset the
- "delims for the buffer
- autocmd Filetype * :call s:SetUpForNewFiletype(&filetype, 1)
-augroup END
-
-
-" Function: s:SetUpForNewFiletype(filetype) function {{{2
-" This function is responsible for setting up buffer scoped variables for the
-" given filetype.
-"
-" Args:
-" -filetype: the filetype to set delimiters for
-" -forceReset: 1 if the delimiters should be reset if they have already be
-" set for this buffer.
-"
-function s:SetUpForNewFiletype(filetype, forceReset)
- let b:NERDSexyComMarker = ''
-
- if has_key(s:delimiterMap, a:filetype)
- let b:NERDCommenterDelims = s:delimiterMap[a:filetype]
- for i in ['left', 'leftAlt', 'right', 'rightAlt']
- if !has_key(b:NERDCommenterDelims, i)
- let b:NERDCommenterDelims[i] = ''
- endif
- endfor
- else
- let b:NERDCommenterDelims = s:CreateDelimMapFromCms()
- endif
-
-endfunction
-
-function s:CreateDelimMapFromCms()
- return {
- \ 'left': substitute(&commentstring, '\([^ \t]*\)\s*%s.*', '\1', ''),
- \ 'right': substitute(&commentstring, '.*%s\s*\(.*\)', '\1', 'g'),
- \ 'leftAlt': '',
- \ 'rightAlt': '' }
-endfunction
-
-" Function: s:SwitchToAlternativeDelimiters(printMsgs) function {{{2
-" This function is used to swap the delimiters that are being used to the
-" alternative delimiters for that filetype. For example, if a c++ file is
-" being edited and // comments are being used, after this function is called
-" /**/ comments will be used.
-"
-" Args:
-" -printMsgs: if this is 1 then a message is echoed to the user telling them
-" if this function changed the delimiters or not
-function s:SwitchToAlternativeDelimiters(printMsgs)
- "if both of the alternative delimiters are empty then there is no
- "alternative comment style so bail out
- if b:NERDCommenterDelims['leftAlt'] == '' && b:NERDCommenterDelims['rightAlt'] == ''
- if a:printMsgs
- call s:NerdEcho("Cannot use alternative delimiters, none are specified", 0)
- endif
- return 0
- endif
-
- "save the current delimiters
- let tempLeft = s:Left()
- let tempRight = s:Right()
-
- "swap current delimiters for alternative
- let b:NERDCommenterDelims['left'] = b:NERDCommenterDelims['leftAlt']
- let b:NERDCommenterDelims['right'] = b:NERDCommenterDelims['rightAlt']
-
- "set the previously current delimiters to be the new alternative ones
- let b:NERDCommenterDelims['leftAlt'] = tempLeft
- let b:NERDCommenterDelims['rightAlt'] = tempRight
-
- "tell the user what comment delimiters they are now using
- if a:printMsgs
- call s:NerdEcho("Now using " . s:Left() . " " . s:Right() . " to delimit comments", 1)
- endif
-
- return 1
-endfunction
-
-" Section: Comment delimiter add/removal functions {{{1
-" ============================================================================
-" Function: s:AppendCommentToLine(){{{2
-" This function appends comment delimiters at the EOL and places the cursor in
-" position to start typing the comment
-function s:AppendCommentToLine()
- let left = s:Left({'space': 1})
- let right = s:Right({'space': 1})
-
- " get the len of the right delim
- let lenRight = strlen(right)
-
- let isLineEmpty = strlen(getline(".")) == 0
- let insOrApp = (isLineEmpty==1 ? 'i' : 'A')
-
- "stick the delimiters down at the end of the line. We have to format the
- "comment with spaces as appropriate
- execute ":normal! " . insOrApp . (isLineEmpty ? '' : ' ') . left . right . " "
-
- " if there is a right delimiter then we gotta move the cursor left
- " by the len of the right delimiter so we insert between the delimiters
- if lenRight > 0
- let leftMoveAmount = lenRight
- execute ":normal! " . leftMoveAmount . "h"
- endif
- startinsert
-endfunction
-
-" Function: s:CommentBlock(top, bottom, lSide, rSide, forceNested ) {{{2
-" This function is used to comment out a region of code. This region is
-" specified as a bounding box by arguments to the function.
-"
-" Args:
-" -top: the line number for the top line of code in the region
-" -bottom: the line number for the bottom line of code in the region
-" -lSide: the column number for the left most column in the region
-" -rSide: the column number for the right most column in the region
-" -forceNested: a flag indicating whether comments should be nested
-function s:CommentBlock(top, bottom, lSide, rSide, forceNested )
- " we need to create local copies of these arguments so we can modify them
- let top = a:top
- let bottom = a:bottom
- let lSide = a:lSide
- let rSide = a:rSide
-
- "if the top or bottom line starts with tabs we have to adjust the left and
- "right boundaries so that they are set as though the tabs were spaces
- let topline = getline(top)
- let bottomline = getline(bottom)
- if s:HasLeadingTabs(topline, bottomline)
-
- "find out how many tabs are in the top line and adjust the left
- "boundary accordingly
- let numTabs = s:NumberOfLeadingTabs(topline)
- if lSide < numTabs
- let lSide = &ts * lSide
- else
- let lSide = (lSide - numTabs) + (&ts * numTabs)
- endif
-
- "find out how many tabs are in the bottom line and adjust the right
- "boundary accordingly
- let numTabs = s:NumberOfLeadingTabs(bottomline)
- let rSide = (rSide - numTabs) + (&ts * numTabs)
- endif
-
- "we must check that bottom IS actually below top, if it is not then we
- "swap top and bottom. Similarly for left and right.
- if bottom < top
- let temp = top
- let top = bottom
- let bottom = top
- endif
- if rSide < lSide
- let temp = lSide
- let lSide = rSide
- let rSide = temp
- endif
-
- "if the current delimiters arent multipart then we will switch to the
- "alternative delims (if THEY are) as the comment will be better and more
- "accurate with multipart delims
- let switchedDelims = 0
- if !s:Multipart() && g:NERDAllowAnyVisualDelims && s:AltMultipart()
- let switchedDelims = 1
- call s:SwitchToAlternativeDelimiters(0)
- endif
-
- "start the commenting from the top and keep commenting till we reach the
- "bottom
- let currentLine=top
- while currentLine <= bottom
-
- "check if we are allowed to comment this line
- if s:CanCommentLine(a:forceNested, currentLine)
-
- "convert the leading tabs into spaces
- let theLine = getline(currentLine)
- let lineHasLeadTabs = s:HasLeadingTabs(theLine)
- if lineHasLeadTabs
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- endif
-
- "dont comment lines that begin after the right boundary of the
- "block unless the user has specified to do so
- if theLine !~ '^ \{' . rSide . '\}' || !g:NERDBlockComIgnoreEmpty
-
- "attempt to place the cursor in on the left of the boundary box,
- "then check if we were successful, if not then we cant comment this
- "line
- call setline(currentLine, theLine)
- if s:CanPlaceCursor(currentLine, lSide)
-
- let leftSpaced = s:Left({'space': 1})
- let rightSpaced = s:Right({'space': 1})
-
- "stick the left delimiter down
- let theLine = strpart(theLine, 0, lSide-1) . leftSpaced . strpart(theLine, lSide-1)
-
- if s:Multipart()
- "stick the right delimiter down
- let theLine = strpart(theLine, 0, rSide+strlen(leftSpaced)) . rightSpaced . strpart(theLine, rSide+strlen(leftSpaced))
-
- let firstLeftDelim = s:FindDelimiterIndex(s:Left(), theLine)
- let lastRightDelim = s:LastIndexOfDelim(s:Right(), theLine)
-
- if firstLeftDelim != -1 && lastRightDelim != -1
- let searchStr = strpart(theLine, 0, lastRightDelim)
- let searchStr = strpart(searchStr, firstLeftDelim+strlen(s:Left()))
-
- "replace the outter most delims in searchStr with
- "place-holders
- let theLineWithPlaceHolders = s:ReplaceDelims(s:Left(), s:Right(), g:NERDLPlace, g:NERDRPlace, searchStr)
-
- "add the right delimiter onto the line
- let theLine = strpart(theLine, 0, firstLeftDelim+strlen(s:Left())) . theLineWithPlaceHolders . strpart(theLine, lastRightDelim)
- endif
- endif
- endif
- endif
-
- "restore tabs if needed
- if lineHasLeadTabs
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
-
- call setline(currentLine, theLine)
- endif
-
- let currentLine = currentLine + 1
- endwhile
-
- "if we switched delims then we gotta go back to what they were before
- if switchedDelims == 1
- call s:SwitchToAlternativeDelimiters(0)
- endif
-endfunction
-
-" Function: s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) {{{2
-" This function comments a range of lines.
-"
-" Args:
-" -forceNested: a flag indicating whether the called is requesting the comment
-" to be nested if need be
-" -align: should be "left" or "both" or "none"
-" -firstLine/lastLine: the top and bottom lines to comment
-function s:CommentLines(forceNested, align, firstLine, lastLine)
- " we need to get the left and right indexes of the leftmost char in the
- " block of of lines and the right most char so that we can do alignment of
- " the delimiters if the user has specified
- let leftAlignIndx = s:LeftMostIndx(a:forceNested, 0, a:firstLine, a:lastLine)
- let rightAlignIndx = s:RightMostIndx(a:forceNested, 0, a:firstLine, a:lastLine)
-
- " gotta add the length of the left delimiter onto the rightAlignIndx cos
- " we'll be adding a left delim to the line
- let rightAlignIndx = rightAlignIndx + strlen(s:Left({'space': 1}))
-
- " now we actually comment the lines. Do it line by line
- let currentLine = a:firstLine
- while currentLine <= a:lastLine
-
- " get the next line, check commentability and convert spaces to tabs
- let theLine = getline(currentLine)
- let lineHasLeadingTabs = s:HasLeadingTabs(theLine)
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- if s:CanCommentLine(a:forceNested, currentLine)
- "if the user has specified forceNesting then we check to see if we
- "need to switch delimiters for place-holders
- if a:forceNested && g:NERDUsePlaceHolders
- let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine)
- endif
-
- " find out if the line is commented using normal delims and/or
- " alternate ones
- let isCommented = s:IsCommented(s:Left(), s:Right(), theLine) || s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine)
-
- " check if we can comment this line
- if !isCommented || g:NERDUsePlaceHolders || s:Multipart()
- if a:align == "left" || a:align == "both"
- let theLine = s:AddLeftDelimAligned(s:Left({'space': 1}), theLine, leftAlignIndx)
- else
- let theLine = s:AddLeftDelim(s:Left({'space': 1}), theLine)
- endif
- if a:align == "both"
- let theLine = s:AddRightDelimAligned(s:Right({'space': 1}), theLine, rightAlignIndx)
- else
- let theLine = s:AddRightDelim(s:Right({'space': 1}), theLine)
- endif
- endif
- endif
-
- " restore leading tabs if appropriate
- if lineHasLeadingTabs
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
-
- " we are done with this line
- call setline(currentLine, theLine)
- let currentLine = currentLine + 1
- endwhile
-
-endfunction
-
-" Function: s:CommentLinesMinimal(firstLine, lastLine) {{{2
-" This function comments a range of lines in a minimal style. I
-"
-" Args:
-" -firstLine/lastLine: the top and bottom lines to comment
-function s:CommentLinesMinimal(firstLine, lastLine)
- "check that minimal comments can be done on this filetype
- if !s:HasMultipartDelims()
- throw 'NERDCommenter.Delimiters exception: Minimal comments can only be used for filetypes that have multipart delimiters'
- endif
-
- "if we need to use place holders for the comment, make sure they are
- "enabled for this filetype
- if !g:NERDUsePlaceHolders && s:DoesBlockHaveMultipartDelim(a:firstLine, a:lastLine)
- throw 'NERDCommenter.Settings exception: Place holders are required but disabled.'
- endif
-
- "get the left and right delims to smack on
- let left = s:GetSexyComLeft(g:NERDSpaceDelims,0)
- let right = s:GetSexyComRight(g:NERDSpaceDelims,0)
-
- "make sure all multipart delims on the lines are replaced with
- "placeholders to prevent illegal syntax
- let currentLine = a:firstLine
- while(currentLine <= a:lastLine)
- let theLine = getline(currentLine)
- let theLine = s:ReplaceDelims(left, right, g:NERDLPlace, g:NERDRPlace, theLine)
- call setline(currentLine, theLine)
- let currentLine = currentLine + 1
- endwhile
-
- "add the delim to the top line
- let theLine = getline(a:firstLine)
- let lineHasLeadingTabs = s:HasLeadingTabs(theLine)
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- let theLine = s:AddLeftDelim(left, theLine)
- if lineHasLeadingTabs
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
- call setline(a:firstLine, theLine)
-
- "add the delim to the bottom line
- let theLine = getline(a:lastLine)
- let lineHasLeadingTabs = s:HasLeadingTabs(theLine)
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- let theLine = s:AddRightDelim(right, theLine)
- if lineHasLeadingTabs
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
- call setline(a:lastLine, theLine)
-endfunction
-
-" Function: s:CommentLinesSexy(topline, bottomline) function {{{2
-" This function is used to comment lines in the 'Sexy' style. eg in c:
-" /*
-" * This is a sexy comment
-" */
-" Args:
-" -topline: the line num of the top line in the sexy comment
-" -bottomline: the line num of the bottom line in the sexy comment
-function s:CommentLinesSexy(topline, bottomline)
- let left = s:GetSexyComLeft(0, 0)
- let right = s:GetSexyComRight(0, 0)
-
- "check if we can do a sexy comment with the available delimiters
- if left == -1 || right == -1
- throw 'NERDCommenter.Delimiters exception: cannot perform sexy comments with available delimiters.'
- endif
-
- "make sure the lines arent already commented sexually
- if !s:CanSexyCommentLines(a:topline, a:bottomline)
- throw 'NERDCommenter.Nesting exception: cannot nest sexy comments'
- endif
-
-
- let sexyComMarker = s:GetSexyComMarker(0,0)
- let sexyComMarkerSpaced = s:GetSexyComMarker(1,0)
-
-
- " we jam the comment as far to the right as possible
- let leftAlignIndx = s:LeftMostIndx(1, 1, a:topline, a:bottomline)
-
- "check if we should use the compact style i.e that the left/right
- "delimiters should appear on the first and last lines of the code and not
- "on separate lines above/below the first/last lines of code
- if g:NERDCompactSexyComs
- let spaceString = (g:NERDSpaceDelims ? s:spaceStr : '')
-
- "comment the top line
- let theLine = getline(a:topline)
- let lineHasTabs = s:HasLeadingTabs(theLine)
- if lineHasTabs
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- endif
- let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine)
- let theLine = s:AddLeftDelimAligned(left . spaceString, theLine, leftAlignIndx)
- if lineHasTabs
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
- call setline(a:topline, theLine)
-
- "comment the bottom line
- if a:bottomline != a:topline
- let theLine = getline(a:bottomline)
- let lineHasTabs = s:HasLeadingTabs(theLine)
- if lineHasTabs
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- endif
- let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine)
- endif
- let theLine = s:AddRightDelim(spaceString . right, theLine)
- if lineHasTabs
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
- call setline(a:bottomline, theLine)
- else
-
- " add the left delimiter one line above the lines that are to be commented
- call cursor(a:topline, 1)
- execute 'normal! O'
- let theLine = repeat(' ', leftAlignIndx) . left
-
- " Make sure tabs are respected
- if !&expandtab
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
- call setline(a:topline, theLine)
-
- " add the right delimiter after bottom line (we have to add 1 cos we moved
- " the lines down when we added the left delim
- call cursor(a:bottomline+1, 1)
- execute 'normal! o'
- let theLine = repeat(' ', leftAlignIndx) . repeat(' ', strlen(left)-strlen(sexyComMarker)) . right
-
- " Make sure tabs are respected
- if !&expandtab
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
- call setline(a:bottomline+2, theLine)
-
- endif
-
- " go thru each line adding the sexyComMarker marker to the start of each
- " line in the appropriate place to align them with the comment delims
- let currentLine = a:topline+1
- while currentLine <= a:bottomline + !g:NERDCompactSexyComs
- " get the line and convert the tabs to spaces
- let theLine = getline(currentLine)
- let lineHasTabs = s:HasLeadingTabs(theLine)
- if lineHasTabs
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- endif
-
- let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine)
-
- " add the sexyComMarker
- let theLine = repeat(' ', leftAlignIndx) . repeat(' ', strlen(left)-strlen(sexyComMarker)) . sexyComMarkerSpaced . strpart(theLine, leftAlignIndx)
-
- if lineHasTabs
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
-
-
- " set the line and move onto the next one
- call setline(currentLine, theLine)
- let currentLine = currentLine + 1
- endwhile
-
-endfunction
-
-" Function: s:CommentLinesToggle(forceNested, firstLine, lastLine) {{{2
-" Applies "toggle" commenting to the given range of lines
-"
-" Args:
-" -forceNested: a flag indicating whether the called is requesting the comment
-" to be nested if need be
-" -firstLine/lastLine: the top and bottom lines to comment
-function s:CommentLinesToggle(forceNested, firstLine, lastLine)
- let currentLine = a:firstLine
- while currentLine <= a:lastLine
-
- " get the next line, check commentability and convert spaces to tabs
- let theLine = getline(currentLine)
- let lineHasLeadingTabs = s:HasLeadingTabs(theLine)
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- if s:CanToggleCommentLine(a:forceNested, currentLine)
-
- "if the user has specified forceNesting then we check to see if we
- "need to switch delimiters for place-holders
- if g:NERDUsePlaceHolders
- let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine)
- endif
-
- let theLine = s:AddLeftDelim(s:Left({'space': 1}), theLine)
- let theLine = s:AddRightDelim(s:Right({'space': 1}), theLine)
- endif
-
- " restore leading tabs if appropriate
- if lineHasLeadingTabs
- let theLine = s:ConvertLeadingSpacesToTabs(theLine)
- endif
-
- " we are done with this line
- call setline(currentLine, theLine)
- let currentLine = currentLine + 1
- endwhile
-
-endfunction
-
-" Function: s:CommentRegion(topline, topCol, bottomLine, bottomCol) function {{{2
-" This function comments chunks of text selected in visual mode.
-" It will comment exactly the text that they have selected.
-" Args:
-" -topLine: the line num of the top line in the sexy comment
-" -topCol: top left col for this comment
-" -bottomline: the line num of the bottom line in the sexy comment
-" -bottomCol: the bottom right col for this comment
-" -forceNested: whether the caller wants comments to be nested if the
-" line(s) are already commented
-function s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested)
-
- "switch delims (if we can) if the current set isnt multipart
- let switchedDelims = 0
- if !s:Multipart() && s:AltMultipart() && !g:NERDAllowAnyVisualDelims
- let switchedDelims = 1
- call s:SwitchToAlternativeDelimiters(0)
- endif
-
- "if there is only one line in the comment then just do it
- if a:topLine == a:bottomLine
- call s:CommentBlock(a:topLine, a:bottomLine, a:topCol, a:bottomCol, a:forceNested)
-
- "there are multiple lines in the comment
- else
- "comment the top line
- call s:CommentBlock(a:topLine, a:topLine, a:topCol, strlen(getline(a:topLine)), a:forceNested)
-
- "comment out all the lines in the middle of the comment
- let topOfRange = a:topLine+1
- let bottomOfRange = a:bottomLine-1
- if topOfRange <= bottomOfRange
- call s:CommentLines(a:forceNested, "none", topOfRange, bottomOfRange)
- endif
-
- "comment the bottom line
- let bottom = getline(a:bottomLine)
- let numLeadingSpacesTabs = strlen(substitute(bottom, '^\([ \t]*\).*$', '\1', ''))
- call s:CommentBlock(a:bottomLine, a:bottomLine, numLeadingSpacesTabs+1, a:bottomCol, a:forceNested)
-
- endif
-
- "stick the cursor back on the char it was on before the comment
- call cursor(a:topLine, a:topCol + strlen(s:Left()) + g:NERDSpaceDelims)
-
- "if we switched delims then we gotta go back to what they were before
- if switchedDelims == 1
- call s:SwitchToAlternativeDelimiters(0)
- endif
-
-endfunction
-
-" Function: s:InvertComment(firstLine, lastLine) function {{{2
-" Inverts the comments on the lines between and including the given line
-" numbers i.e all commented lines are uncommented and vice versa
-" Args:
-" -firstLine: the top of the range of lines to be inverted
-" -lastLine: the bottom of the range of lines to be inverted
-function s:InvertComment(firstLine, lastLine)
-
- " go thru all lines in the given range
- let currentLine = a:firstLine
- while currentLine <= a:lastLine
- let theLine = getline(currentLine)
-
- let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine)
-
- " if the line is commented normally, uncomment it
- if s:IsCommentedFromStartOfLine(s:Left(), theLine) || s:IsCommentedFromStartOfLine(s:Left({'alt': 1}), theLine)
- call s:UncommentLines(currentLine, currentLine)
- let currentLine = currentLine + 1
-
- " check if the line is commented sexually
- elseif !empty(sexyComBounds)
- let numLinesBeforeSexyComRemoved = s:NumLinesInBuf()
- call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1])
-
- "move to the line after last line of the sexy comment
- let numLinesAfterSexyComRemoved = s:NumLinesInBuf()
- let currentLine = sexyComBounds[1] - (numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved) + 1
-
- " the line isnt commented
- else
- call s:CommentLinesToggle(1, currentLine, currentLine)
- let currentLine = currentLine + 1
- endif
-
- endwhile
-endfunction
-
-" Function: NERDComment(isVisual, type) function {{{2
-" This function is a Wrapper for the main commenting functions
-"
-" Args:
-" -isVisual: a flag indicating whether the comment is requested in visual
-" mode or not
-" -type: the type of commenting requested. Can be 'sexy', 'invert',
-" 'minimal', 'toggle', 'alignLeft', 'alignBoth', 'norm',
-" 'nested', 'toEOL', 'append', 'insert', 'uncomment', 'yank'
-function! NERDComment(isVisual, type) range
- " we want case sensitivity when commenting
- let oldIgnoreCase = &ignorecase
- set noignorecase
-
- if !exists("g:did_load_ftplugin") || g:did_load_ftplugin != 1
- call s:NerdEcho("filetype plugins should be enabled. See :help NERDComInstallation and :help :filetype-plugin-on", 0)
- endif
-
- if a:isVisual
- let firstLine = line("'<")
- let lastLine = line("'>")
- let firstCol = col("'<")
- let lastCol = col("'>") - (&selection == 'exclusive' ? 1 : 0)
- else
- let firstLine = a:firstline
- let lastLine = a:lastline
- endif
-
- let countWasGiven = (a:isVisual == 0 && firstLine != lastLine)
-
- let forceNested = (a:type == 'nested' || g:NERDDefaultNesting)
-
- if a:type == 'norm' || a:type == 'nested'
- if a:isVisual && visualmode() == "\16"
- call s:CommentBlock(firstLine, lastLine, firstCol, lastCol, forceNested)
- elseif a:isVisual && visualmode() == "v" && (g:NERDCommentWholeLinesInVMode==0 || (g:NERDCommentWholeLinesInVMode==2 && s:HasMultipartDelims()))
- call s:CommentRegion(firstLine, firstCol, lastLine, lastCol, forceNested)
- else
- call s:CommentLines(forceNested, "none", firstLine, lastLine)
- endif
-
- elseif a:type == 'alignLeft' || a:type == 'alignBoth'
- let align = "none"
- if a:type == "alignLeft"
- let align = "left"
- elseif a:type == "alignBoth"
- let align = "both"
- endif
- call s:CommentLines(forceNested, align, firstLine, lastLine)
-
- elseif a:type == 'invert'
- call s:InvertComment(firstLine, lastLine)
-
- elseif a:type == 'sexy'
- try
- call s:CommentLinesSexy(firstLine, lastLine)
- catch /NERDCommenter.Delimiters/
- call s:CommentLines(forceNested, "none", firstLine, lastLine)
- catch /NERDCommenter.Nesting/
- call s:NerdEcho("Sexy comment aborted. Nested sexy cannot be nested", 0)
- endtry
-
- elseif a:type == 'toggle'
- let theLine = getline(firstLine)
-
- if s:IsInSexyComment(firstLine) || s:IsCommentedFromStartOfLine(s:Left(), theLine) || s:IsCommentedFromStartOfLine(s:Left({'alt': 1}), theLine)
- call s:UncommentLines(firstLine, lastLine)
- else
- call s:CommentLinesToggle(forceNested, firstLine, lastLine)
- endif
-
- elseif a:type == 'minimal'
- try
- call s:CommentLinesMinimal(firstLine, lastLine)
- catch /NERDCommenter.Delimiters/
- call s:NerdEcho("Minimal comments can only be used for filetypes that have multipart delimiters.", 0)
- catch /NERDCommenter.Settings/
- call s:NerdEcho("Place holders are required but disabled.", 0)
- endtry
-
- elseif a:type == 'toEOL'
- call s:SaveScreenState()
- call s:CommentBlock(firstLine, firstLine, col("."), col("$")-1, 1)
- call s:RestoreScreenState()
-
- elseif a:type == 'append'
- call s:AppendCommentToLine()
-
- elseif a:type == 'insert'
- call s:PlaceDelimitersAndInsBetween()
-
- elseif a:type == 'uncomment'
- call s:UncommentLines(firstLine, lastLine)
-
- elseif a:type == 'yank'
- if a:isVisual
- normal! gvy
- elseif countWasGiven
- execute firstLine .','. lastLine .'yank'
- else
- normal! yy
- endif
- execute firstLine .','. lastLine .'call NERDComment('. a:isVisual .', "norm")'
- endif
-
- let &ignorecase = oldIgnoreCase
-endfunction
-
-" Function: s:PlaceDelimitersAndInsBetween() function {{{2
-" This is function is called to place comment delimiters down and place the
-" cursor between them
-function s:PlaceDelimitersAndInsBetween()
- " get the left and right delimiters without any escape chars in them
- let left = s:Left({'space': 1})
- let right = s:Right({'space': 1})
-
- let theLine = getline(".")
- let lineHasLeadTabs = s:HasLeadingTabs(theLine) || (theLine =~ '^ *$' && !&expandtab)
-
- "convert tabs to spaces and adjust the cursors column to take this into
- "account
- let untabbedCol = s:UntabbedCol(theLine, col("."))
- call setline(line("."), s:ConvertLeadingTabsToSpaces(theLine))
- call cursor(line("."), untabbedCol)
-
- " get the len of the right delim
- let lenRight = strlen(right)
-
- let isDelimOnEOL = col(".") >= strlen(getline("."))
-
- " if the cursor is in the first col then we gotta insert rather than
- " append the comment delimiters here
- let insOrApp = (col(".")==1 ? 'i' : 'a')
-
- " place the delimiters down. We do it differently depending on whether
- " there is a left AND right delimiter
- if lenRight > 0
- execute ":normal! " . insOrApp . left . right
- execute ":normal! " . lenRight . "h"
- else
- execute ":normal! " . insOrApp . left
-
- " if we are tacking the delim on the EOL then we gotta add a space
- " after it cos when we go out of insert mode the cursor will move back
- " one and the user wont be in position to type the comment.
- if isDelimOnEOL
- execute 'normal! a '
- endif
- endif
- normal! l
-
- "if needed convert spaces back to tabs and adjust the cursors col
- "accordingly
- if lineHasLeadTabs
- let tabbedCol = s:TabbedCol(getline("."), col("."))
- call setline(line("."), s:ConvertLeadingSpacesToTabs(getline(".")))
- call cursor(line("."), tabbedCol)
- endif
-
- startinsert
-endfunction
-
-" Function: s:RemoveDelimiters(left, right, line) {{{2
-" this function is called to remove the first left comment delimiter and the
-" last right delimiter of the given line.
-"
-" The args left and right must be strings. If there is no right delimiter (as
-" is the case for e.g vim file comments) them the arg right should be ""
-"
-" Args:
-" -left: the left comment delimiter
-" -right: the right comment delimiter
-" -line: the line to remove the delimiters from
-function s:RemoveDelimiters(left, right, line)
-
- let l:left = a:left
- let l:right = a:right
- let lenLeft = strlen(left)
- let lenRight = strlen(right)
-
- let delimsSpaced = (g:NERDSpaceDelims || g:NERDRemoveExtraSpaces)
-
- let line = a:line
-
- "look for the left delimiter, if we find it, remove it.
- let leftIndx = s:FindDelimiterIndex(a:left, line)
- if leftIndx != -1
- let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+lenLeft)
-
- "if the user has specified that there is a space after the left delim
- "then check for the space and remove it if it is there
- if delimsSpaced && strpart(line, leftIndx, s:lenSpaceStr) == s:spaceStr
- let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+s:lenSpaceStr)
- endif
- endif
-
- "look for the right delimiter, if we find it, remove it
- let rightIndx = s:FindDelimiterIndex(a:right, line)
- if rightIndx != -1
- let line = strpart(line, 0, rightIndx) . strpart(line, rightIndx+lenRight)
-
- "if the user has specified that there is a space before the right delim
- "then check for the space and remove it if it is there
- if delimsSpaced && strpart(line, rightIndx-s:lenSpaceStr, s:lenSpaceStr) == s:spaceStr && s:Multipart()
- let line = strpart(line, 0, rightIndx-s:lenSpaceStr) . strpart(line, rightIndx)
- endif
- endif
-
- return line
-endfunction
-
-" Function: s:UncommentLines(topLine, bottomLine) {{{2
-" This function uncomments the given lines
-"
-" Args:
-" topLine: the top line of the visual selection to uncomment
-" bottomLine: the bottom line of the visual selection to uncomment
-function s:UncommentLines(topLine, bottomLine)
- "make local copies of a:firstline and a:lastline and, if need be, swap
- "them around if the top line is below the bottom
- let l:firstline = a:topLine
- let l:lastline = a:bottomLine
- if firstline > lastline
- let firstline = lastline
- let lastline = a:topLine
- endif
-
- "go thru each line uncommenting each line removing sexy comments
- let currentLine = firstline
- while currentLine <= lastline
-
- "check the current line to see if it is part of a sexy comment
- let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine)
- if !empty(sexyComBounds)
-
- "we need to store the num lines in the buf before the comment is
- "removed so we know how many lines were removed when the sexy com
- "was removed
- let numLinesBeforeSexyComRemoved = s:NumLinesInBuf()
-
- call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1])
-
- "move to the line after last line of the sexy comment
- let numLinesAfterSexyComRemoved = s:NumLinesInBuf()
- let numLinesRemoved = numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved
- let currentLine = sexyComBounds[1] - numLinesRemoved + 1
- let lastline = lastline - numLinesRemoved
-
- "no sexy com was detected so uncomment the line as normal
- else
- call s:UncommentLinesNormal(currentLine, currentLine)
- let currentLine = currentLine + 1
- endif
- endwhile
-
-endfunction
-
-" Function: s:UncommentLinesSexy(topline, bottomline) {{{2
-" This function removes all the comment characters associated with the sexy
-" comment spanning the given lines
-" Args:
-" -topline/bottomline: the top/bottom lines of the sexy comment
-function s:UncommentLinesSexy(topline, bottomline)
- let left = s:GetSexyComLeft(0,1)
- let right = s:GetSexyComRight(0,1)
-
-
- "check if it is even possible for sexy comments to exist with the
- "available delimiters
- if left == -1 || right == -1
- throw 'NERDCommenter.Delimiters exception: cannot uncomment sexy comments with available delimiters.'
- endif
-
- let leftUnEsc = s:GetSexyComLeft(0,0)
- let rightUnEsc = s:GetSexyComRight(0,0)
-
- let sexyComMarker = s:GetSexyComMarker(0, 1)
- let sexyComMarkerUnEsc = s:GetSexyComMarker(0, 0)
-
- "the markerOffset is how far right we need to move the sexyComMarker to
- "line it up with the end of the left delim
- let markerOffset = strlen(leftUnEsc)-strlen(sexyComMarkerUnEsc)
-
- " go thru the intermediate lines of the sexy comment and remove the
- " sexy comment markers (eg the '*'s on the start of line in a c sexy
- " comment)
- let currentLine = a:topline+1
- while currentLine < a:bottomline
- let theLine = getline(currentLine)
-
- " remove the sexy comment marker from the line. We also remove the
- " space after it if there is one and if appropriate options are set
- let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc)
- if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims
- let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr)
- else
- let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc))
- endif
-
- let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine)
-
- let theLine = s:ConvertLeadingWhiteSpace(theLine)
-
- " move onto the next line
- call setline(currentLine, theLine)
- let currentLine = currentLine + 1
- endwhile
-
- " gotta make a copy of a:bottomline cos we modify the position of the
- " last line it if we remove the topline
- let bottomline = a:bottomline
-
- " get the first line so we can remove the left delim from it
- let theLine = getline(a:topline)
-
- " if the first line contains only the left delim then just delete it
- if theLine =~ '^[ \t]*' . left . '[ \t]*$' && !g:NERDCompactSexyComs
- call cursor(a:topline, 1)
- normal! dd
- let bottomline = bottomline - 1
-
- " topline contains more than just the left delim
- else
-
- " remove the delim. If there is a space after it
- " then remove this too if appropriate
- let delimIndx = stridx(theLine, leftUnEsc)
- if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims
- let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)+s:lenSpaceStr)
- else
- let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc))
- endif
- let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine)
- call setline(a:topline, theLine)
- endif
-
- " get the last line so we can remove the right delim
- let theLine = getline(bottomline)
-
- " if the bottomline contains only the right delim then just delete it
- if theLine =~ '^[ \t]*' . right . '[ \t]*$'
- call cursor(bottomline, 1)
- normal! dd
-
- " the last line contains more than the right delim
- else
- " remove the right delim. If there is a space after it and
- " if the appropriate options are set then remove this too.
- let delimIndx = s:LastIndexOfDelim(rightUnEsc, theLine)
- if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims
- let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)+s:lenSpaceStr)
- else
- let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc))
- endif
-
- " if the last line also starts with a sexy comment marker then we
- " remove this as well
- if theLine =~ '^[ \t]*' . sexyComMarker
-
- " remove the sexyComMarker. If there is a space after it then
- " remove that too
- let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc)
- if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims
- let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr)
- else
- let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc))
- endif
- endif
-
- let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine)
- call setline(bottomline, theLine)
- endif
-endfunction
-
-" Function: s:UncommentLineNormal(line) {{{2
-" uncomments the given line and returns the result
-" Args:
-" -line: the line to uncomment
-function s:UncommentLineNormal(line)
- let line = a:line
-
- "get the comment status on the line so we know how it is commented
- let lineCommentStatus = s:IsCommentedOuttermost(s:Left(), s:Right(), s:Left({'alt': 1}), s:Right({'alt': 1}), line)
-
- "it is commented with s:Left() and s:Right() so remove these delims
- if lineCommentStatus == 1
- let line = s:RemoveDelimiters(s:Left(), s:Right(), line)
-
- "it is commented with s:Left({'alt': 1}) and s:Right({'alt': 1}) so remove these delims
- elseif lineCommentStatus == 2 && g:NERDRemoveAltComs
- let line = s:RemoveDelimiters(s:Left({'alt': 1}), s:Right({'alt': 1}), line)
-
- "it is not properly commented with any delims so we check if it has
- "any random left or right delims on it and remove the outtermost ones
- else
- "get the positions of all delim types on the line
- let indxLeft = s:FindDelimiterIndex(s:Left(), line)
- let indxLeftAlt = s:FindDelimiterIndex(s:Left({'alt': 1}), line)
- let indxRight = s:FindDelimiterIndex(s:Right(), line)
- let indxRightAlt = s:FindDelimiterIndex(s:Right({'alt': 1}), line)
-
- "remove the outter most left comment delim
- if indxLeft != -1 && (indxLeft < indxLeftAlt || indxLeftAlt == -1)
- let line = s:RemoveDelimiters(s:Left(), '', line)
- elseif indxLeftAlt != -1
- let line = s:RemoveDelimiters(s:Left({'alt': 1}), '', line)
- endif
-
- "remove the outter most right comment delim
- if indxRight != -1 && (indxRight < indxRightAlt || indxRightAlt == -1)
- let line = s:RemoveDelimiters('', s:Right(), line)
- elseif indxRightAlt != -1
- let line = s:RemoveDelimiters('', s:Right({'alt': 1}), line)
- endif
- endif
-
-
- let indxLeft = s:FindDelimiterIndex(s:Left(), line)
- let indxLeftAlt = s:FindDelimiterIndex(s:Left({'alt': 1}), line)
- let indxLeftPlace = s:FindDelimiterIndex(g:NERDLPlace, line)
-
- let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line)
- let indxRightAlt = s:FindDelimiterIndex(s:Right({'alt': 1}), line)
- let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line)
-
- let right = s:Right()
- let left = s:Left()
- if !s:Multipart()
- let right = s:Right({'alt': 1})
- let left = s:Left({'alt': 1})
- endif
-
-
- "if there are place-holders on the line then we check to see if they are
- "the outtermost delimiters on the line. If so then we replace them with
- "real delimiters
- if indxLeftPlace != -1
- if (indxLeftPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1)
- let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line)
- endif
- elseif indxRightPlace != -1
- if (indxRightPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1)
- let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line)
- endif
-
- endif
-
- let line = s:ConvertLeadingWhiteSpace(line)
-
- return line
-endfunction
-
-" Function: s:UncommentLinesNormal(topline, bottomline) {{{2
-" This function is called to uncomment lines that arent a sexy comment
-" Args:
-" -topline/bottomline: the top/bottom line numbers of the comment
-function s:UncommentLinesNormal(topline, bottomline)
- let currentLine = a:topline
- while currentLine <= a:bottomline
- let line = getline(currentLine)
- call setline(currentLine, s:UncommentLineNormal(line))
- let currentLine = currentLine + 1
- endwhile
-endfunction
-
-
-" Section: Other helper functions {{{1
-" ============================================================================
-
-" Function: s:AddLeftDelim(delim, theLine) {{{2
-" Args:
-function s:AddLeftDelim(delim, theLine)
- return substitute(a:theLine, '^\([ \t]*\)', '\1' . a:delim, '')
-endfunction
-
-" Function: s:AddLeftDelimAligned(delim, theLine) {{{2
-" Args:
-function s:AddLeftDelimAligned(delim, theLine, alignIndx)
-
- "if the line is not long enough then bung some extra spaces on the front
- "so we can align the delim properly
- let theLine = a:theLine
- if strlen(theLine) < a:alignIndx
- let theLine = repeat(' ', a:alignIndx - strlen(theLine))
- endif
-
- return strpart(theLine, 0, a:alignIndx) . a:delim . strpart(theLine, a:alignIndx)
-endfunction
-
-" Function: s:AddRightDelim(delim, theLine) {{{2
-" Args:
-function s:AddRightDelim(delim, theLine)
- if a:delim == ''
- return a:theLine
- else
- return substitute(a:theLine, '$', a:delim, '')
- endif
-endfunction
-
-" Function: s:AddRightDelimAligned(delim, theLine, alignIndx) {{{2
-" Args:
-function s:AddRightDelimAligned(delim, theLine, alignIndx)
- if a:delim == ""
- return a:theLine
- else
-
- " when we align the right delim we are just adding spaces
- " so we get a string containing the needed spaces (it
- " could be empty)
- let extraSpaces = ''
- let extraSpaces = repeat(' ', a:alignIndx-strlen(a:theLine))
-
- " add the right delim
- return substitute(a:theLine, '$', extraSpaces . a:delim, '')
- endif
-endfunction
-
-" Function: s:AltMultipart() {{{2
-" returns 1 if the alternative delims are multipart
-function s:AltMultipart()
- return b:NERDCommenterDelims['rightAlt'] != ''
-endfunction
-
-" Function: s:CanCommentLine(forceNested, line) {{{2
-"This function is used to determine whether the given line can be commented.
-"It returns 1 if it can be and 0 otherwise
-"
-" Args:
-" -forceNested: a flag indicating whether the caller wants comments to be nested
-" if the current line is already commented
-" -lineNum: the line num of the line to check for commentability
-function s:CanCommentLine(forceNested, lineNum)
- let theLine = getline(a:lineNum)
-
- " make sure we don't comment lines that are just spaces or tabs or empty.
- if theLine =~ "^[ \t]*$"
- return 0
- endif
-
- "if the line is part of a sexy comment then just flag it...
- if s:IsInSexyComment(a:lineNum)
- return 0
- endif
-
- let isCommented = s:IsCommentedNormOrSexy(a:lineNum)
-
- "if the line isnt commented return true
- if !isCommented
- return 1
- endif
-
- "if the line is commented but nesting is allowed then return true
- if a:forceNested && (!s:Multipart() || g:NERDUsePlaceHolders)
- return 1
- endif
-
- return 0
-endfunction
-
-" Function: s:CanPlaceCursor(line, col) {{{2
-" returns 1 if the cursor can be placed exactly in the given position
-function s:CanPlaceCursor(line, col)
- let c = col(".")
- let l = line(".")
- call cursor(a:line, a:col)
- let success = (line(".") == a:line && col(".") == a:col)
- call cursor(l,c)
- return success
-endfunction
-
-" Function: s:CanSexyCommentLines(topline, bottomline) {{{2
-" Return: 1 if the given lines can be commented sexually, 0 otherwise
-function s:CanSexyCommentLines(topline, bottomline)
- " see if the selected regions have any sexy comments
- let currentLine = a:topline
- while(currentLine <= a:bottomline)
- if s:IsInSexyComment(currentLine)
- return 0
- endif
- let currentLine = currentLine + 1
- endwhile
- return 1
-endfunction
-" Function: s:CanToggleCommentLine(forceNested, line) {{{2
-"This function is used to determine whether the given line can be toggle commented.
-"It returns 1 if it can be and 0 otherwise
-"
-" Args:
-" -lineNum: the line num of the line to check for commentability
-function s:CanToggleCommentLine(forceNested, lineNum)
- let theLine = getline(a:lineNum)
- if (s:IsCommentedFromStartOfLine(s:Left(), theLine) || s:IsCommentedFromStartOfLine(s:Left({'alt': 1}), theLine)) && !a:forceNested
- return 0
- endif
-
- " make sure we don't comment lines that are just spaces or tabs or empty.
- if theLine =~ "^[ \t]*$"
- return 0
- endif
-
- "if the line is part of a sexy comment then just flag it...
- if s:IsInSexyComment(a:lineNum)
- return 0
- endif
-
- return 1
-endfunction
-
-" Function: s:ConvertLeadingSpacesToTabs(line) {{{2
-" This function takes a line and converts all leading tabs on that line into
-" spaces
-"
-" Args:
-" -line: the line whose leading tabs will be converted
-function s:ConvertLeadingSpacesToTabs(line)
- let toReturn = a:line
- while toReturn =~ '^\t*' . s:TabSpace() . '\(.*\)$'
- let toReturn = substitute(toReturn, '^\(\t*\)' . s:TabSpace() . '\(.*\)$' , '\1\t\2' , "")
- endwhile
-
- return toReturn
-endfunction
-
-
-" Function: s:ConvertLeadingTabsToSpaces(line) {{{2
-" This function takes a line and converts all leading spaces on that line into
-" tabs
-"
-" Args:
-" -line: the line whose leading spaces will be converted
-function s:ConvertLeadingTabsToSpaces(line)
- let toReturn = a:line
- while toReturn =~ '^\( *\)\t'
- let toReturn = substitute(toReturn, '^\( *\)\t', '\1' . s:TabSpace() , "")
- endwhile
-
- return toReturn
-endfunction
-
-" Function: s:ConvertLeadingWhiteSpace(line) {{{2
-" Converts the leading white space to tabs/spaces depending on &ts
-"
-" Args:
-" -line: the line to convert
-function s:ConvertLeadingWhiteSpace(line)
- let toReturn = a:line
- while toReturn =~ '^ *\t'
- let toReturn = substitute(toReturn, '^ *\zs\t\ze', s:TabSpace(), "g")
- endwhile
-
- if !&expandtab
- let toReturn = s:ConvertLeadingSpacesToTabs(toReturn)
- endif
-
- return toReturn
-endfunction
-
-
-" Function: s:CountNonESCedOccurances(str, searchstr, escChar) {{{2
-" This function counts the number of substrings contained in another string.
-" These substrings are only counted if they are not escaped with escChar
-" Args:
-" -str: the string to look for searchstr in
-" -searchstr: the substring to search for in str
-" -escChar: the escape character which, when preceding an instance of
-" searchstr, will cause it not to be counted
-function s:CountNonESCedOccurances(str, searchstr, escChar)
- "get the index of the first occurrence of searchstr
- let indx = stridx(a:str, a:searchstr)
-
- "if there is an instance of searchstr in str process it
- if indx != -1
- "get the remainder of str after this instance of searchstr is removed
- let lensearchstr = strlen(a:searchstr)
- let strLeft = strpart(a:str, indx+lensearchstr)
-
- "if this instance of searchstr is not escaped, add one to the count
- "and recurse. If it is escaped, just recurse
- if !s:IsEscaped(a:str, indx, a:escChar)
- return 1 + s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar)
- else
- return s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar)
- endif
- endif
-endfunction
-" Function: s:DoesBlockHaveDelim(delim, top, bottom) {{{2
-" Returns 1 if the given block of lines has a delimiter (a:delim) in it
-" Args:
-" -delim: the comment delimiter to check the block for
-" -top: the top line number of the block
-" -bottom: the bottom line number of the block
-function s:DoesBlockHaveDelim(delim, top, bottom)
- let currentLine = a:top
- while currentLine < a:bottom
- let theline = getline(currentLine)
- if s:FindDelimiterIndex(a:delim, theline) != -1
- return 1
- endif
- let currentLine = currentLine + 1
- endwhile
- return 0
-endfunction
-
-" Function: s:DoesBlockHaveMultipartDelim(top, bottom) {{{2
-" Returns 1 if the given block has a >= 1 multipart delimiter in it
-" Args:
-" -top: the top line number of the block
-" -bottom: the bottom line number of the block
-function s:DoesBlockHaveMultipartDelim(top, bottom)
- if s:HasMultipartDelims()
- if s:Multipart()
- return s:DoesBlockHaveDelim(s:Left(), a:top, a:bottom) || s:DoesBlockHaveDelim(s:Right(), a:top, a:bottom)
- else
- return s:DoesBlockHaveDelim(s:Left({'alt': 1}), a:top, a:bottom) || s:DoesBlockHaveDelim(s:Right({'alt': 1}), a:top, a:bottom)
- endif
- endif
- return 0
-endfunction
-
-
-" Function: s:Esc(str) {{{2
-" Escapes all the tricky chars in the given string
-function s:Esc(str)
- let charsToEsc = '*/\."&$+'
- return escape(a:str, charsToEsc)
-endfunction
-
-" Function: s:FindDelimiterIndex(delimiter, line) {{{2
-" This function is used to get the string index of the input comment delimiter
-" on the input line. If no valid comment delimiter is found in the line then
-" -1 is returned
-" Args:
-" -delimiter: the delimiter we are looking to find the index of
-" -line: the line we are looking for delimiter on
-function s:FindDelimiterIndex(delimiter, line)
-
- "make sure the delimiter isnt empty otherwise we go into an infinite loop.
- if a:delimiter == ""
- return -1
- endif
-
-
- let l:delimiter = a:delimiter
- let lenDel = strlen(l:delimiter)
-
- "get the index of the first occurrence of the delimiter
- let delIndx = stridx(a:line, l:delimiter)
-
- "keep looping thru the line till we either find a real comment delimiter
- "or run off the EOL
- while delIndx != -1
-
- "if we are not off the EOL get the str before the possible delimiter
- "in question and check if it really is a delimiter. If it is, return
- "its position
- if delIndx != -1
- if s:IsDelimValid(l:delimiter, delIndx, a:line)
- return delIndx
- endif
- endif
-
- "we have not yet found a real comment delimiter so move past the
- "current one we are lookin at
- let restOfLine = strpart(a:line, delIndx + lenDel)
- let distToNextDelim = stridx(restOfLine , l:delimiter)
-
- "if distToNextDelim is -1 then there is no more potential delimiters
- "on the line so set delIndx to -1. Otherwise, move along the line by
- "distToNextDelim
- if distToNextDelim == -1
- let delIndx = -1
- else
- let delIndx = delIndx + lenDel + distToNextDelim
- endif
- endwhile
-
- "there is no comment delimiter on this line
- return -1
-endfunction
-
-" Function: s:FindBoundingLinesOfSexyCom(lineNum) {{{2
-" This function takes in a line number and tests whether this line number is
-" the top/bottom/middle line of a sexy comment. If it is then the top/bottom
-" lines of the sexy comment are returned
-" Args:
-" -lineNum: the line number that is to be tested whether it is the
-" top/bottom/middle line of a sexy com
-" Returns:
-" A string that has the top/bottom lines of the sexy comment encoded in it.
-" The format is 'topline,bottomline'. If a:lineNum turns out not to be the
-" top/bottom/middle of a sexy comment then -1 is returned
-function s:FindBoundingLinesOfSexyCom(lineNum)
-
- "find which delimiters to look for as the start/end delims of the comment
- let left = ''
- let right = ''
- if s:Multipart()
- let left = s:Left({'esc': 1})
- let right = s:Right({'esc': 1})
- elseif s:AltMultipart()
- let left = s:Left({'alt': 1, 'esc': 1})
- let right = s:Right({'alt': 1, 'esc': 1})
- else
- return []
- endif
-
- let sexyComMarker = s:GetSexyComMarker(0, 1)
-
- "initialise the top/bottom line numbers of the sexy comment to -1
- let top = -1
- let bottom = -1
-
- let currentLine = a:lineNum
- while top == -1 || bottom == -1
- let theLine = getline(currentLine)
-
- "check if the current line is the top of the sexy comment
- if currentLine <= a:lineNum && theLine =~ '^[ \t]*' . left && theLine !~ '.*' . right && currentLine < s:NumLinesInBuf()
- let top = currentLine
- let currentLine = a:lineNum
-
- "check if the current line is the bottom of the sexy comment
- elseif theLine =~ '^[ \t]*' . right && theLine !~ '.*' . left && currentLine > 1
- let bottom = currentLine
-
- "the right delimiter is on the same line as the last sexyComMarker
- elseif theLine =~ '^[ \t]*' . sexyComMarker . '.*' . right
- let bottom = currentLine
-
- "we have not found the top or bottom line so we assume currentLine is an
- "intermediate line and look to prove otherwise
- else
-
- "if the line doesnt start with a sexyComMarker then it is not a sexy
- "comment
- if theLine !~ '^[ \t]*' . sexyComMarker
- return []
- endif
-
- endif
-
- "if top is -1 then we havent found the top yet so keep looking up
- if top == -1
- let currentLine = currentLine - 1
- "if we have found the top line then go down looking for the bottom
- else
- let currentLine = currentLine + 1
- endif
-
- endwhile
-
- return [top, bottom]
-endfunction
-
-
-" Function: s:GetSexyComMarker() {{{2
-" Returns the sexy comment marker for the current filetype.
-"
-" C style sexy comments are assumed if possible. If not then the sexy comment
-" marker is the last char of the delimiter pair that has both left and right
-" delims and has the longest left delim
-"
-" Args:
-" -space: specifies whether the marker is to have a space string after it
-" (the space string will only be added if NERDSpaceDelims is set)
-" -esc: specifies whether the tricky chars in the marker are to be ESCed
-function s:GetSexyComMarker(space, esc)
- let sexyComMarker = b:NERDSexyComMarker
-
- "if there is no hardcoded marker then we find one
- if sexyComMarker == ''
-
- "if the filetype has c style comments then use standard c sexy
- "comments
- if s:HasCStyleComments()
- let sexyComMarker = '*'
- else
- "find a comment marker by getting the longest available left delim
- "(that has a corresponding right delim) and taking the last char
- let lenLeft = strlen(s:Left())
- let lenLeftAlt = strlen(s:Left({'alt': 1}))
- let left = ''
- let right = ''
- if s:Multipart() && lenLeft >= lenLeftAlt
- let left = s:Left()
- elseif s:AltMultipart()
- let left = s:Left({'alt': 1})
- else
- return -1
- endif
-
- "get the last char of left
- let sexyComMarker = strpart(left, strlen(left)-1)
- endif
- endif
-
- if a:space && g:NERDSpaceDelims
- let sexyComMarker = sexyComMarker . s:spaceStr
- endif
-
- if a:esc
- let sexyComMarker = s:Esc(sexyComMarker)
- endif
-
- return sexyComMarker
-endfunction
-
-" Function: s:GetSexyComLeft(space, esc) {{{2
-" Returns the left delimiter for sexy comments for this filetype or -1 if
-" there is none. C style sexy comments are used if possible
-" Args:
-" -space: specifies if the delim has a space string on the end
-" (the space string will only be added if NERDSpaceDelims is set)
-" -esc: specifies whether the tricky chars in the string are ESCed
-function s:GetSexyComLeft(space, esc)
- let lenLeft = strlen(s:Left())
- let lenLeftAlt = strlen(s:Left({'alt': 1}))
- let left = ''
-
- "assume c style sexy comments if possible
- if s:HasCStyleComments()
- let left = '/*'
- else
- "grab the longest left delim that has a right
- if s:Multipart() && lenLeft >= lenLeftAlt
- let left = s:Left()
- elseif s:AltMultipart()
- let left = s:Left({'alt': 1})
- else
- return -1
- endif
- endif
-
- if a:space && g:NERDSpaceDelims
- let left = left . s:spaceStr
- endif
-
- if a:esc
- let left = s:Esc(left)
- endif
-
- return left
-endfunction
-
-" Function: s:GetSexyComRight(space, esc) {{{2
-" Returns the right delimiter for sexy comments for this filetype or -1 if
-" there is none. C style sexy comments are used if possible.
-" Args:
-" -space: specifies if the delim has a space string on the start
-" (the space string will only be added if NERDSpaceDelims
-" is specified for the current filetype)
-" -esc: specifies whether the tricky chars in the string are ESCed
-function s:GetSexyComRight(space, esc)
- let lenLeft = strlen(s:Left())
- let lenLeftAlt = strlen(s:Left({'alt': 1}))
- let right = ''
-
- "assume c style sexy comments if possible
- if s:HasCStyleComments()
- let right = '*/'
- else
- "grab the right delim that pairs with the longest left delim
- if s:Multipart() && lenLeft >= lenLeftAlt
- let right = s:Right()
- elseif s:AltMultipart()
- let right = s:Right({'alt': 1})
- else
- return -1
- endif
- endif
-
- if a:space && g:NERDSpaceDelims
- let right = s:spaceStr . right
- endif
-
- if a:esc
- let right = s:Esc(right)
- endif
-
- return right
-endfunction
-
-" Function: s:HasMultipartDelims() {{{2
-" Returns 1 iff the current filetype has at least one set of multipart delims
-function s:HasMultipartDelims()
- return s:Multipart() || s:AltMultipart()
-endfunction
-
-" Function: s:HasLeadingTabs(...) {{{2
-" Returns 1 if any of the given strings have leading tabs
-function s:HasLeadingTabs(...)
- for s in a:000
- if s =~ '^\t.*'
- return 1
- end
- endfor
- return 0
-endfunction
-" Function: s:HasCStyleComments() {{{2
-" Returns 1 iff the current filetype has c style comment delimiters
-function s:HasCStyleComments()
- return (s:Left() == '/*' && s:Right() == '*/') || (s:Left({'alt': 1}) == '/*' && s:Right({'alt': 1}) == '*/')
-endfunction
-
-" Function: s:IsCommentedNormOrSexy(lineNum) {{{2
-"This function is used to determine whether the given line is commented with
-"either set of delimiters or if it is part of a sexy comment
-"
-" Args:
-" -lineNum: the line number of the line to check
-function s:IsCommentedNormOrSexy(lineNum)
- let theLine = getline(a:lineNum)
-
- "if the line is commented normally return 1
- if s:IsCommented(s:Left(), s:Right(), theLine) || s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine)
- return 1
- endif
-
- "if the line is part of a sexy comment return 1
- if s:IsInSexyComment(a:lineNum)
- return 1
- endif
- return 0
-endfunction
-
-" Function: s:IsCommented(left, right, line) {{{2
-"This function is used to determine whether the given line is commented with
-"the given delimiters
-"
-" Args:
-" -line: the line that to check if commented
-" -left/right: the left and right delimiters to check for
-function s:IsCommented(left, right, line)
- "if the line isnt commented return true
- if s:FindDelimiterIndex(a:left, a:line) != -1 && (s:FindDelimiterIndex(a:right, a:line) != -1 || !s:Multipart())
- return 1
- endif
- return 0
-endfunction
-
-" Function: s:IsCommentedFromStartOfLine(left, line) {{{2
-"This function is used to determine whether the given line is commented with
-"the given delimiters at the start of the line i.e the left delimiter is the
-"first thing on the line (apart from spaces\tabs)
-"
-" Args:
-" -line: the line that to check if commented
-" -left: the left delimiter to check for
-function s:IsCommentedFromStartOfLine(left, line)
- let theLine = s:ConvertLeadingTabsToSpaces(a:line)
- let numSpaces = strlen(substitute(theLine, '^\( *\).*$', '\1', ''))
- let delimIndx = s:FindDelimiterIndex(a:left, theLine)
- return delimIndx == numSpaces
-endfunction
-
-" Function: s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) {{{2
-" Finds the type of the outtermost delims on the line
-"
-" Args:
-" -line: the line that to check if the outtermost comments on it are
-" left/right
-" -left/right: the left and right delimiters to check for
-" -leftAlt/rightAlt: the left and right alternative delimiters to check for
-"
-" Returns:
-" 0 if the line is not commented with either set of delims
-" 1 if the line is commented with the left/right delim set
-" 2 if the line is commented with the leftAlt/rightAlt delim set
-function s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line)
- "get the first positions of the left delims and the last positions of the
- "right delims
- let indxLeft = s:FindDelimiterIndex(a:left, a:line)
- let indxLeftAlt = s:FindDelimiterIndex(a:leftAlt, a:line)
- let indxRight = s:LastIndexOfDelim(a:right, a:line)
- let indxRightAlt = s:LastIndexOfDelim(a:rightAlt, a:line)
-
- "check if the line has a left delim before a leftAlt delim
- if (indxLeft <= indxLeftAlt || indxLeftAlt == -1) && indxLeft != -1
- "check if the line has a right delim after any rightAlt delim
- if (indxRight > indxRightAlt && indxRight > indxLeft) || !s:Multipart()
- return 1
- endif
-
- "check if the line has a leftAlt delim before a left delim
- elseif (indxLeftAlt <= indxLeft || indxLeft == -1) && indxLeftAlt != -1
- "check if the line has a rightAlt delim after any right delim
- if (indxRightAlt > indxRight && indxRightAlt > indxLeftAlt) || !s:AltMultipart()
- return 2
- endif
- else
- return 0
- endif
-
- return 0
-
-endfunction
-
-
-" Function: s:IsDelimValid(delimiter, delIndx, line) {{{2
-" This function is responsible for determining whether a given instance of a
-" comment delimiter is a real delimiter or not. For example, in java the
-" // string is a comment delimiter but in the line:
-" System.out.println("//");
-" it does not count as a comment delimiter. This function is responsible for
-" distinguishing between such cases. It does so by applying a set of
-" heuristics that are not fool proof but should work most of the time.
-"
-" Args:
-" -delimiter: the delimiter we are validating
-" -delIndx: the position of delimiter in line
-" -line: the line that delimiter occurs in
-"
-" Returns:
-" 0 if the given delimiter is not a real delimiter (as far as we can tell) ,
-" 1 otherwise
-function s:IsDelimValid(delimiter, delIndx, line)
- "get the delimiter without the escchars
- let l:delimiter = a:delimiter
-
- "get the strings before and after the delimiter
- let preComStr = strpart(a:line, 0, a:delIndx)
- let postComStr = strpart(a:line, a:delIndx+strlen(delimiter))
-
- "to check if the delimiter is real, make sure it isnt preceded by
- "an odd number of quotes and followed by the same (which would indicate
- "that it is part of a string and therefore is not a comment)
- if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, '"', "\\"))
- return 0
- endif
- if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "'", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "'", "\\"))
- return 0
- endif
- if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "`", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "`", "\\"))
- return 0
- endif
-
-
- "if the comment delimiter is escaped, assume it isnt a real delimiter
- if s:IsEscaped(a:line, a:delIndx, "\\")
- return 0
- endif
-
- "vim comments are so fuckin stupid!! Why the hell do they have comment
- "delimiters that are used elsewhere in the syntax?!?! We need to check
- "some conditions especially for vim
- if &filetype == "vim"
- if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\"))
- return 0
- endif
-
- "if the delimiter is on the very first char of the line or is the
- "first non-tab/space char on the line then it is a valid comment delimiter
- if a:delIndx == 0 || a:line =~ "^[ \t]\\{" . a:delIndx . "\\}\".*$"
- return 1
- endif
-
- let numLeftParen =s:CountNonESCedOccurances(preComStr, "(", "\\")
- let numRightParen =s:CountNonESCedOccurances(preComStr, ")", "\\")
-
- "if the quote is inside brackets then assume it isnt a comment
- if numLeftParen > numRightParen
- return 0
- endif
-
- "if the line has an even num of unescaped "'s then we can assume that
- "any given " is not a comment delimiter
- if s:IsNumEven(s:CountNonESCedOccurances(a:line, "\"", "\\"))
- return 0
- endif
- endif
-
- return 1
-
-endfunction
-
-" Function: s:IsNumEven(num) {{{2
-" A small function the returns 1 if the input number is even and 0 otherwise
-" Args:
-" -num: the number to check
-function s:IsNumEven(num)
- return (a:num % 2) == 0
-endfunction
-
-" Function: s:IsEscaped(str, indx, escChar) {{{2
-" This function takes a string, an index into that string and an esc char and
-" returns 1 if the char at the index is escaped (i.e if it is preceded by an
-" odd number of esc chars)
-" Args:
-" -str: the string to check
-" -indx: the index into str that we want to check
-" -escChar: the escape char the char at indx may be ESCed with
-function s:IsEscaped(str, indx, escChar)
- "initialise numEscChars to 0 and look at the char before indx
- let numEscChars = 0
- let curIndx = a:indx-1
-
- "keep going back thru str until we either reach the start of the str or
- "run out of esc chars
- while curIndx >= 0 && strpart(a:str, curIndx, 1) == a:escChar
-
- "we have found another esc char so add one to the count and move left
- "one char
- let numEscChars = numEscChars + 1
- let curIndx = curIndx - 1
-
- endwhile
-
- "if there is an odd num of esc chars directly before the char at indx then
- "the char at indx is escaped
- return !s:IsNumEven(numEscChars)
-endfunction
-
-" Function: s:IsInSexyComment(line) {{{2
-" returns 1 if the given line number is part of a sexy comment
-function s:IsInSexyComment(line)
- return !empty(s:FindBoundingLinesOfSexyCom(a:line))
-endfunction
-
-" Function: s:IsSexyComment(topline, bottomline) {{{2
-" This function takes in 2 line numbers and returns 1 if the lines between and
-" including the given line numbers are a sexy comment. It returns 0 otherwise.
-" Args:
-" -topline: the line that the possible sexy comment starts on
-" -bottomline: the line that the possible sexy comment stops on
-function s:IsSexyComment(topline, bottomline)
-
- "get the delim set that would be used for a sexy comment
- let left = ''
- let right = ''
- if s:Multipart()
- let left = s:Left()
- let right = s:Right()
- elseif s:AltMultipart()
- let left = s:Left({'alt': 1})
- let right = s:Right({'alt': 1})
- else
- return 0
- endif
-
- "swap the top and bottom line numbers around if need be
- let topline = a:topline
- let bottomline = a:bottomline
- if bottomline < topline
- topline = bottomline
- bottomline = a:topline
- endif
-
- "if there is < 2 lines in the comment it cannot be sexy
- if (bottomline - topline) <= 0
- return 0
- endif
-
- "if the top line doesnt begin with a left delim then the comment isnt sexy
- if getline(a:topline) !~ '^[ \t]*' . left
- return 0
- endif
-
- "if there is a right delim on the top line then this isnt a sexy comment
- if s:FindDelimiterIndex(right, getline(a:topline)) != -1
- return 0
- endif
-
- "if there is a left delim on the bottom line then this isnt a sexy comment
- if s:FindDelimiterIndex(left, getline(a:bottomline)) != -1
- return 0
- endif
-
- "if the bottom line doesnt begin with a right delim then the comment isnt
- "sexy
- if getline(a:bottomline) !~ '^.*' . right . '$'
- return 0
- endif
-
- let sexyComMarker = s:GetSexyComMarker(0, 1)
-
- "check each of the intermediate lines to make sure they start with a
- "sexyComMarker
- let currentLine = a:topline+1
- while currentLine < a:bottomline
- let theLine = getline(currentLine)
-
- if theLine !~ '^[ \t]*' . sexyComMarker
- return 0
- endif
-
- "if there is a right delim in an intermediate line then the block isnt
- "a sexy comment
- if s:FindDelimiterIndex(right, theLine) != -1
- return 0
- endif
-
- let currentLine = currentLine + 1
- endwhile
-
- "we have not found anything to suggest that this isnt a sexy comment so
- return 1
-
-endfunction
-
-" Function: s:LastIndexOfDelim(delim, str) {{{2
-" This function takes a string and a delimiter and returns the last index of
-" that delimiter in string
-" Args:
-" -delim: the delimiter to look for
-" -str: the string to look for delim in
-function s:LastIndexOfDelim(delim, str)
- let delim = a:delim
- let lenDelim = strlen(delim)
-
- "set index to the first occurrence of delim. If there is no occurrence then
- "bail
- let indx = s:FindDelimiterIndex(delim, a:str)
- if indx == -1
- return -1
- endif
-
- "keep moving to the next instance of delim in str till there is none left
- while 1
-
- "search for the next delim after the previous one
- let searchStr = strpart(a:str, indx+lenDelim)
- let indx2 = s:FindDelimiterIndex(delim, searchStr)
-
- "if we find a delim update indx to record the position of it, if we
- "dont find another delim then indx is the last one so break out of
- "this loop
- if indx2 != -1
- let indx = indx + indx2 + lenDelim
- else
- break
- endif
- endwhile
-
- return indx
-
-endfunction
-
-" Function: s:Left(...) {{{2
-" returns left delimiter data
-function s:Left(...)
- let params = a:0 ? a:1 : {}
-
- let delim = has_key(params, 'alt') ? b:NERDCommenterDelims['leftAlt'] : b:NERDCommenterDelims['left']
-
- if delim == ''
- return ''
- endif
-
- if has_key(params, 'space') && g:NERDSpaceDelims
- let delim = delim . s:spaceStr
- endif
-
- if has_key(params, 'esc')
- let delim = s:Esc(delim)
- endif
-
- return delim
-endfunction
-
-" Function: s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2
-" This function takes in 2 line numbers and returns the index of the left most
-" char (that is not a space or a tab) on all of these lines.
-" Args:
-" -countCommentedLines: 1 if lines that are commented are to be checked as
-" well. 0 otherwise
-" -countEmptyLines: 1 if empty lines are to be counted in the search
-" -topline: the top line to be checked
-" -bottomline: the bottom line to be checked
-function s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline)
-
- " declare the left most index as an extreme value
- let leftMostIndx = 1000
-
- " go thru the block line by line updating leftMostIndx
- let currentLine = a:topline
- while currentLine <= a:bottomline
-
- " get the next line and if it is allowed to be commented, or is not
- " commented, check it
- let theLine = getline(currentLine)
- if a:countEmptyLines || theLine !~ '^[ \t]*$'
- if a:countCommentedLines || (!s:IsCommented(s:Left(), s:Right(), theLine) && !s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine))
- " convert spaces to tabs and get the number of leading spaces for
- " this line and update leftMostIndx if need be
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- let leadSpaceOfLine = strlen( substitute(theLine, '\(^[ \t]*\).*$','\1','') )
- if leadSpaceOfLine < leftMostIndx
- let leftMostIndx = leadSpaceOfLine
- endif
- endif
- endif
-
- " move on to the next line
- let currentLine = currentLine + 1
- endwhile
-
- if leftMostIndx == 1000
- return 0
- else
- return leftMostIndx
- endif
-endfunction
-
-" Function: s:Multipart() {{{2
-" returns 1 if the current delims are multipart
-function s:Multipart()
- return s:Right() != ''
-endfunction
-
-" Function: s:NerdEcho(msg, typeOfMsg) {{{2
-" Args:
-" -msg: the message to echo
-" -typeOfMsg: 0 = warning message
-" 1 = normal message
-function s:NerdEcho(msg, typeOfMsg)
- if a:typeOfMsg == 0
- echohl WarningMsg
- echom 'NERDCommenter:' . a:msg
- echohl None
- elseif a:typeOfMsg == 1
- echom 'NERDCommenter:' . a:msg
- endif
-endfunction
-
-" Function: s:NumberOfLeadingTabs(s) {{{2
-" returns the number of leading tabs in the given string
-function s:NumberOfLeadingTabs(s)
- return strlen(substitute(a:s, '^\(\t*\).*$', '\1', ""))
-endfunction
-
-" Function: s:NumLinesInBuf() {{{2
-" Returns the number of lines in the current buffer
-function s:NumLinesInBuf()
- return line('$')
-endfunction
-
-" Function: s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) {{{2
-" This function takes in a string, 2 delimiters in that string and 2 strings
-" to replace these delimiters with.
-"
-" Args:
-" -toReplace1: the first delimiter to replace
-" -toReplace2: the second delimiter to replace
-" -replacor1: the string to replace toReplace1 with
-" -replacor2: the string to replace toReplace2 with
-" -str: the string that the delimiters to be replaced are in
-function s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str)
- let line = s:ReplaceLeftMostDelim(a:toReplace1, a:replacor1, a:str)
- let line = s:ReplaceRightMostDelim(a:toReplace2, a:replacor2, line)
- return line
-endfunction
-
-" Function: s:ReplaceLeftMostDelim(toReplace, replacor, str) {{{2
-" This function takes a string and a delimiter and replaces the left most
-" occurrence of this delimiter in the string with a given string
-"
-" Args:
-" -toReplace: the delimiter in str that is to be replaced
-" -replacor: the string to replace toReplace with
-" -str: the string that contains toReplace
-function s:ReplaceLeftMostDelim(toReplace, replacor, str)
- let toReplace = a:toReplace
- let replacor = a:replacor
- "get the left most occurrence of toReplace
- let indxToReplace = s:FindDelimiterIndex(toReplace, a:str)
-
- "if there IS an occurrence of toReplace in str then replace it and return
- "the resulting string
- if indxToReplace != -1
- let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace))
- return line
- endif
-
- return a:str
-endfunction
-
-" Function: s:ReplaceRightMostDelim(toReplace, replacor, str) {{{2
-" This function takes a string and a delimiter and replaces the right most
-" occurrence of this delimiter in the string with a given string
-"
-" Args:
-" -toReplace: the delimiter in str that is to be replaced
-" -replacor: the string to replace toReplace with
-" -str: the string that contains toReplace
-"
-function s:ReplaceRightMostDelim(toReplace, replacor, str)
- let toReplace = a:toReplace
- let replacor = a:replacor
- let lenToReplace = strlen(toReplace)
-
- "get the index of the last delim in str
- let indxToReplace = s:LastIndexOfDelim(toReplace, a:str)
-
- "if there IS a delimiter in str, replace it and return the result
- let line = a:str
- if indxToReplace != -1
- let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace))
- endif
- return line
-endfunction
-
-"FUNCTION: s:RestoreScreenState() {{{2
-"
-"Sets the screen state back to what it was when s:SaveScreenState was last
-"called.
-"
-function s:RestoreScreenState()
- if !exists("t:NERDComOldTopLine") || !exists("t:NERDComOldPos")
- throw 'NERDCommenter exception: cannot restore screen'
- endif
-
- call cursor(t:NERDComOldTopLine, 0)
- normal! zt
- call setpos(".", t:NERDComOldPos)
-endfunction
-
-" Function: s:Right(...) {{{2
-" returns right delimiter data
-function s:Right(...)
- let params = a:0 ? a:1 : {}
-
- let delim = has_key(params, 'alt') ? b:NERDCommenterDelims['rightAlt'] : b:NERDCommenterDelims['right']
-
- if delim == ''
- return ''
- endif
-
- if has_key(params, 'space') && g:NERDSpaceDelims
- let delim = s:spaceStr . delim
- endif
-
- if has_key(params, 'esc')
- let delim = s:Esc(delim)
- endif
-
- return delim
-endfunction
-
-" Function: s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2
-" This function takes in 2 line numbers and returns the index of the right most
-" char on all of these lines.
-" Args:
-" -countCommentedLines: 1 if lines that are commented are to be checked as
-" well. 0 otherwise
-" -countEmptyLines: 1 if empty lines are to be counted in the search
-" -topline: the top line to be checked
-" -bottomline: the bottom line to be checked
-function s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline)
- let rightMostIndx = -1
-
- " go thru the block line by line updating rightMostIndx
- let currentLine = a:topline
- while currentLine <= a:bottomline
-
- " get the next line and see if it is commentable, otherwise it doesnt
- " count
- let theLine = getline(currentLine)
- if a:countEmptyLines || theLine !~ '^[ \t]*$'
-
- if a:countCommentedLines || (!s:IsCommented(s:Left(), s:Right(), theLine) && !s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine))
-
- " update rightMostIndx if need be
- let theLine = s:ConvertLeadingTabsToSpaces(theLine)
- let lineLen = strlen(theLine)
- if lineLen > rightMostIndx
- let rightMostIndx = lineLen
- endif
- endif
- endif
-
- " move on to the next line
- let currentLine = currentLine + 1
- endwhile
-
- return rightMostIndx
-endfunction
-
-"FUNCTION: s:SaveScreenState() {{{2
-"Saves the current cursor position in the current buffer and the window
-"scroll position
-function s:SaveScreenState()
- let t:NERDComOldPos = getpos(".")
- let t:NERDComOldTopLine = line("w0")
-endfunction
-
-" Function: s:SwapOutterMultiPartDelimsForPlaceHolders(line) {{{2
-" This function takes a line and swaps the outter most multi-part delims for
-" place holders
-" Args:
-" -line: the line to swap the delims in
-"
-function s:SwapOutterMultiPartDelimsForPlaceHolders(line)
- " find out if the line is commented using normal delims and/or
- " alternate ones
- let isCommented = s:IsCommented(s:Left(), s:Right(), a:line)
- let isCommentedAlt = s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), a:line)
-
- let line2 = a:line
-
- "if the line is commented and there is a right delimiter, replace
- "the delims with place-holders
- if isCommented && s:Multipart()
- let line2 = s:ReplaceDelims(s:Left(), s:Right(), g:NERDLPlace, g:NERDRPlace, a:line)
-
- "similarly if the line is commented with the alternative
- "delimiters
- elseif isCommentedAlt && s:AltMultipart()
- let line2 = s:ReplaceDelims(s:Left({'alt': 1}), s:Right({'alt': 1}), g:NERDLPlace, g:NERDRPlace, a:line)
- endif
-
- return line2
-endfunction
-
-" Function: s:SwapOutterPlaceHoldersForMultiPartDelims(line) {{{2
-" This function takes a line and swaps the outtermost place holders for
-" multi-part delims
-" Args:
-" -line: the line to swap the delims in
-"
-function s:SwapOutterPlaceHoldersForMultiPartDelims(line)
- let left = ''
- let right = ''
- if s:Multipart()
- let left = s:Left()
- let right = s:Right()
- elseif s:AltMultipart()
- let left = s:Left({'alt': 1})
- let right = s:Right({'alt': 1})
- endif
-
- let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, a:line)
- return line
-endfunction
-" Function: s:TabbedCol(line, col) {{{2
-" Gets the col number for given line and existing col number. The new col
-" number is the col number when all leading spaces are converted to tabs
-" Args:
-" -line:the line to get the rel col for
-" -col: the abs col
-function s:TabbedCol(line, col)
- let lineTruncated = strpart(a:line, 0, a:col)
- let lineSpacesToTabs = substitute(lineTruncated, s:TabSpace(), '\t', 'g')
- return strlen(lineSpacesToTabs)
-endfunction
-"FUNCTION: s:TabSpace() {{{2
-"returns a string of spaces equal in length to &tabstop
-function s:TabSpace()
- let tabSpace = ""
- let spacesPerTab = &tabstop
- while spacesPerTab > 0
- let tabSpace = tabSpace . " "
- let spacesPerTab = spacesPerTab - 1
- endwhile
- return tabSpace
-endfunction
-
-" Function: s:UnEsc(str, escChar) {{{2
-" This function removes all the escape chars from a string
-" Args:
-" -str: the string to remove esc chars from
-" -escChar: the escape char to be removed
-function s:UnEsc(str, escChar)
- return substitute(a:str, a:escChar, "", "g")
-endfunction
-
-" Function: s:UntabbedCol(line, col) {{{2
-" Takes a line and a col and returns the absolute column of col taking into
-" account that a tab is worth 3 or 4 (or whatever) spaces.
-" Args:
-" -line:the line to get the abs col for
-" -col: the col that doesnt take into account tabs
-function s:UntabbedCol(line, col)
- let lineTruncated = strpart(a:line, 0, a:col)
- let lineTabsToSpaces = substitute(lineTruncated, '\t', s:TabSpace(), 'g')
- return strlen(lineTabsToSpaces)
-endfunction
-" Section: Comment mapping setup {{{1
-" ===========================================================================
-
-" switch to/from alternative delimiters
-nnoremap <plug>NERDCommenterAltDelims :call <SID>SwitchToAlternativeDelimiters(1)<cr>
-
-" comment out lines
-nnoremap <silent> <plug>NERDCommenterComment :call NERDComment(0, "norm")<cr>
-vnoremap <silent> <plug>NERDCommenterComment <ESC>:call NERDComment(1, "norm")<cr>
-
-" toggle comments
-nnoremap <silent> <plug>NERDCommenterToggle :call NERDComment(0, "toggle")<cr>
-vnoremap <silent> <plug>NERDCommenterToggle <ESC>:call NERDComment(1, "toggle")<cr>
-
-" minimal comments
-nnoremap <silent> <plug>NERDCommenterMinimal :call NERDComment(0, "minimal")<cr>
-vnoremap <silent> <plug>NERDCommenterMinimal <ESC>:call NERDComment(1, "minimal")<cr>
-
-" sexy comments
-nnoremap <silent> <plug>NERDCommenterSexy :call NERDComment(0, "sexy")<CR>
-vnoremap <silent> <plug>NERDCommenterSexy <ESC>:call NERDComment(1, "sexy")<CR>
-
-" invert comments
-nnoremap <silent> <plug>NERDCommenterInvert :call NERDComment(0, "invert")<CR>
-vnoremap <silent> <plug>NERDCommenterInvert <ESC>:call NERDComment(1, "invert")<CR>
-
-" yank then comment
-nmap <silent> <plug>NERDCommenterYank :call NERDComment(0, "yank")<CR>
-vmap <silent> <plug>NERDCommenterYank <ESC>:call NERDComment(1, "yank")<CR>
-
-" left aligned comments
-nnoremap <silent> <plug>NERDCommenterAlignLeft :call NERDComment(0, "alignLeft")<cr>
-vnoremap <silent> <plug>NERDCommenterAlignLeft <ESC>:call NERDComment(1, "alignLeft")<cr>
-
-" left and right aligned comments
-nnoremap <silent> <plug>NERDCommenterAlignBoth :call NERDComment(0, "alignBoth")<cr>
-vnoremap <silent> <plug>NERDCommenterAlignBoth <ESC>:call NERDComment(1, "alignBoth")<cr>
-
-" nested comments
-nnoremap <silent> <plug>NERDCommenterNest :call NERDComment(0, "nested")<cr>
-vnoremap <silent> <plug>NERDCommenterNest <ESC>:call NERDComment(1, "nested")<cr>
-
-" uncomment
-nnoremap <silent> <plug>NERDCommenterUncomment :call NERDComment(0, "uncomment")<cr>
-vnoremap <silent> <plug>NERDCommenterUncomment :call NERDComment(1, "uncomment")<cr>
-
-" comment till the end of the line
-nnoremap <silent> <plug>NERDCommenterToEOL :call NERDComment(0, "toEOL")<cr>
-
-" append comments
-nmap <silent> <plug>NERDCommenterAppend :call NERDComment(0, "append")<cr>
-
-" insert comments
-inoremap <silent> <plug>NERDCommenterInInsert <SPACE><BS><ESC>:call NERDComment(0, "insert")<CR>
-
-
-function! s:CreateMaps(target, combo)
- if !hasmapto(a:target, 'n')
- exec 'nmap ' . a:combo . ' ' . a:target
- endif
-
- if !hasmapto(a:target, 'v')
- exec 'vmap ' . a:combo . ' ' . a:target
- endif
-endfunction
-
-if g:NERDCreateDefaultMappings
- call s:CreateMaps('<plug>NERDCommenterComment', '<leader>cc')
- call s:CreateMaps('<plug>NERDCommenterToggle', '<leader>c<space>')
- call s:CreateMaps('<plug>NERDCommenterMinimal', '<leader>cm')
- call s:CreateMaps('<plug>NERDCommenterSexy', '<leader>cs')
- call s:CreateMaps('<plug>NERDCommenterInvert', '<leader>ci')
- call s:CreateMaps('<plug>NERDCommenterYank', '<leader>cy')
- call s:CreateMaps('<plug>NERDCommenterAlignLeft', '<leader>cl')
- call s:CreateMaps('<plug>NERDCommenterAlignBoth', '<leader>cb')
- call s:CreateMaps('<plug>NERDCommenterNest', '<leader>cn')
- call s:CreateMaps('<plug>NERDCommenterUncomment', '<leader>cu')
- call s:CreateMaps('<plug>NERDCommenterToEOL', '<leader>c$')
- call s:CreateMaps('<plug>NERDCommenterAppend', '<leader>cA')
-
- if !hasmapto('<plug>NERDCommenterAltDelims', 'n')
- nmap <leader>ca <plug>NERDCommenterAltDelims
- endif
-endif
-
-
-
-" Section: Menu item setup {{{1
-" ===========================================================================
-"check if the user wants the menu to be displayed
-if g:NERDMenuMode != 0
-
- let menuRoot = ""
- if g:NERDMenuMode == 1
- let menuRoot = 'comment'
- elseif g:NERDMenuMode == 2
- let menuRoot = '&comment'
- elseif g:NERDMenuMode == 3
- let menuRoot = '&Plugin.&comment'
- endif
-
- function! s:CreateMenuItems(target, desc, root)
- exec 'nmenu <silent> ' . a:root . '.' . a:desc . ' ' . a:target
- exec 'vmenu <silent> ' . a:root . '.' . a:desc . ' ' . a:target
- endfunction
- call s:CreateMenuItems("<plug>NERDCommenterComment", 'Comment', menuRoot)
- call s:CreateMenuItems("<plug>NERDCommenterToggle", 'Toggle', menuRoot)
- call s:CreateMenuItems('<plug>NERDCommenterMinimal', 'Minimal', menuRoot)
- call s:CreateMenuItems('<plug>NERDCommenterNest', 'Nested', menuRoot)
- exec 'nmenu <silent> '. menuRoot .'.To\ EOL <plug>NERDCommenterToEOL'
- call s:CreateMenuItems('<plug>NERDCommenterInvert', 'Invert', menuRoot)
- call s:CreateMenuItems('<plug>NERDCommenterSexy', 'Sexy', menuRoot)
- call s:CreateMenuItems('<plug>NERDCommenterYank', 'Yank\ then\ comment', menuRoot)
- exec 'nmenu <silent> '. menuRoot .'.Append <plug>NERDCommenterAppend'
- exec 'menu <silent> '. menuRoot .'.-Sep- :'
- call s:CreateMenuItems('<plug>NERDCommenterAlignLeft', 'Left\ aligned', menuRoot)
- call s:CreateMenuItems('<plug>NERDCommenterAlignBoth', 'Left\ and\ right\ aligned', menuRoot)
- exec 'menu <silent> '. menuRoot .'.-Sep2- :'
- call s:CreateMenuItems('<plug>NERDCommenterUncomment', 'Uncomment', menuRoot)
- exec 'nmenu <silent> '. menuRoot .'.Switch\ Delimiters <plug>NERDCommenterAltDelims'
- exec 'imenu <silent> '. menuRoot .'.Insert\ Comment\ Here <plug>NERDCommenterInInsert'
- exec 'menu <silent> '. menuRoot .'.-Sep3- :'
- exec 'menu <silent>'. menuRoot .'.Help :help NERDCommenterContents<CR>'
-endif
-" vim: set foldmethod=marker :
+++ /dev/null
-" ============================================================================
-" File: NERD_tree.vim
-" Description: vim global plugin that provides a nice tree explorer
-" Maintainer: Martin Grenfell <martin.grenfell at gmail dot com>
-" Last Change: 1 December, 2009
-" License: This program is free software. It comes without any warranty,
-" to the extent permitted by applicable law. You can redistribute
-" it and/or modify it under the terms of the Do What The Fuck You
-" Want To Public License, Version 2, as published by Sam Hocevar.
-" See http://sam.zoy.org/wtfpl/COPYING for more details.
-"
-" ============================================================================
-let s:NERD_tree_version = '4.1.0'
-
-" SECTION: Script init stuff {{{1
-"============================================================
-if exists("loaded_nerd_tree")
- finish
-endif
-if v:version < 700
- echoerr "NERDTree: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!"
- finish
-endif
-let loaded_nerd_tree = 1
-
-"for line continuation - i.e dont want C in &cpo
-let s:old_cpo = &cpo
-set cpo&vim
-
-"Function: s:initVariable() function {{{2
-"This function is used to initialise a given variable to a given value. The
-"variable is only initialised if it does not exist prior
-"
-"Args:
-"var: the name of the var to be initialised
-"value: the value to initialise var to
-"
-"Returns:
-"1 if the var is set, 0 otherwise
-function! s:initVariable(var, value)
- if !exists(a:var)
- exec 'let ' . a:var . ' = ' . "'" . substitute(a:value, "'", "''", "g") . "'"
- return 1
- endif
- return 0
-endfunction
-
-"SECTION: Init variable calls and other random constants {{{2
-call s:initVariable("g:NERDChristmasTree", 1)
-call s:initVariable("g:NERDTreeAutoCenter", 1)
-call s:initVariable("g:NERDTreeAutoCenterThreshold", 3)
-call s:initVariable("g:NERDTreeCaseSensitiveSort", 0)
-call s:initVariable("g:NERDTreeChDirMode", 0)
-if !exists("g:NERDTreeIgnore")
- let g:NERDTreeIgnore = ['\~$']
-endif
-call s:initVariable("g:NERDTreeBookmarksFile", expand('$HOME') . '/.NERDTreeBookmarks')
-call s:initVariable("g:NERDTreeHighlightCursorline", 1)
-call s:initVariable("g:NERDTreeHijackNetrw", 1)
-call s:initVariable("g:NERDTreeMouseMode", 1)
-call s:initVariable("g:NERDTreeNotificationThreshold", 100)
-call s:initVariable("g:NERDTreeQuitOnOpen", 0)
-call s:initVariable("g:NERDTreeShowBookmarks", 0)
-call s:initVariable("g:NERDTreeShowFiles", 1)
-call s:initVariable("g:NERDTreeShowHidden", 0)
-call s:initVariable("g:NERDTreeShowLineNumbers", 0)
-call s:initVariable("g:NERDTreeSortDirs", 1)
-
-if !exists("g:NERDTreeSortOrder")
- let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$']
-else
- "if there isnt a * in the sort sequence then add one
- if count(g:NERDTreeSortOrder, '*') < 1
- call add(g:NERDTreeSortOrder, '*')
- endif
-endif
-
-"we need to use this number many times for sorting... so we calculate it only
-"once here
-let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*')
-
-if !exists('g:NERDTreeStatusline')
-
- "the exists() crap here is a hack to stop vim spazzing out when
- "loading a session that was created with an open nerd tree. It spazzes
- "because it doesnt store b:NERDTreeRoot (its a b: var, and its a hash)
- let g:NERDTreeStatusline = "%{exists('b:NERDTreeRoot')?b:NERDTreeRoot.path.str():''}"
-
-endif
-call s:initVariable("g:NERDTreeWinPos", "left")
-call s:initVariable("g:NERDTreeWinSize", 31)
-
-let s:running_windows = has("win16") || has("win32") || has("win64")
-
-"init the shell commands that will be used to copy nodes, and remove dir trees
-"
-"Note: the space after the command is important
-if s:running_windows
- call s:initVariable("g:NERDTreeRemoveDirCmd", 'rmdir /s /q ')
-else
- call s:initVariable("g:NERDTreeRemoveDirCmd", 'rm -rf ')
- call s:initVariable("g:NERDTreeCopyCmd", 'cp -r ')
-endif
-
-
-"SECTION: Init variable calls for key mappings {{{2
-call s:initVariable("g:NERDTreeMapActivateNode", "o")
-call s:initVariable("g:NERDTreeMapChangeRoot", "C")
-call s:initVariable("g:NERDTreeMapChdir", "cd")
-call s:initVariable("g:NERDTreeMapCloseChildren", "X")
-call s:initVariable("g:NERDTreeMapCloseDir", "x")
-call s:initVariable("g:NERDTreeMapDeleteBookmark", "D")
-call s:initVariable("g:NERDTreeMapMenu", "m")
-call s:initVariable("g:NERDTreeMapHelp", "?")
-call s:initVariable("g:NERDTreeMapJumpFirstChild", "K")
-call s:initVariable("g:NERDTreeMapJumpLastChild", "J")
-call s:initVariable("g:NERDTreeMapJumpNextSibling", "<C-j>")
-call s:initVariable("g:NERDTreeMapJumpParent", "p")
-call s:initVariable("g:NERDTreeMapJumpPrevSibling", "<C-k>")
-call s:initVariable("g:NERDTreeMapJumpRoot", "P")
-call s:initVariable("g:NERDTreeMapOpenExpl", "e")
-call s:initVariable("g:NERDTreeMapOpenInTab", "t")
-call s:initVariable("g:NERDTreeMapOpenInTabSilent", "T")
-call s:initVariable("g:NERDTreeMapOpenRecursively", "O")
-call s:initVariable("g:NERDTreeMapOpenSplit", "i")
-call s:initVariable("g:NERDTreeMapOpenVSplit", "s")
-call s:initVariable("g:NERDTreeMapPreview", "g" . NERDTreeMapActivateNode)
-call s:initVariable("g:NERDTreeMapPreviewSplit", "g" . NERDTreeMapOpenSplit)
-call s:initVariable("g:NERDTreeMapPreviewVSplit", "g" . NERDTreeMapOpenVSplit)
-call s:initVariable("g:NERDTreeMapQuit", "q")
-call s:initVariable("g:NERDTreeMapRefresh", "r")
-call s:initVariable("g:NERDTreeMapRefreshRoot", "R")
-call s:initVariable("g:NERDTreeMapToggleBookmarks", "B")
-call s:initVariable("g:NERDTreeMapToggleFiles", "F")
-call s:initVariable("g:NERDTreeMapToggleFilters", "f")
-call s:initVariable("g:NERDTreeMapToggleHidden", "I")
-call s:initVariable("g:NERDTreeMapToggleZoom", "A")
-call s:initVariable("g:NERDTreeMapUpdir", "u")
-call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U")
-
-"SECTION: Script level variable declaration{{{2
-if s:running_windows
- let s:escape_chars = " `\|\"#%&,?()\*^<>"
-else
- let s:escape_chars = " \\`\|\"#%&,?()\*^<>"
-endif
-let s:NERDTreeBufName = 'NERD_tree_'
-
-let s:tree_wid = 2
-let s:tree_markup_reg = '^[ `|▼▶]*[\-+~ ]*'
-let s:tree_up_dir_line = '.. (up a dir)'
-
-"the number to add to the nerd tree buffer name to make the buf name unique
-let s:next_buffer_number = 1
-
-" SECTION: Commands {{{1
-"============================================================
-"init the command that users start the nerd tree with
-command! -n=? -complete=dir -bar NERDTree :call s:initNerdTree('<args>')
-command! -n=? -complete=dir -bar NERDTreeToggle :call s:toggle('<args>')
-command! -n=0 -bar NERDTreeClose :call s:closeTreeIfOpen()
-command! -n=1 -complete=customlist,s:completeBookmarks -bar NERDTreeFromBookmark call s:initNerdTree('<args>')
-command! -n=0 -bar NERDTreeMirror call s:initNerdTreeMirror()
-command! -n=0 -bar NERDTreeFind call s:findAndRevealPath()
-" SECTION: Auto commands {{{1
-"============================================================
-augroup NERDTree
- "Save the cursor position whenever we close the nerd tree
- exec "autocmd BufWinLeave ". s:NERDTreeBufName ."* call <SID>saveScreenState()"
-
- "disallow insert mode in the NERDTree
- exec "autocmd BufEnter ". s:NERDTreeBufName ."* stopinsert"
- "cache bookmarks when vim loads
- autocmd VimEnter * call s:Bookmark.CacheBookmarks(0)
-
- "load all nerdtree plugins after vim starts
- autocmd VimEnter * runtime! nerdtree_plugin/**/*.vim
-augroup END
-
-if g:NERDTreeHijackNetrw
- augroup NERDTreeHijackNetrw
- autocmd VimEnter * silent! autocmd! FileExplorer
- au BufEnter,VimEnter * call s:checkForBrowse(expand("<amatch>"))
- augroup END
-endif
-
-"SECTION: Classes {{{1
-"============================================================
-"CLASS: Bookmark {{{2
-"============================================================
-let s:Bookmark = {}
-" FUNCTION: Bookmark.activate() {{{3
-function! s:Bookmark.activate()
- if self.path.isDirectory
- call self.toRoot()
- else
- if self.validate()
- let n = s:TreeFileNode.New(self.path)
- call n.open()
- call s:closeTreeIfQuitOnOpen()
- endif
- endif
-endfunction
-" FUNCTION: Bookmark.AddBookmark(name, path) {{{3
-" Class method to add a new bookmark to the list, if a previous bookmark exists
-" with the same name, just update the path for that bookmark
-function! s:Bookmark.AddBookmark(name, path)
- for i in s:Bookmark.Bookmarks()
- if i.name ==# a:name
- let i.path = a:path
- return
- endif
- endfor
- call add(s:Bookmark.Bookmarks(), s:Bookmark.New(a:name, a:path))
- call s:Bookmark.Sort()
-endfunction
-" Function: Bookmark.Bookmarks() {{{3
-" Class method to get all bookmarks. Lazily initializes the bookmarks global
-" variable
-function! s:Bookmark.Bookmarks()
- if !exists("g:NERDTreeBookmarks")
- let g:NERDTreeBookmarks = []
- endif
- return g:NERDTreeBookmarks
-endfunction
-" Function: Bookmark.BookmarkExistsFor(name) {{{3
-" class method that returns 1 if a bookmark with the given name is found, 0
-" otherwise
-function! s:Bookmark.BookmarkExistsFor(name)
- try
- call s:Bookmark.BookmarkFor(a:name)
- return 1
- catch /^NERDTree.BookmarkNotFoundError/
- return 0
- endtry
-endfunction
-" Function: Bookmark.BookmarkFor(name) {{{3
-" Class method to get the bookmark that has the given name. {} is return if no
-" bookmark is found
-function! s:Bookmark.BookmarkFor(name)
- for i in s:Bookmark.Bookmarks()
- if i.name ==# a:name
- return i
- endif
- endfor
- throw "NERDTree.BookmarkNotFoundError: no bookmark found for name: \"". a:name .'"'
-endfunction
-" Function: Bookmark.BookmarkNames() {{{3
-" Class method to return an array of all bookmark names
-function! s:Bookmark.BookmarkNames()
- let names = []
- for i in s:Bookmark.Bookmarks()
- call add(names, i.name)
- endfor
- return names
-endfunction
-" FUNCTION: Bookmark.CacheBookmarks(silent) {{{3
-" Class method to read all bookmarks from the bookmarks file intialize
-" bookmark objects for each one.
-"
-" Args:
-" silent - dont echo an error msg if invalid bookmarks are found
-function! s:Bookmark.CacheBookmarks(silent)
- if filereadable(g:NERDTreeBookmarksFile)
- let g:NERDTreeBookmarks = []
- let g:NERDTreeInvalidBookmarks = []
- let bookmarkStrings = readfile(g:NERDTreeBookmarksFile)
- let invalidBookmarksFound = 0
- for i in bookmarkStrings
-
- "ignore blank lines
- if i != ''
-
- let name = substitute(i, '^\(.\{-}\) .*$', '\1', '')
- let path = substitute(i, '^.\{-} \(.*\)$', '\1', '')
-
- try
- let bookmark = s:Bookmark.New(name, s:Path.New(path))
- call add(g:NERDTreeBookmarks, bookmark)
- catch /^NERDTree.InvalidArgumentsError/
- call add(g:NERDTreeInvalidBookmarks, i)
- let invalidBookmarksFound += 1
- endtry
- endif
- endfor
- if invalidBookmarksFound
- call s:Bookmark.Write()
- if !a:silent
- call s:echo(invalidBookmarksFound . " invalid bookmarks were read. See :help NERDTreeInvalidBookmarks for info.")
- endif
- endif
- call s:Bookmark.Sort()
- endif
-endfunction
-" FUNCTION: Bookmark.compareTo(otherbookmark) {{{3
-" Compare these two bookmarks for sorting purposes
-function! s:Bookmark.compareTo(otherbookmark)
- return a:otherbookmark.name < self.name
-endfunction
-" FUNCTION: Bookmark.ClearAll() {{{3
-" Class method to delete all bookmarks.
-function! s:Bookmark.ClearAll()
- for i in s:Bookmark.Bookmarks()
- call i.delete()
- endfor
- call s:Bookmark.Write()
-endfunction
-" FUNCTION: Bookmark.delete() {{{3
-" Delete this bookmark. If the node for this bookmark is under the current
-" root, then recache bookmarks for its Path object
-function! s:Bookmark.delete()
- let node = {}
- try
- let node = self.getNode(1)
- catch /^NERDTree.BookmarkedNodeNotFoundError/
- endtry
- call remove(s:Bookmark.Bookmarks(), index(s:Bookmark.Bookmarks(), self))
- if !empty(node)
- call node.path.cacheDisplayString()
- endif
- call s:Bookmark.Write()
-endfunction
-" FUNCTION: Bookmark.getNode(searchFromAbsoluteRoot) {{{3
-" Gets the treenode for this bookmark
-"
-" Args:
-" searchFromAbsoluteRoot: specifies whether we should search from the current
-" tree root, or the highest cached node
-function! s:Bookmark.getNode(searchFromAbsoluteRoot)
- let searchRoot = a:searchFromAbsoluteRoot ? s:TreeDirNode.AbsoluteTreeRoot() : b:NERDTreeRoot
- let targetNode = searchRoot.findNode(self.path)
- if empty(targetNode)
- throw "NERDTree.BookmarkedNodeNotFoundError: no node was found for bookmark: " . self.name
- endif
- return targetNode
-endfunction
-" FUNCTION: Bookmark.GetNodeForName(name, searchFromAbsoluteRoot) {{{3
-" Class method that finds the bookmark with the given name and returns the
-" treenode for it.
-function! s:Bookmark.GetNodeForName(name, searchFromAbsoluteRoot)
- let bookmark = s:Bookmark.BookmarkFor(a:name)
- return bookmark.getNode(a:searchFromAbsoluteRoot)
-endfunction
-" FUNCTION: Bookmark.GetSelected() {{{3
-" returns the Bookmark the cursor is over, or {}
-function! s:Bookmark.GetSelected()
- let line = getline(".")
- let name = substitute(line, '^>\(.\{-}\) .\+$', '\1', '')
- if name != line
- try
- return s:Bookmark.BookmarkFor(name)
- catch /^NERDTree.BookmarkNotFoundError/
- return {}
- endtry
- endif
- return {}
-endfunction
-
-" Function: Bookmark.InvalidBookmarks() {{{3
-" Class method to get all invalid bookmark strings read from the bookmarks
-" file
-function! s:Bookmark.InvalidBookmarks()
- if !exists("g:NERDTreeInvalidBookmarks")
- let g:NERDTreeInvalidBookmarks = []
- endif
- return g:NERDTreeInvalidBookmarks
-endfunction
-" FUNCTION: Bookmark.mustExist() {{{3
-function! s:Bookmark.mustExist()
- if !self.path.exists()
- call s:Bookmark.CacheBookmarks(1)
- throw "NERDTree.BookmarkPointsToInvalidLocationError: the bookmark \"".
- \ self.name ."\" points to a non existing location: \"". self.path.str()
- endif
-endfunction
-" FUNCTION: Bookmark.New(name, path) {{{3
-" Create a new bookmark object with the given name and path object
-function! s:Bookmark.New(name, path)
- if a:name =~ ' '
- throw "NERDTree.IllegalBookmarkNameError: illegal name:" . a:name
- endif
-
- let newBookmark = copy(self)
- let newBookmark.name = a:name
- let newBookmark.path = a:path
- return newBookmark
-endfunction
-" FUNCTION: Bookmark.openInNewTab(options) {{{3
-" Create a new bookmark object with the given name and path object
-function! s:Bookmark.openInNewTab(options)
- let currentTab = tabpagenr()
- if self.path.isDirectory
- tabnew
- call s:initNerdTree(self.name)
- else
- exec "tabedit " . bookmark.path.str({'format': 'Edit'})
- endif
-
- if has_key(a:options, 'stayInCurrentTab')
- exec "tabnext " . currentTab
- endif
-endfunction
-" Function: Bookmark.setPath(path) {{{3
-" makes this bookmark point to the given path
-function! s:Bookmark.setPath(path)
- let self.path = a:path
-endfunction
-" Function: Bookmark.Sort() {{{3
-" Class method that sorts all bookmarks
-function! s:Bookmark.Sort()
- let CompareFunc = function("s:compareBookmarks")
- call sort(s:Bookmark.Bookmarks(), CompareFunc)
-endfunction
-" Function: Bookmark.str() {{{3
-" Get the string that should be rendered in the view for this bookmark
-function! s:Bookmark.str()
- let pathStrMaxLen = winwidth(s:getTreeWinNum()) - 4 - len(self.name)
- if &nu
- let pathStrMaxLen = pathStrMaxLen - &numberwidth
- endif
-
- let pathStr = self.path.str({'format': 'UI'})
- if len(pathStr) > pathStrMaxLen
- let pathStr = '<' . strpart(pathStr, len(pathStr) - pathStrMaxLen)
- endif
- return '>' . self.name . ' ' . pathStr
-endfunction
-" FUNCTION: Bookmark.toRoot() {{{3
-" Make the node for this bookmark the new tree root
-function! s:Bookmark.toRoot()
- if self.validate()
- try
- let targetNode = self.getNode(1)
- catch /^NERDTree.BookmarkedNodeNotFoundError/
- let targetNode = s:TreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path)
- endtry
- call targetNode.makeRoot()
- call s:renderView()
- call targetNode.putCursorHere(0, 0)
- endif
-endfunction
-" FUNCTION: Bookmark.ToRoot(name) {{{3
-" Make the node for this bookmark the new tree root
-function! s:Bookmark.ToRoot(name)
- let bookmark = s:Bookmark.BookmarkFor(a:name)
- call bookmark.toRoot()
-endfunction
-
-
-"FUNCTION: Bookmark.validate() {{{3
-function! s:Bookmark.validate()
- if self.path.exists()
- return 1
- else
- call s:Bookmark.CacheBookmarks(1)
- call s:renderView()
- call s:echo(self.name . "now points to an invalid location. See :help NERDTreeInvalidBookmarks for info.")
- return 0
- endif
-endfunction
-
-" Function: Bookmark.Write() {{{3
-" Class method to write all bookmarks to the bookmarks file
-function! s:Bookmark.Write()
- let bookmarkStrings = []
- for i in s:Bookmark.Bookmarks()
- call add(bookmarkStrings, i.name . ' ' . i.path.str())
- endfor
-
- "add a blank line before the invalid ones
- call add(bookmarkStrings, "")
-
- for j in s:Bookmark.InvalidBookmarks()
- call add(bookmarkStrings, j)
- endfor
- call writefile(bookmarkStrings, g:NERDTreeBookmarksFile)
-endfunction
-"CLASS: KeyMap {{{2
-"============================================================
-let s:KeyMap = {}
-"FUNCTION: KeyMap.All() {{{3
-function! s:KeyMap.All()
- if !exists("s:keyMaps")
- let s:keyMaps = []
- endif
- return s:keyMaps
-endfunction
-
-"FUNCTION: KeyMap.BindAll() {{{3
-function! s:KeyMap.BindAll()
- for i in s:KeyMap.All()
- call i.bind()
- endfor
-endfunction
-
-"FUNCTION: KeyMap.bind() {{{3
-function! s:KeyMap.bind()
- exec "nnoremap <silent> <buffer> ". self.key ." :call ". self.callback ."()<cr>"
-endfunction
-
-"FUNCTION: KeyMap.Create(options) {{{3
-function! s:KeyMap.Create(options)
- let newKeyMap = copy(self)
- let newKeyMap.key = a:options['key']
- let newKeyMap.quickhelpText = a:options['quickhelpText']
- let newKeyMap.callback = a:options['callback']
- call add(s:KeyMap.All(), newKeyMap)
-endfunction
-"CLASS: MenuController {{{2
-"============================================================
-let s:MenuController = {}
-"FUNCTION: MenuController.New(menuItems) {{{3
-"create a new menu controller that operates on the given menu items
-function! s:MenuController.New(menuItems)
- let newMenuController = copy(self)
- if a:menuItems[0].isSeparator()
- let newMenuController.menuItems = a:menuItems[1:-1]
- else
- let newMenuController.menuItems = a:menuItems
- endif
- return newMenuController
-endfunction
-
-"FUNCTION: MenuController.showMenu() {{{3
-"start the main loop of the menu and get the user to choose/execute a menu
-"item
-function! s:MenuController.showMenu()
- call self._saveOptions()
-
- try
- let self.selection = 0
-
- let done = 0
- while !done
- redraw!
- call self._echoPrompt()
- let key = nr2char(getchar())
- let done = self._handleKeypress(key)
- endwhile
- finally
- call self._restoreOptions()
- endtry
-
- if self.selection != -1
- let m = self._current()
- call m.execute()
- endif
-endfunction
-
-"FUNCTION: MenuController._echoPrompt() {{{3
-function! s:MenuController._echoPrompt()
- echo "NERDTree Menu. Use j/k/enter and the shortcuts indicated"
- echo "=========================================================="
-
- for i in range(0, len(self.menuItems)-1)
- if self.selection == i
- echo "> " . self.menuItems[i].text
- else
- echo " " . self.menuItems[i].text
- endif
- endfor
-endfunction
-
-"FUNCTION: MenuController._current(key) {{{3
-"get the MenuItem that is curently selected
-function! s:MenuController._current()
- return self.menuItems[self.selection]
-endfunction
-
-"FUNCTION: MenuController._handleKeypress(key) {{{3
-"change the selection (if appropriate) and return 1 if the user has made
-"their choice, 0 otherwise
-function! s:MenuController._handleKeypress(key)
- if a:key == 'j'
- call self._cursorDown()
- elseif a:key == 'k'
- call self._cursorUp()
- elseif a:key == nr2char(27) "escape
- let self.selection = -1
- return 1
- elseif a:key == "\r" || a:key == "\n" "enter and ctrl-j
- return 1
- else
- let index = self._nextIndexFor(a:key)
- if index != -1
- let self.selection = index
- if len(self._allIndexesFor(a:key)) == 1
- return 1
- endif
- endif
- endif
-
- return 0
-endfunction
-
-"FUNCTION: MenuController._allIndexesFor(shortcut) {{{3
-"get indexes to all menu items with the given shortcut
-function! s:MenuController._allIndexesFor(shortcut)
- let toReturn = []
-
- for i in range(0, len(self.menuItems)-1)
- if self.menuItems[i].shortcut == a:shortcut
- call add(toReturn, i)
- endif
- endfor
-
- return toReturn
-endfunction
-
-"FUNCTION: MenuController._nextIndexFor(shortcut) {{{3
-"get the index to the next menu item with the given shortcut, starts from the
-"current cursor location and wraps around to the top again if need be
-function! s:MenuController._nextIndexFor(shortcut)
- for i in range(self.selection+1, len(self.menuItems)-1)
- if self.menuItems[i].shortcut == a:shortcut
- return i
- endif
- endfor
-
- for i in range(0, self.selection)
- if self.menuItems[i].shortcut == a:shortcut
- return i
- endif
- endfor
-
- return -1
-endfunction
-
-"FUNCTION: MenuController._setCmdheight() {{{3
-"sets &cmdheight to whatever is needed to display the menu
-function! s:MenuController._setCmdheight()
- let &cmdheight = len(self.menuItems) + 3
-endfunction
-
-"FUNCTION: MenuController._saveOptions() {{{3
-"set any vim options that are required to make the menu work (saving their old
-"values)
-function! s:MenuController._saveOptions()
- let self._oldLazyredraw = &lazyredraw
- let self._oldCmdheight = &cmdheight
- set nolazyredraw
- call self._setCmdheight()
-endfunction
-
-"FUNCTION: MenuController._restoreOptions() {{{3
-"restore the options we saved in _saveOptions()
-function! s:MenuController._restoreOptions()
- let &cmdheight = self._oldCmdheight
- let &lazyredraw = self._oldLazyredraw
-endfunction
-
-"FUNCTION: MenuController._cursorDown() {{{3
-"move the cursor to the next menu item, skipping separators
-function! s:MenuController._cursorDown()
- let done = 0
- while !done
- if self.selection < len(self.menuItems)-1
- let self.selection += 1
- else
- let self.selection = 0
- endif
-
- if !self._current().isSeparator()
- let done = 1
- endif
- endwhile
-endfunction
-
-"FUNCTION: MenuController._cursorUp() {{{3
-"move the cursor to the previous menu item, skipping separators
-function! s:MenuController._cursorUp()
- let done = 0
- while !done
- if self.selection > 0
- let self.selection -= 1
- else
- let self.selection = len(self.menuItems)-1
- endif
-
- if !self._current().isSeparator()
- let done = 1
- endif
- endwhile
-endfunction
-
-"CLASS: MenuItem {{{2
-"============================================================
-let s:MenuItem = {}
-"FUNCTION: MenuItem.All() {{{3
-"get all top level menu items
-function! s:MenuItem.All()
- if !exists("s:menuItems")
- let s:menuItems = []
- endif
- return s:menuItems
-endfunction
-
-"FUNCTION: MenuItem.AllEnabled() {{{3
-"get all top level menu items that are currently enabled
-function! s:MenuItem.AllEnabled()
- let toReturn = []
- for i in s:MenuItem.All()
- if i.enabled()
- call add(toReturn, i)
- endif
- endfor
- return toReturn
-endfunction
-
-"FUNCTION: MenuItem.Create(options) {{{3
-"make a new menu item and add it to the global list
-function! s:MenuItem.Create(options)
- let newMenuItem = copy(self)
-
- let newMenuItem.text = a:options['text']
- let newMenuItem.shortcut = a:options['shortcut']
- let newMenuItem.children = []
-
- let newMenuItem.isActiveCallback = -1
- if has_key(a:options, 'isActiveCallback')
- let newMenuItem.isActiveCallback = a:options['isActiveCallback']
- endif
-
- let newMenuItem.callback = -1
- if has_key(a:options, 'callback')
- let newMenuItem.callback = a:options['callback']
- endif
-
- if has_key(a:options, 'parent')
- call add(a:options['parent'].children, newMenuItem)
- else
- call add(s:MenuItem.All(), newMenuItem)
- endif
-
- return newMenuItem
-endfunction
-
-"FUNCTION: MenuItem.CreateSeparator(options) {{{3
-"make a new separator menu item and add it to the global list
-function! s:MenuItem.CreateSeparator(options)
- let standard_options = { 'text': '--------------------',
- \ 'shortcut': -1,
- \ 'callback': -1 }
- let options = extend(a:options, standard_options, "force")
-
- return s:MenuItem.Create(options)
-endfunction
-
-"FUNCTION: MenuItem.CreateSubmenu(options) {{{3
-"make a new submenu and add it to global list
-function! s:MenuItem.CreateSubmenu(options)
- let standard_options = { 'callback': -1 }
- let options = extend(a:options, standard_options, "force")
-
- return s:MenuItem.Create(options)
-endfunction
-
-"FUNCTION: MenuItem.enabled() {{{3
-"return 1 if this menu item should be displayed
-"
-"delegates off to the isActiveCallback, and defaults to 1 if no callback was
-"specified
-function! s:MenuItem.enabled()
- if self.isActiveCallback != -1
- return {self.isActiveCallback}()
- endif
- return 1
-endfunction
-
-"FUNCTION: MenuItem.execute() {{{3
-"perform the action behind this menu item, if this menuitem has children then
-"display a new menu for them, otherwise deletegate off to the menuitem's
-"callback
-function! s:MenuItem.execute()
- if len(self.children)
- let mc = s:MenuController.New(self.children)
- call mc.showMenu()
- else
- if self.callback != -1
- call {self.callback}()
- endif
- endif
-endfunction
-
-"FUNCTION: MenuItem.isSeparator() {{{3
-"return 1 if this menuitem is a separator
-function! s:MenuItem.isSeparator()
- return self.callback == -1 && self.children == []
-endfunction
-
-"FUNCTION: MenuItem.isSubmenu() {{{3
-"return 1 if this menuitem is a submenu
-function! s:MenuItem.isSubmenu()
- return self.callback == -1 && !empty(self.children)
-endfunction
-
-"CLASS: TreeFileNode {{{2
-"This class is the parent of the TreeDirNode class and constitures the
-"'Component' part of the composite design pattern between the treenode
-"classes.
-"============================================================
-let s:TreeFileNode = {}
-"FUNCTION: TreeFileNode.activate(forceKeepWinOpen) {{{3
-function! s:TreeFileNode.activate(forceKeepWinOpen)
- call self.open()
- if !a:forceKeepWinOpen
- call s:closeTreeIfQuitOnOpen()
- end
-endfunction
-"FUNCTION: TreeFileNode.bookmark(name) {{{3
-"bookmark this node with a:name
-function! s:TreeFileNode.bookmark(name)
-
- "if a bookmark exists with the same name and the node is cached then save
- "it so we can update its display string
- let oldMarkedNode = {}
- try
- let oldMarkedNode = s:Bookmark.GetNodeForName(a:name, 1)
- catch /^NERDTree.BookmarkNotFoundError/
- catch /^NERDTree.BookmarkedNodeNotFoundError/
- endtry
-
- call s:Bookmark.AddBookmark(a:name, self.path)
- call self.path.cacheDisplayString()
- call s:Bookmark.Write()
-
- if !empty(oldMarkedNode)
- call oldMarkedNode.path.cacheDisplayString()
- endif
-endfunction
-"FUNCTION: TreeFileNode.cacheParent() {{{3
-"initializes self.parent if it isnt already
-function! s:TreeFileNode.cacheParent()
- if empty(self.parent)
- let parentPath = self.path.getParent()
- if parentPath.equals(self.path)
- throw "NERDTree.CannotCacheParentError: already at root"
- endif
- let self.parent = s:TreeFileNode.New(parentPath)
- endif
-endfunction
-"FUNCTION: TreeFileNode.compareNodes {{{3
-"This is supposed to be a class level method but i cant figure out how to
-"get func refs to work from a dict..
-"
-"A class level method that compares two nodes
-"
-"Args:
-"n1, n2: the 2 nodes to compare
-function! s:compareNodes(n1, n2)
- return a:n1.path.compareTo(a:n2.path)
-endfunction
-
-"FUNCTION: TreeFileNode.clearBoomarks() {{{3
-function! s:TreeFileNode.clearBoomarks()
- for i in s:Bookmark.Bookmarks()
- if i.path.equals(self.path)
- call i.delete()
- end
- endfor
- call self.path.cacheDisplayString()
-endfunction
-"FUNCTION: TreeFileNode.copy(dest) {{{3
-function! s:TreeFileNode.copy(dest)
- call self.path.copy(a:dest)
- let newPath = s:Path.New(a:dest)
- let parent = b:NERDTreeRoot.findNode(newPath.getParent())
- if !empty(parent)
- call parent.refresh()
- endif
- return parent.findNode(newPath)
-endfunction
-
-"FUNCTION: TreeFileNode.delete {{{3
-"Removes this node from the tree and calls the Delete method for its path obj
-function! s:TreeFileNode.delete()
- call self.path.delete()
- call self.parent.removeChild(self)
-endfunction
-
-"FUNCTION: TreeFileNode.displayString() {{{3
-"
-"Returns a string that specifies how the node should be represented as a
-"string
-"
-"Return:
-"a string that can be used in the view to represent this node
-function! s:TreeFileNode.displayString()
- return self.path.displayString()
-endfunction
-
-"FUNCTION: TreeFileNode.equals(treenode) {{{3
-"
-"Compares this treenode to the input treenode and returns 1 if they are the
-"same node.
-"
-"Use this method instead of == because sometimes when the treenodes contain
-"many children, vim seg faults when doing ==
-"
-"Args:
-"treenode: the other treenode to compare to
-function! s:TreeFileNode.equals(treenode)
- return self.path.str() ==# a:treenode.path.str()
-endfunction
-
-"FUNCTION: TreeFileNode.findNode(path) {{{3
-"Returns self if this node.path.Equals the given path.
-"Returns {} if not equal.
-"
-"Args:
-"path: the path object to compare against
-function! s:TreeFileNode.findNode(path)
- if a:path.equals(self.path)
- return self
- endif
- return {}
-endfunction
-"FUNCTION: TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction) {{{3
-"
-"Finds the next sibling for this node in the indicated direction. This sibling
-"must be a directory and may/may not have children as specified.
-"
-"Args:
-"direction: 0 if you want to find the previous sibling, 1 for the next sibling
-"
-"Return:
-"a treenode object or {} if no appropriate sibling could be found
-function! s:TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction)
- "if we have no parent then we can have no siblings
- if self.parent != {}
- let nextSibling = self.findSibling(a:direction)
-
- while nextSibling != {}
- if nextSibling.path.isDirectory && nextSibling.hasVisibleChildren() && nextSibling.isOpen
- return nextSibling
- endif
- let nextSibling = nextSibling.findSibling(a:direction)
- endwhile
- endif
-
- return {}
-endfunction
-"FUNCTION: TreeFileNode.findSibling(direction) {{{3
-"
-"Finds the next sibling for this node in the indicated direction
-"
-"Args:
-"direction: 0 if you want to find the previous sibling, 1 for the next sibling
-"
-"Return:
-"a treenode object or {} if no sibling could be found
-function! s:TreeFileNode.findSibling(direction)
- "if we have no parent then we can have no siblings
- if self.parent != {}
-
- "get the index of this node in its parents children
- let siblingIndx = self.parent.getChildIndex(self.path)
-
- if siblingIndx != -1
- "move a long to the next potential sibling node
- let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1
-
- "keep moving along to the next sibling till we find one that is valid
- let numSiblings = self.parent.getChildCount()
- while siblingIndx >= 0 && siblingIndx < numSiblings
-
- "if the next node is not an ignored node (i.e. wont show up in the
- "view) then return it
- if self.parent.children[siblingIndx].path.ignore() ==# 0
- return self.parent.children[siblingIndx]
- endif
-
- "go to next node
- let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1
- endwhile
- endif
- endif
-
- return {}
-endfunction
-
-"FUNCTION: TreeFileNode.getLineNum(){{{3
-"returns the line number this node is rendered on, or -1 if it isnt rendered
-function! s:TreeFileNode.getLineNum()
- "if the node is the root then return the root line no.
- if self.isRoot()
- return s:TreeFileNode.GetRootLineNum()
- endif
-
- let totalLines = line("$")
-
- "the path components we have matched so far
- let pathcomponents = [substitute(b:NERDTreeRoot.path.str({'format': 'UI'}), '/ *$', '', '')]
- "the index of the component we are searching for
- let curPathComponent = 1
-
- let fullpath = self.path.str({'format': 'UI'})
-
-
- let lnum = s:TreeFileNode.GetRootLineNum()
- while lnum > 0
- let lnum = lnum + 1
- "have we reached the bottom of the tree?
- if lnum ==# totalLines+1
- return -1
- endif
-
- let curLine = getline(lnum)
-
- let indent = s:indentLevelFor(curLine)
- if indent ==# curPathComponent
- let curLine = s:stripMarkupFromLine(curLine, 1)
-
- let curPath = join(pathcomponents, '/') . '/' . curLine
- if stridx(fullpath, curPath, 0) ==# 0
- if fullpath ==# curPath || strpart(fullpath, len(curPath)-1,1) ==# '/'
- let curLine = substitute(curLine, '/ *$', '', '')
- call add(pathcomponents, curLine)
- let curPathComponent = curPathComponent + 1
-
- if fullpath ==# curPath
- return lnum
- endif
- endif
- endif
- endif
- endwhile
- return -1
-endfunction
-
-"FUNCTION: TreeFileNode.GetRootForTab(){{{3
-"get the root node for this tab
-function! s:TreeFileNode.GetRootForTab()
- if s:treeExistsForTab()
- return getbufvar(t:NERDTreeBufName, 'NERDTreeRoot')
- end
- return {}
-endfunction
-"FUNCTION: TreeFileNode.GetRootLineNum(){{{3
-"gets the line number of the root node
-function! s:TreeFileNode.GetRootLineNum()
- let rootLine = 1
- while getline(rootLine) !~ '^\(/\|<\)'
- let rootLine = rootLine + 1
- endwhile
- return rootLine
-endfunction
-
-"FUNCTION: TreeFileNode.GetSelected() {{{3
-"gets the treenode that the cursor is currently over
-function! s:TreeFileNode.GetSelected()
- try
- let path = s:getPath(line("."))
- if path ==# {}
- return {}
- endif
- return b:NERDTreeRoot.findNode(path)
- catch /NERDTree/
- return {}
- endtry
-endfunction
-"FUNCTION: TreeFileNode.isVisible() {{{3
-"returns 1 if this node should be visible according to the tree filters and
-"hidden file filters (and their on/off status)
-function! s:TreeFileNode.isVisible()
- return !self.path.ignore()
-endfunction
-"FUNCTION: TreeFileNode.isRoot() {{{3
-"returns 1 if this node is b:NERDTreeRoot
-function! s:TreeFileNode.isRoot()
- if !s:treeExistsForBuf()
- throw "NERDTree.NoTreeError: No tree exists for the current buffer"
- endif
-
- return self.equals(b:NERDTreeRoot)
-endfunction
-
-"FUNCTION: TreeFileNode.makeRoot() {{{3
-"Make this node the root of the tree
-function! s:TreeFileNode.makeRoot()
- if self.path.isDirectory
- let b:NERDTreeRoot = self
- else
- call self.cacheParent()
- let b:NERDTreeRoot = self.parent
- endif
-
- call b:NERDTreeRoot.open()
-
- "change dir to the dir of the new root if instructed to
- if g:NERDTreeChDirMode ==# 2
- exec "cd " . b:NERDTreeRoot.path.str({'format': 'Edit'})
- endif
-endfunction
-"FUNCTION: TreeFileNode.New(path) {{{3
-"Returns a new TreeNode object with the given path and parent
-"
-"Args:
-"path: a path object representing the full filesystem path to the file/dir that the node represents
-function! s:TreeFileNode.New(path)
- if a:path.isDirectory
- return s:TreeDirNode.New(a:path)
- else
- let newTreeNode = copy(self)
- let newTreeNode.path = a:path
- let newTreeNode.parent = {}
- return newTreeNode
- endif
-endfunction
-
-"FUNCTION: TreeFileNode.open() {{{3
-"Open the file represented by the given node in the current window, splitting
-"the window if needed
-"
-"ARGS:
-"treenode: file node to open
-function! s:TreeFileNode.open()
- if b:NERDTreeType ==# "secondary"
- exec 'edit ' . self.path.str({'format': 'Edit'})
- return
- endif
-
- "if the file is already open in this tab then just stick the cursor in it
- let winnr = bufwinnr('^' . self.path.str() . '$')
- if winnr != -1
- call s:exec(winnr . "wincmd w")
-
- else
- if !s:isWindowUsable(winnr("#")) && s:firstUsableWindow() ==# -1
- call self.openSplit()
- else
- try
- if !s:isWindowUsable(winnr("#"))
- call s:exec(s:firstUsableWindow() . "wincmd w")
- else
- call s:exec('wincmd p')
- endif
- exec ("edit " . self.path.str({'format': 'Edit'}))
- catch /^Vim\%((\a\+)\)\=:E37/
- call s:putCursorInTreeWin()
- throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self.path.str() ." is already open and modified."
- catch /^Vim\%((\a\+)\)\=:/
- echo v:exception
- endtry
- endif
- endif
-endfunction
-"FUNCTION: TreeFileNode.openSplit() {{{3
-"Open this node in a new window
-function! s:TreeFileNode.openSplit()
-
- if b:NERDTreeType ==# "secondary"
- exec "split " . self.path.str({'format': 'Edit'})
- return
- endif
-
- " Save the user's settings for splitbelow and splitright
- let savesplitbelow=&splitbelow
- let savesplitright=&splitright
-
- " 'there' will be set to a command to move from the split window
- " back to the explorer window
- "
- " 'back' will be set to a command to move from the explorer window
- " back to the newly split window
- "
- " 'right' and 'below' will be set to the settings needed for
- " splitbelow and splitright IF the explorer is the only window.
- "
- let there= g:NERDTreeWinPos ==# "left" ? "wincmd h" : "wincmd l"
- let back = g:NERDTreeWinPos ==# "left" ? "wincmd l" : "wincmd h"
- let right= g:NERDTreeWinPos ==# "left"
- let below=0
-
- " Attempt to go to adjacent window
- call s:exec(back)
-
- let onlyOneWin = (winnr("$") ==# 1)
-
- " If no adjacent window, set splitright and splitbelow appropriately
- if onlyOneWin
- let &splitright=right
- let &splitbelow=below
- else
- " found adjacent window - invert split direction
- let &splitright=!right
- let &splitbelow=!below
- endif
-
- let splitMode = onlyOneWin ? "vertical" : ""
-
- " Open the new window
- try
- exec(splitMode." sp " . self.path.str({'format': 'Edit'}))
- catch /^Vim\%((\a\+)\)\=:E37/
- call s:putCursorInTreeWin()
- throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self.path.str() ." is already open and modified."
- catch /^Vim\%((\a\+)\)\=:/
- "do nothing
- endtry
-
- "resize the tree window if no other window was open before
- if onlyOneWin
- let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize
- call s:exec(there)
- exec("silent ". splitMode ." resize ". size)
- call s:exec('wincmd p')
- endif
-
- " Restore splitmode settings
- let &splitbelow=savesplitbelow
- let &splitright=savesplitright
-endfunction
-"FUNCTION: TreeFileNode.openVSplit() {{{3
-"Open this node in a new vertical window
-function! s:TreeFileNode.openVSplit()
- if b:NERDTreeType ==# "secondary"
- exec "vnew " . self.path.str({'format': 'Edit'})
- return
- endif
-
- let winwidth = winwidth(".")
- if winnr("$")==#1
- let winwidth = g:NERDTreeWinSize
- endif
-
- call s:exec("wincmd p")
- exec "vnew " . self.path.str({'format': 'Edit'})
-
- "resize the nerd tree back to the original size
- call s:putCursorInTreeWin()
- exec("silent vertical resize ". winwidth)
- call s:exec('wincmd p')
-endfunction
-"FUNCTION: TreeFileNode.openInNewTab(options) {{{3
-function! s:TreeFileNode.openInNewTab(options)
- let currentTab = tabpagenr()
-
- if !has_key(a:options, 'keepTreeOpen')
- call s:closeTreeIfQuitOnOpen()
- endif
-
- exec "tabedit " . self.path.str({'format': 'Edit'})
-
- if has_key(a:options, 'stayInCurrentTab') && a:options['stayInCurrentTab']
- exec "tabnext " . currentTab
- endif
-
-endfunction
-"FUNCTION: TreeFileNode.putCursorHere(isJump, recurseUpward){{{3
-"Places the cursor on the line number this node is rendered on
-"
-"Args:
-"isJump: 1 if this cursor movement should be counted as a jump by vim
-"recurseUpward: try to put the cursor on the parent if the this node isnt
-"visible
-function! s:TreeFileNode.putCursorHere(isJump, recurseUpward)
- let ln = self.getLineNum()
- if ln != -1
- if a:isJump
- mark '
- endif
- call cursor(ln, col("."))
- else
- if a:recurseUpward
- let node = self
- while node != {} && node.getLineNum() ==# -1
- let node = node.parent
- call node.open()
- endwhile
- call s:renderView()
- call node.putCursorHere(a:isJump, 0)
- endif
- endif
-endfunction
-
-"FUNCTION: TreeFileNode.refresh() {{{3
-function! s:TreeFileNode.refresh()
- call self.path.refresh()
-endfunction
-"FUNCTION: TreeFileNode.rename() {{{3
-"Calls the rename method for this nodes path obj
-function! s:TreeFileNode.rename(newName)
- let newName = substitute(a:newName, '\(\\\|\/\)$', '', '')
- call self.path.rename(newName)
- call self.parent.removeChild(self)
-
- let parentPath = self.path.getParent()
- let newParent = b:NERDTreeRoot.findNode(parentPath)
-
- if newParent != {}
- call newParent.createChild(self.path, 1)
- call newParent.refresh()
- endif
-endfunction
-"FUNCTION: TreeFileNode.renderToString {{{3
-"returns a string representation for this tree to be rendered in the view
-function! s:TreeFileNode.renderToString()
- return self._renderToString(0, 0, [], self.getChildCount() ==# 1)
-endfunction
-
-
-"Args:
-"depth: the current depth in the tree for this call
-"drawText: 1 if we should actually draw the line for this node (if 0 then the
-"child nodes are rendered only)
-"vertMap: a binary array that indicates whether a vertical bar should be draw
-"for each depth in the tree
-"isLastChild:true if this curNode is the last child of its parent
-function! s:TreeFileNode._renderToString(depth, drawText, vertMap, isLastChild)
- let output = ""
- if a:drawText ==# 1
-
- let treeParts = ''
-
- "get all the leading spaces and vertical tree parts for this line
- if a:depth > 1
- for j in a:vertMap[0:-2]
- let treeParts = treeParts . ' '
- endfor
- endif
-
- if self.path.isDirectory
- if self.isOpen
- let treeParts = treeParts . '▼ '
- else
- let treeParts = treeParts . '▶ '
- endif
- else
- let treeParts = treeParts . ''
- endif
-
- let line = treeParts . self.displayString()
-
- let output = output . line . "\n"
- endif
-
- "if the node is an open dir, draw its children
- if self.path.isDirectory ==# 1 && self.isOpen ==# 1
-
- let childNodesToDraw = self.getVisibleChildren()
- if len(childNodesToDraw) > 0
-
- "draw all the nodes children except the last
- let lastIndx = len(childNodesToDraw)-1
- if lastIndx > 0
- for i in childNodesToDraw[0:lastIndx-1]
- let output = output . i._renderToString(a:depth + 1, 1, add(copy(a:vertMap), 1), 0)
- endfor
- endif
-
- "draw the last child, indicating that it IS the last
- let output = output . childNodesToDraw[lastIndx]._renderToString(a:depth + 1, 1, add(copy(a:vertMap), 0), 1)
- endif
- endif
-
- return output
-endfunction
-"CLASS: TreeDirNode {{{2
-"This class is a child of the TreeFileNode class and constitutes the
-"'Composite' part of the composite design pattern between the treenode
-"classes.
-"============================================================
-let s:TreeDirNode = copy(s:TreeFileNode)
-"FUNCTION: TreeDirNode.AbsoluteTreeRoot(){{{3
-"class method that returns the highest cached ancestor of the current root
-function! s:TreeDirNode.AbsoluteTreeRoot()
- let currentNode = b:NERDTreeRoot
- while currentNode.parent != {}
- let currentNode = currentNode.parent
- endwhile
- return currentNode
-endfunction
-"FUNCTION: TreeDirNode.activate(forceKeepWinOpen) {{{3
-unlet s:TreeDirNode.activate
-function! s:TreeDirNode.activate(forceKeepWinOpen)
- call self.toggleOpen()
- call s:renderView()
- call self.putCursorHere(0, 0)
-endfunction
-"FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{3
-"Adds the given treenode to the list of children for this node
-"
-"Args:
-"-treenode: the node to add
-"-inOrder: 1 if the new node should be inserted in sorted order
-function! s:TreeDirNode.addChild(treenode, inOrder)
- call add(self.children, a:treenode)
- let a:treenode.parent = self
-
- if a:inOrder
- call self.sortChildren()
- endif
-endfunction
-
-"FUNCTION: TreeDirNode.close() {{{3
-"Closes this directory
-function! s:TreeDirNode.close()
- let self.isOpen = 0
-endfunction
-
-"FUNCTION: TreeDirNode.closeChildren() {{{3
-"Closes all the child dir nodes of this node
-function! s:TreeDirNode.closeChildren()
- for i in self.children
- if i.path.isDirectory
- call i.close()
- call i.closeChildren()
- endif
- endfor
-endfunction
-
-"FUNCTION: TreeDirNode.createChild(path, inOrder) {{{3
-"Instantiates a new child node for this node with the given path. The new
-"nodes parent is set to this node.
-"
-"Args:
-"path: a Path object that this node will represent/contain
-"inOrder: 1 if the new node should be inserted in sorted order
-"
-"Returns:
-"the newly created node
-function! s:TreeDirNode.createChild(path, inOrder)
- let newTreeNode = s:TreeFileNode.New(a:path)
- call self.addChild(newTreeNode, a:inOrder)
- return newTreeNode
-endfunction
-
-"FUNCTION: TreeDirNode.findNode(path) {{{3
-"Will find one of the children (recursively) that has the given path
-"
-"Args:
-"path: a path object
-unlet s:TreeDirNode.findNode
-function! s:TreeDirNode.findNode(path)
- if a:path.equals(self.path)
- return self
- endif
- if stridx(a:path.str(), self.path.str(), 0) ==# -1
- return {}
- endif
-
- if self.path.isDirectory
- for i in self.children
- let retVal = i.findNode(a:path)
- if retVal != {}
- return retVal
- endif
- endfor
- endif
- return {}
-endfunction
-"FUNCTION: TreeDirNode.getChildCount() {{{3
-"Returns the number of children this node has
-function! s:TreeDirNode.getChildCount()
- return len(self.children)
-endfunction
-
-"FUNCTION: TreeDirNode.getChild(path) {{{3
-"Returns child node of this node that has the given path or {} if no such node
-"exists.
-"
-"This function doesnt not recurse into child dir nodes
-"
-"Args:
-"path: a path object
-function! s:TreeDirNode.getChild(path)
- if stridx(a:path.str(), self.path.str(), 0) ==# -1
- return {}
- endif
-
- let index = self.getChildIndex(a:path)
- if index ==# -1
- return {}
- else
- return self.children[index]
- endif
-
-endfunction
-
-"FUNCTION: TreeDirNode.getChildByIndex(indx, visible) {{{3
-"returns the child at the given index
-"Args:
-"indx: the index to get the child from
-"visible: 1 if only the visible children array should be used, 0 if all the
-"children should be searched.
-function! s:TreeDirNode.getChildByIndex(indx, visible)
- let array_to_search = a:visible? self.getVisibleChildren() : self.children
- if a:indx > len(array_to_search)
- throw "NERDTree.InvalidArgumentsError: Index is out of bounds."
- endif
- return array_to_search[a:indx]
-endfunction
-
-"FUNCTION: TreeDirNode.getChildIndex(path) {{{3
-"Returns the index of the child node of this node that has the given path or
-"-1 if no such node exists.
-"
-"This function doesnt not recurse into child dir nodes
-"
-"Args:
-"path: a path object
-function! s:TreeDirNode.getChildIndex(path)
- if stridx(a:path.str(), self.path.str(), 0) ==# -1
- return -1
- endif
-
- "do a binary search for the child
- let a = 0
- let z = self.getChildCount()
- while a < z
- let mid = (a+z)/2
- let diff = a:path.compareTo(self.children[mid].path)
-
- if diff ==# -1
- let z = mid
- elseif diff ==# 1
- let a = mid+1
- else
- return mid
- endif
- endwhile
- return -1
-endfunction
-
-"FUNCTION: TreeDirNode.GetSelected() {{{3
-"Returns the current node if it is a dir node, or else returns the current
-"nodes parent
-unlet s:TreeDirNode.GetSelected
-function! s:TreeDirNode.GetSelected()
- let currentDir = s:TreeFileNode.GetSelected()
- if currentDir != {} && !currentDir.isRoot()
- if currentDir.path.isDirectory ==# 0
- let currentDir = currentDir.parent
- endif
- endif
- return currentDir
-endfunction
-"FUNCTION: TreeDirNode.getVisibleChildCount() {{{3
-"Returns the number of visible children this node has
-function! s:TreeDirNode.getVisibleChildCount()
- return len(self.getVisibleChildren())
-endfunction
-
-"FUNCTION: TreeDirNode.getVisibleChildren() {{{3
-"Returns a list of children to display for this node, in the correct order
-"
-"Return:
-"an array of treenodes
-function! s:TreeDirNode.getVisibleChildren()
- let toReturn = []
- for i in self.children
- if i.path.ignore() ==# 0
- call add(toReturn, i)
- endif
- endfor
- return toReturn
-endfunction
-
-"FUNCTION: TreeDirNode.hasVisibleChildren() {{{3
-"returns 1 if this node has any childre, 0 otherwise..
-function! s:TreeDirNode.hasVisibleChildren()
- return self.getVisibleChildCount() != 0
-endfunction
-
-"FUNCTION: TreeDirNode._initChildren() {{{3
-"Removes all childen from this node and re-reads them
-"
-"Args:
-"silent: 1 if the function should not echo any "please wait" messages for
-"large directories
-"
-"Return: the number of child nodes read
-function! s:TreeDirNode._initChildren(silent)
- "remove all the current child nodes
- let self.children = []
-
- "get an array of all the files in the nodes dir
- let dir = self.path
- let globDir = dir.str({'format': 'Glob'})
- let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*')
- let files = split(filesStr, "\n")
-
- if !a:silent && len(files) > g:NERDTreeNotificationThreshold
- call s:echo("Please wait, caching a large dir ...")
- endif
-
- let invalidFilesFound = 0
- for i in files
-
- "filter out the .. and . directories
- "Note: we must match .. AND ../ cos sometimes the globpath returns
- "../ for path with strange chars (eg $)
- if i !~ '\/\.\.\/\?$' && i !~ '\/\.\/\?$'
-
- "put the next file in a new node and attach it
- try
- let path = s:Path.New(i)
- call self.createChild(path, 0)
- catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/
- let invalidFilesFound += 1
- endtry
- endif
- endfor
-
- call self.sortChildren()
-
- if !a:silent && len(files) > g:NERDTreeNotificationThreshold
- call s:echo("Please wait, caching a large dir ... DONE (". self.getChildCount() ." nodes cached).")
- endif
-
- if invalidFilesFound
- call s:echoWarning(invalidFilesFound . " file(s) could not be loaded into the NERD tree")
- endif
- return self.getChildCount()
-endfunction
-"FUNCTION: TreeDirNode.New(path) {{{3
-"Returns a new TreeNode object with the given path and parent
-"
-"Args:
-"path: a path object representing the full filesystem path to the file/dir that the node represents
-unlet s:TreeDirNode.New
-function! s:TreeDirNode.New(path)
- if a:path.isDirectory != 1
- throw "NERDTree.InvalidArgumentsError: A TreeDirNode object must be instantiated with a directory Path object."
- endif
-
- let newTreeNode = copy(self)
- let newTreeNode.path = a:path
-
- let newTreeNode.isOpen = 0
- let newTreeNode.children = []
-
- let newTreeNode.parent = {}
-
- return newTreeNode
-endfunction
-"FUNCTION: TreeDirNode.open() {{{3
-"Reads in all this nodes children
-"
-"Return: the number of child nodes read
-unlet s:TreeDirNode.open
-function! s:TreeDirNode.open()
- let self.isOpen = 1
- if self.children ==# []
- return self._initChildren(0)
- else
- return 0
- endif
-endfunction
-
-" FUNCTION: TreeDirNode.openExplorer() {{{3
-" opens an explorer window for this node in the previous window (could be a
-" nerd tree or a netrw)
-function! s:TreeDirNode.openExplorer()
- let oldwin = winnr()
- call s:exec('wincmd p')
- if oldwin ==# winnr() || (&modified && s:bufInWindows(winbufnr(winnr())) < 2)
- call s:exec('wincmd p')
- call self.openSplit()
- else
- exec ("silent edit " . self.path.str({'format': 'Edit'}))
- endif
-endfunction
-"FUNCTION: TreeDirNode.openInNewTab(options) {{{3
-unlet s:TreeDirNode.openInNewTab
-function! s:TreeDirNode.openInNewTab(options)
- let currentTab = tabpagenr()
-
- if !has_key(a:options, 'keepTreeOpen') || !a:options['keepTreeOpen']
- call s:closeTreeIfQuitOnOpen()
- endif
-
- tabnew
- call s:initNerdTree(self.path.str())
-
- if has_key(a:options, 'stayInCurrentTab') && a:options['stayInCurrentTab']
- exec "tabnext " . currentTab
- endif
-endfunction
-"FUNCTION: TreeDirNode.openRecursively() {{{3
-"Opens this treenode and all of its children whose paths arent 'ignored'
-"because of the file filters.
-"
-"This method is actually a wrapper for the OpenRecursively2 method which does
-"the work.
-function! s:TreeDirNode.openRecursively()
- call self._openRecursively2(1)
-endfunction
-
-"FUNCTION: TreeDirNode._openRecursively2() {{{3
-"Opens this all children of this treenode recursively if either:
-" *they arent filtered by file filters
-" *a:forceOpen is 1
-"
-"Args:
-"forceOpen: 1 if this node should be opened regardless of file filters
-function! s:TreeDirNode._openRecursively2(forceOpen)
- if self.path.ignore() ==# 0 || a:forceOpen
- let self.isOpen = 1
- if self.children ==# []
- call self._initChildren(1)
- endif
-
- for i in self.children
- if i.path.isDirectory ==# 1
- call i._openRecursively2(0)
- endif
- endfor
- endif
-endfunction
-
-"FUNCTION: TreeDirNode.refresh() {{{3
-unlet s:TreeDirNode.refresh
-function! s:TreeDirNode.refresh()
- call self.path.refresh()
-
- "if this node was ever opened, refresh its children
- if self.isOpen || !empty(self.children)
- "go thru all the files/dirs under this node
- let newChildNodes = []
- let invalidFilesFound = 0
- let dir = self.path
- let globDir = dir.str({'format': 'Glob'})
- let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*')
- let files = split(filesStr, "\n")
- for i in files
- "filter out the .. and . directories
- "Note: we must match .. AND ../ cos sometimes the globpath returns
- "../ for path with strange chars (eg $)
- if i !~ '\/\.\.\/\?$' && i !~ '\/\.\/\?$'
-
- try
- "create a new path and see if it exists in this nodes children
- let path = s:Path.New(i)
- let newNode = self.getChild(path)
- if newNode != {}
- call newNode.refresh()
- call add(newChildNodes, newNode)
-
- "the node doesnt exist so create it
- else
- let newNode = s:TreeFileNode.New(path)
- let newNode.parent = self
- call add(newChildNodes, newNode)
- endif
-
-
- catch /^NERDTree.InvalidArgumentsError/
- let invalidFilesFound = 1
- endtry
- endif
- endfor
-
- "swap this nodes children out for the children we just read/refreshed
- let self.children = newChildNodes
- call self.sortChildren()
-
- if invalidFilesFound
- call s:echoWarning("some files could not be loaded into the NERD tree")
- endif
- endif
-endfunction
-
-"FUNCTION: TreeDirNode.reveal(path) {{{3
-"reveal the given path, i.e. cache and open all treenodes needed to display it
-"in the UI
-function! s:TreeDirNode.reveal(path)
- if !a:path.isUnder(self.path)
- throw "NERDTree.InvalidArgumentsError: " . a:path.str() . " should be under " . self.path.str()
- endif
-
- call self.open()
-
- if self.path.equals(a:path.getParent())
- let n = self.findNode(a:path)
- call s:renderView()
- call n.putCursorHere(1,0)
- return
- endif
-
- let p = a:path
- while !p.getParent().equals(self.path)
- let p = p.getParent()
- endwhile
-
- let n = self.findNode(p)
- call n.reveal(a:path)
-endfunction
-"FUNCTION: TreeDirNode.removeChild(treenode) {{{3
-"
-"Removes the given treenode from this nodes set of children
-"
-"Args:
-"treenode: the node to remove
-"
-"Throws a NERDTree.ChildNotFoundError if the given treenode is not found
-function! s:TreeDirNode.removeChild(treenode)
- for i in range(0, self.getChildCount()-1)
- if self.children[i].equals(a:treenode)
- call remove(self.children, i)
- return
- endif
- endfor
-
- throw "NERDTree.ChildNotFoundError: child node was not found"
-endfunction
-
-"FUNCTION: TreeDirNode.sortChildren() {{{3
-"
-"Sorts the children of this node according to alphabetical order and the
-"directory priority.
-"
-function! s:TreeDirNode.sortChildren()
- let CompareFunc = function("s:compareNodes")
- call sort(self.children, CompareFunc)
-endfunction
-
-"FUNCTION: TreeDirNode.toggleOpen() {{{3
-"Opens this directory if it is closed and vice versa
-function! s:TreeDirNode.toggleOpen()
- if self.isOpen ==# 1
- call self.close()
- else
- call self.open()
- endif
-endfunction
-
-"FUNCTION: TreeDirNode.transplantChild(newNode) {{{3
-"Replaces the child of this with the given node (where the child node's full
-"path matches a:newNode's fullpath). The search for the matching node is
-"non-recursive
-"
-"Arg:
-"newNode: the node to graft into the tree
-function! s:TreeDirNode.transplantChild(newNode)
- for i in range(0, self.getChildCount()-1)
- if self.children[i].equals(a:newNode)
- let self.children[i] = a:newNode
- let a:newNode.parent = self
- break
- endif
- endfor
-endfunction
-"============================================================
-"CLASS: Path {{{2
-"============================================================
-let s:Path = {}
-"FUNCTION: Path.AbsolutePathFor(str) {{{3
-function! s:Path.AbsolutePathFor(str)
- let prependCWD = 0
- if s:running_windows
- let prependCWD = a:str !~ '^.:\(\\\|\/\)'
- else
- let prependCWD = a:str !~ '^/'
- endif
-
- let toReturn = a:str
- if prependCWD
- let toReturn = getcwd() . s:Path.Slash() . a:str
- endif
-
- return toReturn
-endfunction
-"FUNCTION: Path.bookmarkNames() {{{3
-function! s:Path.bookmarkNames()
- if !exists("self._bookmarkNames")
- call self.cacheDisplayString()
- endif
- return self._bookmarkNames
-endfunction
-"FUNCTION: Path.cacheDisplayString() {{{3
-function! s:Path.cacheDisplayString()
- let self.cachedDisplayString = self.getLastPathComponent(1)
-
- if self.isExecutable
- let self.cachedDisplayString = self.cachedDisplayString . '*'
- endif
-
- let self._bookmarkNames = []
- for i in s:Bookmark.Bookmarks()
- if i.path.equals(self)
- call add(self._bookmarkNames, i.name)
- endif
- endfor
- if !empty(self._bookmarkNames)
- let self.cachedDisplayString .= ' {' . join(self._bookmarkNames) . '}'
- endif
-
- if self.isSymLink
- let self.cachedDisplayString .= ' -> ' . self.symLinkDest
- endif
-
- if self.isReadOnly
- let self.cachedDisplayString .= ' [RO]'
- endif
-endfunction
-"FUNCTION: Path.changeToDir() {{{3
-function! s:Path.changeToDir()
- let dir = self.str({'format': 'Cd'})
- if self.isDirectory ==# 0
- let dir = self.getParent().str({'format': 'Cd'})
- endif
-
- try
- execute "cd " . dir
- call s:echo("CWD is now: " . getcwd())
- catch
- throw "NERDTree.PathChangeError: cannot change CWD to " . dir
- endtry
-endfunction
-
-"FUNCTION: Path.compareTo() {{{3
-"
-"Compares this Path to the given path and returns 0 if they are equal, -1 if
-"this Path is "less than" the given path, or 1 if it is "greater".
-"
-"Args:
-"path: the path object to compare this to
-"
-"Return:
-"1, -1 or 0
-function! s:Path.compareTo(path)
- let thisPath = self.getLastPathComponent(1)
- let thatPath = a:path.getLastPathComponent(1)
-
- "if the paths are the same then clearly we return 0
- if thisPath ==# thatPath
- return 0
- endif
-
- let thisSS = self.getSortOrderIndex()
- let thatSS = a:path.getSortOrderIndex()
-
- "compare the sort sequences, if they are different then the return
- "value is easy
- if thisSS < thatSS
- return -1
- elseif thisSS > thatSS
- return 1
- else
- "if the sort sequences are the same then compare the paths
- "alphabetically
- let pathCompare = g:NERDTreeCaseSensitiveSort ? thisPath <# thatPath : thisPath <? thatPath
- if pathCompare
- return -1
- else
- return 1
- endif
- endif
-endfunction
-
-"FUNCTION: Path.Create(fullpath) {{{3
-"
-"Factory method.
-"
-"Creates a path object with the given path. The path is also created on the
-"filesystem. If the path already exists, a NERDTree.Path.Exists exception is
-"thrown. If any other errors occur, a NERDTree.Path exception is thrown.
-"
-"Args:
-"fullpath: the full filesystem path to the file/dir to create
-function! s:Path.Create(fullpath)
- "bail if the a:fullpath already exists
- if isdirectory(a:fullpath) || filereadable(a:fullpath)
- throw "NERDTree.CreatePathError: Directory Exists: '" . a:fullpath . "'"
- endif
-
- try
-
- "if it ends with a slash, assume its a dir create it
- if a:fullpath =~ '\(\\\|\/\)$'
- "whack the trailing slash off the end if it exists
- let fullpath = substitute(a:fullpath, '\(\\\|\/\)$', '', '')
-
- call mkdir(fullpath, 'p')
-
- "assume its a file and create
- else
- call writefile([], a:fullpath)
- endif
- catch
- throw "NERDTree.CreatePathError: Could not create path: '" . a:fullpath . "'"
- endtry
-
- return s:Path.New(a:fullpath)
-endfunction
-
-"FUNCTION: Path.copy(dest) {{{3
-"
-"Copies the file/dir represented by this Path to the given location
-"
-"Args:
-"dest: the location to copy this dir/file to
-function! s:Path.copy(dest)
- if !s:Path.CopyingSupported()
- throw "NERDTree.CopyingNotSupportedError: Copying is not supported on this OS"
- endif
-
- let dest = s:Path.WinToUnixPath(a:dest)
-
- let cmd = g:NERDTreeCopyCmd . " " . self.str() . " " . dest
- let success = system(cmd)
- if success != 0
- throw "NERDTree.CopyError: Could not copy ''". self.str() ."'' to: '" . a:dest . "'"
- endif
-endfunction
-
-"FUNCTION: Path.CopyingSupported() {{{3
-"
-"returns 1 if copying is supported for this OS
-function! s:Path.CopyingSupported()
- return exists('g:NERDTreeCopyCmd')
-endfunction
-
-
-"FUNCTION: Path.copyingWillOverwrite(dest) {{{3
-"
-"returns 1 if copy this path to the given location will cause files to
-"overwritten
-"
-"Args:
-"dest: the location this path will be copied to
-function! s:Path.copyingWillOverwrite(dest)
- if filereadable(a:dest)
- return 1
- endif
-
- if isdirectory(a:dest)
- let path = s:Path.JoinPathStrings(a:dest, self.getLastPathComponent(0))
- if filereadable(path)
- return 1
- endif
- endif
-endfunction
-
-"FUNCTION: Path.delete() {{{3
-"
-"Deletes the file represented by this path.
-"Deletion of directories is not supported
-"
-"Throws NERDTree.Path.Deletion exceptions
-function! s:Path.delete()
- if self.isDirectory
-
- let cmd = g:NERDTreeRemoveDirCmd . self.str({'escape': 1})
- let success = system(cmd)
-
- if v:shell_error != 0
- throw "NERDTree.PathDeletionError: Could not delete directory: '" . self.str() . "'"
- endif
- else
- let success = delete(self.str())
- if success != 0
- throw "NERDTree.PathDeletionError: Could not delete file: '" . self.str() . "'"
- endif
- endif
-
- "delete all bookmarks for this path
- for i in self.bookmarkNames()
- let bookmark = s:Bookmark.BookmarkFor(i)
- call bookmark.delete()
- endfor
-endfunction
-
-"FUNCTION: Path.displayString() {{{3
-"
-"Returns a string that specifies how the path should be represented as a
-"string
-function! s:Path.displayString()
- if self.cachedDisplayString ==# ""
- call self.cacheDisplayString()
- endif
-
- return self.cachedDisplayString
-endfunction
-"FUNCTION: Path.extractDriveLetter(fullpath) {{{3
-"
-"If running windows, cache the drive letter for this path
-function! s:Path.extractDriveLetter(fullpath)
- if s:running_windows
- let self.drive = substitute(a:fullpath, '\(^[a-zA-Z]:\).*', '\1', '')
- else
- let self.drive = ''
- endif
-
-endfunction
-"FUNCTION: Path.exists() {{{3
-"return 1 if this path points to a location that is readable or is a directory
-function! s:Path.exists()
- let p = self.str()
- return filereadable(p) || isdirectory(p)
-endfunction
-"FUNCTION: Path.getDir() {{{3
-"
-"Returns this path if it is a directory, else this paths parent.
-"
-"Return:
-"a Path object
-function! s:Path.getDir()
- if self.isDirectory
- return self
- else
- return self.getParent()
- endif
-endfunction
-"FUNCTION: Path.getParent() {{{3
-"
-"Returns a new path object for this paths parent
-"
-"Return:
-"a new Path object
-function! s:Path.getParent()
- if s:running_windows
- let path = self.drive . '\' . join(self.pathSegments[0:-2], '\')
- else
- let path = '/'. join(self.pathSegments[0:-2], '/')
- endif
-
- return s:Path.New(path)
-endfunction
-"FUNCTION: Path.getLastPathComponent(dirSlash) {{{3
-"
-"Gets the last part of this path.
-"
-"Args:
-"dirSlash: if 1 then a trailing slash will be added to the returned value for
-"directory nodes.
-function! s:Path.getLastPathComponent(dirSlash)
- if empty(self.pathSegments)
- return ''
- endif
- let toReturn = self.pathSegments[-1]
- if a:dirSlash && self.isDirectory
- let toReturn = toReturn . '/'
- endif
- return toReturn
-endfunction
-
-"FUNCTION: Path.getSortOrderIndex() {{{3
-"returns the index of the pattern in g:NERDTreeSortOrder that this path matches
-function! s:Path.getSortOrderIndex()
- let i = 0
- while i < len(g:NERDTreeSortOrder)
- if self.getLastPathComponent(1) =~ g:NERDTreeSortOrder[i]
- return i
- endif
- let i = i + 1
- endwhile
- return s:NERDTreeSortStarIndex
-endfunction
-
-"FUNCTION: Path.ignore() {{{3
-"returns true if this path should be ignored
-function! s:Path.ignore()
- let lastPathComponent = self.getLastPathComponent(0)
-
- "filter out the user specified paths to ignore
- if b:NERDTreeIgnoreEnabled
- for i in g:NERDTreeIgnore
- if lastPathComponent =~ i
- return 1
- endif
- endfor
- endif
-
- "dont show hidden files unless instructed to
- if b:NERDTreeShowHidden ==# 0 && lastPathComponent =~ '^\.'
- return 1
- endif
-
- if b:NERDTreeShowFiles ==# 0 && self.isDirectory ==# 0
- return 1
- endif
-
- return 0
-endfunction
-
-"FUNCTION: Path.isUnder(path) {{{3
-"return 1 if this path is somewhere under the given path in the filesystem.
-"
-"a:path should be a dir
-function! s:Path.isUnder(path)
- if a:path.isDirectory == 0
- return 0
- endif
-
- let this = self.str()
- let that = a:path.str()
- return stridx(this, that . s:Path.Slash()) == 0
-endfunction
-
-"FUNCTION: Path.JoinPathStrings(...) {{{3
-function! s:Path.JoinPathStrings(...)
- let components = []
- for i in a:000
- let components = extend(components, split(i, '/'))
- endfor
- return '/' . join(components, '/')
-endfunction
-
-"FUNCTION: Path.equals() {{{3
-"
-"Determines whether 2 path objects are "equal".
-"They are equal if the paths they represent are the same
-"
-"Args:
-"path: the other path obj to compare this with
-function! s:Path.equals(path)
- return self.str() ==# a:path.str()
-endfunction
-
-"FUNCTION: Path.New() {{{3
-"The Constructor for the Path object
-function! s:Path.New(path)
- let newPath = copy(self)
-
- call newPath.readInfoFromDisk(s:Path.AbsolutePathFor(a:path))
-
- let newPath.cachedDisplayString = ""
-
- return newPath
-endfunction
-
-"FUNCTION: Path.Slash() {{{3
-"return the slash to use for the current OS
-function! s:Path.Slash()
- return s:running_windows ? '\' : '/'
-endfunction
-
-"FUNCTION: Path.readInfoFromDisk(fullpath) {{{3
-"
-"
-"Throws NERDTree.Path.InvalidArguments exception.
-function! s:Path.readInfoFromDisk(fullpath)
- call self.extractDriveLetter(a:fullpath)
-
- let fullpath = s:Path.WinToUnixPath(a:fullpath)
-
- if getftype(fullpath) ==# "fifo"
- throw "NERDTree.InvalidFiletypeError: Cant handle FIFO files: " . a:fullpath
- endif
-
- let self.pathSegments = split(fullpath, '/')
-
- let self.isReadOnly = 0
- if isdirectory(a:fullpath)
- let self.isDirectory = 1
- elseif filereadable(a:fullpath)
- let self.isDirectory = 0
- let self.isReadOnly = filewritable(a:fullpath) ==# 0
- else
- throw "NERDTree.InvalidArgumentsError: Invalid path = " . a:fullpath
- endif
-
- let self.isExecutable = 0
- if !self.isDirectory
- let self.isExecutable = getfperm(a:fullpath) =~ 'x'
- endif
-
- "grab the last part of the path (minus the trailing slash)
- let lastPathComponent = self.getLastPathComponent(0)
-
- "get the path to the new node with the parent dir fully resolved
- let hardPath = resolve(self.strTrunk()) . '/' . lastPathComponent
-
- "if the last part of the path is a symlink then flag it as such
- let self.isSymLink = (resolve(hardPath) != hardPath)
- if self.isSymLink
- let self.symLinkDest = resolve(fullpath)
-
- "if the link is a dir then slap a / on the end of its dest
- if isdirectory(self.symLinkDest)
-
- "we always wanna treat MS windows shortcuts as files for
- "simplicity
- if hardPath !~ '\.lnk$'
-
- let self.symLinkDest = self.symLinkDest . '/'
- endif
- endif
- endif
-endfunction
-
-"FUNCTION: Path.refresh() {{{3
-function! s:Path.refresh()
- call self.readInfoFromDisk(self.str())
- call self.cacheDisplayString()
-endfunction
-
-"FUNCTION: Path.rename() {{{3
-"
-"Renames this node on the filesystem
-function! s:Path.rename(newPath)
- if a:newPath ==# ''
- throw "NERDTree.InvalidArgumentsError: Invalid newPath for renaming = ". a:newPath
- endif
-
- let success = rename(self.str(), a:newPath)
- if success != 0
- throw "NERDTree.PathRenameError: Could not rename: '" . self.str() . "'" . 'to:' . a:newPath
- endif
- call self.readInfoFromDisk(a:newPath)
-
- for i in self.bookmarkNames()
- let b = s:Bookmark.BookmarkFor(i)
- call b.setPath(copy(self))
- endfor
- call s:Bookmark.Write()
-endfunction
-
-"FUNCTION: Path.str() {{{3
-"
-"Returns a string representation of this Path
-"
-"Takes an optional dictionary param to specify how the output should be
-"formatted.
-"
-"The dict may have the following keys:
-" 'format'
-" 'escape'
-" 'truncateTo'
-"
-"The 'format' key may have a value of:
-" 'Cd' - a string to be used with the :cd command
-" 'Edit' - a string to be used with :e :sp :new :tabedit etc
-" 'UI' - a string used in the NERD tree UI
-"
-"The 'escape' key, if specified will cause the output to be escaped with
-"shellescape()
-"
-"The 'truncateTo' key causes the resulting string to be truncated to the value
-"'truncateTo' maps to. A '<' char will be prepended.
-function! s:Path.str(...)
- let options = a:0 ? a:1 : {}
- let toReturn = ""
-
- if has_key(options, 'format')
- let format = options['format']
- if has_key(self, '_strFor' . format)
- exec 'let toReturn = self._strFor' . format . '()'
- else
- raise 'NERDTree.UnknownFormatError: unknown format "'. format .'"'
- endif
- else
- let toReturn = self._str()
- endif
-
- if has_key(options, 'escape') && options['escape']
- let toReturn = shellescape(toReturn)
- endif
-
- if has_key(options, 'truncateTo')
- let limit = options['truncateTo']
- if len(toReturn) > limit
- let toReturn = "<" . strpart(toReturn, len(toReturn) - limit + 1)
- endif
- endif
-
- return toReturn
-endfunction
-
-"FUNCTION: Path._strForUI() {{{3
-function! s:Path._strForUI()
- let toReturn = '/' . join(self.pathSegments, '/')
- if self.isDirectory && toReturn != '/'
- let toReturn = toReturn . '/'
- endif
- return toReturn
-endfunction
-
-"FUNCTION: Path._strForCd() {{{3
-"
-" returns a string that can be used with :cd
-function! s:Path._strForCd()
- return escape(self.str(), s:escape_chars)
-endfunction
-"FUNCTION: Path._strForEdit() {{{3
-"
-"Return: the string for this path that is suitable to be used with the :edit
-"command
-function! s:Path._strForEdit()
- let p = self.str({'format': 'UI'})
- let cwd = getcwd()
-
- if s:running_windows
- let p = tolower(self.str())
- let cwd = tolower(getcwd())
- endif
-
- let p = escape(p, s:escape_chars)
-
- let cwd = cwd . s:Path.Slash()
-
- "return a relative path if we can
- if stridx(p, cwd) ==# 0
- let p = strpart(p, strlen(cwd))
- endif
-
- if p ==# ''
- let p = '.'
- endif
-
- return p
-
-endfunction
-"FUNCTION: Path._strForGlob() {{{3
-function! s:Path._strForGlob()
- let lead = s:Path.Slash()
-
- "if we are running windows then slap a drive letter on the front
- if s:running_windows
- let lead = self.drive . '\'
- endif
-
- let toReturn = lead . join(self.pathSegments, s:Path.Slash())
-
- if !s:running_windows
- let toReturn = escape(toReturn, s:escape_chars)
- endif
- return toReturn
-endfunction
-"FUNCTION: Path._str() {{{3
-"
-"Gets the string path for this path object that is appropriate for the OS.
-"EG, in windows c:\foo\bar
-" in *nix /foo/bar
-function! s:Path._str()
- let lead = s:Path.Slash()
-
- "if we are running windows then slap a drive letter on the front
- if s:running_windows
- let lead = self.drive . '\'
- endif
-
- return lead . join(self.pathSegments, s:Path.Slash())
-endfunction
-
-"FUNCTION: Path.strTrunk() {{{3
-"Gets the path without the last segment on the end.
-function! s:Path.strTrunk()
- return self.drive . '/' . join(self.pathSegments[0:-2], '/')
-endfunction
-
-"FUNCTION: Path.WinToUnixPath(pathstr){{{3
-"Takes in a windows path and returns the unix equiv
-"
-"A class level method
-"
-"Args:
-"pathstr: the windows path to convert
-function! s:Path.WinToUnixPath(pathstr)
- if !s:running_windows
- return a:pathstr
- endif
-
- let toReturn = a:pathstr
-
- "remove the x:\ of the front
- let toReturn = substitute(toReturn, '^.*:\(\\\|/\)\?', '/', "")
-
- "convert all \ chars to /
- let toReturn = substitute(toReturn, '\', '/', "g")
-
- return toReturn
-endfunction
-
-" SECTION: General Functions {{{1
-"============================================================
-"FUNCTION: s:bufInWindows(bnum){{{2
-"[[STOLEN FROM VTREEEXPLORER.VIM]]
-"Determine the number of windows open to this buffer number.
-"Care of Yegappan Lakshman. Thanks!
-"
-"Args:
-"bnum: the subject buffers buffer number
-function! s:bufInWindows(bnum)
- let cnt = 0
- let winnum = 1
- while 1
- let bufnum = winbufnr(winnum)
- if bufnum < 0
- break
- endif
- if bufnum ==# a:bnum
- let cnt = cnt + 1
- endif
- let winnum = winnum + 1
- endwhile
-
- return cnt
-endfunction " >>>
-"FUNCTION: s:checkForBrowse(dir) {{{2
-"inits a secondary nerd tree in the current buffer if appropriate
-function! s:checkForBrowse(dir)
- if a:dir != '' && isdirectory(a:dir)
- call s:initNerdTreeInPlace(a:dir)
- endif
-endfunction
-"FUNCTION: s:compareBookmarks(first, second) {{{2
-"Compares two bookmarks
-function! s:compareBookmarks(first, second)
- return a:first.compareTo(a:second)
-endfunction
-
-" FUNCTION: s:completeBookmarks(A,L,P) {{{2
-" completion function for the bookmark commands
-function! s:completeBookmarks(A,L,P)
- return filter(s:Bookmark.BookmarkNames(), 'v:val =~ "^' . a:A . '"')
-endfunction
-" FUNCTION: s:exec(cmd) {{{2
-" same as :exec cmd but eventignore=all is set for the duration
-function! s:exec(cmd)
- let old_ei = &ei
- set ei=all
- exec a:cmd
- let &ei = old_ei
-endfunction
-" FUNCTION: s:findAndRevealPath() {{{2
-function! s:findAndRevealPath()
- try
- let p = s:Path.New(expand("%:p"))
- catch /^NERDTree.InvalidArgumentsError/
- call s:echo("no file for the current buffer")
- return
- endtry
-
- if !s:treeExistsForTab()
- call s:initNerdTree(p.getParent().str())
- else
- if !p.isUnder(s:TreeFileNode.GetRootForTab().path)
- call s:initNerdTree(p.getParent().str())
- else
- if !s:isTreeOpen()
- call s:toggle("")
- endif
- endif
- endif
- call s:putCursorInTreeWin()
- call b:NERDTreeRoot.reveal(p)
-endfunction
-"FUNCTION: s:initNerdTree(name) {{{2
-"Initialise the nerd tree for this tab. The tree will start in either the
-"given directory, or the directory associated with the given bookmark
-"
-"Args:
-"name: the name of a bookmark or a directory
-function! s:initNerdTree(name)
- let path = {}
- if s:Bookmark.BookmarkExistsFor(a:name)
- let path = s:Bookmark.BookmarkFor(a:name).path
- else
- let dir = a:name ==# '' ? getcwd() : a:name
-
- "hack to get an absolute path if a relative path is given
- if dir =~ '^\.'
- let dir = getcwd() . s:Path.Slash() . dir
- endif
- let dir = resolve(dir)
-
- try
- let path = s:Path.New(dir)
- catch /^NERDTree.InvalidArgumentsError/
- call s:echo("No bookmark or directory found for: " . a:name)
- return
- endtry
- endif
- if !path.isDirectory
- let path = path.getParent()
- endif
-
- "if instructed to, then change the vim CWD to the dir the NERDTree is
- "inited in
- if g:NERDTreeChDirMode != 0
- call path.changeToDir()
- endif
-
- if s:treeExistsForTab()
- if s:isTreeOpen()
- call s:closeTree()
- endif
- unlet t:NERDTreeBufName
- endif
-
- let newRoot = s:TreeDirNode.New(path)
- call newRoot.open()
-
- call s:createTreeWin()
- let b:treeShowHelp = 0
- let b:NERDTreeIgnoreEnabled = 1
- let b:NERDTreeShowFiles = g:NERDTreeShowFiles
- let b:NERDTreeShowHidden = g:NERDTreeShowHidden
- let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks
- let b:NERDTreeRoot = newRoot
-
- let b:NERDTreeType = "primary"
-
- call s:renderView()
- call b:NERDTreeRoot.putCursorHere(0, 0)
-endfunction
-
-"FUNCTION: s:initNerdTreeInPlace(dir) {{{2
-function! s:initNerdTreeInPlace(dir)
- try
- let path = s:Path.New(a:dir)
- catch /^NERDTree.InvalidArgumentsError/
- call s:echo("Invalid directory name:" . a:name)
- return
- endtry
-
- "we want the directory buffer to disappear when we do the :edit below
- setlocal bufhidden=wipe
-
- let previousBuf = expand("#")
-
- "we need a unique name for each secondary tree buffer to ensure they are
- "all independent
- exec "silent edit " . s:nextBufferName()
-
- let b:NERDTreePreviousBuf = bufnr(previousBuf)
-
- let b:NERDTreeRoot = s:TreeDirNode.New(path)
- call b:NERDTreeRoot.open()
-
- "throwaway buffer options
- setlocal noswapfile
- setlocal buftype=nofile
- setlocal bufhidden=hide
- setlocal nowrap
- setlocal foldcolumn=0
- setlocal nobuflisted
- setlocal nospell
- if g:NERDTreeShowLineNumbers
- setlocal nu
- else
- setlocal nonu
- endif
-
- iabc <buffer>
-
- if g:NERDTreeHighlightCursorline
- setlocal cursorline
- endif
-
- call s:setupStatusline()
-
- let b:treeShowHelp = 0
- let b:NERDTreeIgnoreEnabled = 1
- let b:NERDTreeShowFiles = g:NERDTreeShowFiles
- let b:NERDTreeShowHidden = g:NERDTreeShowHidden
- let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks
-
- let b:NERDTreeType = "secondary"
-
- call s:bindMappings()
- setfiletype nerdtree
- " syntax highlighting
- if has("syntax") && exists("g:syntax_on")
- call s:setupSyntaxHighlighting()
- endif
-
- call s:renderView()
-endfunction
-" FUNCTION: s:initNerdTreeMirror() {{{2
-function! s:initNerdTreeMirror()
-
- "get the names off all the nerd tree buffers
- let treeBufNames = []
- for i in range(1, tabpagenr("$"))
- let nextName = s:tabpagevar(i, 'NERDTreeBufName')
- if nextName != -1 && (!exists("t:NERDTreeBufName") || nextName != t:NERDTreeBufName)
- call add(treeBufNames, nextName)
- endif
- endfor
- let treeBufNames = s:unique(treeBufNames)
-
- "map the option names (that the user will be prompted with) to the nerd
- "tree buffer names
- let options = {}
- let i = 0
- while i < len(treeBufNames)
- let bufName = treeBufNames[i]
- let treeRoot = getbufvar(bufName, "NERDTreeRoot")
- let options[i+1 . '. ' . treeRoot.path.str() . ' (buf name: ' . bufName . ')'] = bufName
- let i = i + 1
- endwhile
-
- "work out which tree to mirror, if there is more than 1 then ask the user
- let bufferName = ''
- if len(keys(options)) > 1
- let choices = ["Choose a tree to mirror"]
- let choices = extend(choices, sort(keys(options)))
- let choice = inputlist(choices)
- if choice < 1 || choice > len(options) || choice ==# ''
- return
- endif
-
- let bufferName = options[sort(keys(options))[choice-1]]
- elseif len(keys(options)) ==# 1
- let bufferName = values(options)[0]
- else
- call s:echo("No trees to mirror")
- return
- endif
-
- if s:treeExistsForTab() && s:isTreeOpen()
- call s:closeTree()
- endif
-
- let t:NERDTreeBufName = bufferName
- call s:createTreeWin()
- exec 'buffer ' . bufferName
- if !&hidden
- call s:renderView()
- endif
-endfunction
-" FUNCTION: s:nextBufferName() {{{2
-" returns the buffer name for the next nerd tree
-function! s:nextBufferName()
- let name = s:NERDTreeBufName . s:next_buffer_number
- let s:next_buffer_number += 1
- return name
-endfunction
-" FUNCTION: s:tabpagevar(tabnr, var) {{{2
-function! s:tabpagevar(tabnr, var)
- let currentTab = tabpagenr()
- let old_ei = &ei
- set ei=all
-
- exec "tabnext " . a:tabnr
- let v = -1
- if exists('t:' . a:var)
- exec 'let v = t:' . a:var
- endif
- exec "tabnext " . currentTab
-
- let &ei = old_ei
-
- return v
-endfunction
-" Function: s:treeExistsForBuffer() {{{2
-" Returns 1 if a nerd tree root exists in the current buffer
-function! s:treeExistsForBuf()
- return exists("b:NERDTreeRoot")
-endfunction
-" Function: s:treeExistsForTab() {{{2
-" Returns 1 if a nerd tree root exists in the current tab
-function! s:treeExistsForTab()
- return exists("t:NERDTreeBufName")
-endfunction
-" Function: s:unique(list) {{{2
-" returns a:list without duplicates
-function! s:unique(list)
- let uniqlist = []
- for elem in a:list
- if index(uniqlist, elem) ==# -1
- let uniqlist += [elem]
- endif
- endfor
- return uniqlist
-endfunction
-" SECTION: Public API {{{1
-"============================================================
-let g:NERDTreePath = s:Path
-let g:NERDTreeDirNode = s:TreeDirNode
-let g:NERDTreeFileNode = s:TreeFileNode
-let g:NERDTreeBookmark = s:Bookmark
-
-function! NERDTreeAddMenuItem(options)
- call s:MenuItem.Create(a:options)
-endfunction
-
-function! NERDTreeAddMenuSeparator(...)
- let opts = a:0 ? a:1 : {}
- call s:MenuItem.CreateSeparator(opts)
-endfunction
-
-function! NERDTreeAddSubmenu(options)
- return s:MenuItem.Create(a:options)
-endfunction
-
-function! NERDTreeAddKeyMap(options)
- call s:KeyMap.Create(a:options)
-endfunction
-
-function! NERDTreeRender()
- call s:renderView()
-endfunction
-
-" SECTION: View Functions {{{1
-"============================================================
-"FUNCTION: s:centerView() {{{2
-"centers the nerd tree window around the cursor (provided the nerd tree
-"options permit)
-function! s:centerView()
- if g:NERDTreeAutoCenter
- let current_line = winline()
- let lines_to_top = current_line
- let lines_to_bottom = winheight(s:getTreeWinNum()) - current_line
- if lines_to_top < g:NERDTreeAutoCenterThreshold || lines_to_bottom < g:NERDTreeAutoCenterThreshold
- normal! zz
- endif
- endif
-endfunction
-"FUNCTION: s:closeTree() {{{2
-"Closes the primary NERD tree window for this tab
-function! s:closeTree()
- if !s:isTreeOpen()
- throw "NERDTree.NoTreeFoundError: no NERDTree is open"
- endif
-
- if winnr("$") != 1
- if winnr() == s:getTreeWinNum()
- wincmd p
- let bufnr = bufnr("")
- wincmd p
- else
- let bufnr = bufnr("")
- endif
-
- call s:exec(s:getTreeWinNum() . " wincmd w")
- close
- call s:exec(bufwinnr(bufnr) . " wincmd w")
- else
- close
- endif
-endfunction
-
-"FUNCTION: s:closeTreeIfOpen() {{{2
-"Closes the NERD tree window if it is open
-function! s:closeTreeIfOpen()
- if s:isTreeOpen()
- call s:closeTree()
- endif
-endfunction
-"FUNCTION: s:closeTreeIfQuitOnOpen() {{{2
-"Closes the NERD tree window if the close on open option is set
-function! s:closeTreeIfQuitOnOpen()
- if g:NERDTreeQuitOnOpen && s:isTreeOpen()
- call s:closeTree()
- endif
-endfunction
-"FUNCTION: s:createTreeWin() {{{2
-"Inits the NERD tree window. ie. opens it, sizes it, sets all the local
-"options etc
-function! s:createTreeWin()
- "create the nerd tree window
- let splitLocation = g:NERDTreeWinPos ==# "left" ? "topleft " : "botright "
- let splitSize = g:NERDTreeWinSize
-
- if !exists('t:NERDTreeBufName')
- let t:NERDTreeBufName = s:nextBufferName()
- silent! exec splitLocation . 'vertical ' . splitSize . ' new'
- silent! exec "edit " . t:NERDTreeBufName
- else
- silent! exec splitLocation . 'vertical ' . splitSize . ' split'
- silent! exec "buffer " . t:NERDTreeBufName
- endif
-
- setlocal winfixwidth
-
- "throwaway buffer options
- setlocal noswapfile
- setlocal buftype=nofile
- setlocal nowrap
- setlocal foldcolumn=0
- setlocal nobuflisted
- setlocal nospell
- if g:NERDTreeShowLineNumbers
- setlocal nu
- else
- setlocal nonu
- endif
-
- iabc <buffer>
-
- if g:NERDTreeHighlightCursorline
- setlocal cursorline
- endif
-
- call s:setupStatusline()
-
- call s:bindMappings()
- setfiletype nerdtree
- " syntax highlighting
- if has("syntax") && exists("g:syntax_on")
- call s:setupSyntaxHighlighting()
- endif
-endfunction
-
-"FUNCTION: s:dumpHelp {{{2
-"prints out the quick help
-function! s:dumpHelp()
- let old_h = @h
- if b:treeShowHelp ==# 1
- let @h= "\" NERD tree (" . s:NERD_tree_version . ") quickhelp~\n"
- let @h=@h."\" ============================\n"
- let @h=@h."\" File node mappings~\n"
- let @h=@h."\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n"
- let @h=@h."\" <CR>,\n"
- if b:NERDTreeType ==# "primary"
- let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in prev window\n"
- else
- let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in current window\n"
- endif
- if b:NERDTreeType ==# "primary"
- let @h=@h."\" ". g:NERDTreeMapPreview .": preview\n"
- endif
- let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n"
- let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
- let @h=@h."\" middle-click,\n"
- let @h=@h."\" ". g:NERDTreeMapOpenSplit .": open split\n"
- let @h=@h."\" ". g:NERDTreeMapPreviewSplit .": preview split\n"
- let @h=@h."\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n"
- let @h=@h."\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n"
-
- let @h=@h."\"\n\" ----------------------------\n"
- let @h=@h."\" Directory node mappings~\n"
- let @h=@h."\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n"
- let @h=@h."\" ". g:NERDTreeMapActivateNode .": open & close node\n"
- let @h=@h."\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n"
- let @h=@h."\" ". g:NERDTreeMapCloseDir .": close parent of node\n"
- let @h=@h."\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n"
- let @h=@h."\" current node recursively\n"
- let @h=@h."\" middle-click,\n"
- let @h=@h."\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n"
-
- let @h=@h."\"\n\" ----------------------------\n"
- let @h=@h."\" Bookmark table mappings~\n"
- let @h=@h."\" double-click,\n"
- let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n"
- let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n"
- let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
- let @h=@h."\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n"
-
- let @h=@h."\"\n\" ----------------------------\n"
- let @h=@h."\" Tree navigation mappings~\n"
- let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n"
- let @h=@h."\" ". g:NERDTreeMapJumpParent .": go to parent\n"
- let @h=@h."\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n"
- let @h=@h."\" ". g:NERDTreeMapJumpLastChild .": go to last child\n"
- let @h=@h."\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n"
- let @h=@h."\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n"
-
- let @h=@h."\"\n\" ----------------------------\n"
- let @h=@h."\" Filesystem mappings~\n"
- let @h=@h."\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n"
- let @h=@h."\" selected dir\n"
- let @h=@h."\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n"
- let @h=@h."\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n"
- let @h=@h."\" but leave old root open\n"
- let @h=@h."\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n"
- let @h=@h."\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n"
- let @h=@h."\" ". g:NERDTreeMapMenu .": Show menu\n"
- let @h=@h."\" ". g:NERDTreeMapChdir .":change the CWD to the\n"
- let @h=@h."\" selected dir\n"
-
- let @h=@h."\"\n\" ----------------------------\n"
- let @h=@h."\" Tree filtering mappings~\n"
- let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (b:NERDTreeShowHidden ? "on" : "off") . ")\n"
- let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (b:NERDTreeIgnoreEnabled ? "on" : "off") . ")\n"
- let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (b:NERDTreeShowFiles ? "on" : "off") . ")\n"
- let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (b:NERDTreeShowBookmarks ? "on" : "off") . ")\n"
-
- "add quickhelp entries for each custom key map
- if len(s:KeyMap.All())
- let @h=@h."\"\n\" ----------------------------\n"
- let @h=@h."\" Custom mappings~\n"
- for i in s:KeyMap.All()
- let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n"
- endfor
- endif
-
- let @h=@h."\"\n\" ----------------------------\n"
- let @h=@h."\" Other mappings~\n"
- let @h=@h."\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n"
- let @h=@h."\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n"
- let @h=@h."\" the NERDTree window\n"
- let @h=@h."\" ". g:NERDTreeMapHelp .": toggle help\n"
- let @h=@h."\"\n\" ----------------------------\n"
- let @h=@h."\" Bookmark commands~\n"
- let @h=@h."\" :Bookmark <name>\n"
- let @h=@h."\" :BookmarkToRoot <name>\n"
- let @h=@h."\" :RevealBookmark <name>\n"
- let @h=@h."\" :OpenBookmark <name>\n"
- let @h=@h."\" :ClearBookmarks [<names>]\n"
- let @h=@h."\" :ClearAllBookmarks\n"
- else
- let @h="\" Press ". g:NERDTreeMapHelp ." for help\n"
- endif
-
- silent! put h
-
- let @h = old_h
-endfunction
-"FUNCTION: s:echo {{{2
-"A wrapper for :echo. Appends 'NERDTree:' on the front of all messages
-"
-"Args:
-"msg: the message to echo
-function! s:echo(msg)
- redraw
- echomsg "NERDTree: " . a:msg
-endfunction
-"FUNCTION: s:echoWarning {{{2
-"Wrapper for s:echo, sets the message type to warningmsg for this message
-"Args:
-"msg: the message to echo
-function! s:echoWarning(msg)
- echohl warningmsg
- call s:echo(a:msg)
- echohl normal
-endfunction
-"FUNCTION: s:echoError {{{2
-"Wrapper for s:echo, sets the message type to errormsg for this message
-"Args:
-"msg: the message to echo
-function! s:echoError(msg)
- echohl errormsg
- call s:echo(a:msg)
- echohl normal
-endfunction
-"FUNCTION: s:firstUsableWindow(){{{2
-"find the window number of the first normal window
-function! s:firstUsableWindow()
- let i = 1
- while i <= winnr("$")
- let bnum = winbufnr(i)
- if bnum != -1 && getbufvar(bnum, '&buftype') ==# ''
- \ && !getwinvar(i, '&previewwindow')
- \ && (!getbufvar(bnum, '&modified') || &hidden)
- return i
- endif
-
- let i += 1
- endwhile
- return -1
-endfunction
-"FUNCTION: s:getPath(ln) {{{2
-"Gets the full path to the node that is rendered on the given line number
-"
-"Args:
-"ln: the line number to get the path for
-"
-"Return:
-"A path if a node was selected, {} if nothing is selected.
-"If the 'up a dir' line was selected then the path to the parent of the
-"current root is returned
-function! s:getPath(ln)
- let line = getline(a:ln)
-
- let rootLine = s:TreeFileNode.GetRootLineNum()
-
- "check to see if we have the root node
- if a:ln == rootLine
- return b:NERDTreeRoot.path
- endif
-
- " in case called from outside the tree
- "if line !~ '^ *[|`▶▼ ]' || line =~ '^$'
- "return {}
- "endif
-
- if line ==# s:tree_up_dir_line
- return b:NERDTreeRoot.path.getParent()
- endif
-
- let indent = s:indentLevelFor(line)
-
- "remove the tree parts and the leading space
- let curFile = s:stripMarkupFromLine(line, 0)
-
- let wasdir = 0
- if curFile =~ '/$'
- let wasdir = 1
- let curFile = substitute(curFile, '/\?$', '/', "")
- endif
-
- let dir = ""
- let lnum = a:ln
- while lnum > 0
- let lnum = lnum - 1
- let curLine = getline(lnum)
- let curLineStripped = s:stripMarkupFromLine(curLine, 1)
-
- "have we reached the top of the tree?
- if lnum == rootLine
- let dir = b:NERDTreeRoot.path.str({'format': 'UI'}) . dir
- break
- endif
- if curLineStripped =~ '/$'
- let lpindent = s:indentLevelFor(curLine)
- if lpindent < indent
- let indent = indent - 1
-
- let dir = substitute (curLineStripped,'^\\', "", "") . dir
- continue
- endif
- endif
- endwhile
- let curFile = b:NERDTreeRoot.path.drive . dir . curFile
- let toReturn = s:Path.New(curFile)
- return toReturn
-endfunction
-
-"FUNCTION: s:getTreeWinNum() {{{2
-"gets the nerd tree window number for this tab
-function! s:getTreeWinNum()
- if exists("t:NERDTreeBufName")
- return bufwinnr(t:NERDTreeBufName)
- else
- return -1
- endif
-endfunction
-"FUNCTION: s:indentLevelFor(line) {{{2
-function! s:indentLevelFor(line)
- return match(a:line, '[^ \-+~`|]') / s:tree_wid
-endfunction
-"FUNCTION: s:isTreeOpen() {{{2
-function! s:isTreeOpen()
- return s:getTreeWinNum() != -1
-endfunction
-"FUNCTION: s:isWindowUsable(winnumber) {{{2
-"Returns 0 if opening a file from the tree in the given window requires it to
-"be split, 1 otherwise
-"
-"Args:
-"winnumber: the number of the window in question
-function! s:isWindowUsable(winnumber)
- "gotta split if theres only one window (i.e. the NERD tree)
- if winnr("$") ==# 1
- return 0
- endif
-
- let oldwinnr = winnr()
- call s:exec(a:winnumber . "wincmd p")
- let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow')
- let modified = &modified
- call s:exec(oldwinnr . "wincmd p")
-
- "if its a special window e.g. quickfix or another explorer plugin then we
- "have to split
- if specialWindow
- return 0
- endif
-
- if &hidden
- return 1
- endif
-
- return !modified || s:bufInWindows(winbufnr(a:winnumber)) >= 2
-endfunction
-
-" FUNCTION: s:jumpToChild(direction) {{{2
-" Args:
-" direction: 0 if going to first child, 1 if going to last
-function! s:jumpToChild(direction)
- let currentNode = s:TreeFileNode.GetSelected()
- if currentNode ==# {} || currentNode.isRoot()
- call s:echo("cannot jump to " . (a:direction ? "last" : "first") . " child")
- return
- end
- let dirNode = currentNode.parent
- let childNodes = dirNode.getVisibleChildren()
-
- let targetNode = childNodes[0]
- if a:direction
- let targetNode = childNodes[len(childNodes) - 1]
- endif
-
- if targetNode.equals(currentNode)
- let siblingDir = currentNode.parent.findOpenDirSiblingWithVisibleChildren(a:direction)
- if siblingDir != {}
- let indx = a:direction ? siblingDir.getVisibleChildCount()-1 : 0
- let targetNode = siblingDir.getChildByIndex(indx, 1)
- endif
- endif
-
- call targetNode.putCursorHere(1, 0)
-
- call s:centerView()
-endfunction
-
-
-"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{2
-"prints out the given msg and, if the user responds by pushing 'y' then the
-"buffer with the given bufnum is deleted
-"
-"Args:
-"bufnum: the buffer that may be deleted
-"msg: a message that will be echoed to the user asking them if they wish to
-" del the buffer
-function! s:promptToDelBuffer(bufnum, msg)
- echo a:msg
- if nr2char(getchar()) ==# 'y'
- exec "silent bdelete! " . a:bufnum
- endif
-endfunction
-
-"FUNCTION: s:putCursorOnBookmarkTable(){{{2
-"Places the cursor at the top of the bookmarks table
-function! s:putCursorOnBookmarkTable()
- if !b:NERDTreeShowBookmarks
- throw "NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active"
- endif
-
- let rootNodeLine = s:TreeFileNode.GetRootLineNum()
-
- let line = 1
- while getline(line) !~ '^>-\+Bookmarks-\+$'
- let line = line + 1
- if line >= rootNodeLine
- throw "NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table"
- endif
- endwhile
- call cursor(line, 0)
-endfunction
-
-"FUNCTION: s:putCursorInTreeWin(){{{2
-"Places the cursor in the nerd tree window
-function! s:putCursorInTreeWin()
- if !s:isTreeOpen()
- throw "NERDTree.InvalidOperationError: cant put cursor in NERD tree window, no window exists"
- endif
-
- call s:exec(s:getTreeWinNum() . "wincmd w")
-endfunction
-
-"FUNCTION: s:renderBookmarks {{{2
-function! s:renderBookmarks()
-
- call setline(line(".")+1, ">----------Bookmarks----------")
- call cursor(line(".")+1, col("."))
-
- for i in s:Bookmark.Bookmarks()
- call setline(line(".")+1, i.str())
- call cursor(line(".")+1, col("."))
- endfor
-
- call setline(line(".")+1, '')
- call cursor(line(".")+1, col("."))
-endfunction
-"FUNCTION: s:renderView {{{2
-"The entry function for rendering the tree
-function! s:renderView()
- setlocal modifiable
-
- "remember the top line of the buffer and the current line so we can
- "restore the view exactly how it was
- let curLine = line(".")
- let curCol = col(".")
- let topLine = line("w0")
-
- "delete all lines in the buffer (being careful not to clobber a register)
- silent 1,$delete _
-
- call s:dumpHelp()
-
- "delete the blank line before the help and add one after it
- call setline(line(".")+1, "")
- call cursor(line(".")+1, col("."))
-
- if b:NERDTreeShowBookmarks
- call s:renderBookmarks()
- endif
-
- "add the 'up a dir' line
- call setline(line(".")+1, s:tree_up_dir_line)
- call cursor(line(".")+1, col("."))
-
- "draw the header line
- let header = b:NERDTreeRoot.path.str({'format': 'UI', 'truncateTo': winwidth(0)})
- call setline(line(".")+1, header)
- call cursor(line(".")+1, col("."))
-
- "draw the tree
- let old_o = @o
- let @o = b:NERDTreeRoot.renderToString()
- silent put o
- let @o = old_o
-
- "delete the blank line at the top of the buffer
- silent 1,1delete _
-
- "restore the view
- let old_scrolloff=&scrolloff
- let &scrolloff=0
- call cursor(topLine, 1)
- normal! zt
- call cursor(curLine, curCol)
- let &scrolloff = old_scrolloff
-
- setlocal nomodifiable
-endfunction
-
-"FUNCTION: s:renderViewSavingPosition {{{2
-"Renders the tree and ensures the cursor stays on the current node or the
-"current nodes parent if it is no longer available upon re-rendering
-function! s:renderViewSavingPosition()
- let currentNode = s:TreeFileNode.GetSelected()
-
- "go up the tree till we find a node that will be visible or till we run
- "out of nodes
- while currentNode != {} && !currentNode.isVisible() && !currentNode.isRoot()
- let currentNode = currentNode.parent
- endwhile
-
- call s:renderView()
-
- if currentNode != {}
- call currentNode.putCursorHere(0, 0)
- endif
-endfunction
-"FUNCTION: s:restoreScreenState() {{{2
-"
-"Sets the screen state back to what it was when s:saveScreenState was last
-"called.
-"
-"Assumes the cursor is in the NERDTree window
-function! s:restoreScreenState()
- if !exists("b:NERDTreeOldTopLine") || !exists("b:NERDTreeOldPos") || !exists("b:NERDTreeOldWindowSize")
- return
- endif
- exec("silent vertical resize ".b:NERDTreeOldWindowSize)
-
- let old_scrolloff=&scrolloff
- let &scrolloff=0
- call cursor(b:NERDTreeOldTopLine, 0)
- normal! zt
- call setpos(".", b:NERDTreeOldPos)
- let &scrolloff=old_scrolloff
-endfunction
-
-"FUNCTION: s:saveScreenState() {{{2
-"Saves the current cursor position in the current buffer and the window
-"scroll position
-function! s:saveScreenState()
- let win = winnr()
- try
- call s:putCursorInTreeWin()
- let b:NERDTreeOldPos = getpos(".")
- let b:NERDTreeOldTopLine = line("w0")
- let b:NERDTreeOldWindowSize = winwidth("")
- call s:exec(win . "wincmd w")
- catch /^NERDTree.InvalidOperationError/
- endtry
-endfunction
-
-"FUNCTION: s:setupStatusline() {{{2
-function! s:setupStatusline()
- if g:NERDTreeStatusline != -1
- let &l:statusline = g:NERDTreeStatusline
- endif
-endfunction
-"FUNCTION: s:setupSyntaxHighlighting() {{{2
-function! s:setupSyntaxHighlighting()
- "treeFlags are syntax items that should be invisible, but give clues as to
- "how things should be highlighted
- syn match treeFlag #\~#
- syn match treeFlag #\[RO\]#
-
- "highlighting for the .. (up dir) line at the top of the tree
- execute "syn match treeUp #". s:tree_up_dir_line ."#"
-
- "highlighting for the ~/+ symbols for the directory nodes
- syn match treeClosable #\~\<#
- syn match treeClosable #\~\.#
- syn match treeOpenable #+\<#
- syn match treeOpenable #+\.#he=e-1
-
- "highlighting for the tree structural parts
- syn match treePart #|#
- syn match treePart #`#
- syn match treePartFile #[|`]-#hs=s+1 contains=treePart
-
- "quickhelp syntax elements
- syn match treeHelpKey #" \{1,2\}[^ ]*:#hs=s+2,he=e-1
- syn match treeHelpKey #" \{1,2\}[^ ]*,#hs=s+2,he=e-1
- syn match treeHelpTitle #" .*\~#hs=s+2,he=e-1 contains=treeFlag
- syn match treeToggleOn #".*(on)#hs=e-2,he=e-1 contains=treeHelpKey
- syn match treeToggleOff #".*(off)#hs=e-3,he=e-1 contains=treeHelpKey
- syn match treeHelpCommand #" :.\{-}\>#hs=s+3
- syn match treeHelp #^".*# contains=treeHelpKey,treeHelpTitle,treeFlag,treeToggleOff,treeToggleOn,treeHelpCommand
-
- "highlighting for readonly files
- syn match treeRO #.*\[RO\]#hs=s+2 contains=treeFlag,treeBookmark,treePart,treePartFile
-
- "highlighting for sym links
- syn match treeLink #[^-| `].* -> # contains=treeBookmark,treeOpenable,treeClosable,treeDirSlash
-
- "highlighing for directory nodes and file nodes
- syn match treeDirSlash #/#
- syn match treeDir #[^-| `].*/# contains=treeLink,treeDirSlash,treeOpenable,treeClosable
- syn match treeExecFile #[|`]-.*\*\($\| \)# contains=treeLink,treePart,treeRO,treePartFile,treeBookmark
- syn match treeFile #|-.*# contains=treeLink,treePart,treeRO,treePartFile,treeBookmark,treeExecFile
- syn match treeFile #`-.*# contains=treeLink,treePart,treeRO,treePartFile,treeBookmark,treeExecFile
- syn match treeCWD #^/.*$#
-
- "highlighting for bookmarks
- syn match treeBookmark # {.*}#hs=s+1
-
- "highlighting for the bookmarks table
- syn match treeBookmarksLeader #^>#
- syn match treeBookmarksHeader #^>-\+Bookmarks-\+$# contains=treeBookmarksLeader
- syn match treeBookmarkName #^>.\{-} #he=e-1 contains=treeBookmarksLeader
- syn match treeBookmark #^>.*$# contains=treeBookmarksLeader,treeBookmarkName,treeBookmarksHeader
-
- if g:NERDChristmasTree
- hi def link treePart Special
- hi def link treePartFile Type
- hi def link treeFile Normal
- hi def link treeExecFile Title
- hi def link treeDirSlash Identifier
- hi def link treeClosable Type
- else
- hi def link treePart Normal
- hi def link treePartFile Normal
- hi def link treeFile Normal
- hi def link treeClosable Title
- endif
-
- hi def link treeBookmarksHeader statement
- hi def link treeBookmarksLeader ignore
- hi def link treeBookmarkName Identifier
- hi def link treeBookmark normal
-
- hi def link treeHelp String
- hi def link treeHelpKey Identifier
- hi def link treeHelpCommand Identifier
- hi def link treeHelpTitle Macro
- hi def link treeToggleOn Question
- hi def link treeToggleOff WarningMsg
-
- hi def link treeDir Directory
- hi def link treeUp Directory
- hi def link treeCWD Statement
- hi def link treeLink Macro
- hi def link treeOpenable Title
- hi def link treeFlag ignore
- hi def link treeRO WarningMsg
- hi def link treeBookmark Statement
-
- hi def link NERDTreeCurrentNode Search
-endfunction
-
-"FUNCTION: s:stripMarkupFromLine(line, removeLeadingSpaces){{{2
-"returns the given line with all the tree parts stripped off
-"
-"Args:
-"line: the subject line
-"removeLeadingSpaces: 1 if leading spaces are to be removed (leading spaces =
-"any spaces before the actual text of the node)
-function! s:stripMarkupFromLine(line, removeLeadingSpaces)
- let line = a:line
- "remove the tree parts and the leading space
- let line = substitute (line, s:tree_markup_reg,"","")
-
- "strip off any read only flag
- let line = substitute (line, ' \[RO\]', "","")
-
- "strip off any bookmark flags
- let line = substitute (line, ' {[^}]*}', "","")
-
- "strip off any executable flags
- let line = substitute (line, '*\ze\($\| \)', "","")
-
- let wasdir = 0
- if line =~ '/$'
- let wasdir = 1
- endif
- let line = substitute (line,' -> .*',"","") " remove link to
- if wasdir ==# 1
- let line = substitute (line, '/\?$', '/', "")
- endif
-
- if a:removeLeadingSpaces
- let line = substitute (line, '^ *', '', '')
- endif
-
- return line
-endfunction
-
-"FUNCTION: s:toggle(dir) {{{2
-"Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is
-"closed it is restored or initialized (if it doesnt exist)
-"
-"Args:
-"dir: the full path for the root node (is only used if the NERD tree is being
-"initialized.
-function! s:toggle(dir)
- if s:treeExistsForTab()
- if !s:isTreeOpen()
- call s:createTreeWin()
- if !&hidden
- call s:renderView()
- endif
- call s:restoreScreenState()
- else
- call s:closeTree()
- endif
- else
- call s:initNerdTree(a:dir)
- endif
-endfunction
-"SECTION: Interface bindings {{{1
-"============================================================
-"FUNCTION: s:activateNode(forceKeepWindowOpen) {{{2
-"If the current node is a file, open it in the previous window (or a new one
-"if the previous is modified). If it is a directory then it is opened.
-"
-"args:
-"forceKeepWindowOpen - dont close the window even if NERDTreeQuitOnOpen is set
-function! s:activateNode(forceKeepWindowOpen)
- if getline(".") ==# s:tree_up_dir_line
- return s:upDir(0)
- endif
-
- let treenode = s:TreeFileNode.GetSelected()
- if treenode != {}
- call treenode.activate(a:forceKeepWindowOpen)
- else
- let bookmark = s:Bookmark.GetSelected()
- if !empty(bookmark)
- call bookmark.activate()
- endif
- endif
-endfunction
-
-"FUNCTION: s:bindMappings() {{{2
-function! s:bindMappings()
- " set up mappings and commands for this buffer
- nnoremap <silent> <buffer> <middlerelease> :call <SID>handleMiddleMouse()<cr>
- nnoremap <silent> <buffer> <leftrelease> <leftrelease>:call <SID>checkForActivate()<cr>
- nnoremap <silent> <buffer> <2-leftmouse> :call <SID>activateNode(0)<cr>
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapActivateNode . " :call <SID>activateNode(0)<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenSplit ." :call <SID>openEntrySplit(0,0)<cr>"
- exec "nnoremap <silent> <buffer> <cr> :call <SID>activateNode(0)<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapPreview ." :call <SID>previewNode(0)<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapPreviewSplit ." :call <SID>previewNode(1)<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenVSplit ." :call <SID>openEntrySplit(1,0)<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapPreviewVSplit ." :call <SID>previewNode(2)<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenRecursively ." :call <SID>openNodeRecursively()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapUpdirKeepOpen ." :call <SID>upDir(1)<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapUpdir ." :call <SID>upDir(0)<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapChangeRoot ." :call <SID>chRoot()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapChdir ." :call <SID>chCwd()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapQuit ." :call <SID>closeTreeWindow()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapRefreshRoot ." :call <SID>refreshRoot()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapRefresh ." :call <SID>refreshCurrent()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapHelp ." :call <SID>displayHelp()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapToggleZoom ." :call <SID>toggleZoom()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapToggleHidden ." :call <SID>toggleShowHidden()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapToggleFilters ." :call <SID>toggleIgnoreFilter()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapToggleFiles ." :call <SID>toggleShowFiles()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapToggleBookmarks ." :call <SID>toggleShowBookmarks()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapCloseDir ." :call <SID>closeCurrentDir()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapCloseChildren ." :call <SID>closeChildren()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapMenu ." :call <SID>showMenu()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapJumpParent ." :call <SID>jumpToParent()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapJumpNextSibling ." :call <SID>jumpToSibling(1)<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapJumpPrevSibling ." :call <SID>jumpToSibling(0)<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapJumpFirstChild ." :call <SID>jumpToFirstChild()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapJumpLastChild ." :call <SID>jumpToLastChild()<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapJumpRoot ." :call <SID>jumpToRoot()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenInTab ." :call <SID>openInNewTab(0)<cr>"
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenInTabSilent ." :call <SID>openInNewTab(1)<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapOpenExpl ." :call <SID>openExplorer()<cr>"
-
- exec "nnoremap <silent> <buffer> ". g:NERDTreeMapDeleteBookmark ." :call <SID>deleteBookmark()<cr>"
-
- "bind all the user custom maps
- call s:KeyMap.BindAll()
-
- command! -buffer -nargs=1 Bookmark :call <SID>bookmarkNode('<args>')
- command! -buffer -complete=customlist,s:completeBookmarks -nargs=1 RevealBookmark :call <SID>revealBookmark('<args>')
- command! -buffer -complete=customlist,s:completeBookmarks -nargs=1 OpenBookmark :call <SID>openBookmark('<args>')
- command! -buffer -complete=customlist,s:completeBookmarks -nargs=* ClearBookmarks call <SID>clearBookmarks('<args>')
- command! -buffer -complete=customlist,s:completeBookmarks -nargs=+ BookmarkToRoot call s:Bookmark.ToRoot('<args>')
- command! -buffer -nargs=0 ClearAllBookmarks call s:Bookmark.ClearAll() <bar> call <SID>renderView()
- command! -buffer -nargs=0 ReadBookmarks call s:Bookmark.CacheBookmarks(0) <bar> call <SID>renderView()
- command! -buffer -nargs=0 WriteBookmarks call s:Bookmark.Write()
-endfunction
-
-" FUNCTION: s:bookmarkNode(name) {{{2
-" Associate the current node with the given name
-function! s:bookmarkNode(name)
- let currentNode = s:TreeFileNode.GetSelected()
- if currentNode != {}
- try
- call currentNode.bookmark(a:name)
- call s:renderView()
- catch /^NERDTree.IllegalBookmarkNameError/
- call s:echo("bookmark names must not contain spaces")
- endtry
- else
- call s:echo("select a node first")
- endif
-endfunction
-"FUNCTION: s:checkForActivate() {{{2
-"Checks if the click should open the current node, if so then activate() is
-"called (directories are automatically opened if the symbol beside them is
-"clicked)
-function! s:checkForActivate()
- let currentNode = s:TreeFileNode.GetSelected()
- if currentNode != {}
- call s:activateNode(0)
- return
- endif
-endfunction
-
-" FUNCTION: s:chCwd() {{{2
-function! s:chCwd()
- let treenode = s:TreeFileNode.GetSelected()
- if treenode ==# {}
- call s:echo("Select a node first")
- return
- endif
-
- try
- call treenode.path.changeToDir()
- catch /^NERDTree.PathChangeError/
- call s:echoWarning("could not change cwd")
- endtry
-endfunction
-
-" FUNCTION: s:chRoot() {{{2
-" changes the current root to the selected one
-function! s:chRoot()
- let treenode = s:TreeFileNode.GetSelected()
- if treenode ==# {}
- call s:echo("Select a node first")
- return
- endif
-
- call treenode.makeRoot()
- call s:renderView()
- call b:NERDTreeRoot.putCursorHere(0, 0)
-endfunction
-
-" FUNCTION: s:clearBookmarks(bookmarks) {{{2
-function! s:clearBookmarks(bookmarks)
- if a:bookmarks ==# ''
- let currentNode = s:TreeFileNode.GetSelected()
- if currentNode != {}
- call currentNode.clearBoomarks()
- endif
- else
- for name in split(a:bookmarks, ' ')
- let bookmark = s:Bookmark.BookmarkFor(name)
- call bookmark.delete()
- endfor
- endif
- call s:renderView()
-endfunction
-" FUNCTION: s:closeChildren() {{{2
-" closes all childnodes of the current node
-function! s:closeChildren()
- let currentNode = s:TreeDirNode.GetSelected()
- if currentNode ==# {}
- call s:echo("Select a node first")
- return
- endif
-
- call currentNode.closeChildren()
- call s:renderView()
- call currentNode.putCursorHere(0, 0)
-endfunction
-" FUNCTION: s:closeCurrentDir() {{{2
-" closes the parent dir of the current node
-function! s:closeCurrentDir()
- let treenode = s:TreeFileNode.GetSelected()
- if treenode ==# {}
- call s:echo("Select a node first")
- return
- endif
-
- let parent = treenode.parent
- if parent ==# {} || parent.isRoot()
- call s:echo("cannot close tree root")
- else
- call treenode.parent.close()
- call s:renderView()
- call treenode.parent.putCursorHere(0, 0)
- endif
-endfunction
-" FUNCTION: s:closeTreeWindow() {{{2
-" close the tree window
-function! s:closeTreeWindow()
- if b:NERDTreeType ==# "secondary" && b:NERDTreePreviousBuf != -1
- exec "buffer " . b:NERDTreePreviousBuf
- else
- if winnr("$") > 1
- call s:closeTree()
- else
- call s:echo("Cannot close last window")
- endif
- endif
-endfunction
-" FUNCTION: s:deleteBookmark() {{{2
-" if the cursor is on a bookmark, prompt to delete
-function! s:deleteBookmark()
- let bookmark = s:Bookmark.GetSelected()
- if bookmark ==# {}
- call s:echo("Put the cursor on a bookmark")
- return
- endif
-
- echo "Are you sure you wish to delete the bookmark:\n\"" . bookmark.name . "\" (yN):"
-
- if nr2char(getchar()) ==# 'y'
- try
- call bookmark.delete()
- call s:renderView()
- redraw
- catch /^NERDTree/
- call s:echoWarning("Could not remove bookmark")
- endtry
- else
- call s:echo("delete aborted" )
- endif
-
-endfunction
-
-" FUNCTION: s:displayHelp() {{{2
-" toggles the help display
-function! s:displayHelp()
- let b:treeShowHelp = b:treeShowHelp ? 0 : 1
- call s:renderView()
- call s:centerView()
-endfunction
-
-" FUNCTION: s:handleMiddleMouse() {{{2
-function! s:handleMiddleMouse()
- let curNode = s:TreeFileNode.GetSelected()
- if curNode ==# {}
- call s:echo("Put the cursor on a node first" )
- return
- endif
-
- if curNode.path.isDirectory
- call s:openExplorer()
- else
- call s:openEntrySplit(0,0)
- endif
-endfunction
-
-
-" FUNCTION: s:jumpToFirstChild() {{{2
-" wrapper for the jump to child method
-function! s:jumpToFirstChild()
- call s:jumpToChild(0)
-endfunction
-
-" FUNCTION: s:jumpToLastChild() {{{2
-" wrapper for the jump to child method
-function! s:jumpToLastChild()
- call s:jumpToChild(1)
-endfunction
-
-" FUNCTION: s:jumpToParent() {{{2
-" moves the cursor to the parent of the current node
-function! s:jumpToParent()
- let currentNode = s:TreeFileNode.GetSelected()
- if !empty(currentNode)
- if !empty(currentNode.parent)
- call currentNode.parent.putCursorHere(1, 0)
- call s:centerView()
- else
- call s:echo("cannot jump to parent")
- endif
- else
- call s:echo("put the cursor on a node first")
- endif
-endfunction
-
-" FUNCTION: s:jumpToRoot() {{{2
-" moves the cursor to the root node
-function! s:jumpToRoot()
- call b:NERDTreeRoot.putCursorHere(1, 0)
- call s:centerView()
-endfunction
-
-" FUNCTION: s:jumpToSibling() {{{2
-" moves the cursor to the sibling of the current node in the given direction
-"
-" Args:
-" forward: 1 if the cursor should move to the next sibling, 0 if it should
-" move back to the previous sibling
-function! s:jumpToSibling(forward)
- let currentNode = s:TreeFileNode.GetSelected()
- if !empty(currentNode)
- let sibling = currentNode.findSibling(a:forward)
-
- if !empty(sibling)
- call sibling.putCursorHere(1, 0)
- call s:centerView()
- endif
- else
- call s:echo("put the cursor on a node first")
- endif
-endfunction
-
-" FUNCTION: s:openBookmark(name) {{{2
-" put the cursor on the given bookmark and, if its a file, open it
-function! s:openBookmark(name)
- try
- let targetNode = s:Bookmark.GetNodeForName(a:name, 0)
- call targetNode.putCursorHere(0, 1)
- redraw!
- catch /^NERDTree.BookmarkedNodeNotFoundError/
- call s:echo("note - target node is not cached")
- let bookmark = s:Bookmark.BookmarkFor(a:name)
- let targetNode = s:TreeFileNode.New(bookmark.path)
- endtry
- if targetNode.path.isDirectory
- call targetNode.openExplorer()
- else
- call targetNode.open()
- endif
-endfunction
-" FUNCTION: s:openEntrySplit(vertical, forceKeepWindowOpen) {{{2
-"Opens the currently selected file from the explorer in a
-"new window
-"
-"args:
-"forceKeepWindowOpen - dont close the window even if NERDTreeQuitOnOpen is set
-function! s:openEntrySplit(vertical, forceKeepWindowOpen)
- let treenode = s:TreeFileNode.GetSelected()
- if treenode != {}
- if a:vertical
- call treenode.openVSplit()
- else
- call treenode.openSplit()
- endif
- if !a:forceKeepWindowOpen
- call s:closeTreeIfQuitOnOpen()
- endif
- else
- call s:echo("select a node first")
- endif
-endfunction
-
-" FUNCTION: s:openExplorer() {{{2
-function! s:openExplorer()
- let treenode = s:TreeDirNode.GetSelected()
- if treenode != {}
- call treenode.openExplorer()
- else
- call s:echo("select a node first")
- endif
-endfunction
-
-" FUNCTION: s:openInNewTab(stayCurrentTab) {{{2
-" Opens the selected node or bookmark in a new tab
-" Args:
-" stayCurrentTab: if 1 then vim will stay in the current tab, if 0 then vim
-" will go to the tab where the new file is opened
-function! s:openInNewTab(stayCurrentTab)
- let target = s:TreeFileNode.GetSelected()
- if target == {}
- let target = s:Bookmark.GetSelected()
- endif
-
- if target != {}
- call target.openInNewTab({'stayInCurrentTab': a:stayCurrentTab})
- endif
-endfunction
-
-" FUNCTION: s:openNodeRecursively() {{{2
-function! s:openNodeRecursively()
- let treenode = s:TreeFileNode.GetSelected()
- if treenode ==# {} || treenode.path.isDirectory ==# 0
- call s:echo("Select a directory node first" )
- else
- call s:echo("Recursively opening node. Please wait...")
- call treenode.openRecursively()
- call s:renderView()
- redraw
- call s:echo("Recursively opening node. Please wait... DONE")
- endif
-
-endfunction
-
-"FUNCTION: s:previewNode() {{{2
-"Args:
-" openNewWin: if 0, use the previous window, if 1 open in new split, if 2
-" open in a vsplit
-function! s:previewNode(openNewWin)
- let currentBuf = bufnr("")
- if a:openNewWin > 0
- call s:openEntrySplit(a:openNewWin ==# 2,1)
- else
- call s:activateNode(1)
- end
- call s:exec(bufwinnr(currentBuf) . "wincmd w")
-endfunction
-
-" FUNCTION: s:revealBookmark(name) {{{2
-" put the cursor on the node associate with the given name
-function! s:revealBookmark(name)
- try
- let targetNode = s:Bookmark.GetNodeForName(a:name, 0)
- call targetNode.putCursorHere(0, 1)
- catch /^NERDTree.BookmarkNotFoundError/
- call s:echo("Bookmark isnt cached under the current root")
- endtry
-endfunction
-" FUNCTION: s:refreshRoot() {{{2
-" Reloads the current root. All nodes below this will be lost and the root dir
-" will be reloaded.
-function! s:refreshRoot()
- call s:echo("Refreshing the root node. This could take a while...")
- call b:NERDTreeRoot.refresh()
- call s:renderView()
- redraw
- call s:echo("Refreshing the root node. This could take a while... DONE")
-endfunction
-
-" FUNCTION: s:refreshCurrent() {{{2
-" refreshes the root for the current node
-function! s:refreshCurrent()
- let treenode = s:TreeDirNode.GetSelected()
- if treenode ==# {}
- call s:echo("Refresh failed. Select a node first")
- return
- endif
-
- call s:echo("Refreshing node. This could take a while...")
- call treenode.refresh()
- call s:renderView()
- redraw
- call s:echo("Refreshing node. This could take a while... DONE")
-endfunction
-" FUNCTION: s:showMenu() {{{2
-function! s:showMenu()
- let curNode = s:TreeFileNode.GetSelected()
- if curNode ==# {}
- call s:echo("Put the cursor on a node first" )
- return
- endif
-
- let mc = s:MenuController.New(s:MenuItem.AllEnabled())
- call mc.showMenu()
-endfunction
-
-" FUNCTION: s:toggleIgnoreFilter() {{{2
-" toggles the use of the NERDTreeIgnore option
-function! s:toggleIgnoreFilter()
- let b:NERDTreeIgnoreEnabled = !b:NERDTreeIgnoreEnabled
- call s:renderViewSavingPosition()
- call s:centerView()
-endfunction
-
-" FUNCTION: s:toggleShowBookmarks() {{{2
-" toggles the display of bookmarks
-function! s:toggleShowBookmarks()
- let b:NERDTreeShowBookmarks = !b:NERDTreeShowBookmarks
- if b:NERDTreeShowBookmarks
- call s:renderView()
- call s:putCursorOnBookmarkTable()
- else
- call s:renderViewSavingPosition()
- endif
- call s:centerView()
-endfunction
-" FUNCTION: s:toggleShowFiles() {{{2
-" toggles the display of hidden files
-function! s:toggleShowFiles()
- let b:NERDTreeShowFiles = !b:NERDTreeShowFiles
- call s:renderViewSavingPosition()
- call s:centerView()
-endfunction
-
-" FUNCTION: s:toggleShowHidden() {{{2
-" toggles the display of hidden files
-function! s:toggleShowHidden()
- let b:NERDTreeShowHidden = !b:NERDTreeShowHidden
- call s:renderViewSavingPosition()
- call s:centerView()
-endfunction
-
-" FUNCTION: s:toggleZoom() {{2
-" zoom (maximize/minimize) the NERDTree window
-function! s:toggleZoom()
- if exists("b:NERDTreeZoomed") && b:NERDTreeZoomed
- let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize
- exec "silent vertical resize ". size
- let b:NERDTreeZoomed = 0
- else
- exec "vertical resize"
- let b:NERDTreeZoomed = 1
- endif
-endfunction
-
-"FUNCTION: s:upDir(keepState) {{{2
-"moves the tree up a level
-"
-"Args:
-"keepState: 1 if the current root should be left open when the tree is
-"re-rendered
-function! s:upDir(keepState)
- let cwd = b:NERDTreeRoot.path.str({'format': 'UI'})
- if cwd ==# "/" || cwd =~ '^[^/]..$'
- call s:echo("already at top dir")
- else
- if !a:keepState
- call b:NERDTreeRoot.close()
- endif
-
- let oldRoot = b:NERDTreeRoot
-
- if empty(b:NERDTreeRoot.parent)
- let path = b:NERDTreeRoot.path.getParent()
- let newRoot = s:TreeDirNode.New(path)
- call newRoot.open()
- call newRoot.transplantChild(b:NERDTreeRoot)
- let b:NERDTreeRoot = newRoot
- else
- let b:NERDTreeRoot = b:NERDTreeRoot.parent
- endif
-
- if g:NERDTreeChDirMode ==# 2
- call b:NERDTreeRoot.path.changeToDir()
- endif
-
- call s:renderView()
- call oldRoot.putCursorHere(0, 0)
- endif
-endfunction
-
-
-"reset &cpo back to users setting
-let &cpo = s:old_cpo
-
-" vim: set sw=4 sts=4 et fdm=marker:
+++ /dev/null
-" SearchComplete.vim
-" Author: Chris Russell
-" Version: 1.1
-" License: GPL v2.0
-"
-" Description:
-" This script defineds functions and key mappings for Tab completion in
-" searches.
-"
-" Help:
-" This script catches the <Tab> character when using the '/' search
-" command. Pressing Tab will expand the current partial word to the
-" next matching word starting with the partial word.
-"
-" If you want to match a tab, use the '\t' pattern.
-"
-" Installation:
-" Simply drop this file into your $HOME/.vim/plugin directory.
-"
-" Changelog:
-" 2002-11-08 v1.1
-" Convert to unix eol
-" 2002-11-05 v1.0
-" Initial release
-"
-" TODO:
-"
-
-
-"--------------------------------------------------
-" Avoid multiple sourcing
-"--------------------------------------------------
-if exists( "loaded_search_complete" )
- finish
-endif
-let loaded_search_complete = 1
-
-
-"--------------------------------------------------
-" Key mappings
-"--------------------------------------------------
-noremap / :call SearchCompleteStart()<CR>/
-
-
-"--------------------------------------------------
-" Set mappings for search complete
-"--------------------------------------------------
-function! SearchCompleteStart()
- cnoremap <Tab> <C-C>:call SearchComplete()<CR>/<C-R>s
- cnoremap <silent> <CR> <CR>:call SearchCompleteStop()<CR>
- cnoremap <silent> <Esc> <C-C>:call SearchCompleteStop()<CR>
-endfunction
-
-"--------------------------------------------------
-" Tab completion in / search
-"--------------------------------------------------
-function! SearchComplete()
- " get current cursor position
- let l:loc = col( "." ) - 1
- " get partial search and delete
- let l:search = histget( '/', -1 )
- call histdel( '/', -1 )
- " check if new search
- if l:search == @s
- " get root search string
- let l:search = b:searchcomplete
- " increase number of autocompletes
- let b:searchcompletedepth = b:searchcompletedepth . "\<C-N>"
- else
- " one autocomplete
- let b:searchcompletedepth = "\<C-N>"
- endif
- " store origional search parameter
- let b:searchcomplete = l:search
- " set paste option to disable indent options
- let l:paste = &paste
- setlocal paste
- " on a temporary line put search string and use autocomplete
- execute "normal! A\n" . l:search . b:searchcompletedepth
- " get autocomplete result
- let @s = getline( line( "." ) )
- " undo and return to first char
- execute "normal! u0"
- " return to cursor position
- if l:loc > 0
- execute "normal! ". l:loc . "l"
- endif
- " reset paste option
- let &paste = l:paste
-endfunction
-
-"--------------------------------------------------
-" Remove search complete mappings
-"--------------------------------------------------
-function! SearchCompleteStop()
- cunmap <Tab>
- cunmap <CR>
- cunmap <Esc>
-endfunction
-
+++ /dev/null
-" ZoomWin: Brief-like ability to zoom into/out-of a window
-" Author: Charles Campbell
-" original version by Ron Aaron
-" Date: Jan 16, 2009
-" Version: 23e ASTRO-ONLY
-" History: see :help zoomwin-history {{{1
-" GetLatestVimScripts: 508 1 :AutoInstall: ZoomWin.vim
-
-" ---------------------------------------------------------------------
-" Load Once: {{{1
-if &cp || exists("g:loaded_ZoomWinPlugin")
- finish
-endif
-if v:version < 702
- echohl WarningMsg
- echo "***warning*** this version of ZoomWin needs vim 7.2"
- echohl Normal
- finish
-endif
-let s:keepcpo = &cpo
-let g:loaded_ZoomWinPlugin = "v23"
-set cpo&vim
-"DechoTabOn
-
-" ---------------------------------------------------------------------
-" Public Interface: {{{1
-if !hasmapto("<Plug>ZoomWin")
- nmap <unique> <c-w>o <Plug>ZoomWin
-endif
-nnoremap <silent> <script> <Plug>ZoomWin :set lz<CR>:silent call ZoomWin#ZoomWin()<CR>:set nolz<CR>
-com! ZoomWin :set lz|silent call ZoomWin#ZoomWin()|set nolz
-
-au VimLeave * call ZoomWin#CleanupSessionFile()
-
-" ---------------------------------------------------------------------
-" ZoomWin: toggles between a single-window and a multi-window layout {{{1
-" The original version was by Ron Aaron.
-" This function provides compatibility with previous versions.
-fun! ZoomWin()
- call ZoomWin#ZoomWin()
-endfun
-
-" ---------------------------------------------------------------------
-" Restore: {{{1
-let &cpo= s:keepcpo
-unlet s:keepcpo
-" ---------------------------------------------------------------------
-" Modelines: {{{1
-" vim: ts=4 fdm=marker
+++ /dev/null
-" NOTE: You must, of course, install the ack script
-" in your path.
-" On Debian / Ubuntu:
-" sudo apt-get install ack-grep
-" On your vimrc:
-" let g:ackprg="ack-grep -H --nocolor --nogroup --column"
-"
-" With MacPorts:
-" sudo port install p5-app-ack
-
-" Location of the ack utility
-if !exists("g:ackprg")
- let g:ackprg="ack -H --nocolor --nogroup --column"
-endif
-
-function! s:Ack(cmd, args)
- redraw
- echo "Searching ..."
-
- " If no pattern is provided, search for the word under the cursor
- if empty(a:args)
- let l:grepargs = expand("<cword>")
- else
- let l:grepargs = a:args
- end
-
- " Format, used to manage column jump
- if a:cmd =~# '-g$'
- let g:ackformat="%f"
- else
- let g:ackformat="%f:%l:%c:%m"
- end
-
- let grepprg_bak=&grepprg
- let grepformat_bak=&grepformat
- try
- let &grepprg=g:ackprg
- let &grepformat=g:ackformat
- silent execute a:cmd . " " . l:grepargs
- finally
- let &grepprg=grepprg_bak
- let &grepformat=grepformat_bak
- endtry
-
- if a:cmd =~# '^l'
- botright lopen
- else
- botright copen
- endif
-
- " TODO: Document this!
- exec "nnoremap <silent> <buffer> q :ccl<CR>"
- exec "nnoremap <silent> <buffer> t <C-W><CR><C-W>T"
- exec "nnoremap <silent> <buffer> T <C-W><CR><C-W>TgT<C-W><C-W>"
- exec "nnoremap <silent> <buffer> o <CR>"
- exec "nnoremap <silent> <buffer> go <CR><C-W><C-W>"
-
- " If highlighting is on, highlight the search keyword.
- if exists("g:ackhighlight")
- let @/=a:args
- set hlsearch
- end
-
- redraw!
-endfunction
-
-function! s:AckFromSearch(cmd, args)
- let search = getreg('/')
- " translate vim regular expression to perl regular expression.
- let search = substitute(search,'\(\\<\|\\>\)','\\b','g')
- call s:Ack(a:cmd, '"' . search .'" '. a:args)
-endfunction
-
-command! -bang -nargs=* -complete=file Ack call s:Ack('grep<bang>',<q-args>)
-command! -bang -nargs=* -complete=file AckAdd call s:Ack('grepadd<bang>', <q-args>)
-command! -bang -nargs=* -complete=file AckFromSearch call s:AckFromSearch('grep<bang>', <q-args>)
-command! -bang -nargs=* -complete=file LAck call s:Ack('lgrep<bang>', <q-args>)
-command! -bang -nargs=* -complete=file LAckAdd call s:Ack('lgrepadd<bang>', <q-args>)
-command! -bang -nargs=* -complete=file AckFile call s:Ack('grep<bang> -g', <q-args>)
+++ /dev/null
-" cecutil.vim : save/restore window position
-" save/restore mark position
-" save/restore selected user maps
-" Author: Charles E. Campbell, Jr.
-" Version: 18b ASTRO-ONLY
-" Date: Aug 27, 2008
-"
-" Saving Restoring Destroying Marks: {{{1
-" call SaveMark(markname) let savemark= SaveMark(markname)
-" call RestoreMark(markname) call RestoreMark(savemark)
-" call DestroyMark(markname)
-" commands: SM RM DM
-"
-" Saving Restoring Destroying Window Position: {{{1
-" call SaveWinPosn() let winposn= SaveWinPosn()
-" call RestoreWinPosn() call RestoreWinPosn(winposn)
-" \swp : save current window/buffer's position
-" \rwp : restore current window/buffer's previous position
-" commands: SWP RWP
-"
-" Saving And Restoring User Maps: {{{1
-" call SaveUserMaps(mapmode,maplead,mapchx,suffix)
-" call RestoreUserMaps(suffix)
-"
-" GetLatestVimScripts: 1066 1 :AutoInstall: cecutil.vim
-"
-" You believe that God is one. You do well. The demons also {{{1
-" believe, and shudder. But do you want to know, vain man, that
-" faith apart from works is dead? (James 2:19,20 WEB)
-
-" ---------------------------------------------------------------------
-" Load Once: {{{1
-if &cp || exists("g:loaded_cecutil")
- finish
-endif
-let g:loaded_cecutil = "v18b"
-let s:keepcpo = &cpo
-set cpo&vim
-"DechoTabOn
-
-" =======================
-" Public Interface: {{{1
-" =======================
-
-" ---------------------------------------------------------------------
-" Map Interface: {{{2
-if !hasmapto('<Plug>SaveWinPosn')
- map <unique> <Leader>swp <Plug>SaveWinPosn
-endif
-if !hasmapto('<Plug>RestoreWinPosn')
- map <unique> <Leader>rwp <Plug>RestoreWinPosn
-endif
-nmap <silent> <Plug>SaveWinPosn :call SaveWinPosn()<CR>
-nmap <silent> <Plug>RestoreWinPosn :call RestoreWinPosn()<CR>
-
-" ---------------------------------------------------------------------
-" Command Interface: {{{2
-com! -bar -nargs=0 SWP call SaveWinPosn()
-com! -bar -nargs=0 RWP call RestoreWinPosn()
-com! -bar -nargs=1 SM call SaveMark(<q-args>)
-com! -bar -nargs=1 RM call RestoreMark(<q-args>)
-com! -bar -nargs=1 DM call DestroyMark(<q-args>)
-
-if v:version < 630
- let s:modifier= "sil "
-else
- let s:modifier= "sil keepj "
-endif
-
-" ===============
-" Functions: {{{1
-" ===============
-
-" ---------------------------------------------------------------------
-" SaveWinPosn: {{{2
-" let winposn= SaveWinPosn() will save window position in winposn variable
-" call SaveWinPosn() will save window position in b:cecutil_winposn{b:cecutil_iwinposn}
-" let winposn= SaveWinPosn(0) will *only* save window position in winposn variable (no stacking done)
-fun! SaveWinPosn(...)
-" call Dfunc("SaveWinPosn() a:0=".a:0)
- if line(".") == 1 && getline(1) == ""
-" call Dfunc("SaveWinPosn : empty buffer")
- return ""
- endif
- let so_keep = &l:so
- let siso_keep = &siso
- let ss_keep = &l:ss
- setlocal so=0 siso=0 ss=0
-
- let swline = line(".")
- let swcol = col(".")
- let swwline = winline() - 1
- let swwcol = virtcol(".") - wincol()
- let savedposn = "call GoWinbufnr(".winbufnr(0).")|silent ".swline
- let savedposn = savedposn."|".s:modifier."norm! 0z\<cr>"
- if swwline > 0
- let savedposn= savedposn.":".s:modifier."norm! ".swwline."\<c-y>\<cr>"
- endif
- if swwcol > 0
- let savedposn= savedposn.":".s:modifier."norm! 0".swwcol."zl\<cr>"
- endif
- let savedposn = savedposn.":".s:modifier."call cursor(".swline.",".swcol.")\<cr>"
-
- " save window position in
- " b:cecutil_winposn_{iwinposn} (stack)
- " only when SaveWinPosn() is used
- if a:0 == 0
- if !exists("b:cecutil_iwinposn")
- let b:cecutil_iwinposn= 1
- else
- let b:cecutil_iwinposn= b:cecutil_iwinposn + 1
- endif
-" call Decho("saving posn to SWP stack")
- let b:cecutil_winposn{b:cecutil_iwinposn}= savedposn
- endif
-
- let &l:so = so_keep
- let &siso = siso_keep
- let &l:ss = ss_keep
-
-" if exists("b:cecutil_iwinposn") " Decho
-" call Decho("b:cecutil_winpos{".b:cecutil_iwinposn."}[".b:cecutil_winposn{b:cecutil_iwinposn}."]")
-" else " Decho
-" call Decho("b:cecutil_iwinposn doesn't exist")
-" endif " Decho
-" call Dret("SaveWinPosn [".savedposn."]")
- return savedposn
-endfun
-
-" ---------------------------------------------------------------------
-" RestoreWinPosn: {{{2
-" call RestoreWinPosn()
-" call RestoreWinPosn(winposn)
-fun! RestoreWinPosn(...)
-" call Dfunc("RestoreWinPosn() a:0=".a:0)
-" call Decho("getline(1)<".getline(1).">")
-" call Decho("line(.)=".line("."))
- if line(".") == 1 && getline(1) == ""
-" call Dfunc("RestoreWinPosn : empty buffer")
- return ""
- endif
- let so_keep = &l:so
- let siso_keep = &l:siso
- let ss_keep = &l:ss
- setlocal so=0 siso=0 ss=0
-
- if a:0 == 0 || a:1 == ""
- " use saved window position in b:cecutil_winposn{b:cecutil_iwinposn} if it exists
- if exists("b:cecutil_iwinposn") && exists("b:cecutil_winposn{b:cecutil_iwinposn}")
-" call Decho("using stack b:cecutil_winposn{".b:cecutil_iwinposn."}<".b:cecutil_winposn{b:cecutil_iwinposn}.">")
- try
- exe "silent! ".b:cecutil_winposn{b:cecutil_iwinposn}
- catch /^Vim\%((\a\+)\)\=:E749/
- " ignore empty buffer error messages
- endtry
- " normally drop top-of-stack by one
- " but while new top-of-stack doesn't exist
- " drop top-of-stack index by one again
- if b:cecutil_iwinposn >= 1
- unlet b:cecutil_winposn{b:cecutil_iwinposn}
- let b:cecutil_iwinposn= b:cecutil_iwinposn - 1
- while b:cecutil_iwinposn >= 1 && !exists("b:cecutil_winposn{b:cecutil_iwinposn}")
- let b:cecutil_iwinposn= b:cecutil_iwinposn - 1
- endwhile
- if b:cecutil_iwinposn < 1
- unlet b:cecutil_iwinposn
- endif
- endif
- else
- echohl WarningMsg
- echomsg "***warning*** need to SaveWinPosn first!"
- echohl None
- endif
-
- else " handle input argument
-" call Decho("using input a:1<".a:1.">")
- " use window position passed to this function
- exe "silent ".a:1
- " remove a:1 pattern from b:cecutil_winposn{b:cecutil_iwinposn} stack
- if exists("b:cecutil_iwinposn")
- let jwinposn= b:cecutil_iwinposn
- while jwinposn >= 1 " search for a:1 in iwinposn..1
- if exists("b:cecutil_winposn{jwinposn}") " if it exists
- if a:1 == b:cecutil_winposn{jwinposn} " and the pattern matches
- unlet b:cecutil_winposn{jwinposn} " unlet it
- if jwinposn == b:cecutil_iwinposn " if at top-of-stack
- let b:cecutil_iwinposn= b:cecutil_iwinposn - 1 " drop stacktop by one
- endif
- endif
- endif
- let jwinposn= jwinposn - 1
- endwhile
- endif
- endif
-
- " Seems to be something odd: vertical motions after RWP
- " cause jump to first column. The following fixes that.
- " Note: was using wincol()>1, but with signs, a cursor
- " at column 1 yields wincol()==3. Beeping ensued.
- if virtcol('.') > 1
- silent norm! hl
- elseif virtcol(".") < virtcol("$")
- silent norm! lh
- endif
-
- let &l:so = so_keep
- let &l:siso = siso_keep
- let &l:ss = ss_keep
-
-" call Dret("RestoreWinPosn")
-endfun
-
-" ---------------------------------------------------------------------
-" GoWinbufnr: go to window holding given buffer (by number) {{{2
-" Prefers current window; if its buffer number doesn't match,
-" then will try from topleft to bottom right
-fun! GoWinbufnr(bufnum)
-" call Dfunc("GoWinbufnr(".a:bufnum.")")
- if winbufnr(0) == a:bufnum
-" call Dret("GoWinbufnr : winbufnr(0)==a:bufnum")
- return
- endif
- winc t
- let first=1
- while winbufnr(0) != a:bufnum && (first || winnr() != 1)
- winc w
- let first= 0
- endwhile
-" call Dret("GoWinbufnr")
-endfun
-
-" ---------------------------------------------------------------------
-" SaveMark: sets up a string saving a mark position. {{{2
-" For example, SaveMark("a")
-" Also sets up a global variable, g:savemark_{markname}
-fun! SaveMark(markname)
-" call Dfunc("SaveMark(markname<".a:markname.">)")
- let markname= a:markname
- if strpart(markname,0,1) !~ '\a'
- let markname= strpart(markname,1,1)
- endif
-" call Decho("markname=".markname)
-
- let lzkeep = &lz
- set lz
-
- if 1 <= line("'".markname) && line("'".markname) <= line("$")
- let winposn = SaveWinPosn(0)
- exe s:modifier."norm! `".markname
- let savemark = SaveWinPosn(0)
- let g:savemark_{markname} = savemark
- let savemark = markname.savemark
- call RestoreWinPosn(winposn)
- else
- let g:savemark_{markname} = ""
- let savemark = ""
- endif
-
- let &lz= lzkeep
-
-" call Dret("SaveMark : savemark<".savemark.">")
- return savemark
-endfun
-
-" ---------------------------------------------------------------------
-" RestoreMark: {{{2
-" call RestoreMark("a") -or- call RestoreMark(savemark)
-fun! RestoreMark(markname)
-" call Dfunc("RestoreMark(markname<".a:markname.">)")
-
- if strlen(a:markname) <= 0
-" call Dret("RestoreMark : no such mark")
- return
- endif
- let markname= strpart(a:markname,0,1)
- if markname !~ '\a'
- " handles 'a -> a styles
- let markname= strpart(a:markname,1,1)
- endif
-" call Decho("markname=".markname." strlen(a:markname)=".strlen(a:markname))
-
- let lzkeep = &lz
- set lz
- let winposn = SaveWinPosn(0)
-
- if strlen(a:markname) <= 2
- if exists("g:savemark_{markname}") && strlen(g:savemark_{markname}) != 0
- " use global variable g:savemark_{markname}
-" call Decho("use savemark list")
- call RestoreWinPosn(g:savemark_{markname})
- exe "norm! m".markname
- endif
- else
- " markname is a savemark command (string)
-" call Decho("use savemark command")
- let markcmd= strpart(a:markname,1)
- call RestoreWinPosn(markcmd)
- exe "norm! m".markname
- endif
-
- call RestoreWinPosn(winposn)
- let &lz = lzkeep
-
-" call Dret("RestoreMark")
-endfun
-
-" ---------------------------------------------------------------------
-" DestroyMark: {{{2
-" call DestroyMark("a") -- destroys mark
-fun! DestroyMark(markname)
-" call Dfunc("DestroyMark(markname<".a:markname.">)")
-
- " save options and set to standard values
- let reportkeep= &report
- let lzkeep = &lz
- set lz report=10000
-
- let markname= strpart(a:markname,0,1)
- if markname !~ '\a'
- " handles 'a -> a styles
- let markname= strpart(a:markname,1,1)
- endif
-" call Decho("markname=".markname)
-
- let curmod = &mod
- let winposn = SaveWinPosn(0)
- 1
- let lineone = getline(".")
- exe "k".markname
- d
- put! =lineone
- let &mod = curmod
- call RestoreWinPosn(winposn)
-
- " restore options to user settings
- let &report = reportkeep
- let &lz = lzkeep
-
-" call Dret("DestroyMark")
-endfun
-
-" ---------------------------------------------------------------------
-" QArgSplitter: to avoid \ processing by <f-args>, <q-args> is needed. {{{2
-" However, <q-args> doesn't split at all, so this one returns a list
-" with splits at all whitespace (only!), plus a leading length-of-list.
-" The resulting list: qarglist[0] corresponds to a:0
-" qarglist[i] corresponds to a:{i}
-fun! QArgSplitter(qarg)
-" call Dfunc("QArgSplitter(qarg<".a:qarg.">)")
- let qarglist = split(a:qarg)
- let qarglistlen = len(qarglist)
- let qarglist = insert(qarglist,qarglistlen)
-" call Dret("QArgSplitter ".string(qarglist))
- return qarglist
-endfun
-
-" ---------------------------------------------------------------------
-" ListWinPosn: {{{2
-"fun! ListWinPosn() " Decho
-" if !exists("b:cecutil_iwinposn") || b:cecutil_iwinposn == 0 " Decho
-" call Decho("nothing on SWP stack") " Decho
-" else " Decho
-" let jwinposn= b:cecutil_iwinposn " Decho
-" while jwinposn >= 1 " Decho
-" if exists("b:cecutil_winposn{jwinposn}") " Decho
-" call Decho("winposn{".jwinposn."}<".b:cecutil_winposn{jwinposn}.">") " Decho
-" else " Decho
-" call Decho("winposn{".jwinposn."} -- doesn't exist") " Decho
-" endif " Decho
-" let jwinposn= jwinposn - 1 " Decho
-" endwhile " Decho
-" endif " Decho
-"endfun " Decho
-"com! -nargs=0 LWP call ListWinPosn() " Decho
-
-" ---------------------------------------------------------------------
-" SaveUserMaps: this function sets up a script-variable (s:restoremap) {{{2
-" which can be used to restore user maps later with
-" call RestoreUserMaps()
-"
-" mapmode - see :help maparg for details (n v o i c l "")
-" ex. "n" = Normal
-" The letters "b" and "u" are optional prefixes;
-" The "u" means that the map will also be unmapped
-" The "b" means that the map has a <buffer> qualifier
-" ex. "un" = Normal + unmapping
-" ex. "bn" = Normal + <buffer>
-" ex. "bun" = Normal + <buffer> + unmapping
-" ex. "ubn" = Normal + <buffer> + unmapping
-" maplead - see mapchx
-" mapchx - "<something>" handled as a single map item.
-" ex. "<left>"
-" - "string" a string of single letters which are actually
-" multiple two-letter maps (using the maplead:
-" maplead . each_character_in_string)
-" ex. maplead="\" and mapchx="abc" saves user mappings for
-" \a, \b, and \c
-" Of course, if maplead is "", then for mapchx="abc",
-" mappings for a, b, and c are saved.
-" - :something handled as a single map item, w/o the ":"
-" ex. mapchx= ":abc" will save a mapping for "abc"
-" suffix - a string unique to your plugin
-" ex. suffix= "DrawIt"
-fun! SaveUserMaps(mapmode,maplead,mapchx,suffix)
-" call Dfunc("SaveUserMaps(mapmode<".a:mapmode."> maplead<".a:maplead."> mapchx<".a:mapchx."> suffix<".a:suffix.">)")
-
- if !exists("s:restoremap_{a:suffix}")
- " initialize restoremap_suffix to null string
- let s:restoremap_{a:suffix}= ""
- endif
-
- " set up dounmap: if 1, then save and unmap (a:mapmode leads with a "u")
- " if 0, save only
- let mapmode = a:mapmode
- let dounmap = 0
- let dobuffer = ""
- while mapmode =~ '^[bu]'
- if mapmode =~ '^u'
- let dounmap= 1
- let mapmode= strpart(a:mapmode,1)
- elseif mapmode =~ '^b'
- let dobuffer= "<buffer> "
- let mapmode= strpart(a:mapmode,1)
- endif
- endwhile
-" call Decho("dounmap=".dounmap." dobuffer<".dobuffer.">")
-
- " save single map :...something...
- if strpart(a:mapchx,0,1) == ':'
-" call Decho("save single map :...something...")
- let amap= strpart(a:mapchx,1)
- if amap == "|" || amap == "\<c-v>"
- let amap= "\<c-v>".amap
- endif
- let amap = a:maplead.amap
- let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|:silent! ".mapmode."unmap ".dobuffer.amap
- if maparg(amap,mapmode) != ""
- let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge')
- let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|:".mapmode."map ".dobuffer.amap." ".maprhs
- endif
- if dounmap
- exe "silent! ".mapmode."unmap ".dobuffer.amap
- endif
-
- " save single map <something>
- elseif strpart(a:mapchx,0,1) == '<'
-" call Decho("save single map <something>")
- let amap = a:mapchx
- if amap == "|" || amap == "\<c-v>"
- let amap= "\<c-v>".amap
-" call Decho("amap[[".amap."]]")
- endif
- let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|silent! ".mapmode."unmap ".dobuffer.amap
- if maparg(a:mapchx,mapmode) != ""
- let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge')
- let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|".mapmode."map ".amap." ".dobuffer.maprhs
- endif
- if dounmap
- exe "silent! ".mapmode."unmap ".dobuffer.amap
- endif
-
- " save multiple maps
- else
-" call Decho("save multiple maps")
- let i= 1
- while i <= strlen(a:mapchx)
- let amap= a:maplead.strpart(a:mapchx,i-1,1)
- if amap == "|" || amap == "\<c-v>"
- let amap= "\<c-v>".amap
- endif
- let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|silent! ".mapmode."unmap ".dobuffer.amap
- if maparg(amap,mapmode) != ""
- let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge')
- let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|".mapmode."map ".amap." ".dobuffer.maprhs
- endif
- if dounmap
- exe "silent! ".mapmode."unmap ".dobuffer.amap
- endif
- let i= i + 1
- endwhile
- endif
-" call Dret("SaveUserMaps : restoremap_".a:suffix.": ".s:restoremap_{a:suffix})
-endfun
-
-" ---------------------------------------------------------------------
-" RestoreUserMaps: {{{2
-" Used to restore user maps saved by SaveUserMaps()
-fun! RestoreUserMaps(suffix)
-" call Dfunc("RestoreUserMaps(suffix<".a:suffix.">)")
- if exists("s:restoremap_{a:suffix}")
- let s:restoremap_{a:suffix}= substitute(s:restoremap_{a:suffix},'|\s*$','','e')
- if s:restoremap_{a:suffix} != ""
-" call Decho("exe ".s:restoremap_{a:suffix})
- exe "silent! ".s:restoremap_{a:suffix}
- endif
- unlet s:restoremap_{a:suffix}
- endif
-" call Dret("RestoreUserMaps")
-endfun
-
-" ==============
-" Restore: {{{1
-" ==============
-let &cpo= s:keepcpo
-unlet s:keepcpo
-
-" ================
-" Modelines: {{{1
-" ================
-" vim: ts=4 fdm=marker
+++ /dev/null
-" Maintainer: Robert Melton ( iam -at- robertmelton -dot- com)
-" Last Change: 2010 Jan 20th
-
-" default schemes
-amenu T&hemes.D&efault.Blue :colo blue<CR>
-amenu T&hemes.D&efault.DarkBlue :colo darkblue<CR>
-amenu T&hemes.D&efault.Default :colo default<CR>
-amenu T&hemes.D&efault.Delek :colo delek<CR>
-amenu T&hemes.D&efault.Desert :colo desert<CR>
-amenu T&hemes.D&efault.ElfLord :colo elflord<CR>
-amenu T&hemes.D&efault.Evening :colo evening<CR>
-amenu T&hemes.D&efault.Koehler :colo koehler<CR>
-amenu T&hemes.D&efault.Morning :colo morning<CR>
-amenu T&hemes.D&efault.Murphy :colo murphy<CR>
-amenu T&hemes.D&efault.Pablo :colo pablo<CR>
-amenu T&hemes.D&efault.PeachPuff :colo peachpuff<CR>
-amenu T&hemes.D&efault.Ron :colo ron<CR>
-amenu T&hemes.D&efault.Shine :colo shine<CR>
-amenu T&hemes.D&efault.Torte :colo torte<CR>
-amenu T&hemes.-s1- :
-
-" 37 new themes
-amenu T&hemes.&New.&Dark.Adaryn :colo adaryn<CR>
-amenu T&hemes.&New.&Dark.Adrian :colo adrian<CR>
-amenu T&hemes.&New.&Dark.Anotherdark :colo anotherdark<CR>
-amenu T&hemes.&New.&Dark.BlackSea :colo blacksea<CR>
-amenu T&hemes.&New.&Dark.Colorer :colo colorer<CR>
-amenu T&hemes.&New.&Dark.Darkbone :colo darkbone<CR>
-amenu T&hemes.&New.&Dark.DarkZ :colo darkz<CR>
-amenu T&hemes.&New.&Dark.Herald :colo herald<CR>
-amenu T&hemes.&New.&Dark.Jammy :colo jammy<CR>
-amenu T&hemes.&New.&Dark.Kellys :colo kellys<CR>
-amenu T&hemes.&New.&Dark.Lettuce :colo lettuce<CR>
-amenu T&hemes.&New.&Dark.Maroloccio :colo maroloccio<CR>
-amenu T&hemes.&New.&Dark.Molokai :colo molokai<CR>
-amenu T&hemes.&New.&Dark.Mustang :colo mustang<CR>
-amenu T&hemes.&New.&Dark.TIRBlack :colo tir_black<CR>
-amenu T&hemes.&New.&Dark.Twilight :colo twilight<CR>
-amenu T&hemes.&New.&Dark.Two2Tango :colo two2tango<CR>
-amenu T&hemes.&New.&Dark.Wuye :colo wuye<CR>
-amenu T&hemes.&New.&Dark.Zmrok :colo zmrok<CR>
-amenu T&hemes.&New.&Light.BClear :colo bclear<CR>
-amenu T&hemes.&New.&Light.Satori :colo satori<CR>
-amenu T&hemes.&New.&Light.Silent :colo silent<CR>
-amenu T&hemes.&New.&Light.SoSo :colo soso<CR>
-amenu T&hemes.&New.&Light.SummerFruit256 :colo summerfruit256<CR>
-amenu T&hemes.&New.&Light.TAqua :colo taqua<CR>
-amenu T&hemes.&New.&Light.TCSoft :colo tcsoft<CR>
-amenu T&hemes.&New.&Light.VYLight :colo vylight<CR>
-amenu T&hemes.&New.&Other.Aqua :colo aqua<CR>
-amenu T&hemes.&New.&Other.Clarity :colo clarity<CR>
-amenu T&hemes.&New.&Other.CleanPHP :colo cleanphp<CR>
-amenu T&hemes.&New.&Other.Denim :colo denim<CR>
-amenu T&hemes.&New.&Other.Guardian :colo guardian<CR>
-amenu T&hemes.&New.&Other.Moss :colo moss<CR>
-amenu T&hemes.&New.&Other.Nightshimmer :colo nightshimmer<CR>
-amenu T&hemes.&New.&Other.NoQuarter :colo no_quarter<CR>
-amenu T&hemes.&New.&Other.RobinHood :colo robinhood<CR>
-amenu T&hemes.&New.&Other.SoftBlue :colo softblue<CR>
-amenu T&hemes.&New.&Other.Wood :colo wood<CR>
-
-" 30 removed themes
-amenu T&hemes.De&precated.&Dark.DwBlue :colo dw_blue<CR>
-amenu T&hemes.De&precated.&Dark.DwCyan :colo dw_cyan<CR>
-amenu T&hemes.De&precated.&Dark.DwGreen :colo dw_green<CR>
-amenu T&hemes.De&precated.&Dark.DwOrange :colo dw_orange<CR>
-amenu T&hemes.De&precated.&Dark.DwPurple :colo dw_purple<CR>
-amenu T&hemes.De&precated.&Dark.DwRed :colo dw_red<CR>
-amenu T&hemes.De&precated.&Dark.DwYellow :colo dw_yellow<CR>
-amenu T&hemes.De&precated.&Dark.Fruity :colo fruity<CR>
-amenu T&hemes.De&precated.&Dark.Leo :colo leo<CR>
-amenu T&hemes.De&precated.&Dark.Matrix :colo matrix<CR>
-amenu T&hemes.De&precated.&Dark.Metacosm :colo metacosm<CR>
-amenu T&hemes.De&precated.&Dark.Northland :colo northland<CR>
-amenu T&hemes.De&precated.&Dark.Railscasts2 :colo railscasts2<CR>
-amenu T&hemes.De&precated.&Dark.Synic :colo synic<CR>
-amenu T&hemes.De&precated.&Dark.Wombat256 :colo wombat256<CR>
-amenu T&hemes.De&precated.&Dark.Xoria256 :colo xoria256<CR>
-amenu T&hemes.De&precated.&Light.Autumn2 :colo autumn2<CR>
-amenu T&hemes.De&precated.&Light.Buttercream :colo buttercream<CR>
-amenu T&hemes.De&precated.&Light.Fine_blue :colo fine_blue<CR>
-amenu T&hemes.De&precated.&Light.Impact :colo impact<CR>
-amenu T&hemes.De&precated.&Light.Oceanlight :colo oceanlight<CR>
-amenu T&hemes.De&precated.&Light.Print_bw :colo print_bw<CR>
-amenu T&hemes.De&precated.&Light.Pyte :colo pyte<CR>
-amenu T&hemes.De&precated.&Light.Spring :colo spring<CR>
-amenu T&hemes.De&precated.&Light.Winter :colo winter<CR>
-amenu T&hemes.De&precated.&Other.Astronaut :colo astronaut<CR>
-amenu T&hemes.De&precated.&Other.Bluegreen :colo bluegreen<CR>
-amenu T&hemes.De&precated.&Other.Navajo :colo navajo<CR>
-amenu T&hemes.De&precated.&Other.Olive :colo olive<CR>
-amenu T&hemes.De&precated.&Other.Tabula :colo tabula<CR>
-amenu T&hemes.De&precated.&Other.Xemacs :colo xemacs<CR>
-
-" Themepack Themes
-amenu T&hemes.&Dark.Asu1dark :colo asu1dark<CR>
-amenu T&hemes.&Dark.Brookstream :colo brookstream<CR>
-amenu T&hemes.&Dark.Calmar256-dark :colo calmar256-dark<CR>
-amenu T&hemes.&Dark.Camo :colo camo<CR>
-amenu T&hemes.&Dark.Candy :colo candy<CR>
-amenu T&hemes.&Dark.Candycode :colo candycode<CR>
-amenu T&hemes.&Dark.Dante :colo dante<CR>
-amenu T&hemes.&Dark.Darkspectrum :colo darkspectrum<CR>
-amenu T&hemes.&Dark.Desert256 :colo desert256<CR>
-amenu T&hemes.&Dark.DesertEx :colo desertEx<CR>
-amenu T&hemes.&Dark.Dusk :colo dusk<CR>
-amenu T&hemes.&Dark.Earendel :colo earendel<CR>
-amenu T&hemes.&Dark.Ekvoli :colo ekvoli<CR>
-amenu T&hemes.&Dark.Fnaqevan :colo fnaqevan<CR>
-amenu T&hemes.&Dark.Freya :colo freya<CR>
-amenu T&hemes.&Dark.Golden :colo golden<CR>
-amenu T&hemes.&Dark.Inkpot :colo inkpot<CR>
-amenu T&hemes.&Dark.Jellybeans :colo jellybeans<CR>
-amenu T&hemes.&Dark.Lucius :colo lucius<CR>
-amenu T&hemes.&Dark.Manxome :colo manxome<CR>
-amenu T&hemes.&Dark.Moria :colo moria<CR>
-amenu T&hemes.&Dark.Motus :colo motus<CR>
-amenu T&hemes.&Dark.Neon :colo neon<CR>
-amenu T&hemes.&Dark.Neverness :colo neverness<CR>
-amenu T&hemes.&Dark.Oceanblack :colo oceanblack<CR>
-amenu T&hemes.&Dark.Railscasts :colo railscasts<CR>
-amenu T&hemes.&Dark.Rdark :colo rdark<CR>
-amenu T&hemes.&Dark.Relaxedgreen :colo relaxedgreen<CR>
-amenu T&hemes.&Dark.Rootwater :colo rootwater<CR>
-amenu T&hemes.&Dark.Tango :colo tango<CR>
-amenu T&hemes.&Dark.Tango2 :colo tango2<CR>
-amenu T&hemes.&Dark.Vibrantink :colo vibrantink<CR>
-amenu T&hemes.&Dark.Vividchalk :colo vividchalk<CR>
-amenu T&hemes.&Dark.Wombat :colo wombat<CR>
-amenu T&hemes.&Dark.Zenburn :colo zenburn<CR>
-
-amenu T&hemes.&Light.Autumn :colo autumn<CR>
-amenu T&hemes.&Light.Autumnleaf :colo autumnleaf<CR>
-amenu T&hemes.&Light.Baycomb :colo baycomb<CR>
-amenu T&hemes.&Light.Biogoo :colo biogoo<CR>
-amenu T&hemes.&Light.Calmar256-light :colo calmar256-light<CR>
-amenu T&hemes.&Light.Chela_light :colo chela_light<CR>
-amenu T&hemes.&Light.Dawn :colo dawn<CR>
-amenu T&hemes.&Light.Eclipse :colo eclipse<CR>
-amenu T&hemes.&Light.Fog :colo fog<CR>
-amenu T&hemes.&Light.Fruit :colo fruit<CR>
-amenu T&hemes.&Light.Habilight :colo habilight<CR>
-amenu T&hemes.&Light.Ironman :colo ironman<CR>
-amenu T&hemes.&Light.Martin_krischik :colo martin_krischik<CR>
-amenu T&hemes.&Light.Nuvola :colo nuvola<CR>
-amenu T&hemes.&Light.PapayaWhip :colo PapayaWhip<CR>
-amenu T&hemes.&Light.Sienna :colo sienna<CR>
-amenu T&hemes.&Light.Simpleandfriendly :colo simpleandfriendly<CR>
-amenu T&hemes.&Light.Tolerable :colo tolerable<CR>
-amenu T&hemes.&Light.Vc :colo vc<CR>
-
-amenu T&hemes.&Other.Aiseered :colo aiseered<CR>
-amenu T&hemes.&Other.Borland :colo borland<CR>
-amenu T&hemes.&Other.Breeze :colo breeze<CR>
-amenu T&hemes.&Other.Chocolateliquor :colo chocolateliquor<CR>
-amenu T&hemes.&Other.Darkblue2 :colo darkblue2<CR>
-amenu T&hemes.&Other.Darkslategray :colo darkslategray<CR>
-amenu T&hemes.&Other.Marklar :colo marklar<CR>
-amenu T&hemes.&Other.Navajo-night :colo navajo-night<CR>
-amenu T&hemes.&Other.Night :colo night<CR>
-amenu T&hemes.&Other.Oceandeep :colo oceandeep<CR>
-amenu T&hemes.&Other.Peaksea :colo peaksea<CR>
-amenu T&hemes.&Other.Sea :colo sea<CR>
-amenu T&hemes.&Other.Settlemyer :colo settlemyer<CR>
+++ /dev/null
-" FILE: plugin/conque_term.vim {{{
-" AUTHOR: Nico Raffo <nicoraffo@gmail.com>
-" MODIFIED: 2010-05-27
-" VERSION: 1.1, for Vim 7.0
-" LICENSE:
-" Conque - pty interaction in Vim
-" Copyright (C) 2009-2010 Nico Raffo
-"
-" MIT License
-"
-" Permission is hereby granted, free of charge, to any person obtaining a copy
-" of this software and associated documentation files (the "Software"), to deal
-" in the Software without restriction, including without limitation the rights
-" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-" copies of the Software, and to permit persons to whom the Software is
-" furnished to do so, subject to the following conditions:
-"
-" The above copyright notice and this permission notice shall be included in
-" all copies or substantial portions of the Software.
-"
-" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-" THE SOFTWARE.
-" }}}
-
-" See docs/conque_term.txt for help or type :help conque_term
-
-if exists('g:ConqueTerm_Loaded') || v:version < 700
- finish
-endif
-
-" **********************************************************************************************************
-" **** CONFIG **********************************************************************************************
-" **********************************************************************************************************
-
-" Choose key mapping to leave insert mode {{{
-" If you choose something other than '<Esc>', then <Esc> will be sent to terminal
-" Using a different key will usually fix Alt/Meta key issues
-if !exists('g:ConqueTerm_EscKey')
- let g:ConqueTerm_EscKey = '<Esc>'
-endif " }}}
-
-" Enable color. {{{
-" If your apps use a lot of color it will slow down the shell.
-if !exists('g:ConqueTerm_Color')
- let g:ConqueTerm_Color = 1
-endif " }}}
-
-" TERM environment setting {{{
-if !exists('g:ConqueTerm_TERM')
- let g:ConqueTerm_TERM = 'vt100'
-endif " }}}
-
-" Syntax for your buffer {{{
-if !exists('g:ConqueTerm_Syntax')
- let g:ConqueTerm_Syntax = 'conque_term'
-endif " }}}
-
-" Keep on updating the shell window after you've switched to another buffer {{{
-if !exists('g:ConqueTerm_ReadUnfocused')
- let g:ConqueTerm_ReadUnfocused = 0
-endif " }}}
-
-" Use this regular expression to highlight prompt {{{
-if !exists('g:ConqueTerm_PromptRegex')
- let g:ConqueTerm_PromptRegex = '^\w\+@[0-9A-Za-z_.-]\+:[0-9A-Za-z_./\~,:-]\+\$'
-endif " }}}
-
-" Allow user to use <C-w> keys to switch window in insert mode. {{{
-if !exists('g:ConqueTerm_CWInsert')
- let g:ConqueTerm_CWInsert = 0
-endif " }}}
-
-" **********************************************************************************************************
-" **** Startup *********************************************************************************************
-" **********************************************************************************************************
-
-" Startup {{{
-
-let g:ConqueTerm_Loaded = 1
-let g:ConqueTerm_Idx = 1
-
-command! -nargs=+ -complete=shellcmd ConqueTerm call conque_term#open(<q-args>)
-command! -nargs=+ -complete=shellcmd ConqueTermSplit call conque_term#open(<q-args>, ['belowright split'])
-command! -nargs=+ -complete=shellcmd ConqueTermVSplit call conque_term#open(<q-args>, ['belowright vsplit'])
-command! -nargs=+ -complete=shellcmd ConqueTermTab call conque_term#open(<q-args>, ['tabnew'])
-
-" }}}
-
+++ /dev/null
-" File: plugin/delimitMate.vim
-" Version: 2.6
-" Modified: 2011-01-14
-" Description: This plugin provides auto-completion for quotes, parens, etc.
-" Maintainer: Israel Chauca F. <israelchauca@gmail.com>
-" Manual: Read ":help delimitMate".
-" ============================================================================
-
-" Initialization: {{{
-
-if exists("g:loaded_delimitMate") || &cp
- " User doesn't want this plugin or compatible is set, let's get out!
- finish
-endif
-let g:loaded_delimitMate = 1
-
-if exists("s:loaded_delimitMate") && !exists("g:delimitMate_testing")
- " Don't define the functions if they already exist: just do the work
- " (unless we are testing):
- call s:DelimitMateDo()
- finish
-endif
-
-if v:version < 700
- echoerr "delimitMate: this plugin requires vim >= 7!"
- finish
-endif
-
-let s:loaded_delimitMate = 1
-let delimitMate_version = "2.6"
-
-function! s:option_init(name, default) "{{{
- let b = exists("b:delimitMate_" . a:name)
- let g = exists("g:delimitMate_" . a:name)
- let prefix = "_l_delimitMate_"
-
- if !b && !g
- let sufix = a:default
- elseif !b && g
- exec "let sufix = g:delimitMate_" . a:name
- else
- exec "let sufix = b:delimitMate_" . a:name
- endif
- if exists("b:" . prefix . a:name)
- exec "unlockvar! b:" . prefix . a:name
- endif
- exec "let b:" . prefix . a:name . " = " . string(sufix)
- exec "lockvar! b:" . prefix . a:name
-endfunction "}}}
-
-function! s:init() "{{{
-" Initialize variables:
-
- " autoclose
- call s:option_init("autoclose", 1)
-
- " matchpairs
- call s:option_init("matchpairs", string(&matchpairs)[1:-2])
- call s:option_init("matchpairs_list", split(b:_l_delimitMate_matchpairs, ','))
- call s:option_init("left_delims", split(b:_l_delimitMate_matchpairs, ':.,\='))
- call s:option_init("right_delims", split(b:_l_delimitMate_matchpairs, ',\=.:'))
-
- " quotes
- call s:option_init("quotes", "\" ' `")
- call s:option_init("quotes_list", split(b:_l_delimitMate_quotes))
-
- " nesting_quotes
- call s:option_init("nesting_quotes", [])
-
- " excluded_regions
- call s:option_init("excluded_regions", "Comment")
- call s:option_init("excluded_regions_list", split(b:_l_delimitMate_excluded_regions, ',\s*'))
- let enabled = len(b:_l_delimitMate_excluded_regions_list) > 0
- call s:option_init("excluded_regions_enabled", enabled)
-
- " excluded filetypes
- call s:option_init("excluded_ft", "")
-
- " expand_space
- if exists("b:delimitMate_expand_space") && type(b:delimitMate_expand_space) == type("")
- echom "b:delimitMate_expand_space is '".b:delimitMate_expand_space."' but it must be either 1 or 0!"
- echom "Read :help 'delimitMate_expand_space' for more details."
- unlet b:delimitMate_expand_space
- let b:delimitMate_expand_space = 1
- endif
- if exists("g:delimitMate_expand_space") && type(g:delimitMate_expand_space) == type("")
- echom "delimitMate_expand_space is '".g:delimitMate_expand_space."' but it must be either 1 or 0!"
- echom "Read :help 'delimitMate_expand_space' for more details."
- unlet g:delimitMate_expand_space
- let g:delimitMate_expand_space = 1
- endif
- call s:option_init("expand_space", 0)
-
- " expand_cr
- if exists("b:delimitMate_expand_cr") && type(b:delimitMate_expand_cr) == type("")
- echom "b:delimitMate_expand_cr is '".b:delimitMate_expand_cr."' but it must be either 1 or 0!"
- echom "Read :help 'delimitMate_expand_cr' for more details."
- unlet b:delimitMate_expand_cr
- let b:delimitMate_expand_cr = 1
- endif
- if exists("g:delimitMate_expand_cr") && type(g:delimitMate_expand_cr) == type("")
- echom "delimitMate_expand_cr is '".g:delimitMate_expand_cr."' but it must be either 1 or 0!"
- echom "Read :help 'delimitMate_expand_cr' for more details."
- unlet g:delimitMate_expand_cr
- let g:delimitMate_expand_cr = 1
- endif
- if ((&backspace !~ 'eol' || &backspace !~ 'start') && &backspace != 2) &&
- \ ((exists('b:delimitMate_expand_cr') && b:delimitMate_expand_cr == 1) ||
- \ (exists('g:delimitMate_expand_cr') && g:delimitMate_expand_cr == 1))
- echom "delimitMate: There seems to be some incompatibility with your settings that may interfer with the expansion of <CR>. See :help 'delimitMate_expand_cr' for details."
- endif
- call s:option_init("expand_cr", 0)
-
- " smart_matchpairs
- call s:option_init("smart_matchpairs", '^\%(\w\|\!\|£\|\$\|_\|["'']\s*\S\)')
-
- " smart_quotes
- call s:option_init("smart_quotes", 1)
-
- " apostrophes
- call s:option_init("apostrophes", "")
- call s:option_init("apostrophes_list", split(b:_l_delimitMate_apostrophes, ":\s*"))
-
- " tab2exit
- call s:option_init("tab2exit", 1)
-
- " balance_matchpairs
- call s:option_init("balance_matchpairs", 0)
-
- let b:_l_delimitMate_buffer = []
-
-endfunction "}}} Init()
-
-"}}}
-
-" Functions: {{{
-
-function! s:Map() "{{{
- " Set mappings:
- try
- let save_cpo = &cpo
- let save_keymap = &keymap
- let save_iminsert = &iminsert
- let save_imsearch = &imsearch
- set keymap=
- set cpo&vim
- if b:_l_delimitMate_autoclose
- call s:AutoClose()
- else
- call s:NoAutoClose()
- endif
- call s:ExtraMappings()
- finally
- let &cpo = save_cpo
- let &keymap = save_keymap
- let &iminsert = save_iminsert
- let &imsearch = save_imsearch
- endtry
-
- let b:delimitMate_enabled = 1
-
-endfunction "}}} Map()
-
-function! s:Unmap() " {{{
- let imaps =
- \ b:_l_delimitMate_right_delims +
- \ b:_l_delimitMate_left_delims +
- \ b:_l_delimitMate_quotes_list +
- \ b:_l_delimitMate_apostrophes_list +
- \ ['<BS>', '<S-BS>', '<Del>', '<CR>', '<Space>', '<S-Tab>', '<Esc>'] +
- \ ['<Up>', '<Down>', '<Left>', '<Right>', '<LeftMouse>', '<RightMouse>'] +
- \ ['<Home>', '<End>', '<PageUp>', '<PageDown>', '<S-Down>', '<S-Up>', '<C-G>g']
-
- for map in imaps
- if maparg(map, "i") =~? 'delimitMate'
- if map == '|'
- let map = '<Bar>'
- endif
- exec 'silent! iunmap <buffer> ' . map
- endif
- endfor
-
- if !has('gui_running')
- silent! iunmap <C-[>OC
- endif
-
- let b:delimitMate_enabled = 0
-endfunction " }}} s:Unmap()
-
-function! s:TestMappingsDo() "{{{
- %d
- if !exists("g:delimitMate_testing")
- silent call delimitMate#TestMappings()
- else
- let temp_varsDM = [b:_l_delimitMate_expand_space, b:_l_delimitMate_expand_cr, b:_l_delimitMate_autoclose]
- for i in [0,1]
- let b:delimitMate_expand_space = i
- let b:delimitMate_expand_cr = i
- for a in [0,1]
- let b:delimitMate_autoclose = a
- call s:init()
- call s:Unmap()
- call s:Map()
- call delimitMate#TestMappings()
- call append(line('$'),'')
- endfor
- endfor
- let b:delimitMate_expand_space = temp_varsDM[0]
- let b:delimitMate_expand_cr = temp_varsDM[1]
- let b:delimitMate_autoclose = temp_varsDM[2]
- unlet temp_varsDM
- endif
- normal gg
- g/\%^$/d
-endfunction "}}}
-
-function! s:DelimitMateDo(...) "{{{
-
- " First, remove all magic, if needed:
- if exists("b:delimitMate_enabled") && b:delimitMate_enabled == 1
- call s:Unmap()
- endif
-
- " Check if this file type is excluded:
- if exists("g:delimitMate_excluded_ft") &&
- \ index(split(g:delimitMate_excluded_ft, ','), &filetype, 0, 1) >= 0
-
- " Finish here:
- return 1
- endif
-
- " Check if user tried to disable using b:loaded_delimitMate
- if exists("b:loaded_delimitMate")
- return 1
- endif
-
- " Initialize settings:
- call s:init()
-
- " Now, add magic:
- call s:Map()
-
- if a:0 > 0
- echo "delimitMate has been reset."
- endif
-endfunction "}}}
-
-function! s:DelimitMateSwitch() "{{{
- if exists("b:delimitMate_enabled") && b:delimitMate_enabled
- call s:Unmap()
- echo "delimitMate has been disabled."
- else
- call s:Unmap()
- call s:init()
- call s:Map()
- echo "delimitMate has been enabled."
- endif
-endfunction "}}}
-
-function! s:Finish() " {{{
- if exists('g:delimitMate_loaded')
- return delimitMate#Finish(1)
- endif
- return ''
-endfunction " }}}
-
-function! s:FlushBuffer() " {{{
- if exists('g:delimitMate_loaded')
- return delimitMate#FlushBuffer()
- endif
- return ''
-endfunction " }}}
-
-"}}}
-
-" Mappers: {{{
-function! s:NoAutoClose() "{{{
- " inoremap <buffer> ) <C-R>=delimitMate#SkipDelim('\)')<CR>
- for delim in b:_l_delimitMate_right_delims + b:_l_delimitMate_quotes_list
- if delim == '|'
- let delim = '<Bar>'
- endif
- exec 'inoremap <silent> <Plug>delimitMate' . delim . ' <C-R>=delimitMate#SkipDelim("' . escape(delim,'"') . '")<CR>'
- exec 'silent! imap <unique> <buffer> '.delim.' <Plug>delimitMate'.delim
- endfor
-endfunction "}}}
-
-function! s:AutoClose() "{{{
- " Add matching pair and jump to the midle:
- " inoremap <silent> <buffer> ( ()<Left>
- let i = 0
- while i < len(b:_l_delimitMate_matchpairs_list)
- let ld = b:_l_delimitMate_left_delims[i] == '|' ? '<bar>' : b:_l_delimitMate_left_delims[i]
- let rd = b:_l_delimitMate_right_delims[i] == '|' ? '<bar>' : b:_l_delimitMate_right_delims[i]
- exec 'inoremap <silent> <Plug>delimitMate' . ld . ' ' . ld . '<C-R>=delimitMate#ParenDelim("' . escape(rd, '|') . '")<CR>'
- exec 'silent! imap <unique> <buffer> '.ld.' <Plug>delimitMate'.ld
- let i += 1
- endwhile
-
- " Exit from inside the matching pair:
- for delim in b:_l_delimitMate_right_delims
- exec 'inoremap <silent> <Plug>delimitMate' . delim . ' <C-R>=delimitMate#JumpOut("\' . delim . '")<CR>'
- exec 'silent! imap <unique> <buffer> ' . delim . ' <Plug>delimitMate'. delim
- endfor
-
- " Add matching quote and jump to the midle, or exit if inside a pair of matching quotes:
- " inoremap <silent> <buffer> " <C-R>=delimitMate#QuoteDelim("\"")<CR>
- for delim in b:_l_delimitMate_quotes_list
- if delim == '|'
- let delim = '<Bar>'
- endif
- exec 'inoremap <silent> <Plug>delimitMate' . delim . ' <C-R>=delimitMate#QuoteDelim("\' . delim . '")<CR>'
- exec 'silent! imap <unique> <buffer> ' . delim . ' <Plug>delimitMate' . delim
- endfor
-
- " Try to fix the use of apostrophes (kept for backward compatibility):
- " inoremap <silent> <buffer> n't n't
- for map in b:_l_delimitMate_apostrophes_list
- exec "inoremap <silent> " . map . " " . map
- exec 'silent! imap <unique> <buffer> ' . map . ' <Plug>delimitMate' . map
- endfor
-endfunction "}}}
-
-function! s:ExtraMappings() "{{{
- " If pair is empty, delete both delimiters:
- inoremap <silent> <Plug>delimitMateBS <C-R>=delimitMate#BS()<CR>
- if !hasmapto('<Plug>delimitMateBS','i')
- silent! imap <unique> <buffer> <BS> <Plug>delimitMateBS
- endif
- " If pair is empty, delete closing delimiter:
- inoremap <silent> <expr> <Plug>delimitMateS-BS delimitMate#WithinEmptyPair() ? "\<C-R>=delimitMate#Del()\<CR>" : "\<S-BS>"
- if !hasmapto('<Plug>delimitMateS-BS','i')
- silent! imap <unique> <buffer> <S-BS> <Plug>delimitMateS-BS
- endif
- " Expand return if inside an empty pair:
- inoremap <silent> <Plug>delimitMateCR <C-R>=delimitMate#ExpandReturn()<CR>
- if b:_l_delimitMate_expand_cr != 0 && !hasmapto('<Plug>delimitMateCR', 'i')
- silent! imap <unique> <buffer> <CR> <Plug>delimitMateCR
- endif
- " Expand space if inside an empty pair:
- inoremap <silent> <Plug>delimitMateSpace <C-R>=delimitMate#ExpandSpace()<CR>
- if b:_l_delimitMate_expand_space != 0 && !hasmapto('<Plug>delimitMateSpace', 'i')
- silent! imap <unique> <buffer> <Space> <Plug>delimitMateSpace
- endif
- " Jump over any delimiter:
- inoremap <silent> <Plug>delimitMateS-Tab <C-R>=delimitMate#JumpAny("\<S-Tab>")<CR>
- if b:_l_delimitMate_tab2exit && !hasmapto('<Plug>delimitMateS-Tab', 'i')
- silent! imap <unique> <buffer> <S-Tab> <Plug>delimitMateS-Tab
- endif
- " Change char buffer on Del:
- inoremap <silent> <Plug>delimitMateDel <C-R>=delimitMate#Del()<CR>
- if !hasmapto('<Plug>delimitMateDel', 'i')
- silent! imap <unique> <buffer> <Del> <Plug>delimitMateDel
- endif
- " Flush the char buffer on movement keystrokes or when leaving insert mode:
- for map in ['Esc', 'Left', 'Right', 'Home', 'End']
- exec 'inoremap <silent> <Plug>delimitMate'.map.' <C-R>=<SID>Finish()<CR><'.map.'>'
- if !hasmapto('<Plug>delimitMate'.map, 'i')
- exec 'silent! imap <unique> <buffer> <'.map.'> <Plug>delimitMate'.map
- endif
- endfor
- " Except when pop-up menu is active:
- for map in ['Up', 'Down', 'PageUp', 'PageDown', 'S-Down', 'S-Up']
- exec 'inoremap <silent> <expr> <Plug>delimitMate'.map.' pumvisible() ? "\<'.map.'>" : "\<C-R>=\<SID>Finish()\<CR>\<'.map.'>"'
- if !hasmapto('<Plug>delimitMate'.map, 'i')
- exec 'silent! imap <unique> <buffer> <'.map.'> <Plug>delimitMate'.map
- endif
- endfor
- " Avoid ambiguous mappings:
- for map in ['LeftMouse', 'RightMouse']
- exec 'inoremap <silent> <Plug>delimitMateM'.map.' <C-R>=delimitMate#Finish(1)<CR><'.map.'>'
- if !hasmapto('<Plug>delimitMate'.map, 'i')
- exec 'silent! imap <unique> <buffer> <'.map.'> <Plug>delimitMateM'.map
- endif
- endfor
-
- " Jump over next delimiters
- inoremap <buffer> <Plug>delimitMateJumpMany <C-R>=len(b:_l_delimitMate_buffer) ? delimitMate#Finish(0) : delimitMate#JumpMany()<CR>
- if !hasmapto('<Plug>delimitMateJumpMany')
- imap <silent> <buffer> <C-G>g <Plug>delimitMateJumpMany
- endif
-
- " The following simply creates an ambiguous mapping so vim fully processes
- " the escape sequence for terminal keys, see 'ttimeout' for a rough
- " explanation, this just forces it to work
- if !has('gui_running')
- imap <silent> <C-[>OC <RIGHT>
- endif
-endfunction "}}}
-
-"}}}
-
-" Commands: {{{
-
-call s:DelimitMateDo()
-
-" Let me refresh without re-loading the buffer:
-command! -bar DelimitMateReload call s:DelimitMateDo(1)
-
-" Quick test:
-command! -bar DelimitMateTest silent call s:TestMappingsDo()
-
-" Switch On/Off:
-command! -bar DelimitMateSwitch call s:DelimitMateSwitch()
-"}}}
-
-" Autocommands: {{{
-
-augroup delimitMate
- au!
- " Run on file type change.
- "autocmd VimEnter * autocmd FileType * call <SID>DelimitMateDo()
- autocmd FileType * call <SID>DelimitMateDo()
-
- " Run on new buffers.
- autocmd BufNewFile,BufRead,BufEnter *
- \ if !exists('b:delimitMate_was_here') |
- \ call <SID>DelimitMateDo() |
- \ let b:delimitMate_was_here = 1 |
- \ endif
-
- " Flush the char buffer:
- autocmd InsertEnter * call <SID>FlushBuffer()
- autocmd BufEnter *
- \ if mode() == 'i' |
- \ call <SID>FlushBuffer() |
- \ endif
-
-augroup END
-
-"}}}
-
-" GetLatestVimScripts: 2754 1 :AutoInstall: delimitMate.vim
-" vim:foldmethod=marker:foldcolumn=4
+++ /dev/null
-" endwise.vim - EndWise
-" Author: Tim Pope <http://tpo.pe/>
-" Version: 1.0
-" License: Same as Vim itself. See :help license
-" GetLatestVimScripts: 2386 1 :AutoInstall: endwise.vim
-
-if exists("g:loaded_endwise") || &cp
- finish
-endif
-let g:loaded_endwise = 1
-
-augroup endwise " {{{1
- autocmd!
- autocmd FileType lua
- \ let b:endwise_addition = '\=submatch(0)=="{" ? "}" : "end"' |
- \ let b:endwise_words = 'function,do,then' |
- \ let b:endwise_pattern = '^\s*\zs\%(function\|do\|then\)\>\%(.*[^.:@$]\<end\>\)\@!\|\<then\|do\ze\%(\s*|.*|\)\=\s*$' |
- \ let b:endwise_syngroups = 'luaFunction,luaStatement,luaCond'
- autocmd FileType ruby
- \ let b:endwise_addition = '\=submatch(0)=="{" ? "}" : "end"' |
- \ let b:endwise_words = 'module,class,def,if,unless,case,while,until,begin,do' |
- \ let b:endwise_pattern = '^\s*\zs\%(module\|class\|def\|if\|unless\|case\|while\|until\|for\|\|begin\)\>\%(.*[^.:@$]\<end\>\)\@!\|\<do\ze\%(\s*|.*|\)\=\s*$' |
- \ let b:endwise_syngroups = 'rubyModule,rubyClass,rubyDefine,rubyControl,rubyConditional,rubyRepeat'
- autocmd FileType sh,zsh
- \ let b:endwise_addition = '\=submatch(0)=="if" ? "fi" : submatch(0)=="case" ? "esac" : "done"' |
- \ let b:endwise_words = 'if,until,case,do' |
- \ let b:endwise_pattern = '\%(^\s*\zs\%(if\|case\)\>\ze\|\zs\<do\ze$\|^\s*\zsdo\s*\ze$\)' |
- \ let b:endwise_syngroups = 'shConditional,shLoop,shIf,shFor,shRepeat,shCaseEsac,zshConditional,zshRepeat,zshDelimiter'
- autocmd FileType vb,vbnet,aspvbs
- \ let b:endwise_addition = 'End &' |
- \ let b:endwise_words = 'Function,Sub,Class,Module,Enum,Namespace' |
- \ let b:endwise_pattern = '\%(\<End\>.*\)\@<!\<&\>' |
- \ let b:endwise_syngroups = 'vbStatement,vbnetStorage,vbnetProcedure,vbnet.*Words,AspVBSStatement'
- autocmd FileType vim
- \ let b:endwise_addition = 'end&' |
- \ let b:endwise_words = 'fu\%[nction],wh\%[ile],if,for,try' |
- \ let b:endwise_syngroups = 'vimFuncKey,vimNotFunc,vimCommand'
-augroup END " }}}1
-
-" Maps {{{1
-
-if maparg("<Plug>DiscretionaryEnd") == ""
- inoremap <silent> <SID>DiscretionaryEnd <C-R>=<SID>crend(0)<CR>
- inoremap <silent> <SID>AlwaysEnd <C-R>=<SID>crend(1)<CR>
- imap <script> <Plug>DiscretionaryEnd <SID>DiscretionaryEnd
- imap <script> <Plug>AlwaysEnd <SID>AlwaysEnd
-endif
-if maparg('<CR>','i') =~# '<C-R>=.*crend(.)<CR>\|<\%(Plug\|SID\)>.*End'
- " Already mapped
-elseif maparg('<CR>','i') =~ '<CR>'
- exe "imap <script> <C-X><CR> ".maparg('<CR>','i')."<SID>AlwaysEnd"
- exe "imap <script> <CR> ".maparg('<CR>','i')."<SID>DiscretionaryEnd"
-elseif maparg('<CR>','i') =~ '<Plug>delimitMateCR'
- exe "imap <C-X><CR> ".maparg('<CR>', 'i')."<Plug>AlwaysEnd"
- exe "imap <CR> ".maparg('<CR>', 'i')."<Plug>DiscretionaryEnd"
-else
- imap <C-X><CR> <CR><Plug>AlwaysEnd
- imap <CR> <CR><Plug>DiscretionaryEnd
-endif
-
-if maparg('<M-o>','i') == ''
- inoremap <M-o> <C-O>o
-endif
-
-" }}}1
-
-" Code {{{1
-
-function! s:mysearchpair(beginpat,endpat,synpat)
- let g:endwise_syntaxes = ""
- let s:lastline = line('.')
- call s:synname()
- let line = searchpair(a:beginpat,'',a:endpat,'Wn','<SID>synname() !~# "^'.substitute(a:synpat,'\\','\\\\','g').'$"',line('.')+50)
- return line
-endfunction
-
-function! s:crend(always)
- let n = ""
- if !exists("b:endwise_addition") || !exists("b:endwise_words") || !exists("b:endwise_syngroups")
- return n
- end
- let synpat = '\%('.substitute(b:endwise_syngroups,',','\\|','g').'\)'
- let wordchoice = '\%('.substitute(b:endwise_words,',','\\|','g').'\)'
- if exists("b:endwise_pattern")
- let beginpat = substitute(b:endwise_pattern,'&',substitute(wordchoice,'\\','\\&','g'),'g')
- else
- let beginpat = '\<'.wordchoice.'\>'
- endif
- let lnum = line('.') - 1
- let space = matchstr(getline(lnum),'^\s*')
- let col = match(getline(lnum),beginpat) + 1
- let word = matchstr(getline(lnum),beginpat)
- let endword = substitute(word,'.*',b:endwise_addition,'')
- let y = n.endword."\<C-O>O"
- let endpat = '\<'.endword.'\>'
- if a:always
- return y
- elseif col <= 0 || synIDattr(synID(lnum,col,1),'name') !~ '^'.synpat.'$'
- return n
- elseif getline('.') !~ '^\s*#\=$'
- return n
- endif
- let line = s:mysearchpair(beginpat,endpat,synpat)
- " even is false if no end was found, or if the end found was less
- " indented than the current line
- let even = strlen(matchstr(getline(line),'^\s*')) >= strlen(space)
- if line == 0
- let even = 0
- endif
- if !even && line == line('.') + 1
- return y
- endif
- if even
- return n
- endif
- return y
-endfunction
-
-function! s:synname()
- " Checking this helps to force things to stay in sync
- while s:lastline < line('.')
- let s = synIDattr(synID(s:lastline,indent(s:lastline)+1,1),'name')
- let s:lastline = nextnonblank(s:lastline + 1)
- endwhile
-
- let s = synIDattr(synID(line('.'),col('.'),1),'name')
- let g:endwise_syntaxes = g:endwise_syntaxes . line('.').','.col('.')."=".s."\n"
- let s:lastline = line('.')
- return s
-endfunction
-
-" }}}1
-
-" vim:set sw=2 sts=2: