Trailing-Edge
-
PDP-10 Archives
-
mit_emacs_170_teco_1220
-
emacs/timer.emacs
There are no other files named timer.emacs in the archive.
!* Library created and maintained by David Eppstein <Kronj@Sierra> !
!* Compile this file with IVORY, not PURIFY !
!* The funny name is to trick MODLIN into not loading TIME !
!~Filename~:! !Intelligent real-time clock interrupts!
KMPTIME
!& Setup KMPTIME Library:! !S Setup for using our winning macros!
fsClkIntm.vTimer Old Clock Int !* Save old clock interval!
fsClkMacm.vTimer Old Clock Mac !* And old clock mac!
0fsClkInt !* No interrupts set yet!
m.m& Run TimersfsClkMac !* Set macro to run timers!
0fo..qOnly Time in Modelinef"nm.vTime Only' !* Placate LOTS losers!
0fsQVectorm.vTimer Vector !* Make up a new timer vector!
0uTimer Vector Locked !* Timer Vector has not been locked!
m(m.m& Auto Save Timer) !* Auto save to schedule for later!
0fo..qMonths"n ' !* If we have months already, done!
13*5fsQVectorf([5)m.vMonths !* Get ourselves a Q-vector !
:i*Jan u:5(1) !* Jan!
:i*Feb u:5(2) !* Feb!
:i*Mar u:5(3) !* Mar!
:i*Apr u:5(4) !* Apr!
:i*May u:5(5) !* May!
:i*Jun u:5(6) !* Jun!
:i*Jul u:5(7) !* Jul!
:i*Aug u:5(8) !* Aug!
:i*Sep u:5(9) !* Sep!
:i*Oct u:5(10) !* Oct!
:i*Nov u:5(11) !* Nov!
:i*Dec u:5(12) !* Dec!
!& Kill KMPTIME Library:! !S Fix up so user can run without us!
qTimer Old Clock IntfsClkInt !* Fix clock interval!
qTimer Old Clock MacfsClkMac !* And macro to run when alarm goes off!
0uTimer Vector !* No timer vector anymore!
!& Run Timers:! !S Macro to check list of timers for later interpretation!
m(m.m& Declare Load-Time Defaults)
Timer Vector Locked,Lock On Timer Interrupts: 0
Timer Lock Timeout,How long to wait before trying lock again: 300
qTimer Vector Locked"n !* Is timer locked?!
qTimer Lock TimeoutfsClkInt !* Yes, wait a little (5 seconds default)!
' !* Before doing anything!
qTimer Vector[0 !* Get vector!
fq0:"g 0fsClkIntw' !* If nothing, don't run interrupt!
0[1 fq0/5[2 q:0(0)[3 !* Get index, limit, decrement!
<q1-q2; q:0(q1)-q3u:0(q1) q1+2u1> !* Decrement all timeout counters!
< fq0@; q:0(0)-1; !* Loop through all zeroed counts!
m:0(1) !* Macro the macro!
q0[..o 0,10k ]..o > !* And flush that timeout!
fq0f"nw q:0(0)'fsClkInt !* Set new timeout for next interrupt!
!* All done with this alarm!
!& Set Timer:! !S Schedule a timer interrupt for later running.
Arg1 is interval (in 60ths of a second), Arg2 is macro to run.!
m(m.m& Declare Load-Time Defaults)
Timer Vector Locked,Lock On Timer Interrupts: 0
1[Timer Vector Locked !* Lock timer vector from interrupt!
qTimer Vector[..o !* Select vector as buffer!
0[0 fq..o/5[1 !* Get index and length of vector!
<q0-q1; q:..o(q0)-; q0+2u0> !* Find place to put new interrupt!
q0*5j 10,0i !* Make some room!
u:..o(q0) u:..o(q0+1) !* Set timeout and macro!
q0"e fsClkInt' !* If first in line, set up timer!
!* Exit and unlock things!
!& Clear Timer:! !S Remove timer from schedule.
Arg is macro that would have been run.!
m(m.m& Declare Load-Time Defaults)
Timer Vector Locked,Lock On Timer Interrupts: 0
1[Timer Vector Locked !* Lock timer vector from interrupt!
qTimer Vector[..o !* Select vector as buffer!
0[0 fq..0/5[1 !* Get index and length of vector!
<q0-q1; q:..o(q0+1)-"e !* Loop through. If we found the spot!
q0*5j 10 k'"# q0+2u0'> !* Flush it, else go on to next!
!* Exit and unlock things!
!& Auto Save Timer:! !S Timer interrupt for auto save.
Schedules self for later running and runs auto save.!
m(m.m& Declare Load-Time Defaults)
Auto Save Timeout,Interval between auto-save interrupts: 14400
qAuto Save Timeout,(m.m& Auto Save Timer)m(m.m& Set Timer) !* ...!
:m(m.m& Real-time Interrupt) !* Run original auto-save macro!
!& Get Current Time:! !S Gets string form of time.
Time in 7 chars + <Space> + Date in 9 chars;
if qTime Only is nonzero, the just return time in 7 chars.!
m(m.m& Declare Load-Time Defaults)
Time Only,* Just time without date in fancy mode line: 0
!* q0 = String to put in mode line!
!* q1 = full time (scrap)!
!* q5 = date!
[0[1[2[3[4[5 !* Save some qregs for use!
:i5 !* Initialize q5 to null string!
qTime Only[6 !* Get whether to include date!
fsDate+1"e !* If system doesn't know the time!
q6"n :i*No Time' !* ..then say so!
"# :i*No Time & No Date'' !* ...!
fsDate:fsFDConvertu1 !* Save date/time as string in q1!
q6"n oSkipDate' !* If not doing date, then go on!
3,5:g1 u2 !* Get day in q2!
0,2:g1 u3 !* Get month # in q3!
6,8:g1 u4 !* Get year in q4!
Q:Months(3) u3 !* Get month string in q3!
0:g2-48"e !* Leading zero in Day?!
0:F2 ' !* Change to a space!
:i52 3 4 !* Month Date!
!SkipDate! !* Come here if no date wanted!
12,14:g1 u2 !* Save minutes in q2!
9,11:g1 u3 !* Save hour in q3!
F=200"e !* If its on the hour ...!
F=300"e :i*Midnite 5 ' !* Hour = 0 means midnite!
F=312"e :i*12 Noon 5 '' !* Hour = 12 means noon!
3/12"e !* If before noon, ...!
:i4am' !* Then Use am!
"# (3-12):\u3 !* Else put (Hour - 12) in q3!
fq3-1"e :i3 3' !* If only one digit, slide over!
:i4pm' !* Use pm!
F=3 0"e :i312' !* If Hour = 0, change to 12!
"# F=300"e :i312'' !* (Else) If Hour = 00, change to 12!
0:g3-48"e !* If Hour begins with a 0, ...!
0:F3 ' !* Make it into a blank!
q6"e :i*3:24 5 ' !* Return the Time and Date!
"# :i*3:24 ' !* or maybe just the Time!
!& Start Realtime Modeline Clock:! !S Get the realtime clock interrupts going
Postcomma arg is the number of seconds to wait between updates (Default 30).
Precomma arg is time will only f^E the mode line when that macro is in ModeMac!
m.vModeline Safe Macro !* Precomma arg (default 0) is safe to f^E!
ff&1"n*60m.vMode Line Timeout' !* If given a time, use it!
:m(m.m& Insert Correct Time in Mode Line) !* Start up mode macro!
!& Insert Correct Time In Mode Line:! !S Updates modline display of time!
m(m.m& Declare Load-Time Defaults)
Mode Line Timeout,How long to wait between mode line updates: 1800
qMode Line Timeout,( !* Set self to run again later!
m.m& Insert Correct Time In Mode Line)m(m.m& Set Timer) !* ...!
1,M.M &_Periodic_Action"n !* Satisfy users of MODLIN!
M(M.M &_Periodic_Action)' !* who want other things done!
f[InsLen !* Bind insert length info!
qEditor Name[0 !* Put Editor name in q0!
!* Check whether can insert time without worrying about rest of modeline!
f~..J0-1-FQ0"N oSet' !* If ..J is unknown, Set mode line!
fq..J-(fq0+18)"l oSet' !* If ..J is short, same thing!
qModeline Safe Macrof"n[0 !* If a mode safe macro was named!
q0-(]0w fsModeMacro)"n oSet'' !* ..do the f^E only if a match!
!* Can do insertion, so do it!
:i0..J !* Copy ..J into q0!
M(M.M & Get Current Time)[1 !* Get current time in q1!
fqEditor Name+1:f01 !* Replace time into mode line!
F=0..J"e 0' !* Exit if no change to make!
q0 u..J !* Put new mode line in ..J!
FR !* Redisplay the mode line!
0 !* Return!
!Set! !* Here when have to run full mode macro!
fsModeMacrof"n[0 m0fr ]0' !* If a ModeMacro in effect, call it!
0 !* And return!