From 8b445f9dc304efb0ea8a8417ad7b5559891dfc31 Mon Sep 17 00:00:00 2001 From: stefan Date: Sat, 14 Jun 2008 10:17:54 +0000 Subject: [PATCH] =?UTF-8?q?Update=20f=C3=BCr=20Linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://vimsuite.svn.sourceforge.net/svnroot/vimsuite/trunk@162 eb2d0018-73a3-4aeb-bfe9-1def61c9ec69 --- vimfiles/autoload/visincr.vim | 1844 ++++++++++++++++----------------- 1 file changed, 922 insertions(+), 922 deletions(-) diff --git a/vimfiles/autoload/visincr.vim b/vimfiles/autoload/visincr.vim index d0ab614..ba4d99d 100644 --- a/vimfiles/autoload/visincr.vim +++ b/vimfiles/autoload/visincr.vim @@ -1,922 +1,922 @@ -" visincr.vim: Visual-block incremented lists -" Author: Charles E. Campbell, Jr. Ph.D. -" Date: Dec 19, 2007 -" Version: 19 -" -" Visincr assumes that a block of numbers selected by a -" ctrl-v (visual block) has been selected for incrementing. -" This function will transform that block of numbers into -" an incrementing column starting from that topmost number -" in the visual block. Also handles dates, daynames, and -" monthnames. -" -" Fancy Stuff: -" * If the visual block is ragged right (as can happen when "$" -" is used to select the right hand side), the block will have -" spaces appended to straighten it out -" * If the strlen of the count exceeds the visual-block -" allotment of spaces, then additional spaces will be inserted -" * Handles leading tabs by using virtual column calculations -" GetLatestVimScripts: 670 1 :AutoInstall: visincr.vim -" 1Cor 16:14 : Let all that you do be done in love. {{{1 - -" --------------------------------------------------------------------- -" Load Once: {{{1 -if &cp || exists("g:loaded_visincr") - finish -endif -let s:keepcpo = &cpo -let g:loaded_visincr = "v19" -set cpo&vim - -" --------------------------------------------------------------------- -" Methods: {{{1 -let s:I = 0 -let s:II = 1 -let s:IMDY = 2 -let s:IYMD = 3 -let s:IDMY = 4 -let s:ID = 5 -let s:IM = 6 -let s:IA = 7 -let s:IX = 8 -let s:IIX = 9 -let s:IO = 10 -let s:IIO = 11 -let s:IR = 12 -let s:IIR = 13 -let s:IPOW = 14 -let s:IIPOW = 15 -let s:RI = 16 -let s:RII = 17 -let s:RIMDY = 18 -let s:RIYMD = 19 -let s:RIDMY = 20 -let s:RID = 21 -let s:RIM = 22 -let s:RIA = 23 -let s:RIX = 24 -let s:RIIX = 25 -let s:RIO = 26 -let s:RIIO = 27 -let s:RIR = 28 -let s:RIIR = 29 -let s:RIPOW = 30 -let s:RIIPOW = 31 - -" ------------------------------------------------------------------------------ -" Options: {{{1 -if !exists("g:visincr_leaddate") - " choose between dates such as 11/ 5/04 and 11/05/04 - let g:visincr_leaddate = '0' -endif -if !exists("g:visincr_datedivset") - let g:visincr_datedivset= '[-./_:~,+*^]\=' -endif - -" ============================================================================== -" Functions: {{{1 - -" ------------------------------------------------------------------------------ -" VisBlockIncr: {{{2 -fun! visincr#VisBlockIncr(method,...) -" call Dfunc("VisBlockIncr(method<".a:method.">) a:0=".a:0) - - " avoid problems with user options {{{3 - call s:SaveUserOptions() - - " visblockincr only uses visual-block! {{{3 -" call Decho("visualmode<".visualmode().">") - if visualmode() != "\" - echoerr "Please use visual-block mode (ctrl-v)!" - call s:RestoreUserOptions() -" call Dret("VisBlockIncr") - return - endif - - " save boundary line numbers and set up method {{{3 - let y1 = line("'<") - let y2 = line("'>") - let method = (a:method >= s:RI)? (a:method - s:RI) : a:method - let leaddate= g:visincr_leaddate -" call Decho("a:method=".a:method." s:RI=".s:RI." method=".method." leaddeate<".leaddate.">") - - " get increment (default=1; except for power increments, that's default=2) {{{3 - if a:0 > 0 - let incr= a:1 - if method == s:IX || method == s:IIX - let incr= s:Hex2Dec(incr) - elseif method == s:IO || method == s:IIO - let incr= s:Oct2Dec(incr) - endif - elseif method == s:IPOW || method == s:IIPOW - let incr= 2 - else - let incr= 1 - endif -" call Decho("incr=".incr) - - " set up restriction pattern {{{3 - let leftcol = virtcol("'<") - let rghtcol = virtcol("'>") - if leftcol > rghtcol - let leftcol = virtcol("'>") - let rghtcol = virtcol("'<") - endif - let width= rghtcol - leftcol + 1 -" call Decho("width= [rghtcol=".rghtcol."]-[leftcol=".leftcol."]+1=".width) - - if a:method == s:RI - let restrict= '\%'.col(".").'c\d' -" call Decho(":I restricted<".restrict.">") - - elseif a:method == s:RII - let restrict= '\%'.col(".").'c\s\{,'.width.'}\d' -" call Decho(":II restricted<".restrict.">") - - elseif a:method == s:RIMDY - let restrict= '\%'.col(".").'c\d\{1,2}'.g:visincr_datedivset.'\d\{1,2}'.g:visincr_datedivset.'\d\{2,4}' -" call Decho(":IMDY restricted<".restrict.">") - - elseif a:method == s:RIYMD - let restrict= '\%'.col(".").'c\d\{2,4}'.g:visincr_datedivset.'\d\{1,2}'.g:visincr_datedivset.'\d\{1,2}' -" call Decho(":IYMD restricted<".restrict.">") - - elseif a:method == s:RIDMY - let restrict= '\%'.col(".").'c\d\{1,2}'.g:visincr_datedivset.'\d\{1,2}'.g:visincr_datedivset.'\d\{2,4}' -" call Decho(":IDMY restricted<".restrict.">") - - elseif a:method == s:RID - if exists("g:visincr_dow") - let dowlist = substitute(g:visincr_dow,'\(\a\{1,3}\)[^,]*\%(,\|$\)','\1\\|','ge') - let dowlist = substitute(dowlist,'\\|$','','e') - let restrict= '\c\%'.col(".").'c\('.substitute(dowlist,',','\\|','ge').'\)' -" call Decho("restrict<".restrict.">") - else - let restrict= '\c\%'.col(".").'c\(mon\|tue\|wed\|thu\|fri\|sat\|sun\)' - endif -" call Decho(":ID restricted<".restrict.">") - - elseif a:method == s:RIM - if exists("g:visincr_month") - let monlist = substitute(g:visincr_month,'\(\a\{1,3}\)[^,]*\%(,\|$\)','\1\\|','ge') - let monlist = substitute(monlist,'\\|$','','e') - let restrict= '\c\%'.col(".").'c\('.substitute(monlist,',','\\|','ge').'\)' -" call Decho("restrict<".restrict.">") - else - let restrict= '\c\%'.col(".").'c\(jan\|feb\|mar\|apr\|may\|jun\|jul\|aug\|sep\|oct\|nov\|dec\)' - endif -" call Decho(":IM restricted<".restrict.">") - - elseif a:method == s:RIPOW - let restrict= '\%'.col(".").'c\d' -" call Decho(":RIPOW restricted<".restrict.">") - - elseif a:method == s:RIIPOW - let restrict= '\%'.col(".").'c\s\{,'.width.'}\d' -" call Decho(":RIIPOW restricted<".restrict.">") - endif - - " determine zfill {{{3 -" call Decho("a:0=".a:0." method=".method) - if a:0 > 1 && ((s:IMDY <= method && method <= s:IDMY) || (s:RIMDY <= method && method <= s:RIDMY)) - let leaddate= a:2 -" call Decho("set leaddate<".leaddate.">") - elseif a:0 > 1 && method - let zfill= a:2 - if zfill == "''" || zfill == '""' - let zfill="" - endif -" call Decho("set zfill<".zfill.">") - else - " default zfill (a single space) - let zfill= ' ' -" call Decho("set default zfill<".zfill.">") - endif - - " IMDY IYMD IDMY ID IM IA: {{{3 - if s:IMDY <= method && method <= s:IA - let rghtcol = rghtcol + 1 - let curline = getline("'<") - - " ID: {{{3 - if method == s:ID - let pat = '^.*\%'.leftcol.'v\(\a\+\)\%'.rghtcol.'v.*$' - let dow = substitute(substitute(curline,pat,'\1','e'),' ','','ge') - let dowlen = strlen(dow) -" call Decho("pat<".pat."> dow<".dow."> dowlen=".dowlen) - - " set up long daynames - if exists("g:visincr_dow") - let dow_0= substitute(g:visincr_dow,'^\([^,]*\),.*$', '\1','') - let dow_1= substitute(g:visincr_dow,'^\%([^,]*,\)\{1}\([^,]*\),.*$','\1','') - let dow_2= substitute(g:visincr_dow,'^\%([^,]*,\)\{2}\([^,]*\),.*$','\1','') - let dow_3= substitute(g:visincr_dow,'^\%([^,]*,\)\{3}\([^,]*\),.*$','\1','') - let dow_4= substitute(g:visincr_dow,'^\%([^,]*,\)\{4}\([^,]*\),.*$','\1','') - let dow_5= substitute(g:visincr_dow,'^\%([^,]*,\)\{5}\([^,]*\),.*$','\1','') - let dow_6= substitute(g:visincr_dow,'^\%([^,]*,\)\{6}\([^,]*\)$', '\1','') - else - let dow_0= "Monday" - let dow_1= "Tuesday" - let dow_2= "Wednesday" - let dow_3= "Thursday" - let dow_4= "Friday" - let dow_5= "Saturday" - let dow_6= "Sunday" - endif - - " if the daynames under the cursor is <= 3, transform - " long daynames to short daynames - if strlen(dow) <= 3 -" call Decho("transform long daynames to short daynames") - let dow_0= strpart(dow_0,0,3) - let dow_1= strpart(dow_1,0,3) - let dow_2= strpart(dow_2,0,3) - let dow_3= strpart(dow_3,0,3) - let dow_4= strpart(dow_4,0,3) - let dow_5= strpart(dow_5,0,3) - let dow_6= strpart(dow_6,0,3) - endif - - " identify day-of-week under cursor - let idow= 0 - while idow < 7 -" call Decho("dow<".dow."> dow_".idow."<".dow_{idow}.">") - if dow =~ '\c\<'.strpart(dow_{idow},0,3) - break - endif - let idow= idow + 1 - endwhile - if idow >= 7 - echoerr "***error*** misspelled day-of-week <".dow.">" - call s:RestoreUserOptions() -" call Dret("VisBlockIncr : unable to identify day-of-week") - return - endif - - " generate incremented dayname list - norm! `< - norm! gUl - norm! `< - let l = y1 - while l < y2 - norm! j -" call Decho("while [l=".l."] < [y2=".y2."]: line=".line(".")." col[".leftcol.",".rghtcol."] width=".width) - if exists("restrict") && getline(".") !~ restrict - let l= l + 1 - continue - endif - let idow= (idow + incr)%7 - exe 's/\%'.leftcol.'v.\{'.width.'\}/'.dow_{idow}.'/e' - let l= l + 1 - endw - " return from ID - call s:RestoreUserOptions() -" call Dret("VisBlockIncr : ID") - return - endif - - " IM: {{{3 - if method == s:IM - let pat = '^.*\%'.leftcol.'v\(\a\+\)\%'.rghtcol.'v.*$' - let mon = substitute(substitute(curline,pat,'\1','e'),' ','','ge') - let monlen = strlen(mon) - if exists("g:visincr_month") - let mon_0 = substitute(g:visincr_month,'^\([^,]*\),.*$', '\1','') - let mon_1 = substitute(g:visincr_month,'^\%([^,]*,\)\{1}\([^,]*\),.*$', '\1','') - let mon_2 = substitute(g:visincr_month,'^\%([^,]*,\)\{2}\([^,]*\),.*$', '\1','') - let mon_3 = substitute(g:visincr_month,'^\%([^,]*,\)\{3}\([^,]*\),.*$', '\1','') - let mon_4 = substitute(g:visincr_month,'^\%([^,]*,\)\{4}\([^,]*\),.*$', '\1','') - let mon_5 = substitute(g:visincr_month,'^\%([^,]*,\)\{5}\([^,]*\),.*$', '\1','') - let mon_6 = substitute(g:visincr_month,'^\%([^,]*,\)\{6}\([^,]*\),.*$', '\1','') - let mon_7 = substitute(g:visincr_month,'^\%([^,]*,\)\{7}\([^,]*\),.*$', '\1','') - let mon_8 = substitute(g:visincr_month,'^\%([^,]*,\)\{8}\([^,]*\),.*$', '\1','') - let mon_9 = substitute(g:visincr_month,'^\%([^,]*,\)\{9}\([^,]*\),.*$', '\1','') - let mon_10= substitute(g:visincr_month,'^\%([^,]*,\)\{10}\([^,]*\),.*$','\1','') - let mon_11= substitute(g:visincr_month,'^\%([^,]*,\)\{11}\([^,]*\)$', '\1','') - else - let mon_0 = "January" - let mon_1 = "February" - let mon_2 = "March" - let mon_3 = "April" - let mon_4 = "May" - let mon_5 = "June" - let mon_6 = "July" - let mon_7 = "August" - let mon_8 = "September" - let mon_9 = "October" - let mon_10= "November" - let mon_11= "December" - endif - - " identify month under cursor - let imon= 0 - while imon < 12 - if mon =~ '\c\<'.strpart(mon_{imon},0,3) - break - endif - let imon= imon + 1 - endwhile - if imon >= 12 - echoerr "***error*** misspelled month <".mon.">" - call s:RestoreUserOptions() -" call Dret("VisBlockIncr") - return - endif - - " if monthname is three or fewer characters long, - " transform monthnames to three character versions - if strlen(mon) <= 3 -" call Decho("transform monthnames to short versions") - let jmon= 0 - while jmon < 12 - let mon_{jmon} = strpart(mon_{jmon},0,3) - let jmon = jmon + 1 - endwhile - endif - - " generate incremented monthname list - norm! `< - norm! gUl - norm! `< - let l = y1 - while l < y2 - norm! j - if exists("restrict") && getline(".") !~ restrict - let l= l + 1 - continue - endif - let imon= (imon + incr)%12 - exe 's/\%'.leftcol.'v.\{'.width.'\}/'.mon_{imon}.'/e' - let l= l + 1 - endw - " return from IM - call s:RestoreUserOptions() -" call Dret("VisBlockIncr : IM") - return - endif - - " IA: {{{3 - if method == s:IA - let pat = '^.*\%'.leftcol.'v\(\a\).*$' - let letter = substitute(curline,pat,'\1','e') - if letter !~ '\a' - let letter= 'A' - endif - if letter =~ '[a-z]' - let alphabet='abcdefghijklmnopqrstuvwxyz' - else - let alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ' - endif - let ilet= stridx(alphabet,letter) - - norm! `< - let l = y1 - while l <= y2 -" call Decho("letter<".letter."> l=".l." ilet=".ilet) - exe 's/\%'.leftcol.'v.*\%'.rghtcol.'v/'.letter.'/e' - let ilet = (ilet + incr)%26 - let letter = strpart(alphabet,ilet,1) - if l < y2 - silent norm! j - endif - let l= l + 1 - endw - " return from IA - call s:RestoreUserOptions() -" call Dret("VisBlockIncr : IA") - return - endif - - let pat = '^.*\%'.leftcol.'v\( \=[0-9]\{1,4}\)'.g:visincr_datedivset.'\( \=[0-9]\{1,2}\)'.g:visincr_datedivset.'\( \=[0-9]\{1,4}\)\%'.rghtcol.'v.*$' - let datediv= substitute(curline,'^.*\%'.leftcol.'v\%( \=[0-9]\{1,4}\)\('.g:visincr_datedivset.'\).*$','\1','') - if strlen(datediv) > 1 - redraw! - echohl WarningMsg - echomsg "***visincr*** Your date looks odd, is g:visincr_datedivset<".g:visincr_datedivset."> what you want?" - endif -" call Decho("pat <".pat.">") -" call Decho("datediv<".datediv.">") - - " IMDY: {{{3 - if method == s:IMDY - if datediv == "" - let pat= '^.*\%'.leftcol.'v\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,4}\)\%'.rghtcol.'v.*$' - endif - let m = substitute(substitute(curline,pat,'\1',''),' ','','ge')+0 - let d = substitute(substitute(curline,pat,'\2',''),' ','','ge')+0 - let y = substitute(substitute(curline,pat,'\3',''),' ','','ge')+0 - let type = 2 -" call Decho("IMDY: y=".y." m=".m." d=".d." leftcol=".leftcol." rghtcol=".rghtcol) - - " IYMD: {{{3 - elseif method == s:IYMD - if datediv == "" - let pat= '^.*\%'.leftcol.'v\( \=[0-9]\{1,4}\)\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,2}\)\%'.rghtcol.'v.*$' - endif - let y = substitute(substitute(curline,pat,'\1',''),' ','','ge')+0 - let m = substitute(substitute(curline,pat,'\2',''),' ','','ge')+0 - let d = substitute(substitute(curline,pat,'\3',''),' ','','ge')+0 - let type = 1 -" call Decho("IYMD: y=".y." m=".m." d=".d." leftcol=".leftcol." rghtcol=".rghtcol) - - " IDMY: {{{3 - elseif method == s:IDMY - if datediv == "" - let pat= '^.*\%'.leftcol.'v\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,4}\)\%'.rghtcol.'v.*$' - endif - let d = substitute(substitute(curline,pat,'\1',''),' ','','ge')+0 - let m = substitute(substitute(curline,pat,'\2',''),' ','','ge')+0 - let y = substitute(substitute(curline,pat,'\3',''),' ','','ge')+0 - let type = 3 -" call Decho("IDMY: y=".y." m=".m." d=".d." leftcol=".leftcol." rghtcol=".rghtcol) - else - echoerr "***error*** in script" -" call Dret("VisBlockIncr -- method#".method." not supported") - return - endif - - " Julian day/Calendar day calculations {{{3 - try - let julday= calutil#Cal2Jul(y,m,d) - catch /^Vim\%((\a\+)\)\=:E/ - echoerr "***error*** you need calutil.vim! (:help visincr-calutil)" -" call Dret("VisBlockIncr") - return - endtry - norm! `< - let l = y1 - while l <= y2 - if exists("restrict") && getline(".") !~ restrict - norm! j - let l= l + 1 - continue - endif - let doy = calutil#Jul2Cal(julday,type) - - " IYMD: {{{3 - if type == 1 - let doy = substitute(doy,'^\d/',leaddate.'&','e') - let doy = substitute(doy,'/\(\d/\)','/'.leaddate.'\1','e') - let doy = substitute(doy,'/\(\d\)$','/'.leaddate.'\1','e') - - " IMDY IDMY: {{{3 - else - let doy = substitute(doy,'^\d/',' &','e') - let doy = substitute(doy,'/\(\d/\)','/'.leaddate.'\1','e') - let doy = substitute(doy,'/\(\d\)$','/'.leaddate.'\1','e') - endif - - " use user's date divider - if datediv != '/' - let doy= substitute(doy,'/',datediv,'g') - else - let doy= escape(doy,'/') - endif -" call Decho("doy<".doy.">") - - if leaddate != ' ' - let doy= substitute(doy,' ',leaddate,'ge') - endif -" call Decho('exe s/\%'.leftcol.'v.*\%'.rghtcol.'v/'.doy.'/e') - exe 's/\%'.leftcol.'v.*\%'.rghtcol.'v/'.doy.'/e' - let l = l + 1 - let julday= julday + incr - if l <= y2 - norm! j - endif - endw - call s:RestoreUserOptions() -" call Dret("VisBlockIncr : IMDY IYMD IDMY ID IM") - return - endif " IMDY IYMD IDMY ID IM - - " I II IX IIX IO IIO IR IIR IPOW IIPOW: {{{3 - " construct a line from the first line that only has the number in it - let rml = rghtcol - leftcol - let rmlp1 = rml + 1 - let lm1 = leftcol - 1 -" call Decho("rmlp1=[rghtcol=".rghtcol."]-[leftcol=".leftcol."]+1=".rmlp1) -" call Decho("lm1 =[leftcol=".leftcol."]-1=".lm1) - - if lm1 <= 0 - " region beginning at far left -" call Decho("handle visblock at far left") - let lm1 = 1 - let pat = '^\([0-9 \t]\{1,'.rmlp1.'}\).*$' - if method == s:IX || method == s:IIX - let pat = '^\([0-9a-fA-F \t]\{1,'.rmlp1.'}\).*$' - elseif method == s:IR || method == s:IIR - if getline(".") =~ '^\(.\{-}\)\%'.leftcol.'v\([0-9 \t]\{1,'.rmlp1.'}\).*$' - " need to convert arabic notation to roman numeral - let pat = '^\([0-9IVXCLM) \t]\{1,'.rmlp1.'}\).*$' - else - let pat = '^\([IVXCLM) \t]\{1,'.rmlp1.'}\).*$' - endif - else - let pat = '^\([0-9 \t]\{1,'.rmlp1.'}\).*$' - endif - let cnt = substitute(getline("'<"),pat,'\1',"") - - else - " region not beginning at far left -" call Decho("handle visblock not at far left") - if method == s:IX || method == s:IIX - let pat = '^\(.\{-}\)\%'.leftcol.'v\([0-9a-fA-F \t]\{1,'.rmlp1.'}\).*$' - elseif method == s:IO || method == s:IIO - let pat = '^\(.\{-}\)\%'.leftcol.'v\([0-7 \t]\{1,'.rmlp1.'}\).*$' - elseif method == s:IR || method == s:IIR -" call Decho('test: ^\(.\{-}\)\%'.leftcol.'v\([0-9 \t]\{1,'.rmlp1.'}\).*$') - if getline(".") =~ '^\(.\{-}\)\%'.leftcol.'v\([0-9 \t]\{1,'.rmlp1.'}\).*$' - " need to convert arabic notation to roman numeral - let pat = '^\(.\{-}\)\%'.leftcol.'v\([0-9IVXCLM \t]\{1,'.rmlp1.'}\).*$' - else - let pat = '^\(.\{-}\)\%'.leftcol.'v\([IVXCLM \t]\{1,'.rmlp1.'}\).*$' - endif - else - let pat = '^\(.\{-}\)\%'.leftcol.'v\([0-9 \t]\{1,'.rmlp1.'}\).*$' - endif -" call Decho("pat<".pat.">") - let cnt = substitute(getline("'<"),pat,'\2',"") - endif - - let cntlen = strlen(cnt) - let cnt = substitute(cnt,'\s','',"ge") - let ocnt = cnt -" call Decho("cntlen=".cntlen." cnt=".cnt." ocnt=".ocnt." (before I*[XOR] subs)") - - " elide leading zeros - if method == s:IX || method == s:IIX - let cnt= substitute(cnt,'^0*\([1-9a-fA-F]\|0$\)','\1',"ge") - elseif method == s:IO || method == s:IIO - let cnt= substitute(cnt,'^0*\([1-7]\|0$\)','\1',"ge") - elseif method == s:IR || method == s:IIR - let cnt= substitute(cnt,'^\([IVXCLM]$\)','\1',"ge") - else - let cnt= substitute(cnt,'^0*\([1-9]\|0$\)','\1',"ge") - endif -" call Decho("cnt<".cnt."> pat<".pat.">") - - " left-method with zeros {{{3 - " IF top number is zero-mode - " AND we're justified right - " AND increment is positive - " AND user didn't specify a modeding character - if a:0 < 2 && ( method == s:II || method == s:IIX || method == s:IIO) && cnt != ocnt && incr > 0 - let zfill= '0' - endif - - " determine how much incrementing is needed {{{3 - if method == s:IX || method == s:IIX - let maxcnt= s:Dec2Hex(s:Hex2Dec(cnt) + incr*(y2 - y1)) - elseif method == s:IO || method == s:IIO - let maxcnt= s:Dec2Oct(s:Oct2Dec(cnt) + incr*(y2 - y1)) - elseif method == s:IR || method == s:IIR - if cnt =~ '^\d\+$' - let maxcnt= s:Dec2Rom(cnt + incr*(y2 - y1)) - else - let maxcnt= s:Dec2Rom(s:Rom2Dec(cnt) + incr*(y2 - y1)) - endif - elseif method == s:IPOW || method == s:IIPOW - let maxcnt = cnt - let i = 1 - if incr > 0 - while i <= (y2-y1) - let maxcnt= maxcnt*incr - let i= i + 1 - endwhile - else - while i <= (y2-y1) - let maxcnt= maxcnt/(-incr) - let i= i + 1 - endwhile - endif - else - let maxcnt= printf("%d",cnt + incr*(y2 - y1)) - endif - let maxcntlen= strlen(maxcnt) - if cntlen > maxcntlen - let maxcntlen= cntlen - endif - if method == s:IIR - let maxcntlen= maxcntlen + 2 - endif -" call Decho("maxcnt=".maxcnt." maxcntlen=".maxcntlen) - - " go through visual block incrementing numbers based {{{3 - " on first number (saved in cnt), taking care to - " avoid inadvertently issuing "0h" commands. - " l == current line number, over range [y1,y2] - norm! `< - let l = y1 - if (method == s:IR || method == s:IIR) && cnt =~ '^\d\+$' - let cnt= s:Dec2Rom(cnt) - endif - while l <= y2 -" call Decho("----- while [l=".l."] <= [y2=".y2."]: cnt=".cnt) - if exists("restrict") && getline(".") !~ restrict -" call Decho("skipping <".getline(".")."> (restrict)") - norm! j - let l= l + 1 - continue - endif - let cntlen= strlen(cnt) - - " Straighten out ragged-right visual-block selection {{{3 - " by appending spaces as needed - norm! $ - while virtcol("$") <= rghtcol - exe "norm! A \" - endwhile - norm! 0 - - " convert visual block line to all spaces {{{3 - if virtcol(".") != leftcol - exe 'norm! /\%'.leftcol."v\" - endif - exe "norm! " . rmlp1 . "r " - - " cnt has gotten bigger than the visually-selected {{{3 - " area allows. Will insert spaces to accommodate it. - if maxcntlen > 0 - let ins= maxcntlen - rmlp1 - else - let ins= strlen(cnt) - rmlp1 - endif - while ins > 0 - exe "norm! i \" - let ins= ins - 1 - endwhile - - " back up to left-of-block (plus optional left-hand-side modeling) (left-justification support) {{{3 - norm! 0 - if method == s:I || method == s:IO || method == s:IX || method == s:IR || method == s:IPOW - let bkup= leftcol -" call Decho("bkup= [leftcol=".leftcol."] (due to method)") - elseif maxcntlen > 0 - let bkup= leftcol + maxcntlen - cntlen -" call Decho("bkup= [leftcol=".leftcol."]+[maxcntlen=".maxcntlen."]-[cntlen=".cntlen."]=".bkup) - else - let bkup= leftcol -" call Decho("bkup= [leftcol=".leftcol."] ([maxcntlen=".maxcntlen."]<=0)") - endif - if virtcol(".") != bkup - if bkup == 0 - norm! 0 - else - exe 'norm! /\%'.bkup."v\" - endif - endif - - " replace with count {{{3 -" call Decho("exe norm! R" . cnt . "\") - exe "norm! R" . cnt . "\" - if cntlen > 1 - let cntlenm1= cntlen - 1 - exe "norm! " . cntlenm1 . "h" - endif - if zfill != " " - silent! exe 's/\%'.leftcol.'v\( \+\)/\=substitute(submatch(1)," ","'.zfill.'","ge")/e' - endif - - " update cnt: set up for next line {{{3 - if l != y2 - norm! j - endif - if method == s:IX || method == s:IIX - let cnt= s:Dec2Hex(s:Hex2Dec(cnt) + incr) - elseif method == s:IO || method == s:IIO - let cnt= s:Dec2Oct(s:Oct2Dec(cnt) + incr) - elseif method == s:IR || method == s:IIR - let cnt= s:Dec2Rom(s:Rom2Dec(cnt) + incr) - elseif method == s:IPOW || method == s:IIPOW - if incr > 0 - let cnt= cnt*incr - elseif incr < 0 - let cnt= cnt/(-incr) - endif - else - let cnt= cnt + incr - endif - let l = l + 1 - endw - - " restore options: {{{3 - call s:RestoreUserOptions() -" call Dret("VisBlockIncr") -endfun - -" --------------------------------------------------------------------- -" Hex2Dec: convert hexadecimal to decimal {{{2 -fun! s:Hex2Dec(hex) -" call Dfunc("Hex2Dec(hex=".a:hex.")") - let hex= substitute(string(a:hex),"'","","ge") -" call Decho("hex<".hex.">") - if hex =~ '^-' - let n = strpart(hex,1) - let neg = 1 - else - let n = hex - let neg = 0 - endif -" call Decho("n<".n."> neg=".neg) - - let b10 = 0 - while n != "" - let hexdigit= strpart(n,0,1) - if hexdigit =~ '\d' - let hexdigit= char2nr(hexdigit) - char2nr('0') -" call Decho("0-9: hexdigit=".hexdigit) - elseif hexdigit =~ '[a-f]' - let hexdigit= char2nr(hexdigit) - char2nr('a') + 10 -" call Decho("a-f: hexdigit=".hexdigit) - else - let hexdigit= char2nr(hexdigit) - char2nr('A') + 10 -" call Decho("A-F: hexdigit=".hexdigit) - endif - let b10= 16*b10 + hexdigit - let n = strpart(n,1) - endwhile - - if neg - let b10= -b10 - endif -" call Dret("Hex2Dec ".b10) - return b10 -endfun - -" --------------------------------------------------------------------- -" Dec2Hex: convert decimal to hexadecimal {{{2 -fun! s:Dec2Hex(b10) -" call Dfunc("Dec2Hex(b10=".a:b10.")") - if a:b10 >= 0 - let b10 = a:b10 - let neg = 0 - else - let b10 = -a:b10 - let neg = 1 - endif -" call Decho('b10<'.b10.'> neg='.neg) - if v:version >= 700 - let hex= printf("%x",b10) - else - let hex = "" - while b10 - let hex = '0123456789abcdef'[b10 % 16] . hex - let b10 = b10 / 16 - endwhile - endif - if neg - let hex= "-".hex - endif -" call Dret("Dec2Hex ".hex) - return hex -endfun - -" --------------------------------------------------------------------- -" Oct2Dec: convert octal to decimal {{{2 -fun! s:Oct2Dec(oct) -" call Dfunc("Oct2Dec(oct=".a:oct.")") - if a:oct >= 0 - let n = a:oct - let neg= 0 - else - let n = strpart(a:oct,1) - let neg = 1 - endif - - let b10 = 0 - while n != "" - let octdigit= strpart(n,0,1) - if octdigit =~ '[0-7]' - let octdigit= char2nr(octdigit) - char2nr('0') -" call Decho("octdigit=".octdigit) - else - break - endif - let b10= 8*b10 + octdigit - let n = strpart(n,1) - endwhile - - if neg - let b10= -b10 - endif -" call Dret("Oct2Dec ".b10) - return b10 -endfun - -" --------------------------------------------------------------------- -" Dec2Oct: convert decimal to octal {{{2 -fun! s:Dec2Oct(b10) -" call Dfunc("Dec2Oct(b10=".a:b10.")") - if a:b10 >= 0 - let b10 = a:b10 - let neg = 0 - else - let b10 = -a:b10 - let neg = 1 - endif - - if v:version >= 700 - let oct= printf("%o",b10) - else - let oct = "" - while b10 - let oct = '01234567'[b10 % 8] . oct - let b10 = b10 / 8 - endwhile - endif - - if neg - let oct= "-".oct - endif -" call Dret("Dec2Oct ".oct) - return oct -endfun - -" ------------------------------------------------------------------------------ -" Roman Numeral Support: {{{2 -let s:d2r= [ [ 1000000 , 'M)' ],[900000 , 'CM)' ], [500000 , 'D)' ], [400000 , 'CD)' ], [100000 , 'C)' ], [90000 , 'XC)' ], [50000 , 'L)' ], [40000 , 'XL)' ], [10000 , 'X)' ], [9000 , 'IX)'], [5000 , 'V)'], [1000 , 'M' ], [900 , 'CM'], [500 , 'D'], [400 , 'CD'], [100 , 'C'], [90 , 'XC'], [50 , 'L'], [40 , 'XL'], [10 , 'X'], [9 , 'IX'], [5 , 'V'], [4 , 'IV'], [1 , 'I'] ] - -" --------------------------------------------------------------------- -" Rom2Dec: convert roman numerals to a decimal number {{{2 -fun! s:Rom2Dec(roman) -" call Dfunc("Rom2Dec(".a:roman.")") - let roman = substitute(a:roman,'.','\U&','ge') - let dec = 0 - - while roman != '' - for item in s:d2r - let pat= '^'.item[1] - if roman =~ pat - let dec= dec + item[0] - if strlen(item[1]) > 1 - let roman= strpart(roman,strlen(item[1])-1) - endif - break - endif - endfor - let roman= strpart(roman,1) - endwhile - -" call Dret("Rom2Dec ".dec) - return dec -endfun - -" --------------------------------------------------------------------- -" Dec2Rom: convert a decimal number to roman numerals {{{2 -" Note that since there is no zero or negative integers -" using Roman numerals, attempts to convert such will always -" result in "I". -fun! s:Dec2Rom(dec) -" call Dfunc("Dec2Rom(".a:dec.")") - if a:dec > 0 - let roman = "" - let dec = a:dec - let i = 0 - while dec > 0 - while dec >= s:d2r[i][0] - let dec = dec - s:d2r[i][0] - let roman = roman . s:d2r[i][1] - endwhile - let i= i + 1 - endwhile - else - let roman= "I" - endif -" call Dret("Dec2Rom ".roman) - return roman -endfun - -" --------------------------------------------------------------------- -" SaveUserOptions: {{{2 -fun! s:SaveUserOptions() -" call Dfunc("SaveUserOptions()") - let s:fokeep = &fo - let s:gdkeep = &gd - let s:ickeep = &ic - let s:magickeep = &magic - let s:reportkeep= &report - set fo=tcq magic report=9999 noic nogd -" call Dret("SaveUserOptions") -endfun - -" --------------------------------------------------------------------- -" RestoreUserOptions: {{{2 -fun! s:RestoreUserOptions() -" call Dfunc("RestoreUserOptions()") - let &fo = s:fokeep - let &gd = s:gdkeep - let &ic = s:ickeep - let &magic = s:magickeep - let &report= s:reportkeep -" call Dret("RestoreUserOptions") -endfun - -" --------------------------------------------------------------------- -" Restoration: {{{1 -let &cpo= s:keepcpo -unlet s:keepcpo -" ------------------------------------------------------------------------------ -" Modelines: {{{1 -" vim: ts=4 fdm=marker +" visincr.vim: Visual-block incremented lists +" Author: Charles E. Campbell, Jr. Ph.D. +" Date: Dec 19, 2007 +" Version: 19 +" +" Visincr assumes that a block of numbers selected by a +" ctrl-v (visual block) has been selected for incrementing. +" This function will transform that block of numbers into +" an incrementing column starting from that topmost number +" in the visual block. Also handles dates, daynames, and +" monthnames. +" +" Fancy Stuff: +" * If the visual block is ragged right (as can happen when "$" +" is used to select the right hand side), the block will have +" spaces appended to straighten it out +" * If the strlen of the count exceeds the visual-block +" allotment of spaces, then additional spaces will be inserted +" * Handles leading tabs by using virtual column calculations +" GetLatestVimScripts: 670 1 :AutoInstall: visincr.vim +" 1Cor 16:14 : Let all that you do be done in love. {{{1 + +" --------------------------------------------------------------------- +" Load Once: {{{1 +if &cp || exists("g:loaded_visincr") + finish +endif +let s:keepcpo = &cpo +let g:loaded_visincr = "v19" +set cpo&vim + +" --------------------------------------------------------------------- +" Methods: {{{1 +let s:I = 0 +let s:II = 1 +let s:IMDY = 2 +let s:IYMD = 3 +let s:IDMY = 4 +let s:ID = 5 +let s:IM = 6 +let s:IA = 7 +let s:IX = 8 +let s:IIX = 9 +let s:IO = 10 +let s:IIO = 11 +let s:IR = 12 +let s:IIR = 13 +let s:IPOW = 14 +let s:IIPOW = 15 +let s:RI = 16 +let s:RII = 17 +let s:RIMDY = 18 +let s:RIYMD = 19 +let s:RIDMY = 20 +let s:RID = 21 +let s:RIM = 22 +let s:RIA = 23 +let s:RIX = 24 +let s:RIIX = 25 +let s:RIO = 26 +let s:RIIO = 27 +let s:RIR = 28 +let s:RIIR = 29 +let s:RIPOW = 30 +let s:RIIPOW = 31 + +" ------------------------------------------------------------------------------ +" Options: {{{1 +if !exists("g:visincr_leaddate") + " choose between dates such as 11/ 5/04 and 11/05/04 + let g:visincr_leaddate = '0' +endif +if !exists("g:visincr_datedivset") + let g:visincr_datedivset= '[-./_:~,+*^]\=' +endif + +" ============================================================================== +" Functions: {{{1 + +" ------------------------------------------------------------------------------ +" VisBlockIncr: {{{2 +fun! visincr#VisBlockIncr(method,...) +" call Dfunc("VisBlockIncr(method<".a:method.">) a:0=".a:0) + + " avoid problems with user options {{{3 + call s:SaveUserOptions() + + " visblockincr only uses visual-block! {{{3 +" call Decho("visualmode<".visualmode().">") + if visualmode() != "\" + echoerr "Please use visual-block mode (ctrl-v)!" + call s:RestoreUserOptions() +" call Dret("VisBlockIncr") + return + endif + + " save boundary line numbers and set up method {{{3 + let y1 = line("'<") + let y2 = line("'>") + let method = (a:method >= s:RI)? (a:method - s:RI) : a:method + let leaddate= g:visincr_leaddate +" call Decho("a:method=".a:method." s:RI=".s:RI." method=".method." leaddeate<".leaddate.">") + + " get increment (default=1; except for power increments, that's default=2) {{{3 + if a:0 > 0 + let incr= a:1 + if method == s:IX || method == s:IIX + let incr= s:Hex2Dec(incr) + elseif method == s:IO || method == s:IIO + let incr= s:Oct2Dec(incr) + endif + elseif method == s:IPOW || method == s:IIPOW + let incr= 2 + else + let incr= 1 + endif +" call Decho("incr=".incr) + + " set up restriction pattern {{{3 + let leftcol = virtcol("'<") + let rghtcol = virtcol("'>") + if leftcol > rghtcol + let leftcol = virtcol("'>") + let rghtcol = virtcol("'<") + endif + let width= rghtcol - leftcol + 1 +" call Decho("width= [rghtcol=".rghtcol."]-[leftcol=".leftcol."]+1=".width) + + if a:method == s:RI + let restrict= '\%'.col(".").'c\d' +" call Decho(":I restricted<".restrict.">") + + elseif a:method == s:RII + let restrict= '\%'.col(".").'c\s\{,'.width.'}\d' +" call Decho(":II restricted<".restrict.">") + + elseif a:method == s:RIMDY + let restrict= '\%'.col(".").'c\d\{1,2}'.g:visincr_datedivset.'\d\{1,2}'.g:visincr_datedivset.'\d\{2,4}' +" call Decho(":IMDY restricted<".restrict.">") + + elseif a:method == s:RIYMD + let restrict= '\%'.col(".").'c\d\{2,4}'.g:visincr_datedivset.'\d\{1,2}'.g:visincr_datedivset.'\d\{1,2}' +" call Decho(":IYMD restricted<".restrict.">") + + elseif a:method == s:RIDMY + let restrict= '\%'.col(".").'c\d\{1,2}'.g:visincr_datedivset.'\d\{1,2}'.g:visincr_datedivset.'\d\{2,4}' +" call Decho(":IDMY restricted<".restrict.">") + + elseif a:method == s:RID + if exists("g:visincr_dow") + let dowlist = substitute(g:visincr_dow,'\(\a\{1,3}\)[^,]*\%(,\|$\)','\1\\|','ge') + let dowlist = substitute(dowlist,'\\|$','','e') + let restrict= '\c\%'.col(".").'c\('.substitute(dowlist,',','\\|','ge').'\)' +" call Decho("restrict<".restrict.">") + else + let restrict= '\c\%'.col(".").'c\(mon\|tue\|wed\|thu\|fri\|sat\|sun\)' + endif +" call Decho(":ID restricted<".restrict.">") + + elseif a:method == s:RIM + if exists("g:visincr_month") + let monlist = substitute(g:visincr_month,'\(\a\{1,3}\)[^,]*\%(,\|$\)','\1\\|','ge') + let monlist = substitute(monlist,'\\|$','','e') + let restrict= '\c\%'.col(".").'c\('.substitute(monlist,',','\\|','ge').'\)' +" call Decho("restrict<".restrict.">") + else + let restrict= '\c\%'.col(".").'c\(jan\|feb\|mar\|apr\|may\|jun\|jul\|aug\|sep\|oct\|nov\|dec\)' + endif +" call Decho(":IM restricted<".restrict.">") + + elseif a:method == s:RIPOW + let restrict= '\%'.col(".").'c\d' +" call Decho(":RIPOW restricted<".restrict.">") + + elseif a:method == s:RIIPOW + let restrict= '\%'.col(".").'c\s\{,'.width.'}\d' +" call Decho(":RIIPOW restricted<".restrict.">") + endif + + " determine zfill {{{3 +" call Decho("a:0=".a:0." method=".method) + if a:0 > 1 && ((s:IMDY <= method && method <= s:IDMY) || (s:RIMDY <= method && method <= s:RIDMY)) + let leaddate= a:2 +" call Decho("set leaddate<".leaddate.">") + elseif a:0 > 1 && method + let zfill= a:2 + if zfill == "''" || zfill == '""' + let zfill="" + endif +" call Decho("set zfill<".zfill.">") + else + " default zfill (a single space) + let zfill= ' ' +" call Decho("set default zfill<".zfill.">") + endif + + " IMDY IYMD IDMY ID IM IA: {{{3 + if s:IMDY <= method && method <= s:IA + let rghtcol = rghtcol + 1 + let curline = getline("'<") + + " ID: {{{3 + if method == s:ID + let pat = '^.*\%'.leftcol.'v\(\a\+\)\%'.rghtcol.'v.*$' + let dow = substitute(substitute(curline,pat,'\1','e'),' ','','ge') + let dowlen = strlen(dow) +" call Decho("pat<".pat."> dow<".dow."> dowlen=".dowlen) + + " set up long daynames + if exists("g:visincr_dow") + let dow_0= substitute(g:visincr_dow,'^\([^,]*\),.*$', '\1','') + let dow_1= substitute(g:visincr_dow,'^\%([^,]*,\)\{1}\([^,]*\),.*$','\1','') + let dow_2= substitute(g:visincr_dow,'^\%([^,]*,\)\{2}\([^,]*\),.*$','\1','') + let dow_3= substitute(g:visincr_dow,'^\%([^,]*,\)\{3}\([^,]*\),.*$','\1','') + let dow_4= substitute(g:visincr_dow,'^\%([^,]*,\)\{4}\([^,]*\),.*$','\1','') + let dow_5= substitute(g:visincr_dow,'^\%([^,]*,\)\{5}\([^,]*\),.*$','\1','') + let dow_6= substitute(g:visincr_dow,'^\%([^,]*,\)\{6}\([^,]*\)$', '\1','') + else + let dow_0= "Monday" + let dow_1= "Tuesday" + let dow_2= "Wednesday" + let dow_3= "Thursday" + let dow_4= "Friday" + let dow_5= "Saturday" + let dow_6= "Sunday" + endif + + " if the daynames under the cursor is <= 3, transform + " long daynames to short daynames + if strlen(dow) <= 3 +" call Decho("transform long daynames to short daynames") + let dow_0= strpart(dow_0,0,3) + let dow_1= strpart(dow_1,0,3) + let dow_2= strpart(dow_2,0,3) + let dow_3= strpart(dow_3,0,3) + let dow_4= strpart(dow_4,0,3) + let dow_5= strpart(dow_5,0,3) + let dow_6= strpart(dow_6,0,3) + endif + + " identify day-of-week under cursor + let idow= 0 + while idow < 7 +" call Decho("dow<".dow."> dow_".idow."<".dow_{idow}.">") + if dow =~ '\c\<'.strpart(dow_{idow},0,3) + break + endif + let idow= idow + 1 + endwhile + if idow >= 7 + echoerr "***error*** misspelled day-of-week <".dow.">" + call s:RestoreUserOptions() +" call Dret("VisBlockIncr : unable to identify day-of-week") + return + endif + + " generate incremented dayname list + norm! `< + norm! gUl + norm! `< + let l = y1 + while l < y2 + norm! j +" call Decho("while [l=".l."] < [y2=".y2."]: line=".line(".")." col[".leftcol.",".rghtcol."] width=".width) + if exists("restrict") && getline(".") !~ restrict + let l= l + 1 + continue + endif + let idow= (idow + incr)%7 + exe 's/\%'.leftcol.'v.\{'.width.'\}/'.dow_{idow}.'/e' + let l= l + 1 + endw + " return from ID + call s:RestoreUserOptions() +" call Dret("VisBlockIncr : ID") + return + endif + + " IM: {{{3 + if method == s:IM + let pat = '^.*\%'.leftcol.'v\(\a\+\)\%'.rghtcol.'v.*$' + let mon = substitute(substitute(curline,pat,'\1','e'),' ','','ge') + let monlen = strlen(mon) + if exists("g:visincr_month") + let mon_0 = substitute(g:visincr_month,'^\([^,]*\),.*$', '\1','') + let mon_1 = substitute(g:visincr_month,'^\%([^,]*,\)\{1}\([^,]*\),.*$', '\1','') + let mon_2 = substitute(g:visincr_month,'^\%([^,]*,\)\{2}\([^,]*\),.*$', '\1','') + let mon_3 = substitute(g:visincr_month,'^\%([^,]*,\)\{3}\([^,]*\),.*$', '\1','') + let mon_4 = substitute(g:visincr_month,'^\%([^,]*,\)\{4}\([^,]*\),.*$', '\1','') + let mon_5 = substitute(g:visincr_month,'^\%([^,]*,\)\{5}\([^,]*\),.*$', '\1','') + let mon_6 = substitute(g:visincr_month,'^\%([^,]*,\)\{6}\([^,]*\),.*$', '\1','') + let mon_7 = substitute(g:visincr_month,'^\%([^,]*,\)\{7}\([^,]*\),.*$', '\1','') + let mon_8 = substitute(g:visincr_month,'^\%([^,]*,\)\{8}\([^,]*\),.*$', '\1','') + let mon_9 = substitute(g:visincr_month,'^\%([^,]*,\)\{9}\([^,]*\),.*$', '\1','') + let mon_10= substitute(g:visincr_month,'^\%([^,]*,\)\{10}\([^,]*\),.*$','\1','') + let mon_11= substitute(g:visincr_month,'^\%([^,]*,\)\{11}\([^,]*\)$', '\1','') + else + let mon_0 = "January" + let mon_1 = "February" + let mon_2 = "March" + let mon_3 = "April" + let mon_4 = "May" + let mon_5 = "June" + let mon_6 = "July" + let mon_7 = "August" + let mon_8 = "September" + let mon_9 = "October" + let mon_10= "November" + let mon_11= "December" + endif + + " identify month under cursor + let imon= 0 + while imon < 12 + if mon =~ '\c\<'.strpart(mon_{imon},0,3) + break + endif + let imon= imon + 1 + endwhile + if imon >= 12 + echoerr "***error*** misspelled month <".mon.">" + call s:RestoreUserOptions() +" call Dret("VisBlockIncr") + return + endif + + " if monthname is three or fewer characters long, + " transform monthnames to three character versions + if strlen(mon) <= 3 +" call Decho("transform monthnames to short versions") + let jmon= 0 + while jmon < 12 + let mon_{jmon} = strpart(mon_{jmon},0,3) + let jmon = jmon + 1 + endwhile + endif + + " generate incremented monthname list + norm! `< + norm! gUl + norm! `< + let l = y1 + while l < y2 + norm! j + if exists("restrict") && getline(".") !~ restrict + let l= l + 1 + continue + endif + let imon= (imon + incr)%12 + exe 's/\%'.leftcol.'v.\{'.width.'\}/'.mon_{imon}.'/e' + let l= l + 1 + endw + " return from IM + call s:RestoreUserOptions() +" call Dret("VisBlockIncr : IM") + return + endif + + " IA: {{{3 + if method == s:IA + let pat = '^.*\%'.leftcol.'v\(\a\).*$' + let letter = substitute(curline,pat,'\1','e') + if letter !~ '\a' + let letter= 'A' + endif + if letter =~ '[a-z]' + let alphabet='abcdefghijklmnopqrstuvwxyz' + else + let alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ' + endif + let ilet= stridx(alphabet,letter) + + norm! `< + let l = y1 + while l <= y2 +" call Decho("letter<".letter."> l=".l." ilet=".ilet) + exe 's/\%'.leftcol.'v.*\%'.rghtcol.'v/'.letter.'/e' + let ilet = (ilet + incr)%26 + let letter = strpart(alphabet,ilet,1) + if l < y2 + silent norm! j + endif + let l= l + 1 + endw + " return from IA + call s:RestoreUserOptions() +" call Dret("VisBlockIncr : IA") + return + endif + + let pat = '^.*\%'.leftcol.'v\( \=[0-9]\{1,4}\)'.g:visincr_datedivset.'\( \=[0-9]\{1,2}\)'.g:visincr_datedivset.'\( \=[0-9]\{1,4}\)\%'.rghtcol.'v.*$' + let datediv= substitute(curline,'^.*\%'.leftcol.'v\%( \=[0-9]\{1,4}\)\('.g:visincr_datedivset.'\).*$','\1','') + if strlen(datediv) > 1 + redraw! + echohl WarningMsg + echomsg "***visincr*** Your date looks odd, is g:visincr_datedivset<".g:visincr_datedivset."> what you want?" + endif +" call Decho("pat <".pat.">") +" call Decho("datediv<".datediv.">") + + " IMDY: {{{3 + if method == s:IMDY + if datediv == "" + let pat= '^.*\%'.leftcol.'v\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,4}\)\%'.rghtcol.'v.*$' + endif + let m = substitute(substitute(curline,pat,'\1',''),' ','','ge')+0 + let d = substitute(substitute(curline,pat,'\2',''),' ','','ge')+0 + let y = substitute(substitute(curline,pat,'\3',''),' ','','ge')+0 + let type = 2 +" call Decho("IMDY: y=".y." m=".m." d=".d." leftcol=".leftcol." rghtcol=".rghtcol) + + " IYMD: {{{3 + elseif method == s:IYMD + if datediv == "" + let pat= '^.*\%'.leftcol.'v\( \=[0-9]\{1,4}\)\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,2}\)\%'.rghtcol.'v.*$' + endif + let y = substitute(substitute(curline,pat,'\1',''),' ','','ge')+0 + let m = substitute(substitute(curline,pat,'\2',''),' ','','ge')+0 + let d = substitute(substitute(curline,pat,'\3',''),' ','','ge')+0 + let type = 1 +" call Decho("IYMD: y=".y." m=".m." d=".d." leftcol=".leftcol." rghtcol=".rghtcol) + + " IDMY: {{{3 + elseif method == s:IDMY + if datediv == "" + let pat= '^.*\%'.leftcol.'v\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,2}\)\( \=[0-9]\{1,4}\)\%'.rghtcol.'v.*$' + endif + let d = substitute(substitute(curline,pat,'\1',''),' ','','ge')+0 + let m = substitute(substitute(curline,pat,'\2',''),' ','','ge')+0 + let y = substitute(substitute(curline,pat,'\3',''),' ','','ge')+0 + let type = 3 +" call Decho("IDMY: y=".y." m=".m." d=".d." leftcol=".leftcol." rghtcol=".rghtcol) + else + echoerr "***error*** in script" +" call Dret("VisBlockIncr -- method#".method." not supported") + return + endif + + " Julian day/Calendar day calculations {{{3 + try + let julday= calutil#Cal2Jul(y,m,d) + catch /^Vim\%((\a\+)\)\=:E/ + echoerr "***error*** you need calutil.vim! (:help visincr-calutil)" +" call Dret("VisBlockIncr") + return + endtry + norm! `< + let l = y1 + while l <= y2 + if exists("restrict") && getline(".") !~ restrict + norm! j + let l= l + 1 + continue + endif + let doy = calutil#Jul2Cal(julday,type) + + " IYMD: {{{3 + if type == 1 + let doy = substitute(doy,'^\d/',leaddate.'&','e') + let doy = substitute(doy,'/\(\d/\)','/'.leaddate.'\1','e') + let doy = substitute(doy,'/\(\d\)$','/'.leaddate.'\1','e') + + " IMDY IDMY: {{{3 + else + let doy = substitute(doy,'^\d/',' &','e') + let doy = substitute(doy,'/\(\d/\)','/'.leaddate.'\1','e') + let doy = substitute(doy,'/\(\d\)$','/'.leaddate.'\1','e') + endif + + " use user's date divider + if datediv != '/' + let doy= substitute(doy,'/',datediv,'g') + else + let doy= escape(doy,'/') + endif +" call Decho("doy<".doy.">") + + if leaddate != ' ' + let doy= substitute(doy,' ',leaddate,'ge') + endif +" call Decho('exe s/\%'.leftcol.'v.*\%'.rghtcol.'v/'.doy.'/e') + exe 's/\%'.leftcol.'v.*\%'.rghtcol.'v/'.doy.'/e' + let l = l + 1 + let julday= julday + incr + if l <= y2 + norm! j + endif + endw + call s:RestoreUserOptions() +" call Dret("VisBlockIncr : IMDY IYMD IDMY ID IM") + return + endif " IMDY IYMD IDMY ID IM + + " I II IX IIX IO IIO IR IIR IPOW IIPOW: {{{3 + " construct a line from the first line that only has the number in it + let rml = rghtcol - leftcol + let rmlp1 = rml + 1 + let lm1 = leftcol - 1 +" call Decho("rmlp1=[rghtcol=".rghtcol."]-[leftcol=".leftcol."]+1=".rmlp1) +" call Decho("lm1 =[leftcol=".leftcol."]-1=".lm1) + + if lm1 <= 0 + " region beginning at far left +" call Decho("handle visblock at far left") + let lm1 = 1 + let pat = '^\([0-9 \t]\{1,'.rmlp1.'}\).*$' + if method == s:IX || method == s:IIX + let pat = '^\([0-9a-fA-F \t]\{1,'.rmlp1.'}\).*$' + elseif method == s:IR || method == s:IIR + if getline(".") =~ '^\(.\{-}\)\%'.leftcol.'v\([0-9 \t]\{1,'.rmlp1.'}\).*$' + " need to convert arabic notation to roman numeral + let pat = '^\([0-9IVXCLM) \t]\{1,'.rmlp1.'}\).*$' + else + let pat = '^\([IVXCLM) \t]\{1,'.rmlp1.'}\).*$' + endif + else + let pat = '^\([0-9 \t]\{1,'.rmlp1.'}\).*$' + endif + let cnt = substitute(getline("'<"),pat,'\1',"") + + else + " region not beginning at far left +" call Decho("handle visblock not at far left") + if method == s:IX || method == s:IIX + let pat = '^\(.\{-}\)\%'.leftcol.'v\([0-9a-fA-F \t]\{1,'.rmlp1.'}\).*$' + elseif method == s:IO || method == s:IIO + let pat = '^\(.\{-}\)\%'.leftcol.'v\([0-7 \t]\{1,'.rmlp1.'}\).*$' + elseif method == s:IR || method == s:IIR +" call Decho('test: ^\(.\{-}\)\%'.leftcol.'v\([0-9 \t]\{1,'.rmlp1.'}\).*$') + if getline(".") =~ '^\(.\{-}\)\%'.leftcol.'v\([0-9 \t]\{1,'.rmlp1.'}\).*$' + " need to convert arabic notation to roman numeral + let pat = '^\(.\{-}\)\%'.leftcol.'v\([0-9IVXCLM \t]\{1,'.rmlp1.'}\).*$' + else + let pat = '^\(.\{-}\)\%'.leftcol.'v\([IVXCLM \t]\{1,'.rmlp1.'}\).*$' + endif + else + let pat = '^\(.\{-}\)\%'.leftcol.'v\([0-9 \t]\{1,'.rmlp1.'}\).*$' + endif +" call Decho("pat<".pat.">") + let cnt = substitute(getline("'<"),pat,'\2',"") + endif + + let cntlen = strlen(cnt) + let cnt = substitute(cnt,'\s','',"ge") + let ocnt = cnt +" call Decho("cntlen=".cntlen." cnt=".cnt." ocnt=".ocnt." (before I*[XOR] subs)") + + " elide leading zeros + if method == s:IX || method == s:IIX + let cnt= substitute(cnt,'^0*\([1-9a-fA-F]\|0$\)','\1',"ge") + elseif method == s:IO || method == s:IIO + let cnt= substitute(cnt,'^0*\([1-7]\|0$\)','\1',"ge") + elseif method == s:IR || method == s:IIR + let cnt= substitute(cnt,'^\([IVXCLM]$\)','\1',"ge") + else + let cnt= substitute(cnt,'^0*\([1-9]\|0$\)','\1',"ge") + endif +" call Decho("cnt<".cnt."> pat<".pat.">") + + " left-method with zeros {{{3 + " IF top number is zero-mode + " AND we're justified right + " AND increment is positive + " AND user didn't specify a modeding character + if a:0 < 2 && ( method == s:II || method == s:IIX || method == s:IIO) && cnt != ocnt && incr > 0 + let zfill= '0' + endif + + " determine how much incrementing is needed {{{3 + if method == s:IX || method == s:IIX + let maxcnt= s:Dec2Hex(s:Hex2Dec(cnt) + incr*(y2 - y1)) + elseif method == s:IO || method == s:IIO + let maxcnt= s:Dec2Oct(s:Oct2Dec(cnt) + incr*(y2 - y1)) + elseif method == s:IR || method == s:IIR + if cnt =~ '^\d\+$' + let maxcnt= s:Dec2Rom(cnt + incr*(y2 - y1)) + else + let maxcnt= s:Dec2Rom(s:Rom2Dec(cnt) + incr*(y2 - y1)) + endif + elseif method == s:IPOW || method == s:IIPOW + let maxcnt = cnt + let i = 1 + if incr > 0 + while i <= (y2-y1) + let maxcnt= maxcnt*incr + let i= i + 1 + endwhile + else + while i <= (y2-y1) + let maxcnt= maxcnt/(-incr) + let i= i + 1 + endwhile + endif + else + let maxcnt= printf("%d",cnt + incr*(y2 - y1)) + endif + let maxcntlen= strlen(maxcnt) + if cntlen > maxcntlen + let maxcntlen= cntlen + endif + if method == s:IIR + let maxcntlen= maxcntlen + 2 + endif +" call Decho("maxcnt=".maxcnt." maxcntlen=".maxcntlen) + + " go through visual block incrementing numbers based {{{3 + " on first number (saved in cnt), taking care to + " avoid inadvertently issuing "0h" commands. + " l == current line number, over range [y1,y2] + norm! `< + let l = y1 + if (method == s:IR || method == s:IIR) && cnt =~ '^\d\+$' + let cnt= s:Dec2Rom(cnt) + endif + while l <= y2 +" call Decho("----- while [l=".l."] <= [y2=".y2."]: cnt=".cnt) + if exists("restrict") && getline(".") !~ restrict +" call Decho("skipping <".getline(".")."> (restrict)") + norm! j + let l= l + 1 + continue + endif + let cntlen= strlen(cnt) + + " Straighten out ragged-right visual-block selection {{{3 + " by appending spaces as needed + norm! $ + while virtcol("$") <= rghtcol + exe "norm! A \" + endwhile + norm! 0 + + " convert visual block line to all spaces {{{3 + if virtcol(".") != leftcol + exe 'norm! /\%'.leftcol."v\" + endif + exe "norm! " . rmlp1 . "r " + + " cnt has gotten bigger than the visually-selected {{{3 + " area allows. Will insert spaces to accommodate it. + if maxcntlen > 0 + let ins= maxcntlen - rmlp1 + else + let ins= strlen(cnt) - rmlp1 + endif + while ins > 0 + exe "norm! i \" + let ins= ins - 1 + endwhile + + " back up to left-of-block (plus optional left-hand-side modeling) (left-justification support) {{{3 + norm! 0 + if method == s:I || method == s:IO || method == s:IX || method == s:IR || method == s:IPOW + let bkup= leftcol +" call Decho("bkup= [leftcol=".leftcol."] (due to method)") + elseif maxcntlen > 0 + let bkup= leftcol + maxcntlen - cntlen +" call Decho("bkup= [leftcol=".leftcol."]+[maxcntlen=".maxcntlen."]-[cntlen=".cntlen."]=".bkup) + else + let bkup= leftcol +" call Decho("bkup= [leftcol=".leftcol."] ([maxcntlen=".maxcntlen."]<=0)") + endif + if virtcol(".") != bkup + if bkup == 0 + norm! 0 + else + exe 'norm! /\%'.bkup."v\" + endif + endif + + " replace with count {{{3 +" call Decho("exe norm! R" . cnt . "\") + exe "norm! R" . cnt . "\" + if cntlen > 1 + let cntlenm1= cntlen - 1 + exe "norm! " . cntlenm1 . "h" + endif + if zfill != " " + silent! exe 's/\%'.leftcol.'v\( \+\)/\=substitute(submatch(1)," ","'.zfill.'","ge")/e' + endif + + " update cnt: set up for next line {{{3 + if l != y2 + norm! j + endif + if method == s:IX || method == s:IIX + let cnt= s:Dec2Hex(s:Hex2Dec(cnt) + incr) + elseif method == s:IO || method == s:IIO + let cnt= s:Dec2Oct(s:Oct2Dec(cnt) + incr) + elseif method == s:IR || method == s:IIR + let cnt= s:Dec2Rom(s:Rom2Dec(cnt) + incr) + elseif method == s:IPOW || method == s:IIPOW + if incr > 0 + let cnt= cnt*incr + elseif incr < 0 + let cnt= cnt/(-incr) + endif + else + let cnt= cnt + incr + endif + let l = l + 1 + endw + + " restore options: {{{3 + call s:RestoreUserOptions() +" call Dret("VisBlockIncr") +endfun + +" --------------------------------------------------------------------- +" Hex2Dec: convert hexadecimal to decimal {{{2 +fun! s:Hex2Dec(hex) +" call Dfunc("Hex2Dec(hex=".a:hex.")") + let hex= substitute(string(a:hex),"'","","ge") +" call Decho("hex<".hex.">") + if hex =~ '^-' + let n = strpart(hex,1) + let neg = 1 + else + let n = hex + let neg = 0 + endif +" call Decho("n<".n."> neg=".neg) + + let b10 = 0 + while n != "" + let hexdigit= strpart(n,0,1) + if hexdigit =~ '\d' + let hexdigit= char2nr(hexdigit) - char2nr('0') +" call Decho("0-9: hexdigit=".hexdigit) + elseif hexdigit =~ '[a-f]' + let hexdigit= char2nr(hexdigit) - char2nr('a') + 10 +" call Decho("a-f: hexdigit=".hexdigit) + else + let hexdigit= char2nr(hexdigit) - char2nr('A') + 10 +" call Decho("A-F: hexdigit=".hexdigit) + endif + let b10= 16*b10 + hexdigit + let n = strpart(n,1) + endwhile + + if neg + let b10= -b10 + endif +" call Dret("Hex2Dec ".b10) + return b10 +endfun + +" --------------------------------------------------------------------- +" Dec2Hex: convert decimal to hexadecimal {{{2 +fun! s:Dec2Hex(b10) +" call Dfunc("Dec2Hex(b10=".a:b10.")") + if a:b10 >= 0 + let b10 = a:b10 + let neg = 0 + else + let b10 = -a:b10 + let neg = 1 + endif +" call Decho('b10<'.b10.'> neg='.neg) + if v:version >= 700 + let hex= printf("%x",b10) + else + let hex = "" + while b10 + let hex = '0123456789abcdef'[b10 % 16] . hex + let b10 = b10 / 16 + endwhile + endif + if neg + let hex= "-".hex + endif +" call Dret("Dec2Hex ".hex) + return hex +endfun + +" --------------------------------------------------------------------- +" Oct2Dec: convert octal to decimal {{{2 +fun! s:Oct2Dec(oct) +" call Dfunc("Oct2Dec(oct=".a:oct.")") + if a:oct >= 0 + let n = a:oct + let neg= 0 + else + let n = strpart(a:oct,1) + let neg = 1 + endif + + let b10 = 0 + while n != "" + let octdigit= strpart(n,0,1) + if octdigit =~ '[0-7]' + let octdigit= char2nr(octdigit) - char2nr('0') +" call Decho("octdigit=".octdigit) + else + break + endif + let b10= 8*b10 + octdigit + let n = strpart(n,1) + endwhile + + if neg + let b10= -b10 + endif +" call Dret("Oct2Dec ".b10) + return b10 +endfun + +" --------------------------------------------------------------------- +" Dec2Oct: convert decimal to octal {{{2 +fun! s:Dec2Oct(b10) +" call Dfunc("Dec2Oct(b10=".a:b10.")") + if a:b10 >= 0 + let b10 = a:b10 + let neg = 0 + else + let b10 = -a:b10 + let neg = 1 + endif + + if v:version >= 700 + let oct= printf("%o",b10) + else + let oct = "" + while b10 + let oct = '01234567'[b10 % 8] . oct + let b10 = b10 / 8 + endwhile + endif + + if neg + let oct= "-".oct + endif +" call Dret("Dec2Oct ".oct) + return oct +endfun + +" ------------------------------------------------------------------------------ +" Roman Numeral Support: {{{2 +let s:d2r= [ [ 1000000 , 'M)' ],[900000 , 'CM)' ], [500000 , 'D)' ], [400000 , 'CD)' ], [100000 , 'C)' ], [90000 , 'XC)' ], [50000 , 'L)' ], [40000 , 'XL)' ], [10000 , 'X)' ], [9000 , 'IX)'], [5000 , 'V)'], [1000 , 'M' ], [900 , 'CM'], [500 , 'D'], [400 , 'CD'], [100 , 'C'], [90 , 'XC'], [50 , 'L'], [40 , 'XL'], [10 , 'X'], [9 , 'IX'], [5 , 'V'], [4 , 'IV'], [1 , 'I'] ] + +" --------------------------------------------------------------------- +" Rom2Dec: convert roman numerals to a decimal number {{{2 +fun! s:Rom2Dec(roman) +" call Dfunc("Rom2Dec(".a:roman.")") + let roman = substitute(a:roman,'.','\U&','ge') + let dec = 0 + + while roman != '' + for item in s:d2r + let pat= '^'.item[1] + if roman =~ pat + let dec= dec + item[0] + if strlen(item[1]) > 1 + let roman= strpart(roman,strlen(item[1])-1) + endif + break + endif + endfor + let roman= strpart(roman,1) + endwhile + +" call Dret("Rom2Dec ".dec) + return dec +endfun + +" --------------------------------------------------------------------- +" Dec2Rom: convert a decimal number to roman numerals {{{2 +" Note that since there is no zero or negative integers +" using Roman numerals, attempts to convert such will always +" result in "I". +fun! s:Dec2Rom(dec) +" call Dfunc("Dec2Rom(".a:dec.")") + if a:dec > 0 + let roman = "" + let dec = a:dec + let i = 0 + while dec > 0 + while dec >= s:d2r[i][0] + let dec = dec - s:d2r[i][0] + let roman = roman . s:d2r[i][1] + endwhile + let i= i + 1 + endwhile + else + let roman= "I" + endif +" call Dret("Dec2Rom ".roman) + return roman +endfun + +" --------------------------------------------------------------------- +" SaveUserOptions: {{{2 +fun! s:SaveUserOptions() +" call Dfunc("SaveUserOptions()") + let s:fokeep = &fo + let s:gdkeep = &gd + let s:ickeep = &ic + let s:magickeep = &magic + let s:reportkeep= &report + set fo=tcq magic report=9999 noic nogd +" call Dret("SaveUserOptions") +endfun + +" --------------------------------------------------------------------- +" RestoreUserOptions: {{{2 +fun! s:RestoreUserOptions() +" call Dfunc("RestoreUserOptions()") + let &fo = s:fokeep + let &gd = s:gdkeep + let &ic = s:ickeep + let &magic = s:magickeep + let &report= s:reportkeep +" call Dret("RestoreUserOptions") +endfun + +" --------------------------------------------------------------------- +" Restoration: {{{1 +let &cpo= s:keepcpo +unlet s:keepcpo +" ------------------------------------------------------------------------------ +" Modelines: {{{1 +" vim: ts=4 fdm=marker