仕事で予定表を作る都合で,一月分の日付リストを出力するマクロを作り,
その後,出力する曜日を選択できるメニューを装備させてみたものです.
今日,メニューの項目の値を全反転する機能を付加したので上げました.
= Datelstw.def v0.20 = by H_ear
#if 0
選択曜日の指定範囲の日付を出力
ON/OFFメニューのテスト
#endif
* mad for vz!
1 ^\ "" ?.
(mb || mr==$80)?{ &m("! View/Block mode") . }
mi[-,
JU[, JU=$7F+$80, ;#DEF 初期設定可
; +1=日; +2=月; +4=火; +8=水; +16=木; +32=金; +64=土
;初期設定は全ビットON, 各ビットで制御可能
;; bit 0 1 2 3 4 5 6 7
;; fa fb fc fd fi fj fx fy
;; 日 月 火 水 木 金 土 1ヶ月限定出力フラグに使用
;;用途に合わせて on/off しておくことも可能
;;例えば,月水木土のみ出力なら JU=$5A+$80 など.
ax=$2A00, &i($21) ;当日取得
; ---- 年/月入力 ----
:a &g("年 [CR]:当年") y=r, ;<y>年取得
(r==-1 || r==0)?{ &m("") >z } ;[ESC] or 数値でないなら終了
(r==-2)?{ y=cx, } ;[CR]:当年
:b &g("月 [CR]:1-12月") m=r, ;<m>月取得
(r==-1)?{ &m("") >z } ;[ESC]なら終了
(r==-2)?{ m=1, fy!, } ;[CR]:1年分
:c (m<0 || m>12)?{ >b } ;範囲外なら再入力を促す
;JUを使うことで以下の代入を省略できる
;fa=(o&1>0), fb=(o&2>0), fc=(o&4>0), fd=(o&8>0),
;fi=(o&16>0), fj=(o&32>0), fx=(o&64>0),
;o=fa+fb*2+fc*4+fd*8+fi*16+fj*32+fx*64,
; ---- menu ----
:l !01
(r>7)?>R ;OKで抜ければrun
(r>6)?{ JU^=$7F, >l } ;全反転
(r+1)??{ &m("Cancel") >z } ;r=-1 なら[ESC]
>l
:R ; ---- run ----
n=31, &00 (n>r.m)?n=r.m, ;<n>月の日数確定
; ---- 朔日の曜日を確定 ----
; <-- y,m,d
; --> w
d=1, &01 ;<d>朔日を渡して<w>曜日を取得
; ---- 出力 ----
#< (ct!=1)?#n ;空行出力(オートインデント対応)
:n ;(n){ ループ内に条件分岐は使えない
&02 ;wに応じたビットの値を評価させる
;fa==1, fb==2, fc==4, fd==8, fi==16, fj==32, fx==64,
(r)?{
&s ;; ---- 書式カスタマイズ可能 ----
; &?("%4d/%02d/%02d (%2s)",y,m,d,"日月火水木金土"+w*2) #m
; &?("%4d-%02d-%02d (%2s)",y,m,d,"日月火水木金土"+w*2) #m
&?("%4d%02d%02d (%2s)",y,m,d,"日月火水木金土"+w*2) #m
}
&d d++, w=(w+1)%7,
(n--)?>n ;} 擬似ループの末尾
; ---- 連続処理 ----
(fy)?{ &a("次の月を出力します") }?r+,
(r>0)?{
m++,
(m>12)?{
(fy)??>q
m=1, y++,
}
>R
}
:q ; ---- quit ----
#g ;余分な改行を削除
:z ; ---- exit ----
JU], mi],
&d #] .
00: ; ---- 日の整合性確認 ---- ;from calendar.def
r=" $(1f,1c,1f,1e,1f,1e,1f,1f,1e,1f,1e,1f,)", ;Yushi(__)
; _______1__2__3__4__5__6__7__8__9__a__b__c ;month
(y%4==0 && (y%100!=0 || y%400==0))?r.2=29, ?r.2=28, ;閏年
(r)
01: ; ---- 指定日の曜日を算出(ツェラーの式) ----
;1,2月を前年の13,14月として計算する
;グレゴリオ暦採用の1583年以降に対応する
m[, y[,
(m<3)?{ y--, m+=12, } ;Zeller(__)
w=((y+ y/4+ y/400+ (m*13+8)/5+ 1- y/100) +d -1) %7,
y], m],
02: ;wに応じたビットが立っているか評価した値を持って戻る
(w)>?{ (JU&1) (JU&2) (JU&4) (JU&8) (JU&16) (JU&32) (JU&64) }
* popup menu
1 "曜日選択",12,9,4
"N 日",fa
"G 月",fb
"K 火",fc
"S 水",fd
"M 木",fi
"I 金",fj
"D 土",fx
"A 全反転"
"OK"
*
[Variables]
y,m,d,w 年月日曜
n カレント月の日数
JU
fa,fb,fc,fd,fi,fj,fx 曜日選択フラグ
fy 1年分出力フラグ
[Buffers]
[History]
2018/03/04 0.10 初版
2019/11/13 0.20 メニューに全反転を追加
[Notes]
月水金なら EU&=1~ で偶数切捨てになるが使えるか?
on/offなら表示用文字列設定不要.「日$(9)off on」なんてする必要なかった.