Define a "relaxed mode"
Drop debugging message
A method for blocking access to emacs commands based on time.
This package requires
handle time parsing.
time-block.el to somewhere on your
load-path and load
(require 'time-block). It is also available on
To use this package it's necessary to do two things: define time blocking groups and define time blocked commands.
Customize the variable
time-block-groups. An example of a groups
definition is below.
(setf time-block-groups '((:workday . ((1 . (("09:00" . "17:00"))) (2 . (("09:00" . "17:00"))) (3 . (("09:00" . "17:00"))) (4 . (("09:00" . "17:00"))) (5 . (("09:00" . "17:00")))))))
This variable is an alist of names (keywords) to group definitions. A group definition is an alist from days of the week (as numbers, Sunday = 0/7, etc.) to lists of start/stop pairs (times in "HH:MM" form).
It is also possible to ignore time blocking on holidays. This is
globally set using the
time-block-skip-on-holidays-p variable. This
defaults to nil, which does not ignore blocking on holidays. If set
to t, time blocking will be ignored on any holiday. It may also be
set to a regular expression or a list. Holidays which match either
representation will cause time blocking to be ignored.
Commands are only time-blocked if they're defined. This is done using
define-time-blocked-command macro, which behaves similarly to
defun. After the lambda list, it has a list describing blocking and
blocking messages. This is composed of a symbol (a key in
time-block-groups) a block message, and an optional override prompt
(if present, the command will ask if you'd like to override the block
time-block-confirm-override). An example is shown below.
(define-time-blocked-command my/start-elfeed () (:workday "You have decided not to check news currently." "You have decided not to check news currently.\nStill start elfeed?") "Start `elfeed'. Time blocked according to `time-block-groups'." (interactive) (elfeed))
A "focus mode" may be enabled using the
command. This global minor mode by default will block all
block-groups, but this behavior may be changed using
A "relaxed mode" (disabling all blocking) may be enabled with the
time-block-relaxed-mode command. This global minor mode will
disable all block groups (and ignore
present, this behavior is not configurable.
You may check if a group is currently blocked using the
time-block-blocked-p function, which uses the functions in
time-block-block-checkers to determine if a group is presently
blocked. Functions in this hook must take one argument, a group name,
and return non-nil if the group is to be blocked.
Commands can also be advised to use timeblocking. This works for
simpler commands, and as a bonus, can make it harder to access the
commands when blocked. Overall, the arguments for
override-prompt are as above. Consider the
(time-block-advise my/elfeed-block-advice 'elfeed :workday "You have decided not to check news currently." "You have decided not to check news currently.\nStill start elfeed?")
Commands can also be manually advised. This can be done to prevent only certain cases from happening. For instance, I use the following code to delay myself from editing my emacs configuration during the workday.
(defun my/buffer-sets-around-advice (orig name) "Check if NAME is 'emacs', if so, follow time blocking logic before calling ORIG (`buffer-sets-load-set')." (unless (and (string= name "emacs") (time-block-blocked-p :workday) (not (time-block-confirm-override "You have decided not to edit your emacs configuration at this time.\nContinue?"))) (funcall orig name))) (advice-add 'buffer-sets-load-set :around #'my/buffer-sets-around-advice)
When an automatically-advised function or function defined with
define-time-block-command provides an override prompt, the function
time-block-confirm-override is used to confirm that the block should
be overriden. This is done following the logic of
time-block-override-confirmation-functions, an alist from block
groups (or default t) to prompting functions. The prompting function
should take one argument (a confirmation prompt) and return non-nil if
the block should be overridden. The default is
yes-or-no-p, but the
time-block-override-random-string may be used as well.
If you find an error or a bug, send an email to