diff --git a/.vim/bundle/calendar.vim--Matsumoto/README b/.vim/bundle/calendar.vim--Matsumoto/README new file mode 100644 index 0000000..66828b0 --- /dev/null +++ b/.vim/bundle/calendar.vim--Matsumoto/README @@ -0,0 +1,5 @@ +This is a mirror of http://www.vim.org/scripts/script.php?script_id=52 + +This script create calender window. +This don't use the external program(cal). + diff --git a/.vim/bundle/calendar.vim--Matsumoto/plugin/calendar.vim b/.vim/bundle/calendar.vim--Matsumoto/plugin/calendar.vim new file mode 100644 index 0000000..598dd3a --- /dev/null +++ b/.vim/bundle/calendar.vim--Matsumoto/plugin/calendar.vim @@ -0,0 +1,1328 @@ +"============================================================================= +" What Is This: Calendar +" File: calendar.vim +" Author: Yasuhiro Matsumoto +" Last Change: 27-Jan-2011. +" Version: 2.5 +" Thanks: +" SethMilliken : gave a hint for 2.4 +" bw1 : bug fix +" Ingo Karkat : bug fix +" Thinca : bug report, bug fix +" Yu Pei : bug report +" Per Winkvist : bug fix +" Serge (gentoosiast) Koksharov : bug fix +" Vitor Antunes : bug fix +" Olivier Mengue : bug fix +" Noel Henson : today action +" Per Winkvist : bug report +" Peter Findeisen : bug fix +" Chip Campbell : gave a hint for 1.3z +" PAN Shizhu : gave a hint for 1.3y +" Eric Wald : bug fix +" Sascha Wuestemann : advise +" Linas Vasiliauskas : bug report +" Per Winkvist : bug report +" Ronald Hoelwarth : gave a hint for 1.3s +" Vikas Agnihotri : bug report +" Steve Hall : gave a hint for 1.3q +" James Devenish : bug fix +" Carl Mueller : gave a hint for 1.3o +" Klaus Fabritius : bug fix +" Stucki : gave a hint for 1.3m +" Rosta : bug report +" Richard Bair : bug report +" Yin Hao Liew : bug report +" Bill McCarthy : bug fix and gave a hint +" Srinath Avadhanula : bug fix +" Ronald Hoellwarth : few advices +" Juan Orlandini : added higlighting of days with data +" Ray : bug fix +" Ralf.Schandl : gave a hint for 1.3 +" Bhaskar Karambelkar : bug fix +" Suresh Govindachar : gave a hint for 1.2, bug fix +" Michael Geddes : bug fix +" Leif Wickland : bug fix +" Usage: +" :Calendar +" show calendar at this year and this month +" :Calendar 8 +" show calendar at this year and given month +" :Calendar 2001 8 +" show calendar at given year and given month +" :CalendarH ... +" show horizontal calendar ... +" +" cal +" show calendar in normal mode +" caL +" show horizontal calendar ... +" ChangeLog: +" 2.5 : bug fix, 7.2 don't have relativenumber. +" 2.4 : added g:calendar_options. +" 2.3 : week number like ISO8601 +" g:calendar_monday and g:calendar_weeknm work together +" 2.2 : http://gist.github.com/355513#file_customizable_keymap.diff +" http://gist.github.com/355513#file_winfixwidth.diff +" 2.1 : bug fix, set filetype 'calendar'. +" 2.0 : bug fix, many bug fix and enhancements. +" 1.9 : bug fix, use nnoremap. +" 1.8 : bug fix, E382 when close diary. +" 1.7 : bug fix, week number was broken on 2008. +" 1.6 : added calendar_begin action. +" added calendar_end action. +" 1.5 : bug fix, fixed ruler formating with strpart. +" bug fix, using winfixheight. +" 1.4a : bug fix, week number was broken on 2005. +" added calendar_today action. +" bug fix, about wrapscan. +" bug fix, about today mark. +" bug fix, about today navigation. +" 1.4 : bug fix, and one improvement. +" bug 1: +" when marking the current date, there is not distinguished e.g. between +" 20041103 and 20040113, both dates are marked as today +" bug 2: +" the navigation mark "today" doesn't work +" improvement: +" the mapping t worked only when today was displayed, now it works always +" and redisplays the cuurent month and today +" 1.3z : few changes +" asign , for navigation. +" set ws for search navigation. +" add tag for GetLatestVimScripts(AutoInstall) +" 1.3y : bug fix, few changes +" changed color syntax name. (ex. CalNavi, see bottom of this) +" changed a map CalendarV for cal +" changed a map CalendarH for caL +" (competitive map for cvscommand.vim) +" the date on the right-hand side didn't work correctoly. +" make a map to rebuild Calendar window(r). +" 1.3x : bug fix +" viweek can't refer when not set calendar_weeknm. +" 1.3w : bug fix +" on leap year, week number decreases. +" 1.3v : bug fix +" add nowrapscan +" use s:bufautocommandsset for making title +" don't focus to navi when doubleclick bottom next>. +" 1.3u : bug fix +" when enter diary first time, +" it don't warn that you don't have diary directory. +" 1.3t : bug fix +" make sure the variables for help +" 1.3s : bug fix +" make a map CalendarV for ca +" add option calendar_navi_label +" see Additional: +" add option calendar_focus_today +" see Additional: +" add map ? for help +" 1.3r : bug fix +" if clicked navigator, cursor go to strange position. +" 1.3q : bug fix +" coundn't set calendar_navi +" in its horizontal direction +" 1.3p : bug fix +" coundn't edit diary when the calendar is +" in its horizontal direction +" 1.3o : add option calendar_mark, and delete calendar_rmark +" see Additional: +" add option calendar_navi +" see Additional: +" 1.3n : bug fix +" s:CalendarSign() should use filereadable(expand(sfile)). +" 1.3m : tuning +" using topleft or botright for opening Calendar. +" use filereadable for s:CalendarSign(). +" 1.3l : bug fix +" if set calendar_monday, it can see that Sep 1st is Sat +" as well as Aug 31st. +" 1.3k : bug fix +" it didn't escape the file name on calendar. +" 1.3j : support for fixed Gregorian +" added the part of Sep 1752. +" 1.3i : bug fix +" Calculation mistake for week number. +" 1.3h : add option for position of displaying '*' or '+'. +" see Additional: +" 1.3g : centering header +" add option for show name of era. +" see Additional: +" bug fix +" ca didn't show current month. +" 1.3f : bug fix +" there was yet another bug of today's sign. +" 1.3e : added usage for +" support handler for sign. +" see Additional: +" 1.3d : added higlighting of days that have calendar data associated +" with it. +" bug fix for calculates date. +" 1.3c : bug fix for MakeDir() +" if CalendarMakeDir(sfile) != 0 +" v +" if s:CalendarMakeDir(sfile) != 0 +" 1.3b : bug fix for calendar_monday. +" it didn't work g:calendar_monday correctly. +" add g:calendar_version. +" add argument on action handler. +" see Additional: +" 1.3a : bug fix for MakeDir(). +" it was not able to make directory. +" 1.3 : support handler for action. +" see Additional: +" 1.2g : bug fix for today's sign. +" it could not display today's sign correctly. +" 1.2f : bug fix for current Date. +" vtoday variable calculates date as 'YYYYMMDD' +" while the loop calculates date as 'YYYYMMD' i.e just 1 digit +" for date if < 10 so if current date is < 10 , the if condiction +" to check for current date fails and current date is not +" highlighted. +" simple solution changed vtoday calculation line divide the +" current-date by 1 so as to get 1 digit date. +" 1.2e : change the way for setting title. +" auto configuration for g:calendar_wruler with g:calendar_monday +" 1.2d : add option for show week number. +" let g:calendar_weeknm = 1 +" add separator if horizontal. +" change all option's name +" g:calendar_mnth -> g:calendar_mruler +" g:calendar_week -> g:calendar_wruler +" g:calendar_smnd -> g:calendar_monday +" 1.2c : add option for that the week starts with monday. +" let g:calendar_smnd = 1 +" 1.2b : bug fix for modifiable. +" setlocal nomodifiable (was set) +" 1.2a : add default options. +" nonumber,foldcolumn=0,nowrap... as making gap +" 1.2 : support wide display. +" add a command CalendarH +" add map +" 1.1c : extra. +" add a titlestring for today. +" 1.1b : bug fix by Michael Geddes. +" it happend when do ':Calender' twice +" 1.1a : fix misspell. +" Calender -> Calendar +" 1.1 : bug fix. +" it"s about strftime("%m") +" 1.0a : bug fix by Leif Wickland. +" it"s about strftime("%w") +" 1.0 : first release. +" TODO: +" add the option for diary which is separate or single file. +" Additional: +" *if you want to keep focus when goto next or prev calendar, +" add the following to your .vimrc: +" +" let g:calendar_focus_today = 1 +" +" *if you want to place the mark('*' or '+') after the day, +" add the following to your .vimrc: +" +" let g:calendar_mark = 'right' +" +" NOTE:you can set 'left', 'left-fit', 'right' for this option. +" +" *if you want to use navigator, +" add the following to your .vimrc: +" +" let g:calendar_navi = '' +" +" NOTE:you can set 'top', 'bottom', 'both' for this option. +" +" *if you want to replace navigator in your language, +" add the following to your .vimrc: +" +" let g:calendar_navi_label = 'Prev,Today,Next' +" +" NOTE:it must be separated with ','. +" +" *if you want to replace calendar header, +" add the following in your favorite language to your .vimrc: +" +" let g:calendar_erafmt = 'Heisei,-1988' " for Japanese +" (name of era and diff with A.D.) +" +" *if you want to replace calendar ruler, +" add the following in your favorite language to your .vimrc: +" +" let g:calendar_mruler = 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec' +" let g:calendar_wruler = 'Su Mo Tu We Th Fr Sa' +" +" *if you want the week to start with monday, add below to your .vimrc: +" +" let g:calendar_monday = 1 +" (You don't have to to change g:calendar_wruler!) +" +" *if you want to show week number, add this to your .vimrc: +" +" set g:calendar_weeknm as below +" +" let g:calendar_weeknm = 1 " WK01 +" let g:calendar_weeknm = 2 " WK 1 +" let g:calendar_weeknm = 3 " KW01 +" let g:calendar_weeknm = 4 " KW 1 +" +" *if you want to show the current date and time, add below to your .vimrc: +" +" let g:calendar_datetime = 'title' +" +" NOTE:you can set 'title', 'statusline', '' for this option. +" +" *if you want to hook calender when pressing enter, +" add this to your .vimrc: +" +" function MyCalAction(day,month,year,week,dir) +" " day : day you actioned +" " month : month you actioned +" " year : year you actioned +" " week : day of week (Mo=1 ... Su=7) +" " dir : direction of calendar +" endfunction +" let calendar_action = 'MyCalAction' +" +" also, Calendar call following actions when begin or end of display. +" them actions are called at one each time when it show 3 months display. +" +" function MyCalActionBegin() +" endfunction +" let calendar_begin = 'MyCalActionBegin' +" +" function MyCalActionEnd() +" endfunction +" let calendar_end = 'MyCalActionEnd' +" +" *if you want to show sign in calender, +" add this to your .vimrc: +" +" function MyCalSign(day,month,year) +" " day : day you actioned +" " month : month you actioned +" " year : year you actioned +" if a:day == 1 && a:month == 1 +" return 1 " happy new year +" else +" return 0 " or not +" endif +" endfunction +" let calendar_sign = 'MyCalSign' +" +" *if you want to hook calender when pressing 'today', +" add this to your .vimrc: +" +" function MyCalToday() +" endfunction +" let calendar_today = 'MyCalToday' +" +" *if you want to get the version of this. +" type below. +" +" :echo calendar_version +" GetLatestVimScripts: 52 1 :AutoInstall: calendar.vim + +let g:calendar_version = "2.5" +if &compatible + finish +endif + +if !exists("g:calendar_action") + let g:calendar_action = "CalendarDiary" +endif +if !exists("g:calendar_sign") + let g:calendar_sign = "CalendarSign" +endif +if !exists("g:calendar_mark") + \|| (g:calendar_mark != 'left' + \&& g:calendar_mark != 'left-fit' + \&& g:calendar_mark != 'right') + let g:calendar_mark = 'left' +endif +if !exists("g:calendar_navi") + \|| (g:calendar_navi != 'top' + \&& g:calendar_navi != 'bottom' + \&& g:calendar_navi != 'both' + \&& g:calendar_navi != '') + let g:calendar_navi = 'top' +endif +if !exists("g:calendar_navi_label") + let g:calendar_navi_label = "Prev,Today,Next" +endif +if !exists("g:calendar_diary") + let g:calendar_diary = "~/diary" +endif +if !exists("g:calendar_focus_today") + let g:calendar_focus_today = 0 +endif +if !exists("g:calendar_datetime") + \|| (g:calendar_datetime != '' + \&& g:calendar_datetime != 'title' + \&& g:calendar_datetime != 'statusline') + let g:calendar_datetime = 'title' +endif +if !exists("g:calendar_options") + let g:calendar_options="fdc=0 nonu" + if has("+relativenumber") + let g:calendar_options .= " nornu" + endif +endif + +"***************************************************************** +"* Calendar commands +"***************************************************************** +command! -nargs=* Calendar call Calendar(0,) +command! -nargs=* CalendarH call Calendar(1,) + +if !hasmapto("CalendarV") + nmap cal CalendarV +endif +if !hasmapto("CalendarH") + nmap caL CalendarH +endif +nnoremap CalendarV :cal Calendar(0) +nnoremap CalendarH :cal Calendar(1) + +"***************************************************************** +"* GetToken : get token from source with count +"*---------------------------------------------------------------- +"* src : source +"* dlm : delimiter +"* cnt : skip count +"***************************************************************** +function! s:GetToken(src,dlm,cnt) + let tokn_hit=0 " flag of found + let tokn_fnd='' " found path + let tokn_spl='' " token + let tokn_all=a:src " all source + + " safe for end + let tokn_all = tokn_all.a:dlm + while 1 + let tokn_spl = strpart(tokn_all,0,match(tokn_all,a:dlm)) + let tokn_hit = tokn_hit + 1 + if tokn_hit == a:cnt + return tokn_spl + endif + let tokn_all = strpart(tokn_all,strlen(tokn_spl.a:dlm)) + if tokn_all == '' + break + endif + endwhile + return '' +endfunction + +"***************************************************************** +"* CalendarDoAction : call the action handler function +"*---------------------------------------------------------------- +"***************************************************************** +function! s:CalendarDoAction(...) + " for navi + if exists('g:calendar_navi') + let navi = (a:0 > 0)? a:1 : expand("") + let curl = line(".") + if navi == '<' . s:GetToken(g:calendar_navi_label, ',', 1) + if b:CalendarMonth > 1 + call Calendar(b:CalendarDir, b:CalendarYear, b:CalendarMonth-1) + else + call Calendar(b:CalendarDir, b:CalendarYear-1, 12) + endif + elseif navi == s:GetToken(g:calendar_navi_label, ',', 3) . '>' + if b:CalendarMonth < 12 + call Calendar(b:CalendarDir, b:CalendarYear, b:CalendarMonth+1) + else + call Calendar(b:CalendarDir, b:CalendarYear+1, 1) + endif + elseif navi == s:GetToken(g:calendar_navi_label, ',', 2) + call Calendar(b:CalendarDir) + if exists('g:calendar_today') + exe "call " . g:calendar_today . "()" + endif + else + let navi = '' + endif + if navi != '' + if g:calendar_focus_today == 1 && search("\*","w") > 0 + silent execute "normal! gg/\*\" + return + else + if curl < line('$')/2 + silent execute "normal! gg0/".navi."\" + else + silent execute "normal! G$?".navi."\" + endif + return + endif + endif + endif + + " if no action defined return + if !exists("g:calendar_action") || g:calendar_action == "" + return + endif + + if b:CalendarDir + let dir = 'H' + if exists('g:calendar_weeknm') + let cnr = col('.') - (col('.')%(24+5)) + 1 + else + let cnr = col('.') - (col('.')%(24)) + 1 + endif + let week = ((col(".") - cnr - 1 + cnr/49) / 3) + else + let dir = 'V' + let cnr = 1 + let week = ((col(".")+1) / 3) - 1 + endif + let lnr = 1 + let hdr = 1 + while 1 + if lnr > line('.') + break + endif + let sline = getline(lnr) + if sline =~ '^\s*$' + let hdr = lnr + 1 + endif + let lnr = lnr + 1 + endwhile + let lnr = line('.') + if(exists('g:calendar_monday')) + let week = week + 1 + elseif(week == 0) + let week = 7 + endif + if lnr-hdr < 2 + return + endif + let sline = substitute(strpart(getline(hdr),cnr,21),'\s*\(.*\)\s*','\1','') + if (col(".")-cnr) > 21 + return + endif + + " extract day + if g:calendar_mark == 'right' && col('.') > 1 + normal! h + let day = matchstr(expand(""), '[^0].*') + normal! l + else + let day = matchstr(expand(""), '[^0].*') + endif + if day == 0 + return + endif + " extract year and month + if exists('g:calendar_erafmt') && g:calendar_erafmt !~ "^\s*$" + let year = matchstr(substitute(sline, '/.*', '', ''), '\d\+') + let month = matchstr(substitute(sline, '.*/\(\d\d\=\).*', '\1', ""), '[^0].*') + if g:calendar_erafmt =~ '.*,[+-]*\d\+' + let veranum=substitute(g:calendar_erafmt,'.*,\([+-]*\d\+\)','\1','') + if year-veranum > 0 + let year=year-veranum + endif + endif + else + let year = matchstr(substitute(sline, '/.*', '', ''), '[^0].*') + let month = matchstr(substitute(sline, '\d*/\(\d\d\=\).*', '\1', ""), '[^0].*') + endif + " call the action function + exe "call " . g:calendar_action . "(day, month, year, week, dir)" +endfunc + +"***************************************************************** +"* Calendar : build calendar +"*---------------------------------------------------------------- +"* a1 : direction +"* a2 : month(if given a3, it's year) +"* a3 : if given, it's month +"***************************************************************** +function! Calendar(...) + + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + "+++ ready for build + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + " remember today + " divide strftime('%d') by 1 so as to get "1,2,3 .. 9" instead of "01, 02, 03 .. 09" + let vtoday = strftime('%Y').strftime('%m').strftime('%d') + + " get arguments + if a:0 == 0 + let dir = 0 + let vyear = strftime('%Y') + let vmnth = matchstr(strftime('%m'), '[^0].*') + elseif a:0 == 1 + let dir = a:1 + let vyear = strftime('%Y') + let vmnth = matchstr(strftime('%m'), '[^0].*') + elseif a:0 == 2 + let dir = a:1 + let vyear = strftime('%Y') + let vmnth = matchstr(a:2, '^[^0].*') + else + let dir = a:1 + let vyear = a:2 + let vmnth = matchstr(a:3, '^[^0].*') + endif + + " remember constant + let vmnth_org = vmnth + let vyear_org = vyear + + " start with last month + let vmnth = vmnth - 1 + if vmnth < 1 + let vmnth = 12 + let vyear = vyear - 1 + endif + + " reset display variables + let vdisplay1 = '' + let vheight = 1 + let vmcnt = 0 + + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + "+++ build display + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + if exists("g:calendar_begin") + exe "call " . g:calendar_begin . "()" + endif + while vmcnt < 3 + let vcolumn = 22 + let vnweek = -1 + "-------------------------------------------------------------- + "--- calculating + "-------------------------------------------------------------- + " set boundary of the month + if vmnth == 1 + let vmdays = 31 + let vparam = 1 + let vsmnth = 'Jan' + elseif vmnth == 2 + let vmdays = 28 + let vparam = 32 + let vsmnth = 'Feb' + elseif vmnth == 3 + let vmdays = 31 + let vparam = 60 + let vsmnth = 'Mar' + elseif vmnth == 4 + let vmdays = 30 + let vparam = 91 + let vsmnth = 'Apr' + elseif vmnth == 5 + let vmdays = 31 + let vparam = 121 + let vsmnth = 'May' + elseif vmnth == 6 + let vmdays = 30 + let vparam = 152 + let vsmnth = 'Jun' + elseif vmnth == 7 + let vmdays = 31 + let vparam = 182 + let vsmnth = 'Jul' + elseif vmnth == 8 + let vmdays = 31 + let vparam = 213 + let vsmnth = 'Aug' + elseif vmnth == 9 + let vmdays = 30 + let vparam = 244 + let vsmnth = 'Sep' + elseif vmnth == 10 + let vmdays = 31 + let vparam = 274 + let vsmnth = 'Oct' + elseif vmnth == 11 + let vmdays = 30 + let vparam = 305 + let vsmnth = 'Nov' + elseif vmnth == 12 + let vmdays = 31 + let vparam = 335 + let vsmnth = 'Dec' + else + echo 'Invalid Year or Month' + return + endif + if vyear % 400 == 0 + if vmnth == 2 + let vmdays = 29 + elseif vmnth >= 3 + let vparam = vparam + 1 + endif + elseif vyear % 100 == 0 + if vmnth == 2 + let vmdays = 28 + endif + elseif vyear % 4 == 0 + if vmnth == 2 + let vmdays = 29 + elseif vmnth >= 3 + let vparam = vparam + 1 + endif + endif + + " calc vnweek of the day + if vnweek == -1 + let vnweek = ( vyear * 365 ) + vparam + let vnweek = vnweek + ( vyear/4 ) - ( vyear/100 ) + ( vyear/400 ) + if vyear % 4 == 0 + if vyear % 100 != 0 || vyear % 400 == 0 + let vnweek = vnweek - 1 + endif + endif + let vnweek = vnweek - 1 + endif + + " fix Gregorian + if vyear <= 1752 + let vnweek = vnweek - 3 + endif + + let vnweek = vnweek % 7 + + if exists('g:calendar_monday') + " if given g:calendar_monday, the week start with monday + if vnweek == 0 + let vnweek = 7 + endif + let vnweek = vnweek - 1 + endif + + if exists('g:calendar_weeknm') + " if given g:calendar_weeknm, show week number(ref:ISO8601) + + "vparam <= 1. day of month + "vnweek <= 1. weekday of month (0-6) + "viweek <= number of week + "vfweek <= 1. day of year + + " mo di mi do fr sa so + " 6 5 4 3 2 1 0 vfweek + " 0 1 2 3 4 5 6 vnweek + + let vfweek =((vparam % 7) -vnweek+ 14-2) % 7 + let viweek = (vparam - vfweek-2+7 ) / 7 +1 + + if vfweek < 3 + let viweek = viweek - 1 + endif + + "vfweekl <=year length + let vfweekl = 52 + if (vfweek == 3) + let vfweekl = 53 + endif + + if viweek == 0 + let viweek = 52 + if ((vfweek == 2) && (((vyear-1) % 4) !=0)) + \ || ((vfweek == 1) && (((vyear-1) % 4) ==0)) + let viweek = 53 + endif + endif + + let vcolumn = vcolumn + 5 + endif + + "-------------------------------------------------------------- + "--- displaying + "-------------------------------------------------------------- + " build header + if exists('g:calendar_erafmt') && g:calendar_erafmt !~ "^\s*$" + if g:calendar_erafmt =~ '.*,[+-]*\d\+' + let veranum=substitute(g:calendar_erafmt,'.*,\([+-]*\d\+\)','\1','') + if vyear+veranum > 0 + let vdisplay2=substitute(g:calendar_erafmt,'\(.*\),.*','\1','') + let vdisplay2=vdisplay2.(vyear+veranum).'/'.vmnth.'(' + else + let vdisplay2=vyear.'/'.vmnth.'(' + endif + else + let vdisplay2=vyear.'/'.vmnth.'(' + endif + let vdisplay2=strpart(" ", + \ 1,(vcolumn-strlen(vdisplay2))/2-2).vdisplay2 + else + let vdisplay2=vyear.'/'.vmnth.'(' + let vdisplay2=strpart(" ", + \ 1,(vcolumn-strlen(vdisplay2))/2-2).vdisplay2 + endif + if exists('g:calendar_mruler') && g:calendar_mruler !~ "^\s*$" + let vdisplay2=vdisplay2.s:GetToken(g:calendar_mruler,',',vmnth).')'."\n" + else + let vdisplay2=vdisplay2.vsmnth.')'."\n" + endif + let vwruler = "Su Mo Tu We Th Fr Sa" + if exists('g:calendar_wruler') && g:calendar_wruler !~ "^\s*$" + let vwruler = g:calendar_wruler + endif + if exists('g:calendar_monday') + let vwruler = strpart(vwruler,stridx(vwruler, ' ') + 1).' '.strpart(vwruler,0,stridx(vwruler, ' ')) + endif + let vdisplay2 = vdisplay2.' '.vwruler."\n" + if g:calendar_mark == 'right' + let vdisplay2 = vdisplay2.' ' + endif + + " build calendar + let vinpcur = 0 + while (vinpcur < vnweek) + let vdisplay2=vdisplay2.' ' + let vinpcur = vinpcur + 1 + endwhile + let vdaycur = 1 + while (vdaycur <= vmdays) + if vmnth < 10 + let vtarget =vyear."0".vmnth + else + let vtarget =vyear.vmnth + endif + if vdaycur < 10 + let vtarget = vtarget."0".vdaycur + else + let vtarget = vtarget.vdaycur + endif + if exists("g:calendar_sign") && g:calendar_sign != "" + exe "let vsign = " . g:calendar_sign . "(vdaycur, vmnth, vyear)" + if vsign != "" + let vsign = vsign[0] + if vsign !~ "[+!#$%&@?]" + let vsign = "+" + endif + endif + else + let vsign = '' + endif + + " show mark + if g:calendar_mark == 'right' + if vdaycur < 10 + let vdisplay2=vdisplay2.' ' + endif + let vdisplay2=vdisplay2.vdaycur + elseif g:calendar_mark == 'left-fit' + if vdaycur < 10 + let vdisplay2=vdisplay2.' ' + endif + endif + if vtarget == vtoday + let vdisplay2=vdisplay2.'*' + elseif vsign != '' + let vdisplay2=vdisplay2.vsign + else + let vdisplay2=vdisplay2.' ' + endif + if g:calendar_mark == 'left' + if vdaycur < 10 + let vdisplay2=vdisplay2.' ' + endif + let vdisplay2=vdisplay2.vdaycur + endif + if g:calendar_mark == 'left-fit' + let vdisplay2=vdisplay2.vdaycur + endif + let vdaycur = vdaycur + 1 + + " fix Gregorian + if vyear == 1752 && vmnth == 9 && vdaycur == 3 + let vdaycur = 14 + endif + + let vinpcur = vinpcur + 1 + if vinpcur % 7 == 0 + if exists('g:calendar_weeknm') + if g:calendar_mark != 'right' + let vdisplay2=vdisplay2.' ' + endif + " if given g:calendar_weeknm, show week number + if viweek < 10 + if g:calendar_weeknm == 1 + let vdisplay2=vdisplay2.'WK0'.viweek + elseif g:calendar_weeknm == 2 + let vdisplay2=vdisplay2.'WK '.viweek + elseif g:calendar_weeknm == 3 + let vdisplay2=vdisplay2.'KW0'.viweek + elseif g:calendar_weeknm == 4 + let vdisplay2=vdisplay2.'KW '.viweek + endif + else + if g:calendar_weeknm <= 2 + let vdisplay2=vdisplay2.'WK'.viweek + else + let vdisplay2=vdisplay2.'KW'.viweek + endif + endif + let viweek = viweek + 1 + + if viweek > vfweekl + let viweek = 1 + endif + + endif + let vdisplay2=vdisplay2."\n" + if g:calendar_mark == 'right' + let vdisplay2 = vdisplay2.' ' + endif + endif + endwhile + + " if it is needed, fill with space + if vinpcur % 7 + while (vinpcur % 7 != 0) + let vdisplay2=vdisplay2.' ' + let vinpcur = vinpcur + 1 + endwhile + if exists('g:calendar_weeknm') + if g:calendar_mark != 'right' + let vdisplay2=vdisplay2.' ' + endif + if viweek < 10 + if g:calendar_weeknm == 1 + let vdisplay2=vdisplay2.'WK0'.viweek + elseif g:calendar_weeknm == 2 + let vdisplay2=vdisplay2.'WK '.viweek + elseif g:calendar_weeknm == 3 + let vdisplay2=vdisplay2.'KW0'.viweek + elseif g:calendar_weeknm == 4 + let vdisplay2=vdisplay2.'KW '.viweek + endif + else + if g:calendar_weeknm <= 2 + let vdisplay2=vdisplay2.'WK'.viweek + else + let vdisplay2=vdisplay2.'KW'.viweek + endif + endif + endif + endif + + " build display + let vstrline = '' + if dir + " for horizontal + "-------------------------------------------------------------- + " +---+ +---+ +------+ + " | | | | | | + " | 1 | + | 2 | = | 1' | + " | | | | | | + " +---+ +---+ +------+ + "-------------------------------------------------------------- + let vtokline = 1 + while 1 + let vtoken1 = s:GetToken(vdisplay1,"\n",vtokline) + let vtoken2 = s:GetToken(vdisplay2,"\n",vtokline) + if vtoken1 == '' && vtoken2 == '' + break + endif + while strlen(vtoken1) < (vcolumn+1)*vmcnt + if strlen(vtoken1) % (vcolumn+1) == 0 + let vtoken1 = vtoken1.'|' + else + let vtoken1 = vtoken1.' ' + endif + endwhile + let vstrline = vstrline.vtoken1.'|'.vtoken2.' '."\n" + let vtokline = vtokline + 1 + endwhile + let vdisplay1 = vstrline + let vheight = vtokline-1 + else + " for virtical + "-------------------------------------------------------------- + " +---+ +---+ +---+ + " | 1 | + | 2 | = | | + " +---+ +---+ | 1'| + " | | + " +---+ + "-------------------------------------------------------------- + let vtokline = 1 + while 1 + let vtoken1 = s:GetToken(vdisplay1,"\n",vtokline) + if vtoken1 == '' + break + endif + let vstrline = vstrline.vtoken1."\n" + let vtokline = vtokline + 1 + let vheight = vheight + 1 + endwhile + if vstrline != '' + let vstrline = vstrline.' '."\n" + let vheight = vheight + 1 + endif + let vtokline = 1 + while 1 + let vtoken2 = s:GetToken(vdisplay2,"\n",vtokline) + if vtoken2 == '' + break + endif + while strlen(vtoken2) < vcolumn + let vtoken2 = vtoken2.' ' + endwhile + let vstrline = vstrline.vtoken2."\n" + let vtokline = vtokline + 1 + let vheight = vtokline + 1 + endwhile + let vdisplay1 = vstrline + endif + let vmnth = vmnth + 1 + let vmcnt = vmcnt + 1 + if vmnth > 12 + let vmnth = 1 + let vyear = vyear + 1 + endif + endwhile + if exists("g:calendar_end") + exe "call " . g:calendar_end . "()" + endif + if a:0 == 0 + return vdisplay1 + endif + + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + "+++ build window + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + " make window + let vwinnum=bufnr('__Calendar') + if getbufvar(vwinnum, 'Calendar')=='Calendar' + let vwinnum=bufwinnr(vwinnum) + else + let vwinnum=-1 + endif + + if vwinnum >= 0 + " if already exist + if vwinnum != bufwinnr('%') + exe vwinnum . 'wincmd w' + endif + setlocal modifiable + silent %d _ + else + " make title + if g:calendar_datetime == "title" && (!exists('s:bufautocommandsset')) + auto BufEnter *Calendar let b:sav_titlestring = &titlestring | let &titlestring = '%{strftime("%c")}' + auto BufLeave *Calendar let &titlestring = b:sav_titlestring + let s:bufautocommandsset=1 + endif + + if exists('g:calendar_navi') && dir + if g:calendar_navi == 'both' + let vheight = vheight + 4 + else + let vheight = vheight + 2 + endif + endif + + " or not + if dir + silent execute 'bo '.vheight.'split __Calendar' + setlocal winfixheight + else + silent execute 'to '.vcolumn.'vsplit __Calendar' + setlocal winfixwidth + endif + call s:CalendarBuildKeymap(dir, vyear, vmnth) + setlocal noswapfile + setlocal buftype=nofile + setlocal bufhidden=delete + silent! exe "setlocal " . g:calendar_options + let nontext_columns = &foldcolumn + &nu * &numberwidth + if has("+relativenumber") + let nontext_columns += &rnu * &numberwidth + endif + " Without this, the 'sidescrolloff' setting may cause the left side of the + " calendar to disappear if the last inserted element is near the right + " window border. + setlocal nowrap + setlocal norightleft + setlocal modifiable + setlocal nolist + let b:Calendar='Calendar' + setlocal filetype=calendar + " is this a vertical (0) or a horizontal (1) split? + exe vcolumn + nontext_columns . "wincmd |" + endif + if g:calendar_datetime == "statusline" + setlocal statusline=%{strftime('%c')} + endif + let b:CalendarDir=dir + let b:CalendarYear = vyear_org + let b:CalendarMonth = vmnth_org + + " navi + if exists('g:calendar_navi') + let navi_label = '<' + \.s:GetToken(g:calendar_navi_label, ',', 1).' ' + \.s:GetToken(g:calendar_navi_label, ',', 2).' ' + \.s:GetToken(g:calendar_navi_label, ',', 3).'>' + if dir + let navcol = vcolumn + (vcolumn-strlen(navi_label)+2)/2 + else + let navcol = (vcolumn-strlen(navi_label)+2)/2 + endif + if navcol < 3 + let navcol = 3 + endif + + if g:calendar_navi == 'top' + execute "normal gg".navcol."i " + silent exec "normal! a".navi_label."\\" + silent put! =vdisplay1 + endif + if g:calendar_navi == 'bottom' + silent put! =vdisplay1 + silent exec "normal! Gi\" + execute "normal ".navcol."i " + silent exec "normal! a".navi_label + endif + if g:calendar_navi == 'both' + execute "normal gg".navcol."i " + silent exec "normal! a".navi_label."\\" + silent put! =vdisplay1 + silent exec "normal! Gi\" + execute "normal ".navcol."i " + silent exec "normal! a".navi_label + endif + else + silent put! =vdisplay1 + endif + + setlocal nomodifiable + " In case we've gotten here from insert mode (via :Calendar)... + stopinsert + + let vyear = vyear_org + let vmnth = vmnth_org + + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + "+++ build highlight + "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + " today + syn clear + if g:calendar_mark =~ 'left-fit' + syn match CalToday display "\s*\*\d*" + syn match CalMemo display "\s*[+!#$%&@?]\d*" + elseif g:calendar_mark =~ 'right' + syn match CalToday display "\d*\*\s*" + syn match CalMemo display "\d*[+!#$%&@?]\s*" + else + syn match CalToday display "\*\s*\d*" + syn match CalMemo display "[+!#$%&@?]\s*\d*" + endif + " header + syn match CalHeader display "[^ ]*\d\+\/\d\+([^)]*)" + + " navi + if exists('g:calendar_navi') + exec "silent! syn match CalNavi display \"\\(<" + \.s:GetToken(g:calendar_navi_label, ',', 1)."\\|" + \.s:GetToken(g:calendar_navi_label, ',', 3).">\\)\"" + exec "silent! syn match CalNavi display \"\\s" + \.s:GetToken(g:calendar_navi_label, ',', 2)."\\s\"hs=s+1,he=e-1" + endif + + " saturday, sunday + let dayorspace = '\(\*\|\s\)\(\s\|\d\)\(\s\|\d\)' + if !exists('g:calendar_weeknm') || g:calendar_weeknm <= 2 + let wknmstring = '\(\sWK[0-9\ ]\d\)*' + else + let wknmstring = '\(\sKW[0-9\ ]\d\)*' + endif + let eolnstring = '\s\(|\|$\)' + if exists('g:calendar_monday') + execute "syn match CalSaturday display \'" + \.dayorspace.dayorspace.wknmstring.eolnstring."\'ms=s+1,me=s+3" + execute "syn match CalSunday display \'" + \.dayorspace.wknmstring.eolnstring."\'ms=s+1,me=s+3" + else + if dir + execute "syn match CalSaturday display \'" + \.dayorspace.wknmstring.eolnstring."\'ms=s+1,me=s+3" + execute "syn match CalSunday display \'\|" + \.dayorspace."\'ms=s+2,me=s+4" + else + execute "syn match CalSaturday display \'" + \.dayorspace.wknmstring.eolnstring."\'ms=s+1,me=s+3" + execute "syn match CalSunday display \'^" + \.dayorspace."\'ms=s+1,me=s+3" + endif + endif + + " week number + if !exists('g:calendar_weeknm') || g:calendar_weeknm <= 2 + syn match CalWeeknm display "WK[0-9\ ]\d" + else + syn match CalWeeknm display "KW[0-9\ ]\d" + endif + + " ruler + execute 'syn match CalRuler "'.vwruler.'"' + + if search("\*","w") > 0 + silent execute "normal! gg/\*\" + endif + + return '' +endfunction + +"***************************************************************** +"* CalendarMakeDir : make directory +"*---------------------------------------------------------------- +"* dir : directory +"***************************************************************** +function! s:CalendarMakeDir(dir) + if(has("unix")) + call system("mkdir " . a:dir) + let rc = v:shell_error + elseif(has("win16") || has("win32") || has("win95") || + \has("dos16") || has("dos32") || has("os2")) + call system("mkdir \"" . a:dir . "\"") + let rc = v:shell_error + else + let rc = 1 + endif + if rc != 0 + call confirm("can't create directory : " . a:dir, "&OK") + endif + return rc +endfunc + +"***************************************************************** +"* CalendarDiary : calendar hook function +"*---------------------------------------------------------------- +"* day : day you actioned +"* month : month you actioned +"* year : year you actioned +"***************************************************************** +function! s:CalendarDiary(day, month, year, week, dir) + " build the file name and create directories as needed + if !isdirectory(expand(g:calendar_diary)) + call confirm("please create diary directory : ".g:calendar_diary, 'OK') + return + endif + let sfile = expand(g:calendar_diary) . "/" . a:year + if isdirectory(sfile) == 0 + if s:CalendarMakeDir(sfile) != 0 + return + endif + endif + let sfile = sfile . "/" . a:month + if isdirectory(sfile) == 0 + if s:CalendarMakeDir(sfile) != 0 + return + endif + endif + let sfile = expand(sfile) . "/" . a:day . ".cal" + let sfile = substitute(sfile, ' ', '\\ ', 'g') + let vbufnr = bufnr('__Calendar') + + " load the file + exe "sp " . sfile + setlocal ft=calendar + let dir = getbufvar(vbufnr, "CalendarDir") + let vyear = getbufvar(vbufnr, "CalendarYear") + let vmnth = getbufvar(vbufnr, "CalendarMonth") + exe "auto BufDelete ".escape(sfile, ' \\')." call Calendar(" . dir . "," . vyear . "," . vmnth . ")" +endfunc + +"***************************************************************** +"* CalendarSign : calendar sign function +"*---------------------------------------------------------------- +"* day : day of sign +"* month : month of sign +"* year : year of sign +"***************************************************************** +function! s:CalendarSign(day, month, year) + let sfile = g:calendar_diary."/".a:year."/".a:month."/".a:day.".cal" + return filereadable(expand(sfile)) +endfunction + +"***************************************************************** +"* CalendarVar : get variable +"*---------------------------------------------------------------- +"***************************************************************** +function! s:CalendarVar(var) + if !exists(a:var) + return '' + endif + exec 'return ' . a:var +endfunction + +"***************************************************************** +"* CalendarBuildKeymap : build keymap +"*---------------------------------------------------------------- +"***************************************************************** +function! s:CalendarBuildKeymap(dir, vyear, vmnth) + " make keymap + execute 'nnoremap q :closewincmd p' + + execute 'nnoremap CalendarDoAction :call CalendarDoAction()' + execute 'nnoremap CalendarDoAction :call CalendarDoAction()' + execute 'nnoremap CalendarGotoToday :call Calendar(b:CalendarDir)' + execute 'nnoremap CalendarShowHelp :call CalendarHelp()' + execute 'nnoremap CalendarReDisplay :call Calendar(' . a:dir . ',' . a:vyear . ',' . a:vmnth . ')' + let pnav = s:GetToken(g:calendar_navi_label, ',', 1) + let nnav = s:GetToken(g:calendar_navi_label, ',', 3) + execute 'nnoremap CalendarGotoPrevMonth :call CalendarDoAction("<' . pnav . '")' + execute 'nnoremap CalendarGotoNextMonth :call CalendarDoAction("' . nnav . '>")' + execute 'nnoremap CalendarGotoPrevYear :call Calendar('.a:dir.','.(a:vyear-1).','.a:vmnth.')' + execute 'nnoremap CalendarGotoNextYear :call Calendar('.a:dir.','.(a:vyear+1).','.a:vmnth.')' + + nmap CalendarDoAction + nmap <2-LeftMouse> CalendarDoAction + nmap t CalendarGotoToday + nmap ? CalendarShowHelp + nmap r CalendarReDisplay + + nmap CalendarGotoPrevMonth + nmap CalendarGotoNextMonth + nmap CalendarGotoPrevYear + nmap CalendarGotoNextYear +endfunction + +"***************************************************************** +"* CalendarHelp : show help for Calendar +"*---------------------------------------------------------------- +"***************************************************************** +function! s:CalendarHelp() + echohl None + echo 'Calendar version ' . g:calendar_version + echohl SpecialKey + echo ' : goto prev month' + echo ' : goto next month' + echo ' : goto prev year' + echo ' : goto next year' + echo 't : goto today' + echo 'q : close window' + echo 'r : re-display window' + echo '? : show this help' + if g:calendar_action == "CalendarDiary" + echo ' : show diary' + endif + echo '' + echohl Question + echo 'calendar_erafmt=' . s:CalendarVar('g:calendar_erafmt') + echo 'calendar_mruler=' . s:CalendarVar('g:calendar_mruler') + echo 'calendar_wruler=' . s:CalendarVar('g:calendar_wruler') + echo 'calendar_weeknm=' . s:CalendarVar('g:calendar_weeknm') + echo 'calendar_navi_label=' . s:CalendarVar('g:calendar_navi_label') + echo 'calendar_diary=' . s:CalendarVar('g:calendar_diary') + echo 'calendar_mark=' . s:CalendarVar('g:calendar_mark') + echo 'calendar_navi=' . s:CalendarVar('g:calendar_navi') + echohl MoreMsg + echo "[Hit any key]" + echohl None + call getchar() + redraw! +endfunction + +hi def link CalNavi Search +hi def link CalSaturday Statement +hi def link CalSunday Type +hi def link CalRuler StatusLine +hi def link CalWeeknm Comment +hi def link CalToday Directory +hi def link CalHeader Special +hi def link CalMemo Identifier