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:
parent
2fdfc43684
commit
1dd6b9c0ee
111
early-init.el
111
early-init.el
|
@ -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)
|
||||||
|
|
||||||
|
|
384
lisp/acdw.el
384
lisp/acdw.el
|
@ -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))
|
||||||
|
|
Loading…
Reference in New Issue