Switch to using `setup.el' for customizations

setup (https://git.sr.ht/~zge/setup) does everything I tried to do with
`acdw/pkg', et al., but better.
This commit is contained in:
Case Duckworth 2021-03-29 17:52:23 -05:00
parent 2fdfc43684
commit 1dd6b9c0ee
3 changed files with 715 additions and 693 deletions

View File

@ -27,64 +27,53 @@
;;; Speed up init ;;; Speed up init
;; see doom-emacs, et al. ;; see doom-emacs, et al.
(defconst gc-cons-threshold-basis (* 800 1000)
"The basis value for `gc-cons-threshold' to return to after a jump.
800 KB is Emacs's default `gc-cons-threshold'.")
(defconst gc-cons-percentage-basis 0.1
"The basis value for `gc-cons-percentage' to return to after init.
0.1 is Emacs's default `gc-cons-percentage'.")
(defvar orig-file-name-handler-alist file-name-handler-alist (defvar orig-file-name-handler-alist file-name-handler-alist
"The original value of `file-name-handler-alist' will be restored "The original value of `file-name-handler-alist' will be restored
after init.") after init.")
(setq gc-cons-threshold most-positive-fixnum (setq file-name-handler-alist nil)
gc-cons-percentage 0.6 (acdw/gc-disable)
file-name-handler-alist nil)
(defun hook--post-init-reset () (add-hook 'after-init-hook
"Reset `gc-cons-threshold', `gc-cons-percentage', and (defun hook--post-init-reset ()
"Reset `gc-cons-threshold', `gc-cons-percentage', and
`file-name-handler-alist' to their defaults after init." `file-name-handler-alist' to their defaults after init."
(setq gc-cons-threshold gc-cons-threshold-basis (acdw/gc-enable)
gc-cons-percentage gc-cons-percentage-basis) (dolist (handler file-name-handler-alist)
(dolist (handler file-name-handler-alist) (add-to-list 'orig-file-name-handler-alist handler))
(add-to-list 'orig-file-name-handler-alist handler)) (setq file-name-handler-alist orig-file-name-handler-alist)))
(setq file-name-handler-alist orig-file-name-handler-alist))
(add-hook 'after-init-hook #'hook--post-init-reset)
;;; Frame settings ;;; Frame settings
(setq default-frame-alist ; Remove most UI (setq default-frame-alist ; Remove most UI
`((tool-bar-lines . 0) ; No tool bar `((tool-bar-lines . 0) ; No tool bar
(menu-bar-lines . 0) ; No menu bar (menu-bar-lines . 0) ; No menu bar
(vertical-scroll-bars) ; No scroll bars (vertical-scroll-bars) ; No scroll bars
(horizontal-scroll-bars) ; ... at all (horizontal-scroll-bars) ; ... at all
(width . 84) ; A /little/ wider than (width . 84) ; A /little/ wider than
; `fill-column' (set later) ; `fill-column' (set later)
(height . 30) (height . 30)
(left-fringe . 8) ; Width of fringes (left-fringe . 8) ; Width of fringes
(right-fringe . 8) ; (8 is default) (right-fringe . 8) ; (8 is default)
(font . ,(pcase acdw/system (font . ,(pcase acdw/system
(:home "DejaVu Sans Mono 10") (:home "DejaVu Sans Mono 10")
(:work "Consolas 10")))) (:work "Consolas 10"))))
frame-inhibit-implied-resize t ; Don't resize randomly frame-inhibit-implied-resize t ; Don't resize randomly
frame-resize-pixelwise t ; Resize by pixels, not chars frame-resize-pixelwise t ; Resize by pixels, not chars
) )
(defun hook--disable-ui-modes () (defun hook--disable-ui-modes ()
"Disable frame UI using modes, for toggling later." "Disable frame UI using modes, for toggling later."
(dolist (mode ;; each mode is of the form (MODE . FRAME-ALIST-VAR) (dolist (mode ;; each mode is of the form (MODE . FRAME-ALIST-VAR)
'((tool-bar-mode . tool-bar-lines) '((tool-bar-mode . tool-bar-lines)
(menu-bar-mode . menu-bar-lines) (menu-bar-mode . menu-bar-lines)
(scroll-bar-mode . vertical-scroll-bars) (scroll-bar-mode . vertical-scroll-bars)
(horizontal-scroll-bar-mode . horizontal-scroll-bars) (horizontal-scroll-bar-mode . horizontal-scroll-bars)
)) ))
(let ((setting (alist-get (cdr mode) default-frame-alist))) (let ((setting (alist-get (cdr mode) default-frame-alist)))
(when (or (not setting) (when (or (not setting)
(= 0 setting)) (= 0 setting))
(funcall (car mode) -1))))) (funcall (car mode) -1)))))
(add-hook 'after-init-hook #'hook--disable-ui-modes) (add-hook 'after-init-hook #'hook--disable-ui-modes)
@ -92,11 +81,11 @@
;; 1. Update `exec-path'. ;; 1. Update `exec-path'.
(dolist (path (list (expand-file-name "bin" user-emacs-directory) (dolist (path (list (expand-file-name "bin" user-emacs-directory)
(expand-file-name "~/bin") (expand-file-name "~/bin")
(expand-file-name "~/.local/bin") (expand-file-name "~/.local/bin")
(expand-file-name "~/usr/bin") (expand-file-name "~/usr/bin")
(expand-file-name "~/cmd") (expand-file-name "~/cmd")
(expand-file-name "~/mingw64/bin"))) (expand-file-name "~/mingw64/bin")))
(when (file-exists-p path) (when (file-exists-p path)
(add-to-list 'exec-path path :append))) (add-to-list 'exec-path path :append)))
@ -104,27 +93,25 @@
(setenv "PATH" (mapconcat #'identity exec-path path-separator)) (setenv "PATH" (mapconcat #'identity exec-path path-separator))
;; 2. Set `package' and `straight' variables. ;; 2. Set `package' and `straight' variables.
(setq package-enable-at-startup nil ; not sure if strictly (setq package-enable-at-startup nil
; necessary package-quickstart nil
package-quickstart nil ; ditto
straight-host-usernames '((github . "duckwork") straight-host-usernames '((github . "duckwork")
(gitlab . "acdw")) (gitlab . "acdw"))
straight-base-dir acdw/dir ; don't clutter ~/.emacs.d straight-base-dir acdw/dir)
)
;; 3. Bootstrap `straight'. ;; 3. Bootstrap `straight'.
(defvar bootstrap-version) (defvar bootstrap-version)
(let ((bootstrap-file (let ((bootstrap-file
(expand-file-name (expand-file-name
"straight/repos/straight.el/bootstrap.el" "straight/repos/straight.el/bootstrap.el"
straight-base-dir)) straight-base-dir))
(bootstrap-version 5)) (bootstrap-version 5))
(unless (file-exists-p bootstrap-file) (unless (file-exists-p bootstrap-file)
(with-current-buffer (with-current-buffer
(url-retrieve-synchronously (url-retrieve-synchronously
(concat "https://raw.githubusercontent.com/" (concat "https://raw.githubusercontent.com/"
"raxod502/straight.el/develop/install.el") "raxod502/straight.el/develop/install.el")
'silent 'inhibit-cookies) 'silent 'inhibit-cookies)
(goto-char (point-max)) (goto-char (point-max))
(eval-print-last-sexp))) (eval-print-last-sexp)))
(load bootstrap-file nil 'nomessage)) (load bootstrap-file nil 'nomessage))
@ -134,10 +121,10 @@
(defun hook--message-startup-time () (defun hook--message-startup-time ()
"Show Emacs's startup time in the message buffer. For profiling." "Show Emacs's startup time in the message buffer. For profiling."
(message "Emacs ready in %s with %d garbage collections." (message "Emacs ready in %s with %d garbage collections."
(format "%.2f seconds" (format "%.2f seconds"
(float-time (time-subtract after-init-time (float-time (time-subtract after-init-time
before-init-time))) before-init-time)))
gcs-done)) gcs-done))
(add-hook 'emacs-startup-hook #'hook--message-startup-time) (add-hook 'emacs-startup-hook #'hook--message-startup-time)

913
init.el

File diff suppressed because it is too large Load Diff

View File

@ -22,9 +22,9 @@
;;; Utilities ;;; Utilities
(defconst acdw/system (pcase system-type (defconst acdw/system (pcase system-type
('gnu/linux :home) ('gnu/linux :home)
((or 'msdos 'windows-nt) :work) ((or 'msdos 'windows-nt) :work)
(_ :other)) (_ :other))
"Which system is currently being used.") "Which system is currently being used.")
(defun acdw/when-unfocused (func &rest args) (defun acdw/when-unfocused (func &rest args)
@ -37,220 +37,260 @@ Ready for use with `after-focus-change-function'."
(defun acdw/sunrise-sunset (sunrise-command sunset-command) (defun acdw/sunrise-sunset (sunrise-command sunset-command)
"Run commands at sunrise and sunset." "Run commands at sunrise and sunset."
(let* ((times-regex (rx (* nonl) (let* ((times-regex (rx (* nonl)
(: (any ?s ?S) "unrise") " " (: (any ?s ?S) "unrise") " "
(group (repeat 1 2 digit) ":" (group (repeat 1 2 digit) ":"
(repeat 1 2 digit) (repeat 1 2 digit)
(: (any ?a ?A ?p ?P) (any ?m ?M))) (: (any ?a ?A ?p ?P) (any ?m ?M)))
(* nonl) (* nonl)
(: (any ?s ?S) "unset") " " (: (any ?s ?S) "unset") " "
(group (repeat 1 2 digit) ":" (group (repeat 1 2 digit) ":"
(repeat 1 2 digit) (repeat 1 2 digit)
(: (any ?a ?A ?p ?P) (any ?m ?M))) (: (any ?a ?A ?p ?P) (any ?m ?M)))
(* nonl))) (* nonl)))
(ss (sunrise-sunset)) (ss (sunrise-sunset))
(_m (string-match times-regex ss)) (_m (string-match times-regex ss))
(sunrise-time (match-string 1 ss)) (sunrise-time (match-string 1 ss))
(sunset-time (match-string 2 ss))) (sunset-time (match-string 2 ss)))
(run-at-time sunrise-time (* 60 60 24) sunrise-command) (run-at-time sunrise-time (* 60 60 24) sunrise-command)
(run-at-time sunset-time (* 60 60 24) sunset-command) (run-at-time sunset-time (* 60 60 24) sunset-command)
(run-at-time "12:00am" (* 60 60 24) sunset-command))) (run-at-time "12:00am" (* 60 60 24) sunset-command)))
;;; Garbage collection hacks
(defconst acdw/gc-cons-threshold-basis (* 800 1024 1024)
"Basis value for `gc-cons-threshold' to return to after jumping.
800 KB is Emacs's default.")
(defconst acdw/gc-cons-percentage-basis 0.1
"Basis value for `gc-cons-percentage' to return to after jumping.
0.1 is Emacs's default.")
(defun acdw/gc-disable ()
"Disable garbage collection by setting relevant variables to their maxima."
(setq gc-cons-threshold most-positive-fixnum
gc-cons-percentage 0.8))
(defun acdw/gc-enable ()
"Re-enable garbage collection by setting relevant variables back to bases."
(setq gc-cons-threshold acdw/gc-cons-threshold-basis
gc-cons-percentage acdw/gc-cons-percentage-basis))
;;; Directories (think `no-littering') ;;; Directories (think `no-littering')
(defvar acdw/dir (expand-file-name (defvar acdw/dir (expand-file-name
(convert-standard-filename "var/") (convert-standard-filename "var/")
user-emacs-directory) user-emacs-directory)
"A directory to hold extra configuration and emacs data.") "A directory to hold extra configuration and emacs data.")
(defun acdw/in-dir (file &optional make-directory) (defun acdw/in-dir (file &optional make-directory)
"Expand FILE relative to `acdw/dir', optionally creating its "Expand FILE relative to `acdw/dir', optionally creating its
directory." directory."
(let ((f (expand-file-name (convert-standard-filename file) (let ((f (expand-file-name (convert-standard-filename file)
acdw/dir))) acdw/dir)))
(when make-directory (when make-directory
(make-directory (file-name-directory f) 'parents)) (make-directory (file-name-directory f) 'parents))
f)) f))
;;; Settings ;;; Settings
(defun acdw/set (assignments) ;; (defun acdw/set (assignments)
"Perform `customize-set-variable' on each of ASSIGNMENTS. ;; "Perform `customize-set-variable' on each of ASSIGNMENTS.
ASSIGNMENTS is a list where each element is of the form ;; ASSIGNMENTS is a list where each element is of the form
(VARIABLE VALUE [COMMENT])." ;; (VARIABLE VALUE [COMMENT])."
(let (setting) ; for return value ;; (let (setting) ; for return value
(dolist (assignment assignments setting) ;; (dolist (assignment assignments setting)
(customize-set-variable (car assignment) ;; (customize-set-variable (car assignment)
(cadr assignment) ;; (cadr assignment)
(if (and (caddr assignment) ;; (if (and (caddr assignment)
(stringp (caddr assignment))) ;; (stringp (caddr assignment)))
(caddr assignment) ;; (caddr assignment)
"Customized by `acdw/set'.")) ;; "Customized by `acdw/set'."))
(setq setting (car assignment))))) ;; (setq setting (car assignment)))))
;;; Faces ;;; Faces
(defun acdw/set-face (face spec) ;; (defun acdw/set-face (face spec)
"Customize FACE according to SPEC, and register it with `customize'. ;; "Customize FACE according to SPEC, and register it with `customize'.
SPEC is as for `defface'." ;; SPEC is as for `defface'."
(put face 'customized-face spec) ;; (put face 'customized-face spec)
(face-spec-set face spec)) ;; (face-spec-set face spec))
(defmacro acdw/set-faces (face-specs) ;; (defmacro acdw/set-faces (face-specs)
"Run `acdw/set-face' over each face in FACE-SPECS." ;; "Run `acdw/set-face' over each face in FACE-SPECS."
(let (face-list) ;; (let (face-list)
(dolist (face face-specs) ;; (dolist (face face-specs)
(push `(acdw/set-face ',(car face) ',(cdr face)) face-list)) ;; (push `(acdw/set-face ',(car face) ',(cdr face)) face-list))
`(progn ;; `(progn
,@face-list))) ;; ,@face-list)))
;;; Hooks ;;; Hooks
(defmacro acdw/hooks (hook-specs &rest args) ;; (defmacro acdw/hooks (hook-specs &rest args)
"Add functions to hooks, according to HOOK-SPECS. ;; "Add functions to hooks, according to HOOK-SPECS.
Each HOOK-SPEC is of the following format: (HOOKS FUNCS [DEPTH] [LOCAL]). ;; Each HOOK-SPEC is of the following format: (HOOKS FUNCS [DEPTH] [LOCAL]).
Either HOOKS or FUNCS can also be a list, in which case `add-hook' is called ;; Either HOOKS or FUNCS can also be a list, in which case `add-hook' is called
over the Cartesian product of HOOKS and FUNCS. In each HOOK-SPEC, DEPTH and ;; over the Cartesian product of HOOKS and FUNCS. In each HOOK-SPEC, DEPTH and
LOCAL apply to all hooks defined; if finer control is needed, either pass the ;; LOCAL apply to all hooks defined; if finer control is needed, either pass the
same hooks and functions in different HOOK-SPECs, or just use `add-hook'. ;; same hooks and functions in different HOOK-SPECs, or just use `add-hook'.
ARGS accept the following keywords: ;; ARGS accept the following keywords:
:after FEATURE .. `autoload' all functions after FEATURE." ;; :after FEATURE .. `autoload' all functions after FEATURE."
(let ((after (plist-get args :after)) ;; (let ((after (plist-get args :after))
(command-list)) ;; (command-list))
(dolist (spec hook-specs) ;; (dolist (spec hook-specs)
(let* ((hooks (car spec)) ;; (let* ((hooks (car spec))
(funcs (cadr spec)) ;; (funcs (cadr spec))
(depth (or (caddr spec) 0)) ;; (depth (or (caddr spec) 0))
(local (cadddr spec))) ;; (local (cadddr spec)))
(when (not (listp hooks)) (setq hooks (list hooks))) ;; (when (not (listp hooks)) (setq hooks (list hooks)))
(when (not (listp funcs)) (setq funcs (list funcs))) ;; (when (not (listp funcs)) (setq funcs (list funcs)))
(dolist (hook hooks) ;; (dolist (hook hooks)
(dolist (func funcs) ;; (dolist (func funcs)
(push `(add-hook ',hook #',func ,depth ,local) command-list) ;; (push `(add-hook ',hook #',func ,depth ,local) command-list)
(when after ;; (when after
(push `(autoload #',func ,after) command-list)))))) ;; (push `(autoload #',func ,after) command-list))))))
`(progn ;; `(progn
,@command-list))) ;; ,@command-list)))
;;; Keybindings ;;; Keybindings
(defvar acdw/bind-default-map 'acdw/map ;; (defvar acdw/bind-default-map 'acdw/map
"The default keymap to use with `acdw/bind'.") ;; "The default keymap to use with `acdw/bind'.")
(defmacro acdw/bind (key command &rest args) ;; (defmacro acdw/bind (key command &rest args)
"A simple key-binding macro to take care of the repetitive stuff ;; "A simple key-binding macro to take care of the repetitive stuff
automatically. ;; automatically.
If KEY is a vector, it's passed directly to `define-key', ;; If KEY is a vector, it's passed directly to `define-key',
otherwise it's wrapped in `kbd'. ;; otherwise it's wrapped in `kbd'.
The following keywords are recognized: ;; The following keywords are recognized:
:after ARGS .. call `autoload' on COMMAND using ARGS before ;; :after ARGS .. call `autoload' on COMMAND using ARGS before
binding the key. ARGS can be just the filename to ;; binding the key. ARGS can be just the filename to
load; in that case it's wrapped in a list. ;; load; in that case it's wrapped in a list.
:map KEYMAP .. define KEY in KEYMAP instead of the ;; :map KEYMAP .. define KEY in KEYMAP instead of the
default `acdw/bind-default-map'. If `:after' is also supplied, ;; default `acdw/bind-default-map'. If `:after' is also supplied,
run `autoload' on KEYMAP (except when using `:map-after', see). ;; run `autoload' on KEYMAP (except when using `:map-after', see).
:map-after FILE .. run the underlying `define-key' command in an ;; :map-after FILE .. run the underlying `define-key' command in an
`with-eval-after-load'. For the rare occasion when the keymap is ;; `with-eval-after-load'. For the rare occasion when the keymap is
defined in a different file than the command it binds (looking ;; defined in a different file than the command it binds (looking
at you, `org-mode')." ;; at you, `org-mode')."
(let ((after (when-let (sym (plist-get args :after)) ;; (let ((after (when-let (sym (plist-get args :after))
(if (not (listp sym)) ;; (if (not (listp sym))
(list sym) ;; (list sym)
sym))) ;; sym)))
(map-after (plist-get args :map-after)) ;; (map-after (plist-get args :map-after))
(keymap (or (plist-get args :map) acdw/bind-default-map)) ;; (keymap (or (plist-get args :map) acdw/bind-default-map))
(keycode (if (vectorp key) key (kbd key))) ;; (keycode (if (vectorp key) key (kbd key)))
(command-list)) ;; (command-list))
(let ((define-key-command `(define-key ,keymap ,keycode ',command))) ;; (let ((define-key-command `(define-key ,keymap ,keycode ',command)))
(if map-after ;; (if map-after
(push `(with-eval-after-load ,map-after ;; (push `(with-eval-after-load ,map-after
,define-key-command) ;; ,define-key-command)
command-list) ;; command-list)
(push define-key-command command-list))) ;; (push define-key-command command-list)))
(when after ;; (when after
(unless (fboundp command) ;; (unless (fboundp command)
(push `(autoload ',command ,@after) command-list)) ;; (push `(autoload ',command ,@after) command-list))
(unless (or map-after ;; (unless (or map-after
(eq keymap acdw/bind-default-map)) ;; (eq keymap acdw/bind-default-map))
(push `(autoload ',keymap ,(car after) nil nil 'keymap) command-list))) ;; (push `(autoload ',keymap ,(car after) nil nil 'keymap) command-list)))
`(progn ;; `(progn
,@command-list))) ;; ,@command-list)))
(defmacro acdw/binds (bindings) ;; (defmacro acdw/binds (bindings)
"Bind multiple keys at once." ;; "Bind multiple keys at once."
(let (bind-list) ;; (let (bind-list)
(dolist (bind bindings) ;; (dolist (bind bindings)
(push `(acdw/bind ,@bind) bind-list)) ;; (push `(acdw/bind ,@bind) bind-list))
`(progn ;; `(progn
,@bind-list))) ;; ,@bind-list)))
;; convenience ;; convenience
(defmacro acdw/bind-after-map (file keymap bindings) ;; (defmacro acdw/bind-after-map (file keymap bindings)
"Wrap multiple calls of `acdw/bind' after FILE and with KEYMAP. ;; "Wrap multiple calls of `acdw/bind' after FILE and with KEYMAP.
KEYMAP can be nil." ;; KEYMAP can be nil."
(declare (indent 2)) ;; (declare (indent 2))
(let ((bind-list) ;; (let ((bind-list)
(extra-args (if keymap ;; (extra-args (if keymap
`(:after ,file :map ,keymap) ;; `(:after ,file :map ,keymap)
`(:after ,file)))) ;; `(:after ,file))))
(dolist (binding bindings) ;; (dolist (binding bindings)
(push `(acdw/bind ,@binding ,@extra-args) bind-list)) ;; (push `(acdw/bind ,@binding ,@extra-args) bind-list))
`(progn ;; `(progn
,@bind-list))) ;; ,@bind-list)))
;;; Packages ;;; Packages
(defmacro acdw/pkg (package &rest args) ;; (defmacro acdw/pkg (package &rest args)
"Set up a package using `straight.el'. ;; "Set up a package using `straight.el'.
ARGS can include the following keywords: ;; ARGS can include the following keywords:
:local BOOL .. if BOOL is non-nil, don't run `straight-use-package' on ;; :local BOOL .. if BOOL is non-nil, don't run `straight-use-package' on
PACKAGE. Good for using `acdw/pkg' on local features. ;; PACKAGE. Good for using `acdw/pkg' on local features.
:require BOOL .. if BOOL is non-nil, run `require' on PACKAGE before anything. ;; :require BOOL .. if BOOL is non-nil, run `require' on PACKAGE before anything.
:now FORMS .. run FORMS immediately. ;; :now FORMS .. run FORMS immediately.
:then FORMS .. run FORMS after loading PACKAGE, using `with-eval-after-load'. ;; :then FORMS .. run FORMS after loading PACKAGE, using `with-eval-after-load'.
:set SETTINGS .. pass SETTINGS to `acdw/set', right after `:now' forms. ;; :set SETTINGS .. pass SETTINGS to `acdw/set', right after `:now' forms.
SETTINGS should be properly quoted, just like they'd be passed ;; SETTINGS should be properly quoted, just like they'd be passed
to the function. ;; to the function.
:binds BINDS .. run `acdw/bind-after-map' on BINDS. ;; :binds BINDS .. run `acdw/bind-after-map' on BINDS.
:hooks HOOKS .. run `acdw/hooks' on HOOKS." ;; :hooks HOOKS .. run `acdw/hooks' on HOOKS."
(declare (indent 1)) ;; (declare (indent 1))
(let ((local-pkg (plist-get args :local)) ;; (let ((local-pkg (plist-get args :local))
(require-pkg (plist-get args :require)) ;; (require-pkg (plist-get args :require))
(now-forms (plist-get args :now)) ;; (now-forms (plist-get args :now))
(settings (plist-get args :set)) ;; (settings (plist-get args :set))
(binds (plist-get args :binds)) ;; (binds (plist-get args :binds))
(hooks (plist-get args :hooks)) ;; (hooks (plist-get args :hooks))
(then-forms (plist-get args :then)) ;; (then-forms (plist-get args :then))
(requirement (if (listp package) ;; (requirement (if (listp package)
(car package) ;; (car package)
package)) ;; package))
(final-form)) ;; (final-form))
(when then-forms ;; (when then-forms
(push `(with-eval-after-load ',requirement ,@then-forms) final-form)) ;; (push `(with-eval-after-load ',requirement ,@then-forms) final-form))
(when hooks ;; (when hooks
(push `(acdw/hooks ,hooks :after ,(symbol-name requirement)) final-form)) ;; (push `(acdw/hooks ,hooks :after ,(symbol-name requirement)) final-form))
(when binds ;; (when binds
(push `(acdw/bind-after-map ,(symbol-name requirement) nil ,binds) ;; (push `(acdw/bind-after-map ,(symbol-name requirement) nil ,binds)
final-form)) ;; final-form))
(when settings ;; (when settings
(push `(acdw/set ,settings) final-form)) ;; (push `(acdw/set ,settings) final-form))
(when now-forms ;; (when now-forms
(push `(progn ,@now-forms) final-form)) ;; (push `(progn ,@now-forms) final-form))
(unless local-pkg ;; (unless local-pkg
(push `(straight-use-package ',package) final-form)) ;; (push `(straight-use-package ',package) final-form))
(when require-pkg ;; (when require-pkg
(push `(require ',requirement) final-form)) ;; (push `(require ',requirement) final-form))
`(progn ;; `(progn
,@final-form))) ;; ,@final-form)))
;;; Reading mode
(define-minor-mode acdw/reading-mode
"A mode for reading."
:init-value t
:lighter " Read"
(if acdw/reading-mode
(progn ;; turn on
(display-fill-column-indicator-mode -1)
(dolist (mode '(visual-fill-column-mode
iscroll-mode))
(when (fboundp mode)
(funcall mode +1))))
;; turn off
(display-fill-column-indicator-mode +1)
(dolist (mode '(visual-fill-column-mode
iscroll-mode))
(when (fboundp mode)
(funcall mode -1)))))
;;; Keymap & Mode ;;; Keymap & Mode
@ -273,7 +313,7 @@ ARGS can include the following keywords:
;; Set up a leader key for `acdw/mode' ;; Set up a leader key for `acdw/mode'
(defvar acdw/leader (defvar acdw/leader
(let ((map (make-sparse-keymap)) (let ((map (make-sparse-keymap))
(c-z (global-key-binding "\C-z"))) (c-z (global-key-binding "\C-z")))
(define-key acdw/map "\C-z" map) (define-key acdw/map "\C-z" map)
(define-key map "\C-z" c-z) (define-key map "\C-z" c-z)
map)) map))