GetLatestVimScripts

git-svn-id: https://vimsuite.svn.sourceforge.net/svnroot/vimsuite/trunk@223 eb2d0018-73a3-4aeb-bfe9-1def61c9ec69
This commit is contained in:
alterdepp 2012-10-09 08:49:49 +00:00
parent 9221e87eef
commit c5e36fcdd2
11 changed files with 755 additions and 390 deletions

View File

@ -8,7 +8,7 @@ ScriptID SourceID Filename
862 2635 cscope_quickfix.vim 862 2635 cscope_quickfix.vim
51 171 cscope_macros.vim 51 171 cscope_macros.vim
102 16171 DirDiff.vim 102 16171 DirDiff.vim
1189 8687 matrix.vim 1189 18650 matrix.vim
948 2878 Scons Compiler plugin 948 2878 Scons Compiler plugin
1709 6421 Scons Syntax file 1709 6421 Scons Syntax file
1772 7248 DAMOS.zip DAMOS tools (von Stefan) 1772 7248 DAMOS.zip DAMOS tools (von Stefan)
@ -23,7 +23,7 @@ ScriptID SourceID Filename
39 8196 matchit.vim 39 8196 matchit.vim
2092 8095 reloaded.vim (matrix colorscheme) 2092 8095 reloaded.vim (matrix colorscheme)
848 14668 SrchRplcHiGrp.vim (Search/Replace on Syntax Group) 848 14668 SrchRplcHiGrp.vim (Search/Replace on Syntax Group)
294 10110 Align.vim 294 18148 Align.vim
479 9276 MultipleSearch.vba 479 9276 MultipleSearch.vba
1066 7618 cecutil.vim 1066 7618 cecutil.vim
1173 17289 tComment.vim 1173 17289 tComment.vim
@ -32,6 +32,6 @@ ScriptID SourceID Filename
642 15781 :AutoInstall: getscript.vim 642 15781 :AutoInstall: getscript.vim
1075 15782 :AutoInstall: netrw.vim 1075 15782 :AutoInstall: netrw.vim
1502 15362 :AutoInstall: vimball.vim 1502 15362 :AutoInstall: vimball.vim
3304 17406 Gundo 3304 18081 Gundo
90 17031 vcscommand 90 17031 vcscommand

View File

@ -1,10 +1,10 @@
" Align: tool to align multiple fields based on one or more separators " Align: tool to align multiple fields based on one or more separators
" Author: Charles E. Campbell, Jr. " Author: Charles E. Campbell, Jr.
" Date: Mar 03, 2009 " Date: Jun 18, 2012
" Version: 35 " Version: 36
" GetLatestVimScripts: 294 1 :AutoInstall: Align.vim " GetLatestVimScripts: 294 1 :AutoInstall: Align.vim
" GetLatestVimScripts: 1066 1 :AutoInstall: cecutil.vim " GetLatestVimScripts: 1066 1 :AutoInstall: cecutil.vim
" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1 " Copyright: Copyright (C) 1999-2012 Charles E. Campbell, Jr. {{{1
" Permission is hereby granted to use and distribute this code, " Permission is hereby granted to use and distribute this code,
" with or without modifications, provided that this copyright " with or without modifications, provided that this copyright
" notice is copied with it. Like anything else that's free, " notice is copied with it. Like anything else that's free,
@ -18,13 +18,14 @@
" the power of God for salvation for everyone who believes; for the Jew first, " 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 " and also for the Greek. For in it is revealed God's righteousness from
" faith to faith. " faith to faith.
"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" Load Once: {{{1 " Load Once: {{{1
if exists("g:loaded_Align") || &cp if exists("g:loaded_Align") || &cp
finish finish
endif endif
let g:loaded_Align = "v35" let g:loaded_Align = "v36"
if v:version < 700 if v:version < 700
echohl WarningMsg echohl WarningMsg
echo "***warning*** this version of Align needs vim 7.0" echo "***warning*** this version of Align needs vim 7.0"
@ -84,14 +85,13 @@ endif
" | s:AlignSep " | s:AlignSep
fun! Align#AlignCtrl(...) fun! Align#AlignCtrl(...)
" call Dfunc("AlignCtrl(...) a:0=".a:0) " call Dfunc("Align#AlignCtrl(...) a:0=".a:0)
" save options that will be changed " save options that may be changed later
let keep_search = @/ call s:SaveUserOptions()
let keep_ic = &ic
" turn ignorecase off " turn ignorecase off
set noic setlocal noic
" clear visual mode so that old visual-mode selections don't " clear visual mode so that old visual-mode selections don't
" get applied to new invocations of Align(). " get applied to new invocations of Align().
@ -121,19 +121,20 @@ fun! Align#AlignCtrl(...)
let ipat= 2 let ipat= 2
while ipat <= A[0] while ipat <= A[0]
if "" =~ A[ipat] if "" =~ A[ipat]
echoerr "AlignCtrl: separator<".A[ipat]."> matches zero-length string" echoerr "(AlignCtrl) separator<".A[ipat]."> matches zero-length string"
let &ic= keep_ic call s:RestoreUserOptions()
" call Dret("AlignCtrl") " call Dret("Align#AlignCtrl")
return return
endif endif
let ipat= ipat + 1 let ipat= ipat + 1
endwhile endwhile
endif endif
endif endif
" call Decho("(AlignCtrl) passed bad-separator pattern check (no zero-length matches)")
" call Decho("AlignCtrl() A[0]=".A[0]) " call Decho("(AlignCtrl) A[0]=".A[0])
if !exists("s:AlignStyle") if !exists("s:AlignStyle")
let s:AlignStyle= "l" let s:AlignStyle= 'l'
endif endif
if !exists("s:AlignPrePad") if !exists("s:AlignPrePad")
let s:AlignPrePad= 0 let s:AlignPrePad= 0
@ -153,7 +154,7 @@ fun! Align#AlignCtrl(...)
let s:AlignPatQty= 0 let s:AlignPatQty= 0
endif endif
echo "AlignCtrl<".s:AlignCtrl."> qty=".s:AlignPatQty." AlignStyle<".s:AlignStyle."> Padding<".s:AlignPrePad."|".s:AlignPostPad."> LeadingWS=".s:AlignLeadKeep." AlignSep=".s:AlignSep 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) " call Decho("(AlignCtrl) 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") if exists("s:AlignGPat") && !exists("s:AlignVPat")
echo "AlignGPat<".s:AlignGPat.">" echo "AlignGPat<".s:AlignGPat.">"
elseif !exists("s:AlignGPat") && exists("s:AlignVPat") elseif !exists("s:AlignGPat") && exists("s:AlignVPat")
@ -164,7 +165,7 @@ fun! Align#AlignCtrl(...)
let ipat= 1 let ipat= 1
while ipat <= s:AlignPatQty while ipat <= s:AlignPatQty
echo "Pat".ipat."<".s:AlignPat_{ipat}.">" echo "Pat".ipat."<".s:AlignPat_{ipat}.">"
" call Decho("Pat".ipat."<".s:AlignPat_{ipat}.">") " call Decho("(AlignCtrl) Pat".ipat."<".s:AlignPat_{ipat}.">")
let ipat= ipat + 1 let ipat= ipat + 1
endwhile endwhile
@ -190,9 +191,8 @@ fun! Align#AlignCtrl(...)
call Align#AlignCtrl("g") call Align#AlignCtrl("g")
call Align#AlignCtrl("v") call Align#AlignCtrl("v")
let s:dovisclear = 1 let s:dovisclear = 1
let &ic = keep_ic call s:RestoreUserOptions()
let @/ = keep_search " call Dret("Align#AlignCtrl")
" call Dret("AlignCtrl")
return return
endif endif
@ -205,7 +205,7 @@ fun! Align#AlignCtrl(...)
endif endif
" = : record a list of alignment patterns that are equivalent " = : record a list of alignment patterns that are equivalent
if style =~# "=" if style =~# "=" || (A[0] >= 2 && style !~# "C" && s:AlignCtrl =~# '=')
" call Decho("style case =: record list of equiv alignment patterns") " call Decho("style case =: record list of equiv alignment patterns")
let s:AlignCtrl = '=' let s:AlignCtrl = '='
if A[0] >= 2 if A[0] >= 2
@ -221,7 +221,7 @@ fun! Align#AlignCtrl(...)
endif endif
"c : cycle through alignment pattern(s) "c : cycle through alignment pattern(s)
elseif style =~# 'C' elseif style =~# 'C' || (A[0] >= 2 && s:AlignCtrl =~# '=')
" call Decho("style case C: cycle through alignment pattern(s)") " call Decho("style case C: cycle through alignment pattern(s)")
let s:AlignCtrl = 'C' let s:AlignCtrl = 'C'
if A[0] >= 2 if A[0] >= 2
@ -239,10 +239,9 @@ fun! Align#AlignCtrl(...)
let s:AlignPrePad= substitute(style,'^.*p\(\d\+\).*$','\1','') let s:AlignPrePad= substitute(style,'^.*p\(\d\+\).*$','\1','')
" call Decho("style case p".s:AlignPrePad.": pre-separator padding") " call Decho("style case p".s:AlignPrePad.": pre-separator padding")
if s:AlignPrePad == "" if s:AlignPrePad == ""
echoerr "AlignCtrl: 'p' needs to be followed by a numeric argument' echoerr "(AlignCtrl) 'p' needs to be followed by a numeric argument'"
let @/ = keep_search call s:RestoreUserOptions()
let &ic= keep_ic " call Dret("Align#AlignCtrl")
" call Dret("AlignCtrl")
return return
endif endif
endif endif
@ -251,10 +250,9 @@ fun! Align#AlignCtrl(...)
let s:AlignPostPad= substitute(style,'^.*P\(\d\+\).*$','\1','') let s:AlignPostPad= substitute(style,'^.*P\(\d\+\).*$','\1','')
" call Decho("style case P".s:AlignPostPad.": post-separator padding") " call Decho("style case P".s:AlignPostPad.": post-separator padding")
if s:AlignPostPad == "" if s:AlignPostPad == ""
echoerr "AlignCtrl: 'P' needs to be followed by a numeric argument' echoerr "(AlignCtrl) 'P' needs to be followed by a numeric argument'"
let @/ = keep_search call s:RestoreUserOptions()
let &ic= keep_ic " call Dret("Align#AlignCtrl")
" call Dret("AlignCtrl")
return return
endif endif
endif endif
@ -263,10 +261,10 @@ fun! Align#AlignCtrl(...)
" call Decho("style case w: ignore leading whitespace") " call Decho("style case w: ignore leading whitespace")
let s:AlignLeadKeep= 'w' let s:AlignLeadKeep= 'w'
elseif style =~# 'W' elseif style =~# 'W'
" call Decho("style case w: keep leading whitespace") " call Decho("style case W: keep leading whitespace")
let s:AlignLeadKeep= 'W' let s:AlignLeadKeep= 'W'
elseif style =~# 'I' elseif style =~# 'I'
" call Decho("style case w: retain initial leading whitespace") " call Decho("style case I: retain initial leading whitespace")
let s:AlignLeadKeep= 'I' let s:AlignLeadKeep= 'I'
endif endif
@ -274,8 +272,8 @@ fun! Align#AlignCtrl(...)
" first list item is a "g" selector pattern " first list item is a "g" selector pattern
" call Decho("style case g: global selector pattern") " call Decho("style case g: global selector pattern")
if A[0] < 2 if A[0] < 2
if exists("s:AlignGPat") if exists("s:AlignVPat")
unlet s:AlignGPat unlet s:AlignVPat
" call Decho("unlet s:AlignGPat") " call Decho("unlet s:AlignGPat")
endif endif
else else
@ -286,8 +284,8 @@ fun! Align#AlignCtrl(...)
" first list item is a "v" selector pattern " first list item is a "v" selector pattern
" call Decho("style case v: global selector anti-pattern") " call Decho("style case v: global selector anti-pattern")
if A[0] < 2 if A[0] < 2
if exists("s:AlignVPat") if exists("s:AlignGPat")
unlet s:AlignVPat unlet s:AlignGPat
" call Decho("unlet s:AlignVPat") " call Decho("unlet s:AlignVPat")
endif endif
else else
@ -297,9 +295,9 @@ fun! Align#AlignCtrl(...)
endif endif
"[-lrc+:] : set up s:AlignStyle "[-lrc+:] : set up s:AlignStyle
if style =~# '[-lrc+:]' if style =~# '[-lrc+:*]'
" call Decho("style case [-lrc+:]: field justification") " call Decho("style case [-lrc+:]: field justification")
let s:AlignStyle= substitute(style,'[^-lrc:+]','','g') let s:AlignStyle= substitute(style,'[^-lrc:+*]','','g')
" call Decho("AlignStyle<".s:AlignStyle.">") " call Decho("AlignStyle<".s:AlignStyle.">")
endif endif
@ -316,11 +314,9 @@ fun! Align#AlignCtrl(...)
let s:AlignCtrl= '=' let s:AlignCtrl= '='
endif endif
" restore search and options " restore options and return
let @/ = keep_search call s:RestoreUserOptions()
let &ic= keep_ic " call Dret("Align#AlignCtrl ".s:AlignCtrl.'p'.s:AlignPrePad.'P'.s:AlignPostPad.s:AlignLeadKeep.s:AlignStyle)
" 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 return s:AlignCtrl.'p'.s:AlignPrePad.'P'.s:AlignPostPad.s:AlignLeadKeep.s:AlignStyle
endfun endfun
@ -355,6 +351,9 @@ fun! Align#Align(hasctrl,...) range
return return
endif endif
" save user options
call s:SaveUserOptions()
" set up a list akin to an argument list " set up a list akin to an argument list
if a:0 > 0 if a:0 > 0
let A= s:QArgSplitter(a:1) let A= s:QArgSplitter(a:1)
@ -384,7 +383,8 @@ fun! Align#Align(hasctrl,...) range
let ipat= 1 + hasctrl let ipat= 1 + hasctrl
while ipat <= A[0] while ipat <= A[0]
if "" =~ A[ipat] if "" =~ A[ipat]
echoerr "Align: separator<".A[ipat]."> matches zero-length string" echoerr "(Align) separator<".A[ipat]."> matches zero-length string"
call s:RestoreUserOptions()
" call Dret("Align#Align") " call Dret("Align#Align")
return return
endif endif
@ -392,10 +392,8 @@ fun! Align#Align(hasctrl,...) range
endwhile endwhile
" record current search pattern for subsequent restoration " record current search pattern for subsequent restoration
let keep_search= @/ " (these are all global-only options)
let keep_ic = &ic set noic report=10000 nohls
let keep_report= &report
set noic report=10000
if A[0] > hasctrl if A[0] > hasctrl
" Align will accept a list of separator regexps " Align will accept a list of separator regexps
@ -447,17 +445,32 @@ fun! Align#Align(hasctrl,...) range
let begline = a:lastline let begline = a:lastline
let endline = a:firstline let endline = a:firstline
endif endif
" Expand range to cover align-able lines when the given range is only the current line.
" Look for the first line above the current line that matches the first separator pattern, and
" look for the last line below the current line that matches the first separator pattern.
if begline == endline
" call Decho("case begline == endline")
if !exists("s:AlignPat_{1}")
echohl Error|echo "(Align) no separators specified!"|echohl None
call s:RestoreUserOptions()
" call Dret("Align#Align")
return
endif
let seppat = s:AlignPat_{1}
let begline= search('^\%(\%('.seppat.'\)\@!.\)*$',"bnW")
if begline == 0|let begline= 1|else|let begline= begline + 1|endif
let endline= search('^\%(\%('.seppat.'\)\@!.\)*$',"nW")
if endline == 0|let endline= line("$")|else|let endline= endline - 1|endif
" call Decho("begline=".begline." endline=".endline." curline#".line("."))
endif
" call Decho("begline=".begline." endline=".endline) " call Decho("begline=".begline." endline=".endline)
let fieldcnt = 0 let fieldcnt = 0
if (begline == line("'>") && endline == line("'<")) || (begline == line("'<") && endline == line("'>")) if (begline == line("'>") && endline == line("'<")) || (begline == line("'<") && endline == line("'>"))
let vmode= visualmode() let vmode= visualmode()
" call Decho("vmode=".vmode) " call Decho("vmode=".vmode)
if vmode == "\<c-v>" if vmode == "\<c-v>"
if exists("g:Align_xstrlen") && g:Align_xstrlen let ragged = ( col("'>") > s:Strlen(getline("'>")) || col("'<") > s:Strlen(getline("'<")) )
let ragged = ( col("'>") > s:Strlen(getline("'>")) || col("'<") > s:Strlen(getline("'<")) )
else
let ragged = ( col("'>") > strlen(getline("'>")) || col("'<") > strlen(getline("'<")) )
endif
else else
let ragged= 1 let ragged= 1
endif endif
@ -469,10 +482,14 @@ fun! Align#Align(hasctrl,...) range
endif endif
" call Decho("lines[".begline.",".endline."] col[".begcol.",".endcol."] ragged=".ragged." AlignCtrl<".s:AlignCtrl.">") " call Decho("lines[".begline.",".endline."] col[".begcol.",".endcol."] ragged=".ragged." AlignCtrl<".s:AlignCtrl.">")
" Keep user options " record initial whitespace
let etkeep = &l:et if s:AlignLeadKeep == 'W'
let pastekeep= &l:paste let wskeep = map(getline(begline,endline),"substitute(v:val,'^\\(\\s*\\).\\{-}$','\\1','')")
setlocal et paste endif
" Align needs these options
setl et
set paste
" convert selected range of lines to use spaces instead of tabs " convert selected range of lines to use spaces instead of tabs
" but if first line's initial white spaces are to be retained " but if first line's initial white spaces are to be retained
@ -480,11 +497,30 @@ fun! Align#Align(hasctrl,...) range
if begcol <= 0 && s:AlignLeadKeep == 'I' if begcol <= 0 && s:AlignLeadKeep == 'I'
" retain first leading whitespace for all subsequent lines " retain first leading whitespace for all subsequent lines
let bgntxt= substitute(getline(begline),'^\(\s*\).\{-}$','\1','') let bgntxt= substitute(getline(begline),'^\(\s*\).\{-}$','\1','')
" exception: retain first leading whitespace predicated on g and v patterns
" if such a selected line exists
if exists("s:AlignGPat")
let firstgline= search(s:AlignGPat,"cnW",endline)
if firstgline > 0
let bgntxt= substitute(getline(firstgline),'^\(\s*\).\{-}$','\1','')
endif
elseif exists("s:AlignVPat")
let firstvline= search(s:AlignVPat,"cnW",endline)
if firstvline > 0
let bgntxt= substitute('^\%(\%('.getline(firstvline).')\@!\)*$','^\(\s*\).\{-}$','\1','')
endif
endif
" call Decho("retaining 1st leading whitespace: bgntxt<".bgntxt.">") " call Decho("retaining 1st leading whitespace: bgntxt<".bgntxt.">")
set noet let &l:et= s:keep_et
endif endif
exe begline.",".endline."ret" exe begline.",".endline."ret"
" record transformed to spaces leading whitespace
if s:AlignLeadKeep == 'W'
let wsblanks = map(getline(begline,endline),"substitute(v:val,'^\\(\\s*\\).\\{-}$','\\1','')")
endif
" Execute two passes " Execute two passes
" First pass: collect alignment data (max field sizes) " First pass: collect alignment data (max field sizes)
" Second pass: perform alignment " Second pass: perform alignment
@ -528,11 +564,7 @@ fun! Align#Align(hasctrl,...) range
endif endif
" Extract visual-block selected text (init bgntxt, endtxt) " Extract visual-block selected text (init bgntxt, endtxt)
if exists("g:Align_xstrlen") && g:Align_xstrlen
let txtlen= s:Strlen(txt) let txtlen= s:Strlen(txt)
else
let txtlen= strlen(txt)
endif
if begcol > 0 if begcol > 0
" Record text to left of selected area " Record text to left of selected area
let bgntxt= strpart(txt,0,begcol) let bgntxt= strpart(txt,0,begcol)
@ -557,7 +589,8 @@ fun! Align#Align(hasctrl,...) range
" call Decho("Pass".pass.": txt<". txt .">") " call Decho("Pass".pass.": txt<". txt .">")
" call Decho("Pass".pass.": endtxt<".endtxt.">") " call Decho("Pass".pass.": endtxt<".endtxt.">")
if !exists("s:AlignPat_{1}") if !exists("s:AlignPat_{1}")
echohl Error|echo "no separators specified!"|echohl None echohl Error|echo "(Align) no separators specified!"|echohl None
call s:RestoreUserOptions()
" call Dret("Align#Align") " call Dret("Align#Align")
return return
endif endif
@ -575,7 +608,7 @@ fun! Align#Align(hasctrl,...) range
let alignpostpad= s:AlignPostPad let alignpostpad= s:AlignPostPad
let alignsep = s:AlignSep let alignsep = s:AlignSep
let alignophold = " " let alignophold = " "
let alignop = "l" let alignop = 'l'
" call Decho("Pass".pass.": initial alignstyle<".alignstyle."> seppat<".seppat.">") " call Decho("Pass".pass.": initial alignstyle<".alignstyle."> seppat<".seppat.">")
" Process each field on the line " Process each field on the line
@ -606,23 +639,41 @@ fun! Align#Align(hasctrl,...) range
endif endif
endif endif
" cylic separator alignment specification handling " cyclic separator alignment specification handling
let alignsepop= strpart(alignsep,0,1) let alignsepop= strpart(alignsep,0,1)
let alignsep = strpart(alignsep,1).alignsepop let alignsep = strpart(alignsep,1).alignsepop
" ------------------------------------------------------
" mark end-of-field and the subsequent end-of-separator. " mark end-of-field and the subsequent end-of-separator.
" Extend field if alignop is '-' " ------------------------------------------------------
let endfield = match(txt,seppat,bgnfield) let endfield = match(txt,seppat,bgnfield)
let sepfield = matchend(txt,seppat,bgnfield) let sepfield = matchend(txt,seppat,bgnfield)
let skipfield= sepfield let skipfield= sepfield
" call Decho("Pass".pass.": endfield=match(txt<".txt.">,seppat<".seppat.">,bgnfield=".bgnfield.")=".endfield) " call Decho("Pass".pass.": endfield=match(txt<".txt.">,seppat<".seppat.">,bgnfield=".bgnfield.")=".endfield." alignop=".alignop)
" Mark eof: Extend field if alignop is '*' and AlignSkip() is true.
if alignop == '*' && exists("g:AlignSkip") && type(g:AlignSkip) == 2
" call Decho("Pass".pass.": endfield=match(txt<".txt.">,seppat<".seppat.">,bgnfield=".bgnfield.")=".endfield." alignop=".alignop)
" a '*' acts like a '-' while the g:AlignSkip function reference is true except that alignop doesn't advance
while g:AlignSkip(line,endfield) && endfield != -1
let endfield = match(txt,seppat,skipfield)
let sepfield = matchend(txt,seppat,skipfield)
let skipfield = sepfield
" call Decho("Pass".pass.": extend field: endfield<".strpart(txt,bgnfield,endfield-bgnfield)."> alignop<".alignop."> alignstyle<".alignstyle.">")
endwhile
let alignop = strpart(alignstyle,0,1)
let alignstyle= strpart(alignstyle,1).strpart(alignstyle,0,1)
" call Decho("Pass".pass.": endfield=match(txt<".txt.">,seppat<".seppat.">,bgnfield=".bgnfield.")=".endfield." alignop=".alignop." (after *)")
endif
" Mark eof: Extend field if alignop is '-'
while alignop == '-' && endfield != -1 while alignop == '-' && endfield != -1
let endfield = match(txt,seppat,skipfield) let endfield = match(txt,seppat,skipfield)
let sepfield = matchend(txt,seppat,skipfield) let sepfield = matchend(txt,seppat,skipfield)
let skipfield = sepfield let skipfield = sepfield
let alignop = strpart(alignstyle,0,1) let alignop = strpart(alignstyle,0,1)
let alignstyle= strpart(alignstyle,1).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.">") " call Decho("Pass".pass.": extend field: endfield<".strpart(txt,bgnfield,endfield-bgnfield)."> alignop<".alignop."> alignstyle<".alignstyle.">")
endwhile endwhile
let seplen= sepfield - endfield let seplen= sepfield - endfield
" call Decho("Pass".pass.": seplen=[sepfield=".sepfield."] - [endfield=".endfield."]=".seplen) " call Decho("Pass".pass.": seplen=[sepfield=".sepfield."] - [endfield=".endfield."]=".seplen)
@ -637,11 +688,7 @@ fun! Align#Align(hasctrl,...) range
let field = bgntxt.field let field = bgntxt.field
let bgntxt= "" let bgntxt= ""
endif endif
if exists("g:Align_xstrlen") && g:Align_xstrlen let fieldlen = s:Strlen(field)
let fieldlen = s:Strlen(field)
else
let fieldlen = strlen(field)
endif
let sFieldSize = "FieldSize_".ifield let sFieldSize = "FieldSize_".ifield
if !exists(sFieldSize) if !exists(sFieldSize)
let FieldSize_{ifield}= fieldlen let FieldSize_{ifield}= fieldlen
@ -675,11 +722,7 @@ fun! Align#Align(hasctrl,...) range
let prepad = 0 let prepad = 0
let postpad= 0 let postpad= 0
endif endif
if exists("g:Align_xstrlen") && g:Align_xstrlen let fieldlen = s:Strlen(field)
let fieldlen = s:Strlen(field)
else
let fieldlen = strlen(field)
endif
let sep = s:MakeSpace(prepad).strpart(txt,endfield,sepfield-endfield).s:MakeSpace(postpad) let sep = s:MakeSpace(prepad).strpart(txt,endfield,sepfield-endfield).s:MakeSpace(postpad)
if seplen < SepSize_{ifield} if seplen < SepSize_{ifield}
if alignsepop == "<" if alignsepop == "<"
@ -695,7 +738,7 @@ fun! Align#Align(hasctrl,...) range
let sep = s:MakeSpace(sepleft).sep.s:MakeSpace(sepright) let sep = s:MakeSpace(sepleft).sep.s:MakeSpace(sepright)
endif endif
endif endif
let spaces = FieldSize_{ifield} - fieldlen 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.">") " 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 " Perform alignment according to alignment style justification
@ -746,7 +789,7 @@ fun! Align#Align(hasctrl,...) range
" call Decho("Pass".pass.": bgntxt<".bgntxt."> line=".line) " call Decho("Pass".pass.": bgntxt<".bgntxt."> line=".line)
" call Decho("Pass".pass.": newtxt<".newtxt.">") " call Decho("Pass".pass.": newtxt<".newtxt.">")
" call Decho("Pass".pass.": endtxt<".endtxt.">") " call Decho("Pass".pass.": endtxt<".endtxt.">")
call setline(line,bgntxt.newtxt.endtxt) keepj call setline(line,bgntxt.newtxt.endtxt)
endif endif
let line = line + 1 let line = line + 1
@ -756,9 +799,18 @@ fun! Align#Align(hasctrl,...) range
endwhile " pass loop endwhile " pass loop
" call Decho("end of two pass loop") " call Decho("end of two pass loop")
" Restore user options " restore original leading whitespace
let &l:et = etkeep if s:AlignLeadKeep == 'W'
let &l:paste = pastekeep let iline= begline
let i = 0
" call Decho("restore original leading whitespace")
while iline <= endline
" call Decho("exe ".iline."s/^".wsblanks[i]."/".wskeep[i]."/")
exe "keepj ".iline."s/^".wsblanks[i]."/".wskeep[i]."/"
let iline= iline + 1
let i = i + 1
endwhile
endif
if exists("s:DoAlignPop") if exists("s:DoAlignPop")
" AlignCtrl Map support " AlignCtrl Map support
@ -766,11 +818,8 @@ fun! Align#Align(hasctrl,...) range
unlet s:DoAlignPop unlet s:DoAlignPop
endif endif
" restore current search pattern " restore user options and return
let @/ = keep_search call s:RestoreUserOptions()
let &ic = keep_ic
let &report = keep_report
" call Dret("Align#Align") " call Dret("Align#Align")
return return
endfun endfun
@ -778,7 +827,7 @@ endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" Align#AlignPush: this command/function pushes an alignment control string onto a stack {{{1 " Align#AlignPush: this command/function pushes an alignment control string onto a stack {{{1
fun! Align#AlignPush() fun! Align#AlignPush()
" call Dfunc("AlignPush()") " call Dfunc("Align#AlignPush()")
" initialize the stack " initialize the stack
if !exists("s:AlignCtrlStackQty") if !exists("s:AlignCtrlStackQty")
@ -806,7 +855,7 @@ fun! Align#AlignPush()
let s:AlignVPat_{s:AlignCtrlStackQty}= "" let s:AlignVPat_{s:AlignCtrlStackQty}= ""
endif endif
" call Dret("AlignPush") " call Dret("Align#AlignPush")
endfun endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
@ -817,13 +866,13 @@ fun! Align#AlignPop()
" sanity checks " sanity checks
if !exists("s:AlignCtrlStackQty") if !exists("s:AlignCtrlStackQty")
echoerr "AlignPush needs to be used prior to AlignPop" echoerr "(AlignPop) AlignPush needs to be used prior to AlignPop"
" call Dret("Align#AlignPop <> : AlignPush needs to have been called first") " call Dret("Align#AlignPop <> : AlignPush needs to have been called first")
return "" return ""
endif endif
if s:AlignCtrlStackQty <= 0 if s:AlignCtrlStackQty <= 0
unlet s:AlignCtrlStackQty unlet s:AlignCtrlStackQty
echoerr "AlignPush needs to be used prior to AlignPop" echoerr "(AlignPop) AlignPush needs to be used prior to AlignPop"
" call Dret("Align#AlignPop <> : AlignPop needs to have been called first") " call Dret("Align#AlignPop <> : AlignPop needs to have been called first")
return "" return ""
endif endif
@ -857,15 +906,11 @@ endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" Align#AlignReplaceQuotedSpaces: {{{1 " Align#AlignReplaceQuotedSpaces: {{{1
fun! Align#AlignReplaceQuotedSpaces() fun! Align#AlignReplaceQuotedSpaces()
" call Dfunc("AlignReplaceQuotedSpaces()") " call Dfunc("Align#AlignReplaceQuotedSpaces()")
let l:line = getline(line(".")) let l:line = getline(line("."))
if exists("g:Align_xstrlen") && g:Align_xstrlen let l:linelen = s:Strlen(l:line)
let l:linelen = s:Strlen(l:line)
else
let l:linelen = strlen(l:line)
endif
let l:startingPos = 0 let l:startingPos = 0
let l:startQuotePos = 0 let l:startQuotePos = 0
let l:endQuotePos = 0 let l:endQuotePos = 0
@ -875,28 +920,28 @@ fun! Align#AlignReplaceQuotedSpaces()
" "call Decho("in replace spaces. line=" . line('.')) " "call Decho("in replace spaces. line=" . line('.'))
while (1) while (1)
let l:startQuotePos = match(l:line, l:quoteRe, l:startingPos) let l:startQuotePos = match(l:line, l:quoteRe, l:startingPos)
if (l:startQuotePos < 0) if (l:startQuotePos < 0)
" "call Decho("No more quotes to the end of line") " call Decho("No more quotes to the end of line")
break break
endif endif
let l:endQuotePos = match(l:line, l:quoteRe, l:startQuotePos + 1) let l:endQuotePos = match(l:line, l:quoteRe, l:startQuotePos + 1)
if (l:endQuotePos < 0) if (l:endQuotePos < 0)
" "call Decho("Mismatched quotes") " call Decho("Mismatched quotes")
break break
endif endif
let l:spaceReplaceRe = '^.\{' . (l:startQuotePos + 1) . '}.\{-}\zs\s\ze.*.\{' . (linelen - l:endQuotePos) . '}$' let l:spaceReplaceRe = '^.\{' . (l:startQuotePos + 1) . '}.\{-}\zs\s\ze.*.\{' . (linelen - l:endQuotePos) . '}$'
" "call Decho('spaceReplaceRe="' . l:spaceReplaceRe . '"') " call Decho('spaceReplaceRe="' . l:spaceReplaceRe . '"')
let l:newStr = substitute(l:line, l:spaceReplaceRe, '%', '') let l:newStr = substitute(l:line, l:spaceReplaceRe, '%', '')
while (l:newStr != l:line) while (l:newStr != l:line)
" "call Decho('newstr="' . l:newStr . '"') " call Decho('newstr="' . l:newStr . '"')
let l:line = l:newStr let l:line = l:newStr
let l:newStr = substitute(l:line, l:spaceReplaceRe, '%', '') let l:newStr = substitute(l:line, l:spaceReplaceRe, '%', '')
endwhile endwhile
let l:startingPos = l:endQuotePos + 1 let l:startingPos = l:endQuotePos + 1
endwhile endwhile
call setline(line('.'), l:line) keepj call setline(line('.'), l:line)
" call Dret("AlignReplaceQuotedSpaces") " call Dret("Align#AlignReplaceQuotedSpaces")
endfun endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
@ -923,19 +968,20 @@ fun! s:QArgSplitter(qarg)
while args != "" while args != ""
let iarg = 0 let iarg = 0
let arglen = strlen(args) let arglen = strlen(args)
" call Decho("args[".iarg."]<".args[iarg]."> arglen=".arglen) " call Decho(".args[".iarg."]<".args[iarg]."> arglen=".arglen)
" find index to first not-escaped '"' " find index to first not-escaped '"'
" call Decho("find index to first not-escaped \"")
while args[iarg] != '"' && iarg < arglen while args[iarg] != '"' && iarg < arglen
if args[iarg] == '\' if args[iarg] == '\'
let args= strpart(args,1) let args= strpart(args,1)
endif endif
let iarg= iarg + 1 let iarg= iarg + 1
endwhile endwhile
" call Decho("args<".args."> iarg=".iarg." arglen=".arglen) " call Decho(".args<".args."> iarg=".iarg." arglen=".arglen)
if iarg > 0 if iarg > 0
" handle left of quote or remaining section " handle left of quote or remaining section
" call Decho("handle left of quote or remaining section") " call Decho(".handle left of quote or remaining section")
if args[iarg] == '"' if args[iarg] == '"'
let qarglist= qarglist + split(strpart(args,0,iarg-1)) let qarglist= qarglist + split(strpart(args,0,iarg-1))
else else
@ -946,7 +992,7 @@ fun! s:QArgSplitter(qarg)
elseif iarg < arglen && args[0] == '"' elseif iarg < arglen && args[0] == '"'
" handle "quoted" section " handle "quoted" section
" call Decho("handle quoted section") " call Decho(".handle quoted section")
let iarg= 1 let iarg= 1
while args[iarg] != '"' && iarg < arglen while args[iarg] != '"' && iarg < arglen
if args[iarg] == '\' if args[iarg] == '\'
@ -954,7 +1000,7 @@ fun! s:QArgSplitter(qarg)
endif endif
let iarg= iarg + 1 let iarg= iarg + 1
endwhile endwhile
" call Decho("args<".args."> iarg=".iarg." arglen=".arglen) " call Decho(".args<".args."> iarg=".iarg." arglen=".arglen)
if args[iarg] == '"' if args[iarg] == '"'
call add(qarglist,strpart(args,1,iarg-1)) call add(qarglist,strpart(args,1,iarg-1))
let args= strpart(args,iarg+1) let args= strpart(args,iarg+1)
@ -963,12 +1009,14 @@ fun! s:QArgSplitter(qarg)
let args = "" let args = ""
endif endif
endif endif
" call Decho("qarglist".string(qarglist)." iarg=".iarg." args<".args.">") " call Decho(".qarglist".string(qarglist)." iarg=".iarg." args<".args.">")
endwhile endwhile
" call Decho("end of loop (handling quoted arguments)")
else else
" split at all whitespace " split at all whitespace
let qarglist= split(a:qarg) " call Decho("split at all whitespace")
let qarglist= split(a:qarg,"[ \t]")
endif endif
let qarglistlen= len(qarglist) let qarglistlen= len(qarglist)
@ -984,21 +1032,26 @@ endfun
" nonzero value. Solution from Nicolai Weibull, vim docs " nonzero value. Solution from Nicolai Weibull, vim docs
" (:help strlen()), Tony Mechelynck, and my own invention. " (:help strlen()), Tony Mechelynck, and my own invention.
fun! s:Strlen(x) fun! s:Strlen(x)
" call Dfunc("s:Strlen(x<".a:x.">") " call Dfunc("s:Strlen(x<".a:x."> g:Align_xstrlen=".g:Align_xstrlen)
if g:Align_xstrlen == 1
if type(g:Align_xstrlen) == 1
" allow user to specify a function to compute the string length
exe "let ret= ".g:Align_xstrlen."('".substitute(a:x,"'","''","g")."')"
elseif g:Align_xstrlen == 1
" number of codepoints (Latin a + combining circumflex is two codepoints) " number of codepoints (Latin a + combining circumflex is two codepoints)
" (comment from TM, solution from NW) " (comment from TM, solution from NW)
let ret= strlen(substitute(a:x,'.','c','g')) let ret= strlen(substitute(a:x,'.','c','g'))
elseif g:Align_xstrlen == 2 elseif g:Align_xstrlen == 2
" number of spacing codepoints (Latin a + combining circumflex is one spacing " 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.) " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
" (comment from TM, solution from TM) " (comment from TM, solution from TM)
let ret=strlen(substitute(a:x, '.\Z', 'x', 'g')) let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
elseif g:Align_xstrlen == 3 elseif g:Align_xstrlen == 3
" virtual length (counting, for instance, tabs as anything between 1 and " 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 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
" preceded by lam, one otherwise, etc.) " preceded by lam, one otherwise, etc.)
" (comment from TM, solution from me) " (comment from TM, solution from me)
let modkeep= &l:mod let modkeep= &l:mod
@ -1010,12 +1063,58 @@ fun! s:Strlen(x)
else else
" at least give a decent default " at least give a decent default
ret= strlen(a:x) if v:version >= 703
let ret= strdisplaywidth(a:x)
else
let ret= strlen(a:x)
endif
endif endif
" call Dret("s:Strlen ".ret) " call Dret("s:Strlen ".ret)
return ret return ret
endfun endfun
" ---------------------------------------------------------------------
" s:SaveUserOptions: {{{1
fun! s:SaveUserOptions()
" call Dfunc("s:SaveUserOptions() s:saved_user_options=".(exists("s:saved_user_options")? s:saved_user_options : 'n/a'))
if !exists("s:saved_user_options")
let s:saved_user_options = 1
let s:keep_search = @/
let s:keep_et = &l:et
let s:keep_hls = &hls
let s:keep_ic = &ic
let s:keep_paste = &paste
let s:keep_report = &report
else
let s:saved_user_options = s:saved_user_options + 1
endif
" call Dret("s:SaveUserOptions : s:saved_user_options=".s:saved_user_options)
endfun
" ---------------------------------------------------------------------
" s:RestoreUserOptions: {{{1
fun! s:RestoreUserOptions()
" call Dfunc("s:RestoreUserOptions() s:saved_user_options=".(exists("s:saved_user_options")? s:saved_user_options : 'n/a'))
if exists("s:saved_user_options") && s:saved_user_options == 1
let @/ = s:keep_search
let &l:et = s:keep_et
let &hls = s:keep_hls
let &ic = s:keep_ic
let &paste = s:keep_paste
let &report = s:keep_report
unlet s:keep_search
unlet s:keep_et
unlet s:keep_hls
unlet s:keep_ic
unlet s:keep_paste
unlet s:keep_report
unlet s:saved_user_options
elseif exists("s:saved_user_options")
let s:saved_user_options= s:saved_user_options - 1
endif
" call Dret("s:RestoreUserOptions : s:saved_user_options=".(exists("s:saved_user_options")? s:saved_user_options : 'n/a'))
endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" Set up default values: {{{1 " Set up default values: {{{1
"call Decho("-- Begin AlignCtrl Initialization --") "call Decho("-- Begin AlignCtrl Initialization --")

View File

@ -1,15 +1,25 @@
" AlignMaps.vim : support functions for AlignMaps " AlignMaps.vim : support functions for AlignMaps
" Author: Charles E. Campbell, Jr. " Author: Charles E. Campbell, Jr.
" Date: Mar 03, 2009 " Date: Jun 18, 2012
" Version: 41 " Version: 42
" Copyright: Copyright (C) 1999-2012 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
"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" Load Once: {{{1 " Load Once: {{{1
if &cp || exists("g:loaded_AlignMaps") if &cp || exists("g:loaded_AlignMaps")
finish finish
endif endif
let g:loaded_AlignMaps= "v41" let g:loaded_AlignMaps= "v42"
let s:keepcpo = &cpo let s:keepcpo = &cpo
set cpo&vim set cpo&vim
"DechoTabOn
" ===================================================================== " =====================================================================
" Functions: {{{1 " Functions: {{{1
@ -20,7 +30,7 @@ fun! AlignMaps#WrapperStart(vis) range
" call Dfunc("AlignMaps#WrapperStart(vis=".a:vis.")") " call Dfunc("AlignMaps#WrapperStart(vis=".a:vis.")")
if a:vis if a:vis
norm! '<ma'> keepj norm! '<ma'>
endif endif
if line("'y") == 0 || line("'z") == 0 || !exists("s:alignmaps_wrapcnt") || s:alignmaps_wrapcnt <= 0 if line("'y") == 0 || line("'z") == 0 || !exists("s:alignmaps_wrapcnt") || s:alignmaps_wrapcnt <= 0
@ -34,22 +44,22 @@ fun! AlignMaps#WrapperStart(vis) range
let s:alignmaps_posn = SaveWinPosn(0) let s:alignmaps_posn = SaveWinPosn(0)
" set up fencepost blank lines " set up fencepost blank lines
put ='' put =''
norm! mz'a keepj norm! mz'a
put! ='' put! =''
ky ky
let s:alignmaps_zline = line("'z") let s:alignmaps_zline = line("'z")
exe "'y,'zs/@/\177/ge" exe "keepj 'y,'zs/@/\177/ge"
else else
" call Decho("embedded wrapper") " call Decho("embedded wrapper")
let s:alignmaps_wrapcnt = s:alignmaps_wrapcnt + 1 let s:alignmaps_wrapcnt = s:alignmaps_wrapcnt + 1
norm! 'yjma'zk keepj norm! 'yjma'zk
endif endif
" change some settings to align-standard values " change some settings to align-standard values
set nogd set nogd
set ch=2 set ch=2
AlignPush AlignPush
norm! 'zk keepj norm! 'zk
" call Dret("AlignMaps#WrapperStart : alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z")) " call Dret("AlignMaps#WrapperStart : alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
endfun endfun
@ -59,7 +69,7 @@ fun! AlignMaps#WrapperEnd() range
" call Dfunc("AlignMaps#WrapperEnd() alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z")) " 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 " remove trailing white space introduced by whatever in the modification zone
'y,'zs/ \+$//e keepj 'y,'zs/ \+$//e
" restore AlignCtrl settings " restore AlignCtrl settings
AlignPop AlignPop
@ -67,14 +77,14 @@ fun! AlignMaps#WrapperEnd() range
let s:alignmaps_wrapcnt= s:alignmaps_wrapcnt - 1 let s:alignmaps_wrapcnt= s:alignmaps_wrapcnt - 1
if s:alignmaps_wrapcnt <= 0 if s:alignmaps_wrapcnt <= 0
" initial wrapper ending " initial wrapper ending
exe "'y,'zs/\177/@/ge" exe "keepj 'y,'zs/\177/@/ge"
" if the 'z line hasn't moved, then go ahead and restore window position " if the 'z line hasn't moved, then go ahead and restore window position
let zstationary= s:alignmaps_zline == line("'z") let zstationary= s:alignmaps_zline == line("'z")
" remove fencepost blank lines. " remove fencepost blank lines.
" restore 'a " restore 'a
norm! 'yjmakdd'zdd keepj norm! 'yjmakdd'zdd
" restore original 'y, 'z, and window positioning " restore original 'y, 'z, and window positioning
call RestoreMark(s:alignmaps_keepmy) call RestoreMark(s:alignmaps_keepmy)
@ -135,10 +145,10 @@ fun! AlignMaps#CharJoiner(chr)
let aline = line("'a") let aline = line("'a")
let rep = line(".") - aline let rep = line(".") - aline
while rep > 0 while rep > 0
norm! 'a keepj norm! 'a
while match(getline(aline),a:chr . "\s*$") != -1 && rep >= 0 while match(getline(aline),a:chr . "\s*$") != -1 && rep >= 0
" while = at end-of-line, delete it and join with next " while = at end-of-line, delete it and join with next
norm! 'a$ keepj norm! 'a$
j! j!
let rep = rep - 1 let rep = rep - 1
endwhile endwhile
@ -149,7 +159,7 @@ fun! AlignMaps#CharJoiner(chr)
break break
endif endif
" prepare for next line " prepare for next line
norm! jma keepj norm! jma
let aline = line("'a") let aline = line("'a")
endwhile endwhile
" call Dret("AlignMaps#CharJoiner") " call Dret("AlignMaps#CharJoiner")
@ -159,31 +169,32 @@ endfun
" AlignMaps#Equals: supports \t= and \T= {{{2 " AlignMaps#Equals: supports \t= and \T= {{{2
fun! AlignMaps#Equals() range fun! AlignMaps#Equals() range
" call Dfunc("AlignMaps#Equals()") " call Dfunc("AlignMaps#Equals()")
'a,'zs/\s\+\([*/+\-%|&\~^]\==\)/ \1/e keepj 'a,'zs/\s\+\([*/+\-%|&\~^]\==\)/ \1/e
'a,'zs@ \+\([*/+\-%|&\~^]\)=@\1=@ge keepj 'a,'zs@ \+\([*/+\-%|&\~^]\)=@\1=@ge
'a,'zs/==/\="\<Char-0x0f>\<Char-0x0f>"/ge keepj 'a,'zs/==/\="\<Char-0x0f>\<Char-0x0f>"/ge
'a,'zs/\([!<>:]\)=/\=submatch(1)."\<Char-0x0f>"/ge keepj 'a,'zs/\([!<>:]\)=/\=submatch(1)."\<Char-0x0f>"/ge
norm g'zk keepj norm g'zk
AlignCtrl mIp1P1=l = AlignCtrl mIp1P1=l =
AlignCtrl g = AlignCtrl g =
'a,'z-1Align keepj 'a,'z-1Align
'a,'z-1s@\([*/+\-%|&\~^!=]\)\( \+\)=@\2\1=@ge keepj 'a,'z-1s@\([*/%|&\~^!=]\)\( \+\)=@\2\1=@ge
'a,'z-1s/\( \+\);/;\1/ge keepj 'a,'z-1s@[^+\-]\zs\([+\-]\)\( \+\)=@\2\1=@ge
keepj 'a,'z-1s/\( \+\);/;\1/ge
if &ft == "c" || &ft == "cpp" if &ft == "c" || &ft == "cpp"
" call Decho("exception for ".&ft) " call Decho("exception for ".&ft)
'a,'z-1v/^\s*\/[*/]/s/\/[*/]/@&@/e keepj 'a,'z-1v/^\s*\/[*/]/s/\/[*/]/@&@/e
'a,'z-1v/^\s*\/[*/]/s/\*\//@&/e keepj 'a,'z-1v/^\s*\/[*/]/s/\*\//@&/e
if exists("g:mapleader") if exists("g:mapleader")
exe "norm 'zk" exe "keepj norm 'zk"
call AlignMaps#StdAlign(1) call AlignMaps#StdAlign(1)
else else
exe "norm 'zk" exe "keepj norm 'zk"
call AlignMaps#StdAlign(1) call AlignMaps#StdAlign(1)
endif endif
'y,'zs/^\(\s*\) @/\1/e keepj 'y,'zs/^\(\s*\) @/\1/e
endif endif
'a,'z-1s/\%x0f/=/ge keepj 'a,'z-1s/\%x0f/=/ge
'y,'zs/ @//eg keepj 'y,'zs/ @//eg
" call Dret("AlignMaps#Equals") " call Dret("AlignMaps#Equals")
endfun endfun
@ -194,10 +205,11 @@ fun! AlignMaps#Afnc()
" call Dfunc("AlignMaps#Afnc()") " call Dfunc("AlignMaps#Afnc()")
" keep display quiet " keep display quiet
let chkeep = &ch let chkeep = &l:ch
let gdkeep = &gd let gdkeep = &l:gd
let vekeep = &ve let wwkeep = &l:ww
set ch=2 nogd ve= let vekeep = &l:ve
setlocal ch=2 nogd ve= ww=b,s,<,>,[,]
" will use marks y,z ; save current values " will use marks y,z ; save current values
let mykeep = SaveMark("'y") let mykeep = SaveMark("'y")
@ -206,7 +218,7 @@ fun! AlignMaps#Afnc()
" Find beginning of function -- be careful to skip over comments " Find beginning of function -- be careful to skip over comments
let cmmntid = synIDtrans(hlID("Comment")) let cmmntid = synIDtrans(hlID("Comment"))
let stringid = synIDtrans(hlID("String")) let stringid = synIDtrans(hlID("String"))
exe "norm! ]]" exe "keepj norm! ]]"
while search(")","bW") != 0 while search(")","bW") != 0
" call Decho("line=".line(".")." col=".col(".")) " call Decho("line=".line(".")." col=".col("."))
let parenid= synIDtrans(synID(line("."),col("."),1)) let parenid= synIDtrans(synID(line("."),col("."),1))
@ -214,23 +226,23 @@ fun! AlignMaps#Afnc()
break break
endif endif
endwhile endwhile
norm! %my keepj norm! %my
s/(\s*\(\S\)/(\r \1/e keepj s/(\s*\(\S\)/(\r \1/e
exe "norm! `y%" exe "keepj norm! `y%"
s/)\s*\(\/[*/]\)/)\r\1/e keepj s/)\s*\(\/[*/]\)/)\r\1/e
exe "norm! `y%mz" exe "keepj norm! `y%mz"
'y,'zs/\s\+$//e keepj 'y,'zs/\s\+$//e
'y,'zs/^\s\+//e keepj 'y,'zs/^\s\+//e
'y+1,'zs/^/ / keepj 'y+1,'zs/^/ /
" insert newline after every comma only one parenthesis deep " insert newline after every comma only one parenthesis deep
sil! exe "norm! `y\<right>h" exe "sil! keepj norm! `y\<right>h"
let parens = 1 let parens = 1
let cmmnt = 0 let cmmnt = 0
let cmmntline= -1 let cmmntline= -1
while parens >= 1 while parens >= 1
" call Decho("parens=".parens." @a=".@a) exe 'keepj norm! ma "ay`a '
exe 'norm! ma "ay`a ' " call Decho("parens=".parens." cmmnt=".cmmnt." cmmntline=".cmmntline." line(.)=".line(".")." @a<".@a."> line<".getline(".").">")
if @a == "(" if @a == "("
let parens= parens + 1 let parens= parens + 1
elseif @a == ")" elseif @a == ")"
@ -261,41 +273,42 @@ fun! AlignMaps#Afnc()
endif endif
elseif @a == "," && parens == 1 && cmmnt == 0 elseif @a == "," && parens == 1 && cmmnt == 0
exe "norm! i\<CR>\<Esc>" exe "keepj norm! i\<CR>\<Esc>"
endif endif
endwhile endwhile
norm! `y%mz% sil! keepj norm! `y%mz%
sil! 'y,'zg/^\s*$/d sil! keepj 'y,'zg/^\s*$/d
" perform substitutes to mark fields for Align " perform substitutes to mark fields for Align
sil! 'y+1,'zv/^\//s/^\s\+\(\S\)/ \1/e sil! keepj 'y+1,'zv/^\//s/^\s\+\(\S\)/ \1/e
sil! 'y+1,'zv/^\//s/\(\S\)\s\+/\1 /eg sil! keepj 'y+1,'zv/^\//s/\(\S\)\s\+/\1 /eg
sil! 'y+1,'zv/^\//s/\* \+/*/ge sil! keepj 'y+1,'zv/^\//s/\* \+/*/ge
sil! 'y+1,'zv/^\//s/\w\zs\s*\*/ */ge sil! keepj 'y+1,'zv/^\//s/\w\zs\s*\*/ */ge
" func " func
" ws <- declaration -> <-ptr -> <-var-> <-[array][] -> <-glop-> <-end-> " 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! keepj '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! keepj 'y+1,'z+1g/^\s*\/[*/]/norm! kJ
sil! 'y+1,'z+1s%/[*/]%@&@%ge sil! keepj 'y+1,'z+1s%/[*/]%@&@%ge
sil! 'y+1,'z+1s%*/%@&%ge sil! keepj 'y+1,'z+1s%*/%@&%ge
AlignCtrl mIp0P0=l @ AlignCtrl mIp0P0=l @
sil! 'y+1,'zAlign sil! keepj 'y+1,'zAlign
sil! 'y,'zs%@\(/[*/]\)@%\t\1 %e sil! keepj 'y,'zs%@\(/[*/]\)@%\t\1 %e
sil! 'y,'zs%@\*/% */%e sil! keepj 'y,'zs%@\*/% */%e
sil! 'y,'zs/@\([,)]\)/\1/ sil! keepj 'y,'zs/@\([,)]\)/\1/
sil! 'y,'zs/@/ / sil! keepj 'y,'zs/@/ /
AlignCtrl mIlrp0P0= # @ AlignCtrl mIlrp0P0= # @
sil! 'y+1,'zAlign sil! keepj 'y+1,'zAlign
sil! 'y+1,'zs/#/ / sil! keepj 'y+1,'zs/#/ /
sil! 'y+1,'zs/@// sil! keepj 'y+1,'zs/@//
sil! 'y+1,'zs/\(\s\+\)\([,)]\)/\2\1/e sil! keepj 'y+1,'zs/\(\s\+\)\([,)]\)/\2\1/e
" Restore " Restore
call RestoreMark(mykeep) call RestoreMark(mykeep)
call RestoreMark(mzkeep) call RestoreMark(mzkeep)
let &ch= chkeep let &l:ch= chkeep
let &gd= gdkeep let &l:gd= gdkeep
let &ve= vekeep let &l:ww= wwkeep
let &l:ve= vekeep
" call Dret("AlignMaps#Afnc") " call Dret("AlignMaps#Afnc")
endfun endfun
@ -310,12 +323,42 @@ fun! AlignMaps#FixMultiDec()
let curline = getline(".") let curline = getline(".")
" call Decho("curline<".curline.">") " call Decho("curline<".curline.">")
" " Attempt to ignore function calls (ie. double x=pow(2.,3.),...
" let leader= substitute(curline,'^\s*\([a-zA-Z_ \t][a-zA-Z0-9<>_ \t]*\)\s\+.*$','\1','')
" let i = strlen(leader)
" let paren = 0
" let fmd = strpart(curline,i)
" let ifmd = i
" call Decho("fmd<".fmd."> ifmd=".ifmd)
" while i < strlen(curline)
" if strpart(curline,i,1) == '('
" let paren= paren+1
" elseif strpart(curline,i,1) == ')' && paren > 0
" let paren= paren-1
" elseif strpart(curline,i,1) == '='
" let eq= 1
" elseif strpart(curline,i,1) == ';'
" let paren = 0
" let eq = 0
" let fmd = fmd.strpart(fmd,ifmd,i-ifmd).";\<cr>"
" let ifmd = i + 2
" let i = i + 1
" let leader= substitute(curline,'^\s*\([a-zA-Z_ \t][a-zA-Z0-9<>_ \t]*\)\s\+.*$','\1','')
" elseif strpart(curline,i,1) == ','
" if paren == 0
" let fmd = fmd.strpart(fmd,ifmd,i-ifmd).";\<cr>"
" let ifmd = i + 2
" let i = i + 1
" endif
" endif
" let i= i + 1
" endwhile
" Get the type. I'm assuming one type per line (ie. int x; double y; on one line will not be handled properly) " 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','') let @x=substitute(curline,'^\(\s*[a-zA-Z_ \t][a-zA-Z0-9<>_ \t]*\)\s\+[(*]*\h.*$','\1','')
" call Decho("@x<".@x.">") " call Decho("@x<".@x.">")
" transform line " transform line
exe 's/,/;\r'.@x.' /ge' exe 'keepj s/,/;\r'.@x.' /ge'
"restore register x "restore register x
let @x= xkeep let @x= xkeep
@ -323,6 +366,26 @@ fun! AlignMaps#FixMultiDec()
" call Dret("AlignMaps#FixMultiDec : my=".line("'y")." mz=".line("'z")) " call Dret("AlignMaps#FixMultiDec : my=".line("'y")." mz=".line("'z"))
endfun endfun
" ---------------------------------------------------------------------
" AlignMaps#AlignMapsClean: this function removes the AlignMaps plugin {{{2
fun! AlignMaps#AlignMapsClean()
" call Dfunc("AlignMaps#AlignMapsClean()")
for home in split(&rtp,',') + ['']
" call Decho("considering home<".home.">")
if isdirectory(home)
if filereadable(home."/autoload/AlignMaps.vim")
" call Decho("deleting ".home."/autoload/AlignMaps.vim")
call delete(home."/autoload/AlignMaps.vim")
endif
if filereadable(home."/plugin/AlignMapsPlugin.vim")
" call Decho("deleting ".home."/plugin/AlignMapsPlugin.vim")
call delete(home."/plugin/AlignMapsPlugin.vim")
endif
endif
endfor
" call Dret("AlignMaps#AlignMapsClean")
endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" Restore: {{{1 " Restore: {{{1
let &cpo= s:keepcpo let &cpo= s:keepcpo

View File

@ -46,6 +46,9 @@ endif"}}}
if !exists("g:gundo_prefer_python3")"{{{ if !exists("g:gundo_prefer_python3")"{{{
let g:gundo_prefer_python3 = 0 let g:gundo_prefer_python3 = 0
endif"}}} endif"}}}
if !exists("g:gundo_auto_preview")"{{{
let g:gundo_auto_preview = 1
endif"}}}
let s:has_supported_python = 0 let s:has_supported_python = 0
if g:gundo_prefer_python3 && has('python3')"{{{ if g:gundo_prefer_python3 && has('python3')"{{{
@ -111,6 +114,7 @@ function! s:GundoMapGraph()"{{{
nnoremap <script> <silent> <buffer> gg gg:call <sid>GundoMove(1)<CR> nnoremap <script> <silent> <buffer> gg gg:call <sid>GundoMove(1)<CR>
nnoremap <script> <silent> <buffer> P :call <sid>GundoPlayTo()<CR> nnoremap <script> <silent> <buffer> P :call <sid>GundoPlayTo()<CR>
nnoremap <script> <silent> <buffer> p :call <sid>GundoRenderChangePreview()<CR> nnoremap <script> <silent> <buffer> p :call <sid>GundoRenderChangePreview()<CR>
nnoremap <script> <silent> <buffer> r :call <sid>GundoRenderPreview()<CR>
nnoremap <script> <silent> <buffer> q :call <sid>GundoClose()<CR> nnoremap <script> <silent> <buffer> q :call <sid>GundoClose()<CR>
cabbrev <script> <silent> <buffer> q call <sid>GundoClose() cabbrev <script> <silent> <buffer> q call <sid>GundoClose()
cabbrev <script> <silent> <buffer> quit call <sid>GundoClose() cabbrev <script> <silent> <buffer> quit call <sid>GundoClose()
@ -318,11 +322,17 @@ function! s:GundoToggle()"{{{
endfunction"}}} endfunction"}}}
function! s:GundoShow()"{{{ function! s:GundoShow()"{{{
call s:GundoOpen() if !s:GundoIsVisible()
let g:gundo_target_n = bufnr('')
let g:gundo_target_f = @%
call s:GundoOpen()
endif
endfunction"}}} endfunction"}}}
function! s:GundoHide()"{{{ function! s:GundoHide()"{{{
call s:GundoClose() if s:GundoIsVisible()
call s:GundoClose()
endif
endfunction"}}} endfunction"}}}
"}}} "}}}
@ -377,7 +387,9 @@ function! s:GundoMove(direction) range"{{{
call cursor(0, idx2 + 1) call cursor(0, idx2 + 1)
endif endif
call s:GundoRenderPreview() if g:gundo_auto_preview == 1
call s:GundoRenderPreview()
endif
endfunction"}}} endfunction"}}}
"}}} "}}}
@ -436,6 +448,14 @@ function! gundo#GundoToggle()"{{{
call s:GundoToggle() call s:GundoToggle()
endfunction"}}} endfunction"}}}
function! gundo#GundoShow()"{{{
call s:GundoShow()
endfunction"}}}
function! gundo#GundoHide()"{{{
call s:GundoHide()
endfunction"}}}
function! gundo#GundoRenderGraph()"{{{ function! gundo#GundoRenderGraph()"{{{
call s:GundoRenderGraph() call s:GundoRenderGraph()
endfunction"}}} endfunction"}}}

View File

@ -1,8 +1,8 @@
*align.txt* The Alignment Tool Mar 04, 2009 *align.txt* The Alignment Tool Jun 18, 2012
Author: Charles E. Campbell, Jr. <NdrOchip@ScampbellPfamily.AbizM> Author: Charles E. Campbell <NdrOchip@ScampbellPfamily.AbizM>
(remove NOSPAM from Campbell's email first) (remove NOSPAM from Campbell's email first)
Copyright: (c) 2004-2008 by Charles E. Campbell, Jr. *Align-copyright* Copyright: (c) 2004-2012 by Charles E. Campbell *Align-copyright*
The VIM LICENSE applies to Align.vim, AlignMaps.vim, and Align.txt The VIM LICENSE applies to Align.vim, AlignMaps.vim, and Align.txt
(see |copyright|) except use "Align and AlignMaps" instead of "Vim" (see |copyright|) except use "Align and AlignMaps" instead of "Vim"
NO WARRANTY, EXPRESS OR IMPLIED. USE AT-YOUR-OWN-RISK. NO WARRANTY, EXPRESS OR IMPLIED. USE AT-YOUR-OWN-RISK.
@ -26,6 +26,7 @@ Copyright: (c) 2004-2008 by Charles E. Campbell, Jr. *Align-copyright*
Temporary Settings.....: |alignctrl-m| Temporary Settings.....: |alignctrl-m|
Padding................: |alignctrl-p| |alignctrl-P| Padding................: |alignctrl-p| |alignctrl-P|
Current Options........: |alignctrl-settings| |alignctrl-| Current Options........: |alignctrl-settings| |alignctrl-|
Alignment Control Init...: |alignctrl-init|
Alignment................: |align-align| Alignment................: |align-align|
4. Alignment Maps...........: |align-maps| 4. Alignment Maps...........: |align-maps|
\a,....................: |alignmap-a,| \a,....................: |alignmap-a,|
@ -91,6 +92,7 @@ Copyright: (c) 2004-2008 by Charles E. Campbell, Jr. *Align-copyright*
|| | | - skip this separator || || | | - skip this separator ||
|| | | + re-use last justification method || || | | + re-use last justification method ||
|| | | : treat rest of text as a field || || | | : treat rest of text as a field ||
|| | | * use AlignSkip() function (to skip or not) ||
|| | | || || | | ||
|| | p1 | p### pad separator on left by # blanks || || | p1 | p### pad separator on left by # blanks ||
|| | P1 | P### pad separator on right by # blanks || || | P1 | P### pad separator on right by # blanks ||
@ -176,12 +178,14 @@ ALIGNMENT CONCEPTS *align-concept* *align-concepts* {{{2
< Note how each "=" sign is surrounded by a single space; the < Note how each "=" sign is surrounded by a single space; the
default padding is p1P1 (p1 means one space before the separator, default padding is p1P1 (p1 means one space before the separator,
and P1 means one space after it). If you wish to change the and P1 means one space after it). If you wish to change the
padding, say to no padding, use (see |alignctrl-p|) > padding, say, to no padding, use (see |alignctrl-p|) >
:AlignCtrl lp0P0 :AlignCtrl lp0P0
< Next, note how each field is left justified; that's what the "l" < Next, note how each field is left justified; that's what the "l"
(a small letter "ell") does. If right-justification of the fields in the AlignCtrl parameters (a small letter "ell") does. If
had been desired, an "r" could've been used: > right-justification of the fields had been desired, an "r"
could've been used: >
:AlignCtrl r :AlignCtrl r
< yielding > < yielding >
x = y = z = 3; x = y = z = 3;
@ -196,10 +200,10 @@ ALIGNMENT CONCEPTS *align-concept* *align-concepts* {{{2
justify, right justify, or center them, too (see |alignctrl-<|). justify, right justify, or center them, too (see |alignctrl-<|).
Assume that for some reason a left-right-left-right-... justification Assume that for some reason a left-right-left-right-... justification
sequence was wished. This wish is simply achieved with > sequence was desired. This wish is simply achieved with >
:AlignCtrl lr :AlignCtrl lr
:1,4Align = :1,4Align =
< because the justification commands are considered to be "cylic"; ie. < because the justification commands are considered to be "cyclic"; ie.
lr is the same as lrlrlrlrlrlrlr... lr is the same as lrlrlrlrlrlrlr...
There's a lot more discussed under |alignctrl|; hopefully the examples There's a lot more discussed under |alignctrl|; hopefully the examples
@ -261,7 +265,7 @@ ALIGNMENT COMMANDS *align-command* *align-commands* {{{2
< Also see |alignctrl-m| for a way to automatically do < Also see |alignctrl-m| for a way to automatically do
an AlignPop after an Align (primarily this is for maps). an AlignPop after an Align (primarily this is for maps).
ALIGNMENT OPTIONS *align-option* *align-options* {{{2 ALIGNMENT OPTIONS *align-option* *align-options* *align-xstrlen* {{{2
*align-utf8* *align-utf* *align-codepoint* *align-strlen* *align-multibyte* *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 For those of you who are using 2-byte (or more) characters such as are
@ -279,7 +283,7 @@ ALIGNMENT OPTIONS *align-option* *align-options* {{{2
vim compiled without multi-byte support vim compiled without multi-byte support
$LANG is en_US.UTF-8 (assuming USA english) $LANG is en_US.UTF-8 (assuming USA english)
Number of codepoints (Latin a + combining circumflex is two codepoints)~ Number of codepoints (Latin a + combining circumflex are two codepoints)~
> >
let g:Align_xstrlen= 1 (default) let g:Align_xstrlen= 1 (default)
< <
@ -295,13 +299,20 @@ ALIGNMENT OPTIONS *align-option* *align-options* {{{2
> >
let g:Align_xstrlen= 3 let g:Align_xstrlen= 3
< <
User may specify a function to compute the string length~
>
let g:Align_xstrlen= "strlen"
< This method will cause Align to call upon the named function returning
string length. it should resemble the |strlen()| function, taking one
argument (the string) for input and returning the string length.
By putting one of these settings into your <.vimrc>, Align will use an By putting one of these settings into your <.vimrc>, Align will use an
internal (interpreted) function to determine a string's length instead internal (interpreted) function to determine a string's length instead
of the Vim's built-in |strlen()| function. Since the function is of Vim's built-in |strlen()| function. Since the function is
interpreted, Align will run a bit slower but will handle such strings interpreted, Align will run a bit slower but will handle such strings
correctly. The last setting (g:Align_xstrlen= 3) probably will run correctly. The last settings (g:Align_xstrlen= 3 and
the slowest but be the most accurate. (thanks to Tony Mechelynck for g:Align_xstrlen="userfuncname") probably will run the slowest but be
these) the most accurate. (thanks to Tony Mechelynck for these)
ALIGNMENT CONTROL *alignctrl* *align-control* {{{2 ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
@ -322,7 +333,7 @@ ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
< <
where "ws" stands for "white space" such as blanks and/or tabs. where "ws" stands for "white space" such as blanks and/or tabs.
SEPARATORS *alignctrl-separators* {{{3 SEPARATORS *alignctrl-separators* {{{3
As a result, separators may not have white space (tabs or blanks) on As a result, separators may not have white space (tabs or blanks) on
@ -337,10 +348,11 @@ ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
(ie. @), and then perform a substitute to revert the separators back (ie. @), and then perform a substitute to revert the separators back
to their desired condition (ie. s/@/ :: /g). to their desired condition (ie. s/@/ :: /g).
The Align#Align() function will first convert tabs over the region into The Align#Align() function (which is invoked by the :Align command)
spaces and then apply alignment control. Except for initial white will first convert tabs over the region into spaces and then apply
space, white space surrounding the fields is ignored. One has three alignment control. Except for initial white space, white space
options just for handling initial white space: surrounding the fields is ignored. One has three options just for
handling initial white space:
--- *alignctrl-w* --- *alignctrl-w*
@ -357,9 +369,9 @@ ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
+------------------+---------------+-------------------+-----------------+ +------------------+---------------+-------------------+-----------------+
| Original | w option | W option | I option | | Original | w option | W option | I option |
+------------------+---------------+-------------------+-----------------+ +------------------+---------------+-------------------+-----------------+
| a := baaa |a := baaa | a : = baaa | a := baaa | | a := baaa |a := baaa | a := baaa | a := baaa |
| caaaa := deeee |caaaa := deeee | caaaa : = deeee| caaaa := deeee| | caaaa := deeee |caaaa := deeee | caaaa := deeee | caaaa := deeee|
| ee := f |ee := f | ee : = f | ee := f | | ee := f |ee := f | ee := f | ee := f |
+------------------+---------------+-------------------+-----------------+ +------------------+---------------+-------------------+-----------------+
< <
The original has at least one leading white space on every line. The original has at least one leading white space on every line.
@ -397,17 +409,19 @@ ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
cycle only consists of one character (the "l"). cycle only consists of one character (the "l").
Every time left-justification is used for fields. Every time left-justification is used for fields.
AlignCtrl r : The = separator is repeatedly re-used, as the AlignCtrl r : The = separator is repeatedly re-used, as the
cycle only consists of one character (the "l"). cycle only consists of one character (the "r").
Every time right-justification is used for fields Every time right-justification is used for fields
AlignCtrl lr: Again, the "=" separator is repeatedly re-used, AlignCtrl lr: Again, the "=" separator is repeatedly re-used,
but the fields are justified alternately between but the fields are justified alternately between
left and right. left and right.
Even more separator control is available. With "-+:": Even more separator control is available! With "-+:":
- : skip treating the separator as a separator. *alignctrl--* - : skip treating the separator as a separator. *alignctrl--*
+ : repeat use of the last "lrc" justification *alignctrl-+* + : repeat use of the last "lrc" justification *alignctrl-+*
: : treat the rest of the line as a single field *alignctrl-:* : : treat the rest of the line as a single field *alignctrl-:*
* : like -, but only if g:AlignSkip() returns true *alignctrl-star*
(see |alignctrl-alignskip|)
Example: More justification options: Align = > Example: More justification options: Align = >
+------------+---------------+--------------------+---------------+ +------------+---------------+--------------------+---------------+
@ -452,6 +466,35 @@ ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
3rd separator only: AlignCtrl --l: 3rd separator only: AlignCtrl --l:
etc. etc.
*g:AlignSkip*
Align Skip Control *alignctrl-alignskip*
The separator control '*' permits a function to decide whether or
not a character which matches the current separator pattern should
instead be skipped.
1. Define a function; example: >
fun! AlignSkipString(lineno,indx)
let synid = synID(a:lineno,a:indx+1,1)
let synname = synIDattr(synIDtrans(synid),"name")
let ret= (synname == "String")? 1 : 0
return ret
endfun
<
Input: lineno: current line number
indx : index to character; leftmost character
in the line has an indx of 0 (like |strpart()|)
Output: 0 : if separator is ok
1 : skip separator like it was a '-'
2. Set up |g:AlignSkip| as a function reference (see |Funcref|): >
let g:AlignSkip= function("AlignSkipString")
<
3. Use * as a separator control where a separator potentially should
be skipped over.
--- *alignctrl-=* --- *alignctrl-=*
=C CYCLIC VS ALL-ACTIVE SEPARATORS *alignctrl-C* {{{3 =C CYCLIC VS ALL-ACTIVE SEPARATORS *alignctrl-C* {{{3
@ -465,8 +508,10 @@ ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
constructed: > constructed: >
AlignCtrl ... pat1 pat2 pat3 AlignCtrl ... pat1 pat2 pat3
< becomes >
\(pat1\|pat2\|pat3\) \(pat1\|pat2\|pat3\)
< < (ie. pat1 -or- pat2 -or- pat3; see |/bar|)
Each separator pattern is thus equivalent and simultaneously active. Each separator pattern is thus equivalent and simultaneously active.
The cyclic separator AlignCtrl option stores a list of patterns, only The cyclic separator AlignCtrl option stores a list of patterns, only
one of which is active for each field at a time. one of which is active for each field at a time.
@ -606,12 +651,12 @@ ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
|five= 6; |five = 6; |five = 6; | |five= 6; |five = 6; |five = 6; |
+----------------+------------------+----------------+ +----------------+------------------+----------------+
< <
The first "Align =" aligned with all "="s, including that one in the The first "Align =" aligned with all "="s, including the one in the
"skip=this" comment. "/* skip=this */" comment.
The second "Align =" had a AlignCtrl v-pattern which caused it to skip The second "Align =" had a AlignCtrl v-pattern which caused it to skip
(ignore) the "skip=this" line when aligning. (ignore) the "/* skip=this */" line when aligning.
To remove AlignCtrl's g and v patterns, use (as appropriate) > To remove AlignCtrl's g and v patterns, use (as appropriate) >
AlignCtrl g AlignCtrl g
@ -683,7 +728,7 @@ ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
AlignCtrl......|alignctrl| AlignCtrl......|alignctrl|
qty............|align-concept| qty............|align-concept|
AlignStyle.....|alignctrl--| |alignctrl-+| |alignctrl-:||alignctrl-c| AlignStyle.....|alignctrl--| |alignctrl-+| |alignctrl-:| |alignctrl-c|
Padding........|alignctrl-p| |alignctrl-P| Padding........|alignctrl-p| |alignctrl-P|
One may get a string which can be fed back into AlignCtrl: > One may get a string which can be fed back into AlignCtrl: >
@ -697,7 +742,19 @@ ALIGNMENT CONTROL *alignctrl* *align-control* {{{2
however: > however: >
:let alignctrl= Align#AlignCtrl("d") :let alignctrl= Align#AlignCtrl("d")
<
ALIGNMENT CONTROL INITIALIZATION *alignctrl-init* *alignctrl-initialization* {{{2
If you'd like to have your own default AlignCtrl, you'll be wanting to
put it in a file such as: >
$HOME/.vim/after/plugin/AlignPlugin.vim
< Anything in that file would be sourced at startup, but after your
.vimrc and after $HOME/.vim/plugin/AlignPlugin.vim; hence, :Align
and :AlignCtrl will then be defined.
ALIGNMENT *align-align* {{{2 ALIGNMENT *align-align* {{{2
@ -758,23 +815,31 @@ ALIGNMENT *align-align* {{{2
============================================================================== ==============================================================================
4. Alignment Maps *alignmaps* *align-maps* {{{1 4. Alignment Maps *alignmaps* *align-maps* {{{1
There are a number of maps using Align#AlignCtrl() and Align#Align() There are a number of maps provided in the AlignMaps plugin which
in the <AlignMapsPlugin.vim> file. This file may also be put into the depend upon the Align plugin. The maps provided by AlignMaps
plugins subdirectory. Since AlignCtrl and Align supercede textab and typically start with a leading "t" (for the older "textab" program
its <ttalign.vim> file, the maps either have a leading "t" (for which Align supercedes) or with an "a" for the more complicated
"textab") or the more complicated ones an "a" (for "alignment") for alignment maps.
backwards compatibility.
The maps are shown below with a leading backslash (\). Actually, the The AlignMaps plugin, although provided in the vimball containing
<Leader> construct is used (see |mapleader|), so the maps' leading Align.vim, is really a separate plugin (Align doesn't depend on
kick-off character is easily customized. AlignMaps). Consequently, if you'd rather not have AlignMaps's
mappings, just use the *:AlignMapsClean* command to remove its
components. The :AlignMapsClean command does not remove any maps
generated by AlignMaps in the current instance of vim.
Furthermore, all AlignMapsPlugin.vim maps use the <Plug> construct (see The maps are shown below with a leading backslash (\). However, the
|<Plug>|and |usr_41.txt|). Hence, if one wishes to override the actual maps use the <Leader> construct (see |mapleader|), so the maps'
mapping entirely, one may do that, too. As an example: > leading kick-off character is easily customized.
Furthermore, all the maps specified by the AlignMaps plugin use the
<Plug> construct (see |<Plug>|and |usr_41.txt|). Hence, if one wishes
to override the mapping(s) entirely, one may do that, too. As an
example: >
map <Leader>ACOM <Plug>AM_acom map <Leader>ACOM <Plug>AM_acom
< would have \ACOM do what \acom previously did (assuming that the < would have \ACOM do
mapleader has been left at its default value of a backslash). 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 \a, : useful for breaking up comma-separated
declarations prior to \adec |alignmap-a,| declarations prior to \adec |alignmap-a,|
@ -831,9 +896,9 @@ ALIGNMENT *align-align* {{{2
character "x" where "x" is: ,:<=@# |alignmap-T=| character "x" where "x" is: ,:<=@# |alignmap-T=|
\m= : like \t= but aligns with %... style comments \m= : like \t= but aligns with %... style comments
The leading backslash is actually <leader> (see |mapleader| for how to The leading backslash is actually <leader> (see |mapleader| to learn
customize the leader to be whatever you like). These maps use the how to customize the leader to be whatever you like). These maps use
<Align.vim> package and are defined in the <AlignMaps.vim> file. the <Align.vim> package and are defined in the <AlignMaps.vim> file.
Although the maps use AlignCtrl options, they typically use the "m" Although the maps use AlignCtrl options, they typically use the "m"
option which pushes the options (AlignPush). The associated Align option which pushes the options (AlignPush). The associated Align
call which follows will then AlignPop the user's original options call which follows will then AlignPop the user's original options
@ -847,6 +912,18 @@ ALIGNMENT *align-align* {{{2
Alternatively, one may select the text with the "V" visual mode Alternatively, one may select the text with the "V" visual mode
command. command.
If you want to use visual-block mode (ctrl-v), I suggest using
an AlignMap with the vis.vim plugin, available at either
stable: http://vim.sourceforge.net/scripts/script.php?script_id=1195
devel : http://mysite.verizon.net/astronaut/vim/index.html#VIS
Use it with commands such as >
ctrl-v (move)
:B norm \alignmap_sequence
<
ALIGNMENT MAP USE WITH MENUS~ ALIGNMENT MAP USE WITH MENUS~
One may use the mark-and-move style (ma, move, use the menu) or 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 visual mode style (use the V visual mode, move, then select
@ -862,7 +939,6 @@ ALIGNMENT *align-align* {{{2
must be included). must be included).
COMPLEX ALIGNMENT MAP METHOD~ COMPLEX ALIGNMENT MAP METHOD~
For those complex alignment maps which do alignment on constructs For those complex alignment maps which do alignment on constructs
(e.g. \acom, \adec, etc), a series of substitutes is used to insert (e.g. \acom, \adec, etc), a series of substitutes is used to insert
"@" symbols in appropriate locations. Align#Align() is then used to "@" symbols in appropriate locations. Align#Align() is then used to
@ -934,7 +1010,7 @@ ALIGNMENT *align-align* {{{2
aa:=bb:=cc:=1; aa:=bb:=cc:=1;
a:=b:=c:=1; a:=b:=c:=1;
aaa:=bbb:=ccc:=1; aaa:=bbb:=ccc:=1;
< <
Bcomes: select the three assignment lines, then \a:= > Bcomes: select the three assignment lines, then \a:= >
aa := bb := cc := 1; aa := bb := cc := 1;
a := b := c := 1; a := b := c := 1;
@ -981,6 +1057,17 @@ ALIGNMENT *align-align* {{{2
Alignment Map Examples: \anum *alignmap-anum* {{{3 Alignment Map Examples: \anum *alignmap-anum* {{{3
--------------------------- ---------------------------
First, note that the behavior of the \anum map depends on the existence
of either the vim variable >
g:alignmaps_usanumber
< or >
g:alignmaps_euronumber
< when AlignMaps is loaded.
Essentially, "usa" numbers use "."s and "euro" numbers use ","s to
separate the integer from the fractional portion of a number.
"Usa" numbers are default.
Original: illustrates how to get numbers lined up > Original: illustrates how to get numbers lined up >
-1.234 .5678 -.901e-4 -1.234 .5678 -.901e-4
1.234 5.678 9.01e-4 1.234 5.678 9.01e-4
@ -1012,7 +1099,8 @@ ALIGNMENT *align-align* {{{2
12,34 56,78 90,1e-4 12,34 56,78 90,1e-4
123,4 567,8 901,e-4 123,4 567,8 901,e-4
< <
Becomes: Go to first line, ma. Go to last line, press \anum > Becomes: (assuming g:alignmaps_euronumber exists)
Go to first line, ma. Go to last line, press \anum >
-1,234 ,5678 -,901e-4 -1,234 ,5678 -,901e-4
1,234 5,678 9,01e-4 1,234 5,678 9,01e-4
12,34 56,78 90,1e-4 12,34 56,78 90,1e-4
@ -1022,9 +1110,10 @@ ALIGNMENT *align-align* {{{2
\aenum is provided to support European-style numbers \aenum is provided to support European-style numbers
\aunum is provided to support USA-style numbers \aunum is provided to support USA-style numbers
One may get \aenum behavior for \anum > *g:alignmaps_usanumber* *g:alignmaps_euronumber*
One may get \aenum behavior for \anum by putting >
let g:alignmaps_euronumber= 1 let g:alignmaps_euronumber= 1
< or \aunum behavior for \anum if one puts > < or \aunum behavior for \anum by putting >
let g:alignmaps_usanumber= 1 let g:alignmaps_usanumber= 1
< in one's <.vimrc>. < in one's <.vimrc>.
@ -1311,21 +1400,48 @@ ALIGNMENT *align-align* {{{2
4. Alignment Tools' History *align-history* {{{1 4. Alignment Tools' History *align-history* {{{1
ALIGN HISTORY {{{2 ALIGN HISTORY {{{2
36 : May 20, 2009 * Previously, the "W" AlignCtrl setting, intended
to retain initial white space, did so by convert-
ing any leading tabs into an equivalent quantity
of blanks (using the current tabstop setting).
Align will now retain leading tabs.
Nov 24, 2009 * QArgSplitter() used split(), intending to split
on white space only. However, the \tab map
uses ctrl-o as a separator instead of tabs; the
split() function treated the ctrl-o as a whitespace
character, too. Solution: give split() an explicit
pattern matching blanks and tabs, only. \tab now
works again!
Jun 29, 2010 * included |g:AlignSkip| and |alignctrl-star| support
May 10, 2011 * if the range is only one line, then Align will
automatically grow the range to accommodate all
lines containing the first separator pattern
surrounding the current line.
Aug 05, 2011 * g:Align_xstrlen usage extended to permit users to
specify a function by name which computes string
length.
Oct 27, 2011 * (reported by Fco Javier) reported a problem with
the default s:Strlen() result; there was a missing
"let". Fixed.
Nov 10, 2011 * (Lewis Thompson) Align was doing "set noet" when
it should've been doing "setlocal noet".
Dec 22, 2011 * modifed s:Strlen() to use |strdisplaywidth()| when
g:Align_xstrlen is zero.
35 : Nov 02, 2008 * g:loaded_AlignPlugin testing to prevent re-loading 35 : Nov 02, 2008 * g:loaded_AlignPlugin testing to prevent re-loading
installed installed
Nov 19, 2008 * new sanity check for an AlignStyle of just ":" Nov 19, 2008 * new sanity check for an AlignStyle of just ":"
Jan 08, 2009 * save&restore of |'mod'| now done with local Jan 08, 2009 * save&restore of |'mod'| now done with local
variant variant
34 : Jul 08, 2008 * using :AlignCtrl before entering any alignment 34 : Jul 08, 2008 * using :AlignCtrl before entering any alignment
control commands was causing an error. control commands was causing an error.
33 : Sep 20, 2007 * s:Strlen() introduced to support various ways 33 : Sep 20, 2007 * s:Strlen() introduced to support various ways
used to represent characters and their effects used to represent characters and their effects
on string lengths. See |align-strlen|. on string lengths. See |align-strlen|.
* Align now accepts "..." -- so it can accept * Align now accepts "..." -- so it can accept
whitespace as separators. whitespace as separators.
32 : Aug 18, 2007 * uses |<q-args>| instead of |<f-args>| plus a 32 : Aug 18, 2007 * uses |<q-args>| instead of |<f-args>| plus a
custom argument splitter to allow patterns with custom argument splitter to allow patterns with
backslashes to slide in unaltered. backslashes to slide in unaltered.
31 : Aug 06, 2007 * :[range]Align! [AlignCtrl settings] pattern(s) 31 : Aug 06, 2007 * :[range]Align! [AlignCtrl settings] pattern(s)
implemented. implemented.
30 : Feb 12, 2007 * now uses |setline()| 30 : Feb 12, 2007 * now uses |setline()|
@ -1341,8 +1457,8 @@ ALIGN HISTORY {{{2
25 : Jul 27, 2004 : For debugging, uses Dfunc(), Dret(), and Decho() 25 : Jul 27, 2004 : For debugging, uses Dfunc(), Dret(), and Decho()
24 : Mar 03, 2004 : (should've done this earlier!) visualmode(1) 24 : Mar 03, 2004 : (should've done this earlier!) visualmode(1)
not supported until v6.2, now Align will avoid not supported until v6.2, now Align will avoid
calling it for earlier versions. Visualmode calling it for earlier versions. Visualmode
clearing won't take place then, of course. clearing won't take place then, of course.
23 : Oct 07, 2003 : Included Leif Wickland's ReplaceQuotedSpaces() 23 : Oct 07, 2003 : Included Leif Wickland's ReplaceQuotedSpaces()
function which supports \tsq function which supports \tsq
22 : Jan 29, 2003 : Now requires 6.1.308 or later to clear visualmode() 22 : Jan 29, 2003 : Now requires 6.1.308 or later to clear visualmode()
@ -1365,7 +1481,7 @@ ALIGN HISTORY {{{2
14 : Aug 20, 2002 : bug fix: AlignCtrl default now keeps &ic unchanged 14 : Aug 20, 2002 : bug fix: AlignCtrl default now keeps &ic unchanged
bug fix: Align, on end-field, wasn't using correct bug fix: Align, on end-field, wasn't using correct
alignop bug fix: Align, on end-field, was appending alignop bug fix: Align, on end-field, was appending
padding padding
13 : Aug 19, 2002 : bug fix: zero-length g/v patterns are accepted 13 : Aug 19, 2002 : bug fix: zero-length g/v patterns are accepted
bug fix: always skip blank lines bug fix: always skip blank lines
bug fix: AlignCtrl default now also clears g and v bug fix: AlignCtrl default now also clears g and v
@ -1382,28 +1498,37 @@ ALIGN HISTORY {{{2
9 : Jun 25, 2002 : implemented cyclic padding 9 : Jun 25, 2002 : implemented cyclic padding
ALIGNMENT MAP HISTORY *alignmap-history* {{{2 ALIGNMENT MAP HISTORY *alignmap-history* {{{2
v42 Jan 06, 2010 * new maps for \anum, \aenum, \aunum
Feb 16, 2010 * map for \t=, \T= now handles x++ = something;
for c, c++ correctly.
Oct 29, 2010 * added a note on having one's own default
AlignCtrl (see |alignctrl-init|)
Feb 22, 2011 * for menus, &go =~# used to insure correct case
Jun 10, 2011 * |:AlignMapsClean| command provided to make it
easy for those who would prefer not to have
AlignMaps' maps not to have them.
v41 Nov 02, 2008 * g:loaded_AlignMapsPlugin testing to prevent v41 Nov 02, 2008 * g:loaded_AlignMapsPlugin testing to prevent
re-loading installed re-loading installed
* AlignMaps now use 0x0f (ctrl-p) for special * AlignMaps now use 0x0f (ctrl-p) for special
character substitutions (instead of 0xff). character substitutions (instead of 0xff).
Seems to avoid some problems with having to Seems to avoid some problems with having to
use Strlen(). use Strlen().
* bug fixed with \ts, * bug fixed with \ts,
* new maps: \ts; \ts, \ts: \ts< \ts= \a( * new maps: \ts; \ts, \ts: \ts< \ts= \a(
v40 Oct 21, 2008 * Modified AlignMaps so that its maps use <Plug>s v40 Oct 21, 2008 * Modified AlignMaps so that its maps use <Plug>s
and <script>s. \t@ and related maps have been and <script>s. \t@ and related maps have been
changed to call StdAlign() instead. The changed to call StdAlign() instead. The
WrapperStart function now takes an argument and WrapperStart function now takes an argument and
handles being called via visual mode. The handles being called via visual mode. The
former nmaps and vmaps have thus been replaced former nmaps and vmaps have thus been replaced
with a simple map. with a simple map.
Oct 24, 2008 * broke AlignMaps into a plugin and autoload Oct 24, 2008 * broke AlignMaps into a plugin and autoload
pair of scripts. pair of scripts.
v39 Mar 06, 2008 : * \t= only does /* ... */ aligning when in *.c v39 Mar 06, 2008 : * \t= only does /* ... */ aligning when in *.c
*.cpp files. *.cpp files.
v38 Aug 18, 2007 : * \tt altered so that it works with the new v38 Aug 18, 2007 : * \tt altered so that it works with the new
use of |<q-args>| plus a custom argument use of |<q-args>| plus a custom argument
splitter splitter
v36 Sep 27, 2006 : * AlignWrapperStart() now has tests that marks v36 Sep 27, 2006 : * AlignWrapperStart() now has tests that marks
y and z are not set y and z are not set
May 15, 2007 * \anum and variants improved May 15, 2007 * \anum and variants improved

View File

@ -5,25 +5,26 @@ Making Vim's undo tree usable by humans.
============================================================================== ==============================================================================
CONTENTS *Gundo-contents* CONTENTS *Gundo-contents*
1. Intro .......................... |GundoIntro| 1. Intro ........................... |GundoIntro|
2. Usage .......................... |GundoUsage| 2. Usage ........................... |GundoUsage|
3. Configuration .................. |GundoConfig| 3. Configuration ................... |GundoConfig|
3.1 gundo_width ............... |gundo_width| 3.1 gundo_width ............... |gundo_width|
3.2 gundo_preview_height ...... |gundo_preview_height| 3.2 gundo_preview_height ...... |gundo_preview_height|
3.3 gundo_preview_bottom ...... |gundo_preview_bottom| 3.3 gundo_preview_bottom ...... |gundo_preview_bottom|
3.4 gundo_right ............... |gundo_right| 3.4 gundo_right ............... |gundo_right|
3.5 gundo_help ................ |gundo_help| 3.5 gundo_help ................ |gundo_help|
3.6 gundo_disable ............. |gundo_disable| 3.6 gundo_disable ............. |gundo_disable|
3.7 gundo_map_move_older ...... |gundo_map_move_older| 3.7 gundo_map_move_older ...... |gundo_map_move_older|
gundo_map_move_newer ...... |gundo_map_move_newer| gundo_map_move_newer ...... |gundo_map_move_newer|
3.8 gundo_close_on_revert ..... |gundo_close_on_revert| 3.8 gundo_close_on_revert ..... |gundo_close_on_revert|
3.9 gundo_preview_statusline .. |gundo_preview_statusline| 3.9 gundo_preview_statusline .. |gundo_preview_statusline|
gundo_tree_statusline ..... |gundo_tree_statusline| gundo_tree_statusline ..... |gundo_tree_statusline|
4. License ........................ |GundoLicense| 3.10 gundo_auto_preview ........ |gundo_auto_preview|
5. Bugs ........................... |GundoBugs| 4. License ......................... |GundoLicense|
6. Contributing ................... |GundoContributing| 5. Bugs ............................ |GundoBugs|
7. Changelog ...................... |GundoChangelog| 6. Contributing .................... |GundoContributing|
8. Credits ........................ |GundoCredits| 7. Changelog ....................... |GundoChangelog|
8. Credits ......................... |GundoCredits|
============================================================================== ==============================================================================
1. Intro *GundoIntro* 1. Intro *GundoIntro*
@ -206,6 +207,15 @@ Set these to a string to display it as the status line for each Gundo window.
Default: unset (windows use the default statusline) Default: unset (windows use the default statusline)
------------------------------------------------------------------------------
3.10 g:gundo_auto_preview *gundo_auto_preview*
Set this to 0 to disable automatically rendering preview diffs as you move
through the undo tree (you can still render a specific diff with r). This can
be useful on large files and undo trees to speed up Gundo.
Default: 1 (automatically preview diffs)
============================================================================== ==============================================================================
4. License *GundoLicense* 4. License *GundoLicense*
@ -228,7 +238,10 @@ GitHub: http://github.com/sjl/gundo.vim/
============================================================================== ==============================================================================
7. Changelog *GundoChangelog* 7. Changelog *GundoChangelog*
v2.4.0
* Add auto preview option.
* Add 'r' mapping to preview current state.
* Add public gundo#GundoShow() and gundo#GundoHide() functions.
v2.3.0 v2.3.0
* Add statusline configuration. * Add statusline configuration.
v2.2.2 v2.2.2

View File

@ -1,3 +1,4 @@
:AlignMapsClean Align.txt /*:AlignMapsClean*
:CVSEdit vcscommand.txt /*:CVSEdit* :CVSEdit vcscommand.txt /*:CVSEdit*
:CVSEditors vcscommand.txt /*:CVSEditors* :CVSEditors vcscommand.txt /*:CVSEditors*
:CVSUnedit vcscommand.txt /*:CVSUnedit* :CVSUnedit vcscommand.txt /*:CVSUnedit*
@ -158,6 +159,7 @@ align-usage Align.txt /*align-usage*
align-userguide Align.txt /*align-userguide* align-userguide Align.txt /*align-userguide*
align-utf Align.txt /*align-utf* align-utf Align.txt /*align-utf*
align-utf8 Align.txt /*align-utf8* align-utf8 Align.txt /*align-utf8*
align-xstrlen Align.txt /*align-xstrlen*
align.txt Align.txt /*align.txt* align.txt Align.txt /*align.txt*
alignctrl Align.txt /*alignctrl* alignctrl Align.txt /*alignctrl*
alignctrl- Align.txt /*alignctrl-* alignctrl- Align.txt /*alignctrl-*
@ -171,8 +173,11 @@ alignctrl-C Align.txt /*alignctrl-C*
alignctrl-I Align.txt /*alignctrl-I* alignctrl-I Align.txt /*alignctrl-I*
alignctrl-P Align.txt /*alignctrl-P* alignctrl-P Align.txt /*alignctrl-P*
alignctrl-W Align.txt /*alignctrl-W* alignctrl-W Align.txt /*alignctrl-W*
alignctrl-alignskip Align.txt /*alignctrl-alignskip*
alignctrl-c Align.txt /*alignctrl-c* alignctrl-c Align.txt /*alignctrl-c*
alignctrl-g Align.txt /*alignctrl-g* alignctrl-g Align.txt /*alignctrl-g*
alignctrl-init Align.txt /*alignctrl-init*
alignctrl-initialization Align.txt /*alignctrl-initialization*
alignctrl-l Align.txt /*alignctrl-l* alignctrl-l Align.txt /*alignctrl-l*
alignctrl-m Align.txt /*alignctrl-m* alignctrl-m Align.txt /*alignctrl-m*
alignctrl-no-option Align.txt /*alignctrl-no-option* alignctrl-no-option Align.txt /*alignctrl-no-option*
@ -180,6 +185,7 @@ alignctrl-p Align.txt /*alignctrl-p*
alignctrl-r Align.txt /*alignctrl-r* alignctrl-r Align.txt /*alignctrl-r*
alignctrl-separators Align.txt /*alignctrl-separators* alignctrl-separators Align.txt /*alignctrl-separators*
alignctrl-settings Align.txt /*alignctrl-settings* alignctrl-settings Align.txt /*alignctrl-settings*
alignctrl-star Align.txt /*alignctrl-star*
alignctrl-v Align.txt /*alignctrl-v* alignctrl-v Align.txt /*alignctrl-v*
alignctrl-w Align.txt /*alignctrl-w* alignctrl-w Align.txt /*alignctrl-w*
alignman Align.txt /*alignman* alignman Align.txt /*alignman*
@ -1497,11 +1503,14 @@ ex-visincr-IYMD visincr.txt /*ex-visincr-IYMD*
fetch pi_netrw.txt /*fetch* fetch pi_netrw.txt /*fetch*
ftp pi_netrw.txt /*ftp* ftp pi_netrw.txt /*ftp*
g% matchit.txt /*g%* g% matchit.txt /*g%*
g:AlignSkip Align.txt /*g:AlignSkip*
g:MultipleSearchColorSequence MultipleSearch.txt /*g:MultipleSearchColorSequence* g:MultipleSearchColorSequence MultipleSearch.txt /*g:MultipleSearchColorSequence*
g:MultipleSearchMaxColors MultipleSearch.txt /*g:MultipleSearchMaxColors* g:MultipleSearchMaxColors MultipleSearch.txt /*g:MultipleSearchMaxColors*
g:MultipleSearchTextColorSequence MultipleSearch.txt /*g:MultipleSearchTextColorSequence* g:MultipleSearchTextColorSequence MultipleSearch.txt /*g:MultipleSearchTextColorSequence*
g:NetrwTopLvlMenu pi_netrw.txt /*g:NetrwTopLvlMenu* g:NetrwTopLvlMenu pi_netrw.txt /*g:NetrwTopLvlMenu*
g:Netrw_funcref pi_netrw.txt /*g:Netrw_funcref* g:Netrw_funcref pi_netrw.txt /*g:Netrw_funcref*
g:alignmaps_euronumber Align.txt /*g:alignmaps_euronumber*
g:alignmaps_usanumber Align.txt /*g:alignmaps_usanumber*
g:netrw_alto pi_netrw.txt /*g:netrw_alto* g:netrw_alto pi_netrw.txt /*g:netrw_alto*
g:netrw_altv pi_netrw.txt /*g:netrw_altv* g:netrw_altv pi_netrw.txt /*g:netrw_altv*
g:netrw_banner pi_netrw.txt /*g:netrw_banner* g:netrw_banner pi_netrw.txt /*g:netrw_banner*
@ -1623,6 +1632,7 @@ glvs-options pi_getscript.txt /*glvs-options*
glvs-plugins pi_getscript.txt /*glvs-plugins* glvs-plugins pi_getscript.txt /*glvs-plugins*
glvs-usage pi_getscript.txt /*glvs-usage* glvs-usage pi_getscript.txt /*glvs-usage*
gundo.txt gundo.txt /*gundo.txt* gundo.txt gundo.txt /*gundo.txt*
gundo_auto_preview gundo.txt /*gundo_auto_preview*
gundo_close_on_revert gundo.txt /*gundo_close_on_revert* gundo_close_on_revert gundo.txt /*gundo_close_on_revert*
gundo_disable gundo.txt /*gundo_disable* gundo_disable gundo.txt /*gundo_disable*
gundo_help gundo.txt /*gundo_help* gundo_help gundo.txt /*gundo_help*

View File

@ -1,11 +1,9 @@
" AlignMapsPlugin: Alignment maps based upon <Align.vim> and <AlignMaps.vim> " AlignMapsPlugin: Alignment maps based upon <Align.vim> and <AlignMaps.vim>
" Maintainer: Dr. Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz> " Maintainer: Dr. Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz>
" Date: Mar 03, 2009 " Date: Jun 18, 2012
" "
" NOTE: the code herein needs vim 6.0 or later " NOTE: the code herein needs vim 7.0 or later
" needs <Align.vim> v6 or later " Copyright: Copyright (C) 1999-2012 Charles E. Campbell, Jr. {{{1
" 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, " Permission is hereby granted to use and distribute this code,
" with or without modifications, provided that this copyright " with or without modifications, provided that this copyright
" notice is copied with it. Like anything else that's free, " notice is copied with it. Like anything else that's free,
@ -14,7 +12,12 @@
" plugin, you agree that in no event will the copyright " plugin, you agree that in no event will the copyright
" holder be liable for any damages resulting from the use " holder be liable for any damages resulting from the use
" of this software. " of this software.
" " 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.
" ---------------------------------------------------------------------
" Usage: {{{1 " Usage: {{{1
" Use 'a to mark beginning of to-be-aligned region, Alternative: use V " 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 " move cursor to end of region, and execute map. (linewise visual mode) to
@ -29,20 +32,18 @@
" "
" Note: these maps all use <Align.vim>. " 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 " Load Once: {{{1
if &cp || exists("g:loaded_AlignMapsPlugin") if &cp || exists("g:loaded_AlignMapsPlugin")
finish finish
endif endif
let s:keepcpo = &cpo let s:keepcpo = &cpo
let g:loaded_AlignMapsPlugin = "v41" let g:loaded_AlignMapsPlugin = "v42"
set cpo&vim set cpo&vim
" =====================================================================
" Public Interface: {{{1
com! AlignMapsClean :call AlignMaps#AlignMapsClean()
" ===================================================================== " =====================================================================
" Maps: {{{1 " Maps: {{{1
@ -79,14 +80,17 @@ 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_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_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 " Number alignment maps: {{{2
if !hasmapto('<Plug>AM_aunum')|map <unique> <Leader>aunum <Plug>AM_aunum|endif
if !hasmapto('<Plug>AM_aenum')|map <unique> <Leader>aenum <Plug>AM_aenum|endif
if exists("g:alignmaps_euronumber") && !exists("g:alignmaps_usanumber") if exists("g:alignmaps_euronumber") && !exists("g:alignmaps_usanumber")
if !hasmapto('<Plug>AM_anum')|map <unique> <Leader>anum <Plug>AM_aenum|endif if !hasmapto('<Plug>AM_anum')|map <unique> <Leader>anum <Plug>AM_aenum|endif
else else
if !hasmapto('<Plug>AM_anum')|map <unique> <Leader>anum <Plug>AM_aunum|endif if !hasmapto('<Plug>AM_anum')|map <unique> <Leader>anum <Plug>AM_aunum|endif
endif endif
" Plug maps: (the real thing) {{{2
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: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:'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 mIp1P1=l << >><CR>:'a,.Align<CR><SID>WE
@ -97,12 +101,11 @@ map <silent> <script> <Plug>AM_acom <SID>WS:'a,.s/\/[*/]\/\=/@&@/e<CR>:'a,.s/\*
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_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_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_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_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*\%([a-zA-Z_][a-zA-Z_0-9<>:]*\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_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_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_aunum <SID>WS:'a,'zs/\([-+]\=\d\+\)\([eE][-+]\d\+\)\=/\1#\2/ge<CR>:'a,'zs/\([.eE][-+]\=\d\+\)#/\1/ge<CR>:'a,'zs/#\././ge<CR>:'a,'zs/[-+]\=\%(\d\+\%([.#]\d*\)\=\<bar>[.#]\d\+\)\%([eE][-+]\=\d\+\)\=/@&@/ge<CR>:AlignCtrl Imp0P0r<CR>:'a,'zAlign [@#.]<CR>:'a,'zs/\([.#]\)\(\s\+\)\(\d*\%([eE][-+]\=\d\+\)\=\)@/\1\3\2@/ge<CR>:'a,'zs/@//<CR>:'a,'zs/[#@]/ /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 map <silent> <script> <Plug>AM_aenum <SID>WS:'a,'zs/\([-+]\=\d\+\)\([eE][-+]\d\+\)\=/\1#\2/ge<CR>:'a,'zs/\([,eE][-+]\=\d\+\)#/\1/ge<CR>:'a,'zs/#,/,/ge<CR>:'a,'zs/[-+]\=\%(\d\+\%([,#]\d*\)\=\<bar>[,#]\d\+\)\%([eE][-+]\=\d\+\)\=/@&@/ge<CR>:AlignCtrl Imp0P0r<CR>:'a,'zAlign [@#,]<CR>:'a,'zs/\([,#]\)\(\s\+\)\(\d*\%([eE][-+]\=\d\+\)\=\)@/\1\3\2@/ge<CR>:'a,'zs/@//<CR>:'a,'zs/[#@]/ /ge<CR><SID>WE
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" html table alignment {{{2 " html table alignment {{{2
if !hasmapto('<Plug>AM_Htd')|map <unique> <Leader>Htd <Plug>AM_Htd|endif if !hasmapto('<Plug>AM_Htd')|map <unique> <Leader>Htd <Plug>AM_Htd|endif
@ -120,6 +123,7 @@ 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_T@') |map <unique> <Leader>T@ <Plug>AM_T@|endif
if !hasmapto('<Plug>AM_TW@') |map <unique> <Leader>TW@ <Plug>AM_TW@|endif
if !hasmapto('<Plug>AM_Tab') |map <unique> <Leader>Tab <Plug>AM_Tab|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_Tsp') |map <unique> <Leader>Tsp <Plug>AM_Tsp|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
@ -134,6 +138,7 @@ map <silent> <script> <Plug>AM_T< <SID>WS:AlignCtrl mIp0P0=r <<CR>:'a,.Align<C
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:'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>:'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_T@ <SID>WS:AlignCtrl mIp0P0=r @<CR>:'a,.Align<CR><SID>WE
map <silent> <script> <Plug>AM_TW@ <SID>WS:AlignCtrl mWp0P0=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_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_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 map <silent> <script> <Plug>AM_T~ <SID>WS:AlignCtrl mIp0P0=r ~<CR>:'a,.Align<CR>:'y,'zs/ \( *\);/;\1/ge<CR><SID>WE
@ -156,6 +161,7 @@ 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_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_tW@') |map <unique> <Leader>tW@ <Plug>AM_tW@|endif
if !hasmapto('<Plug>AM_m=') |map <unique> <Leader>m= <Plug>AM_m=|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_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_tml') |map <unique> <Leader>tml <Plug>AM_tml|endif
@ -170,28 +176,29 @@ map <silent> <script> <Plug>AM_t: <SID>WS:AlignCtrl mIp1P1=l :<CR>:'a,.Align<CR
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 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: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_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 #\zs<CR>:'a,.Align<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 ,\zs<CR>:'a,.Align<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 :\zs<CR>:'a,.Align<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 ;\zs<CR>:'a,.Align<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 <\zs<CR>:'a,.Align<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 =\zs<CR>:'a,.Align<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_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>:.,'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: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_t@ <SID>WS:call AlignMaps#StdAlign(1)<cr><SID>WE
map <silent> <script> <Plug>AM_tW@ <SID>WS:call AlignMaps#StdAlign(2)<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_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_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"<bar>endif<CR>:'a,.Align <Char-0x0f><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_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_tsp <SID>WS:keepj 'a,.s/^\(\s*\)\(.*\)/\=submatch(1).escape(substitute(submatch(2),'\s\+','@','g'),'\')/<CR>:AlignCtrl mI=lp0P0 @<CR>:'a,.Align<CR>:keepj '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_tsq <SID>WS:'a,.AlignReplaceQuotedSpaces<CR>:keepj 'a,.s/^\(\s*\)\(.*\)/\=submatch(1).substitute(submatch(2),'\s\+','@','g')/<CR>:AlignCtrl mIp0P0=l @<CR>:'a,.Align<CR>:keepj '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 map <silent> <script> <Plug>AM_tt <SID>WS:AlignCtrl mIp1P1=l \\\@<!& \\\\<CR>:'a,.Align<CR><SID>WE
" ===================================================================== " =====================================================================
" Menu Support: {{{1 " Menu Support: {{{1
" ma ..move.. use menu " ma ..move.. use menu
" v V or ctrl-v ..move.. use menu " v V or ctrl-v ..move.. use menu
if has("menu") && has("gui_running") && &go =~ 'm' && !exists("s:firstmenu") if has("menu") && has("gui_running") && &go =~# 'm' && !exists("s:firstmenu")
let s:firstmenu= 1 let s:firstmenu= 1
if !exists("g:DrChipTopLvlMenu") if !exists("g:DrChipTopLvlMenu")
let g:DrChipTopLvlMenu= "DrChip." let g:DrChipTopLvlMenu= "DrChip."

View File

@ -3,7 +3,7 @@
" Date: Nov 02, 2008 " Date: Nov 02, 2008
" GetLatestVimScripts: 294 1 :AutoInstall: Align.vim " GetLatestVimScripts: 294 1 :AutoInstall: Align.vim
" GetLatestVimScripts: 1066 1 :AutoInstall: cecutil.vim " GetLatestVimScripts: 1066 1 :AutoInstall: cecutil.vim
" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1 " Copyright: Copyright (C) 1999-2012 Charles E. Campbell, Jr. {{{1
" Permission is hereby granted to use and distribute this code, " Permission is hereby granted to use and distribute this code,
" with or without modifications, provided that this copyright " with or without modifications, provided that this copyright
" notice is copied with it. Like anything else that's free, " notice is copied with it. Like anything else that's free,
@ -22,7 +22,7 @@
if &cp || exists("g:loaded_AlignPlugin") if &cp || exists("g:loaded_AlignPlugin")
finish finish
endif endif
let g:loaded_AlignPlugin = "v35" let g:loaded_AlignPlugin = "v36"
let s:keepcpo = &cpo let s:keepcpo = &cpo
set cpo&vim set cpo&vim

View File

@ -2,8 +2,8 @@
" save/restore mark position " save/restore mark position
" save/restore selected user maps " save/restore selected user maps
" Author: Charles E. Campbell, Jr. " Author: Charles E. Campbell, Jr.
" Version: 18b ASTRO-ONLY " Version: 18h ASTRO-ONLY
" Date: Aug 27, 2008 " Date: Apr 05, 2010
" "
" Saving Restoring Destroying Marks: {{{1 " Saving Restoring Destroying Marks: {{{1
" call SaveMark(markname) let savemark= SaveMark(markname) " call SaveMark(markname) let savemark= SaveMark(markname)
@ -27,16 +27,17 @@
" You believe that God is one. You do well. The demons also {{{1 " 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 " believe, and shudder. But do you want to know, vain man, that
" faith apart from works is dead? (James 2:19,20 WEB) " faith apart from works is dead? (James 2:19,20 WEB)
"redraw!|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" Load Once: {{{1 " Load Once: {{{1
if &cp || exists("g:loaded_cecutil") if &cp || exists("g:loaded_cecutil")
finish finish
endif endif
let g:loaded_cecutil = "v18b" let g:loaded_cecutil = "v18h"
let s:keepcpo = &cpo let s:keepcpo = &cpo
set cpo&vim set cpo&vim
"DechoTabOn "DechoRemOn
" ======================= " =======================
" Public Interface: {{{1 " Public Interface: {{{1
@ -56,15 +57,17 @@ nmap <silent> <Plug>RestoreWinPosn :call RestoreWinPosn()<CR>
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" Command Interface: {{{2 " Command Interface: {{{2
com! -bar -nargs=0 SWP call SaveWinPosn() com! -bar -nargs=0 SWP call SaveWinPosn()
com! -bar -nargs=0 RWP call RestoreWinPosn() com! -bar -nargs=? RWP call RestoreWinPosn(<args>)
com! -bar -nargs=1 SM call SaveMark(<q-args>) com! -bar -nargs=1 SM call SaveMark(<q-args>)
com! -bar -nargs=1 RM call RestoreMark(<q-args>) com! -bar -nargs=1 RM call RestoreMark(<q-args>)
com! -bar -nargs=1 DM call DestroyMark(<q-args>) com! -bar -nargs=1 DM call DestroyMark(<q-args>)
com! -bar -nargs=1 WLR call s:WinLineRestore(<q-args>)
if v:version < 630 if v:version < 630
let s:modifier= "sil " let s:modifier= "sil! "
else else
let s:modifier= "sil keepj " let s:modifier= "sil! keepj "
endif endif
" =============== " ===============
@ -77,9 +80,9 @@ endif
" call SaveWinPosn() will save window position in b:cecutil_winposn{b:cecutil_iwinposn} " 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) " let winposn= SaveWinPosn(0) will *only* save window position in winposn variable (no stacking done)
fun! SaveWinPosn(...) fun! SaveWinPosn(...)
" call Dfunc("SaveWinPosn() a:0=".a:0) " echomsg "Decho: SaveWinPosn() a:0=".a:0
if line(".") == 1 && getline(1) == "" if line("$") == 1 && getline(1) == ""
" call Dfunc("SaveWinPosn : empty buffer") " echomsg "Decho: SaveWinPosn : empty buffer"
return "" return ""
endif endif
let so_keep = &l:so let so_keep = &l:so
@ -87,14 +90,20 @@ fun! SaveWinPosn(...)
let ss_keep = &l:ss let ss_keep = &l:ss
setlocal so=0 siso=0 ss=0 setlocal so=0 siso=0 ss=0
let swline = line(".") let swline = line(".") " save-window line in file
let swcol = col(".") let swcol = col(".") " save-window column in file
let swwline = winline() - 1 if swcol >= col("$")
let swwcol = virtcol(".") - wincol() let swcol= swcol + virtcol(".") - virtcol("$") " adjust for virtual edit (cursor past end-of-line)
let savedposn = "call GoWinbufnr(".winbufnr(0).")|silent ".swline endif
let swwline = winline() - 1 " save-window window line
let swwcol = virtcol(".") - wincol() " save-window window column
let savedposn = ""
" echomsg "Decho: sw[".swline.",".swcol."] sww[".swwline.",".swwcol."]"
let savedposn = "call GoWinbufnr(".winbufnr(0).")"
let savedposn = savedposn."|".s:modifier.swline
let savedposn = savedposn."|".s:modifier."norm! 0z\<cr>" let savedposn = savedposn."|".s:modifier."norm! 0z\<cr>"
if swwline > 0 if swwline > 0
let savedposn= savedposn.":".s:modifier."norm! ".swwline."\<c-y>\<cr>" let savedposn= savedposn.":".s:modifier."call s:WinLineRestore(".(swwline+1).")\<cr>"
endif endif
if swwcol > 0 if swwcol > 0
let savedposn= savedposn.":".s:modifier."norm! 0".swwcol."zl\<cr>" let savedposn= savedposn.":".s:modifier."norm! 0".swwcol."zl\<cr>"
@ -106,11 +115,11 @@ fun! SaveWinPosn(...)
" only when SaveWinPosn() is used " only when SaveWinPosn() is used
if a:0 == 0 if a:0 == 0
if !exists("b:cecutil_iwinposn") if !exists("b:cecutil_iwinposn")
let b:cecutil_iwinposn= 1 let b:cecutil_iwinposn= 1
else else
let b:cecutil_iwinposn= b:cecutil_iwinposn + 1 let b:cecutil_iwinposn= b:cecutil_iwinposn + 1
endif endif
" call Decho("saving posn to SWP stack") " echomsg "Decho: saving posn to SWP stack"
let b:cecutil_winposn{b:cecutil_iwinposn}= savedposn let b:cecutil_winposn{b:cecutil_iwinposn}= savedposn
endif endif
@ -118,12 +127,12 @@ fun! SaveWinPosn(...)
let &siso = siso_keep let &siso = siso_keep
let &l:ss = ss_keep let &l:ss = ss_keep
" if exists("b:cecutil_iwinposn") " Decho " if exists("b:cecutil_iwinposn") " Decho
" call Decho("b:cecutil_winpos{".b:cecutil_iwinposn."}[".b:cecutil_winposn{b:cecutil_iwinposn}."]") " echomsg "Decho: b:cecutil_winpos{".b:cecutil_iwinposn."}[".b:cecutil_winposn{b:cecutil_iwinposn}."]"
" else " Decho " else " Decho
" call Decho("b:cecutil_iwinposn doesn't exist") " echomsg "Decho: b:cecutil_iwinposn doesn't exist"
" endif " Decho " endif " Decho
" call Dret("SaveWinPosn [".savedposn."]") " echomsg "Decho: SaveWinPosn [".savedposn."]"
return savedposn return savedposn
endfun endfun
@ -132,11 +141,11 @@ endfun
" call RestoreWinPosn() " call RestoreWinPosn()
" call RestoreWinPosn(winposn) " call RestoreWinPosn(winposn)
fun! RestoreWinPosn(...) fun! RestoreWinPosn(...)
" call Dfunc("RestoreWinPosn() a:0=".a:0) " echomsg "Decho: RestoreWinPosn() a:0=".a:0
" call Decho("getline(1)<".getline(1).">") " echomsg "Decho: getline(1)<".getline(1).">"
" call Decho("line(.)=".line(".")) " echomsg "Decho: line(.)=".line(".")
if line(".") == 1 && getline(1) == "" if line("$") == 1 && getline(1) == ""
" call Dfunc("RestoreWinPosn : empty buffer") " echomsg "Decho: RestoreWinPosn : empty buffer"
return "" return ""
endif endif
let so_keep = &l:so let so_keep = &l:so
@ -147,15 +156,15 @@ fun! RestoreWinPosn(...)
if a:0 == 0 || a:1 == "" if a:0 == 0 || a:1 == ""
" use saved window position in b:cecutil_winposn{b:cecutil_iwinposn} if it exists " 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}") 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}.">") " echomsg "Decho: using stack b:cecutil_winposn{".b:cecutil_iwinposn."}<".b:cecutil_winposn{b:cecutil_iwinposn}.">"
try try
exe "silent! ".b:cecutil_winposn{b:cecutil_iwinposn} exe s:modifier.b:cecutil_winposn{b:cecutil_iwinposn}
catch /^Vim\%((\a\+)\)\=:E749/ catch /^Vim\%((\a\+)\)\=:E749/
" ignore empty buffer error messages " ignore empty buffer error messages
endtry endtry
" normally drop top-of-stack by one " normally drop top-of-stack by one
" but while new top-of-stack doesn't exist " but while new top-of-stack doesn't exist
" drop top-of-stack index by one again " drop top-of-stack index by one again
if b:cecutil_iwinposn >= 1 if b:cecutil_iwinposn >= 1
unlet b:cecutil_winposn{b:cecutil_iwinposn} unlet b:cecutil_winposn{b:cecutil_iwinposn}
let b:cecutil_iwinposn= b:cecutil_iwinposn - 1 let b:cecutil_iwinposn= b:cecutil_iwinposn - 1
@ -167,29 +176,29 @@ fun! RestoreWinPosn(...)
endif endif
endif endif
else else
echohl WarningMsg echohl WarningMsg
echomsg "***warning*** need to SaveWinPosn first!" echomsg "***warning*** need to SaveWinPosn first!"
echohl None echohl None
endif endif
else " handle input argument else " handle input argument
" call Decho("using input a:1<".a:1.">") " echomsg "Decho: using input a:1<".a:1.">"
" use window position passed to this function " use window position passed to this function
exe "silent ".a:1 exe a:1
" remove a:1 pattern from b:cecutil_winposn{b:cecutil_iwinposn} stack " remove a:1 pattern from b:cecutil_winposn{b:cecutil_iwinposn} stack
if exists("b:cecutil_iwinposn") if exists("b:cecutil_iwinposn")
let jwinposn= b:cecutil_iwinposn let jwinposn= b:cecutil_iwinposn
while jwinposn >= 1 " search for a:1 in iwinposn..1 while jwinposn >= 1 " search for a:1 in iwinposn..1
if exists("b:cecutil_winposn{jwinposn}") " if it exists if exists("b:cecutil_winposn{jwinposn}") " if it exists
if a:1 == b:cecutil_winposn{jwinposn} " and the pattern matches if a:1 == b:cecutil_winposn{jwinposn} " and the pattern matches
unlet b:cecutil_winposn{jwinposn} " unlet it unlet b:cecutil_winposn{jwinposn} " unlet it
if jwinposn == b:cecutil_iwinposn " if at top-of-stack if jwinposn == b:cecutil_iwinposn " if at top-of-stack
let b:cecutil_iwinposn= b:cecutil_iwinposn - 1 " drop stacktop by one let b:cecutil_iwinposn= b:cecutil_iwinposn - 1 " drop stacktop by one
endif endif
endif endif
endif endif
let jwinposn= jwinposn - 1 let jwinposn= jwinposn - 1
endwhile endwhile
endif endif
endif endif
@ -197,17 +206,34 @@ fun! RestoreWinPosn(...)
" cause jump to first column. The following fixes that. " cause jump to first column. The following fixes that.
" Note: was using wincol()>1, but with signs, a cursor " Note: was using wincol()>1, but with signs, a cursor
" at column 1 yields wincol()==3. Beeping ensued. " at column 1 yields wincol()==3. Beeping ensued.
let vekeep= &ve
set ve=all
if virtcol('.') > 1 if virtcol('.') > 1
silent norm! hl exe s:modifier."norm! hl"
elseif virtcol(".") < virtcol("$") elseif virtcol(".") < virtcol("$")
silent norm! lh exe s:modifier."norm! lh"
endif endif
let &ve= vekeep
let &l:so = so_keep let &l:so = so_keep
let &l:siso = siso_keep let &l:siso = siso_keep
let &l:ss = ss_keep let &l:ss = ss_keep
" call Dret("RestoreWinPosn") " echomsg "Decho: RestoreWinPosn"
endfun
" ---------------------------------------------------------------------
" s:WinLineRestore: {{{2
fun! s:WinLineRestore(swwline)
" echomsg "Decho: s:WinLineRestore(swwline=".a:swwline.")"
while winline() < a:swwline
let curwinline= winline()
exe s:modifier."norm! \<c-y>"
if curwinline == winline()
break
endif
endwhile
" echomsg "Decho: s:WinLineRestore"
endfun endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
@ -416,11 +442,11 @@ fun! SaveUserMaps(mapmode,maplead,mapchx,suffix)
let dobuffer = "" let dobuffer = ""
while mapmode =~ '^[bu]' while mapmode =~ '^[bu]'
if mapmode =~ '^u' if mapmode =~ '^u'
let dounmap= 1 let dounmap = 1
let mapmode= strpart(a:mapmode,1) let mapmode = strpart(a:mapmode,1)
elseif mapmode =~ '^b' elseif mapmode =~ '^b'
let dobuffer= "<buffer> " let dobuffer = "<buffer> "
let mapmode= strpart(a:mapmode,1) let mapmode = strpart(a:mapmode,1)
endif endif
endwhile endwhile
" call Decho("dounmap=".dounmap." dobuffer<".dobuffer.">") " call Decho("dounmap=".dounmap." dobuffer<".dobuffer.">")
@ -453,7 +479,7 @@ fun! SaveUserMaps(mapmode,maplead,mapchx,suffix)
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|silent! ".mapmode."unmap ".dobuffer.amap let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|silent! ".mapmode."unmap ".dobuffer.amap
if maparg(a:mapchx,mapmode) != "" if maparg(a:mapchx,mapmode) != ""
let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge') let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge')
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|".mapmode."map ".amap." ".dobuffer.maprhs let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|".mapmode."map ".dobuffer.amap." ".maprhs
endif endif
if dounmap if dounmap
exe "silent! ".mapmode."unmap ".dobuffer.amap exe "silent! ".mapmode."unmap ".dobuffer.amap
@ -471,7 +497,7 @@ fun! SaveUserMaps(mapmode,maplead,mapchx,suffix)
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|silent! ".mapmode."unmap ".dobuffer.amap let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|silent! ".mapmode."unmap ".dobuffer.amap
if maparg(amap,mapmode) != "" if maparg(amap,mapmode) != ""
let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge') let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge')
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|".mapmode."map ".amap." ".dobuffer.maprhs let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|".mapmode."map ".dobuffer.amap." ".maprhs
endif endif
if dounmap if dounmap
exe "silent! ".mapmode."unmap ".dobuffer.amap exe "silent! ".mapmode."unmap ".dobuffer.amap

View File

@ -41,6 +41,8 @@
" 01/27/05 - added sleep to consume less CPU " 01/27/05 - added sleep to consume less CPU
" removed frame counter " removed frame counter
" 01/26/05 - initial version " 01/26/05 - initial version
"
" This script is released under MIT license.
" Speed range, must be positive. Lower delay = faster. " Speed range, must be positive. Lower delay = faster.