From 2c93878756d6e0c83853195a192ef6b80894c59f Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Thu, 30 Sep 2021 23:17:41 -0500 Subject: [PATCH] Re-write acdw-reading.el --- lisp/acdw-reading.el | 105 ++++++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 36 deletions(-) diff --git a/lisp/acdw-reading.el b/lisp/acdw-reading.el index e3d5716..ff4f0c2 100644 --- a/lisp/acdw-reading.el +++ b/lisp/acdw-reading.el @@ -17,8 +17,60 @@ ;;; Code: -(defvar-local //indicate-empty-lines nil) -(defvar-local //indicate-buffer-boundaries nil) +;;; Customizations + +(defgroup reading nil + "Group for Reading mode customizations." + :prefix "reading-" + :group 'convenience) ; i need to figure this out + +(defcustom reading-vars '((indicate-empty-lines . nil) + (indicate-buffer-boundaries . nil)) + "Alist of variables to set in function `reading-mode'. +The car of each cell is the variable name, and the cdr is the +value to set it to." + :type '(alist :key-type variable + :value-type sexp)) + +(defcustom reading-modes '((display-fill-column-indicator-mode . -1) + (blink-cursor-mode . -1)) + "Alist of modes to set in function `reading-mode'. +The car of each cell is the function name, and the cdr is the +value to call it with." + :type '(alist :key-type function + :value-type sexp)) + +;;; Internal + +(defvar reading--remembered-template "reading--remembered-%s-value" + "The template passed to `format' for remembered modes and variables.") + +(defun reading--remember (things func) + "Apply FUNC to THINGS, remembering their previous value for later." + (declare (indent 1)) + (unless (listp things) + (setq things (list things))) + (dolist (thing things) + (set (make-local-variable + (intern (format reading--remembered-template thing))) + (and (boundp thing) + (symbol-value thing))) + (funcall func thing))) + +(defun reading--recall (things func) + "Recall previously remembered THINGS by applying FUNC to them. +FUNC should be a function with the signature (THING REMEMBERED-SETTING)." + (declare (indent 1)) + (unless (listp things) + (setq things (list things))) + (dolist (thing things) + (with-demoted-errors "reading--recall: %S" + (let ((value (symbol-value + (intern + (format reading--remembered-template thing))))) + (funcall func thing value))))) + +;;; Mode ;;;###autoload (define-minor-mode reading-mode @@ -27,41 +79,22 @@ :lighter " Read" :keymap (make-sparse-keymap) (if reading-mode - (progn ;; turn on - ;; settings - (setq-local //indicate-empty-lines indicate-empty-lines - indicate-empty-lines nil - //indicate-buffer-boundaries indicate-buffer-boundaries - indicate-buffer-boundaries nil) - ;; disable modes - (dolist (mode '(display-fill-column-indicator-mode - blink-cursor-mode)) - (when (fboundp mode) - (set (make-local-variable - (intern (format "//%s" mode))) - (and (boundp mode) - (symbol-value mode))) - (funcall mode -1))) - ;; enable modes - (dolist (mode '(olivetti-mode)) - (when (fboundp mode) - (set (make-local-variable - (intern (format "//%s" mode))) - (and (boundp mode) - (symbol-value mode))) - (funcall mode +1)))) + ;; turn on + (progn + (reading--remember (mapcar #'car reading-vars) + (lambda (var) + (set (make-local-variable var) + (cdr (assoc var reading-vars))))) + (reading--remember (mapcar #'car reading-modes) + (lambda (mode) + (funcall mode (cdr (assoc mode reading-modes)))))) ;; turn off - ;; restore settings - (setq-local indicate-empty-lines //indicate-empty-lines - indicate-buffer-boundaries //indicate-buffer-boundaries) - ;; restore modes - (dolist (mode '(display-fill-column-indicator-mode - olivetti-mode - blink-cursor-mode)) - (when (fboundp mode) - (funcall mode (if (symbol-value (intern (format "//%s" mode))) - +1 - -1)))))) + (reading--recall (mapcar #'car reading-vars) + (lambda (var orig-val) + (set (make-local-variable var) orig-val))) + (reading--recall (mapcar #'car reading-modes) + (lambda (mode orig-setting) + (funcall mode (if orig-setting +1 -1)))))) (provide 'acdw-reading) ;;; acdw-reading.el ends here