diff options
Diffstat (limited to 'lisp/acdw.el')
-rw-r--r-- | lisp/acdw.el | 193 |
1 files changed, 66 insertions, 127 deletions
diff --git a/lisp/acdw.el b/lisp/acdw.el index d412b4b..69f9a7f 100644 --- a/lisp/acdw.el +++ b/lisp/acdw.el | |||
@@ -18,139 +18,79 @@ | |||
18 | ;; functions for me, acdw. | 18 | ;; functions for me, acdw. |
19 | 19 | ||
20 | ;;; Code: | 20 | ;;; Code: |
21 | |||
22 | ;; Utility constants | ||
21 | 23 | ||
22 | ;;; Utilities | ||
23 | |||
24 | ;;;; Determine the system I'm on | ||
25 | (defconst acdw/system (pcase system-type | 24 | (defconst acdw/system (pcase system-type |
26 | ('gnu/linux :home) | 25 | ('gnu/linux :home) |
27 | ((or 'msdos 'windows-nt) :work) | 26 | ((or 'msdos 'windows-nt) :work) |
28 | (_ :other)) | 27 | (_ :other)) |
29 | "Which system is currently being used.") | 28 | "Which computer system is currently being used.") |
30 | 29 | ||
31 | ;;;; Run commands only when unfocused | 30 | |
32 | (defun acdw/when-unfocused (func &rest args) | 31 | ;; Utility functions |
33 | "Call FUNC, with ARGS, iff all Emacs frames are out of focus. | 32 | |
34 | 33 | (defmacro when-unfocused (name &rest forms) | |
35 | Ready for use with `after-focus-change-function'." | 34 | "Define a function NAME, executing FORMS, that fires when Emacs |
36 | (when (seq-every-p #'null (mapcar #'frame-focus-state (frame-list))) | 35 | is unfocused." |
37 | (apply func args))) | 36 | (declare (indent 1)) |
38 | 37 | (let ((func-name (intern (concat "when-unfocused-" (symbol-name name))))) | |
39 | ;;;; Run commands at sunrise and sunset | 38 | `(progn |
40 | (defun acdw/sunrise-sunset (sunrise-command sunset-command) | 39 | (defun ,func-name () "Defined by `when-unfocused'." |
41 | "Run commands at sunrise and sunset." | 40 | (when (seq-every-p #'null |
42 | (let* ((times-regex (rx (* nonl) | 41 | (mapcar #'frame-focus-state (frame-list))) |
43 | (: (any ?s ?S) "unrise") " " | 42 | ,@forms)) |
44 | (group (repeat 1 2 digit) ":" | 43 | (add-function :after after-focus-change-function #',func-name)))) |
45 | (repeat 1 2 digit) | 44 | |
46 | (: (any ?a ?A ?p ?P) (any ?m ?M))) | 45 | (defmacro hook-defun (name hooks &rest forms) |
47 | (* nonl) | 46 | "Define a function NAME that executes FORMS, and add it to |
48 | (: (any ?s ?S) "unset") " " | 47 | each hook in HOOKS." |
49 | (group (repeat 1 2 digit) ":" | 48 | (declare (indent 2)) |
50 | (repeat 1 2 digit) | 49 | (let ((func-name (intern (concat "hook-defun-" (symbol-name name)))) |
51 | (: (any ?a ?A ?p ?P) (any ?m ?M))) | 50 | (hook-list (if (consp hooks) hooks (list hooks))) |
52 | (* nonl))) | 51 | (hook-defun-add-hook-list)) |
53 | (ss (sunrise-sunset)) | 52 | `(progn |
54 | (_m (string-match times-regex ss)) | 53 | (defun ,func-name () "Defined by `hook-defun'." ,@forms) |
55 | (sunrise-time (match-string 1 ss)) | 54 | ,@(dolist (hook hook-list hook-defun-add-hook-list) |
56 | (sunset-time (match-string 2 ss))) | 55 | (push `(add-hook ',hook #',func-name) hook-defun-add-hook-list))))) |
57 | (run-at-time sunrise-time (* 60 60 24) sunrise-command) | 56 | |
58 | (run-at-time sunset-time (* 60 60 24) sunset-command) | 57 | (defun refresh-emacs () |
59 | (run-at-time "12:00am" (* 60 60 24) sunset-command))) | 58 | "Reload Emacs's configuration files." |
60 | 59 | (interactive) | |
61 | ;;;; Define a function and add it to hooks | 60 | (dolist (file (list (locate-user-emacs-file "early-init.el") |
62 | (defun defun-with-hooks (hooks function-def) | 61 | (locate-user-emacs-file "init.el" ".emacs"))) |
63 | "Add FUNCTION-DEF to HOOKS. | 62 | (when (file-exists-p file) |
63 | (load-file file)))) | ||
64 | |||
65 | (defun acdw/dir (&optional file make-directory) | ||
66 | "Place Emacs files in one place. | ||
67 | |||
68 | If called without parameters, `acdw/dir' expands to | ||
69 | ~/.emacs.d/var or similar. If called with FILE, `acdw/dir' | ||
70 | expands FILE to ~/.emacs.d/var, optionally making its directory | ||
71 | if MAKE-DIRECTORY is non-nil." | ||
72 | (let ((dir (expand-file-name (convert-standard-filename "var/") | ||
73 | user-emacs-directory))) | ||
74 | (if file | ||
75 | (let ((file-name (expand-file-name (convert-standard-filename file) | ||
76 | dir))) | ||
77 | (when make-directory | ||
78 | (make-directory (file-name-directory file-name) 'parents)) | ||
79 | file-name) | ||
80 | dir))) | ||
64 | 81 | ||
65 | FUNCTION-DEF should be a `defun' form. This function is just to | 82 | (defun acdw/gc-enable () |
66 | put functions that only exist for hooks closer to the hooks | 83 | "Enable the Garbage collector." |
67 | they bind to." | 84 | (setq gc-cons-threshold (* 800 1024 1024) |
68 | (let ((func function-def)) | 85 | gc-cons-percentage 0.1)) |
69 | (dolist (hook hooks) | ||
70 | (add-hook hook func)))) | ||
71 | |||
72 | ;;; Garbage collection hacks | ||
73 | |||
74 | (defconst acdw/gc-cons-threshold-basis (* 800 1024) | ||
75 | "Basis value for `gc-cons-threshold' to return to after jumping. | ||
76 | 800 KB is Emacs's default.") | ||
77 | |||
78 | (defconst acdw/gc-cons-percentage-basis 0.1 | ||
79 | "Basis value for `gc-cons-percentage' to return to after jumping. | ||
80 | 0.1 is Emacs's default.") | ||
81 | 86 | ||
82 | (defun acdw/gc-disable () | 87 | (defun acdw/gc-disable () |
83 | "Disable garbage collection by setting relevant variables to their maxima." | 88 | "Functionally disable the Garbage collector." |
84 | (setq gc-cons-threshold most-positive-fixnum | 89 | (setq gc-cons-threshold most-positive-fixnum |
85 | gc-cons-percentage 0.8)) | 90 | gc-cons-percentage 0.8)) |
86 | 91 | ||
87 | (defun acdw/gc-enable () | 92 | |
88 | "Re-enable garbage collection by setting relevant variables back to bases." | 93 | ;; Make `C-z' more useful |
89 | (setq gc-cons-threshold acdw/gc-cons-threshold-basis | ||
90 | gc-cons-percentage acdw/gc-cons-percentage-basis)) | ||
91 | |||
92 | ;;; Directories (think `no-littering') | ||
93 | |||
94 | (defvar acdw/dir (expand-file-name | ||
95 | (convert-standard-filename "var/") | ||
96 | user-emacs-directory) | ||
97 | "A directory to hold extra configuration and emacs data.") | ||
98 | |||
99 | (defun acdw/in-dir (file &optional make-directory) | ||
100 | "Expand FILE relative to `acdw/dir', optionally creating its | ||
101 | directory." | ||
102 | (let ((f (expand-file-name (convert-standard-filename file) | ||
103 | acdw/dir))) | ||
104 | (when make-directory | ||
105 | (make-directory (file-name-directory f) 'parents)) | ||
106 | f)) | ||
107 | |||
108 | ;;; Reading mode | ||
109 | |||
110 | (define-minor-mode acdw/reading-mode | ||
111 | "A mode for reading." | ||
112 | :init-value t | ||
113 | :lighter " Read" | ||
114 | (if acdw/reading-mode | ||
115 | (progn ;; turn on | ||
116 | ;; settings | ||
117 | (setq-local mode-line-format | ||
118 | '(:eval | ||
119 | (let* ((fmt " Reading %b (%m) ") | ||
120 | (len (length (format-mode-line fmt)))) | ||
121 | (concat | ||
122 | (propertize " " | ||
123 | 'display `((space :align-to (- right | ||
124 | ,len))) | ||
125 | 'face '(:inherit italic)) | ||
126 | fmt)))) | ||
127 | ;; modes to disable | ||
128 | (dolist (mode '(display-fill-column-indicator-mode)) | ||
129 | (when (fboundp mode) | ||
130 | (funcall mode -1))) | ||
131 | ;; modes to enable | ||
132 | (dolist (mode '(iscroll-mode | ||
133 | olivetti-mode)) | ||
134 | (when (fboundp mode) | ||
135 | (funcall mode +1)))) | ||
136 | ;; turn off | ||
137 | ;; settings | ||
138 | (kill-local-variable 'mode-line-format) | ||
139 | ;; modes to re-enable | ||
140 | (dolist (mode '(display-fill-column-indicator-mode | ||
141 | simple-modeline-mode)) | ||
142 | (when (fboundp mode) | ||
143 | (funcall mode +1))) | ||
144 | ;; modes to re-disable | ||
145 | (dolist (mode '(olivetti-mode | ||
146 | iscroll-mode)) | ||
147 | (when (fboundp mode) | ||
148 | (funcall mode -1))) | ||
149 | (force-mode-line-update))) | ||
150 | |||
151 | ;;; Keymap & Mode | ||
152 | |||
153 | ;; Set up a leader key for `acdw/mode' | ||
154 | (defvar acdw/leader | 94 | (defvar acdw/leader |
155 | (let ((map (make-sparse-keymap)) | 95 | (let ((map (make-sparse-keymap)) |
156 | (c-z (global-key-binding "\C-z"))) | 96 | (c-z (global-key-binding "\C-z"))) |
@@ -159,5 +99,4 @@ directory." | |||
159 | map)) | 99 | map)) |
160 | 100 | ||
161 | (provide 'acdw) | 101 | (provide 'acdw) |
162 | |||
163 | ;;; acdw.el ends here | 102 | ;;; acdw.el ends here |