Add system-file, system-system-file, and change logic around

This commit is contained in:
Case Duckworth 2022-01-04 15:29:54 -06:00
parent 7c76d024bf
commit ef74ca5c9b
2 changed files with 63 additions and 23 deletions

View File

@ -54,6 +54,8 @@ See `no-littering' for examples.")
;; Load system-specific changes.
(progn (require 'system)
(setq system-default-font "DejaVu Sans Mono"
system-variable-pitch-font "DejaVu Sans")
(setq system-load-directory (sync/ "emacs/systems/" t))
(system-settings-load nil :nowarn))

View File

@ -58,6 +58,10 @@ A floating-point number is recommended, since that makes it
relative to the `default' face height."
:type 'number)
(defvar system-file nil
"The current system's file for system-specific configuration.
Do not edit this by hand. Instead, call `system-system-file'.")
;;; Functions
;; Convenience functions for systems
@ -74,40 +78,74 @@ relative to the `default' face height."
This function is like `warn', except it uses the `system' type."
(display-warning 'system (apply #'format-message message args)))
(defun system-system-file (&optional system refresh-cache set-system-file-p)
"Determine the current system's system-specific file.
The current system's file will be returned, and the value of
`system-file' set /unless/ the parameter SYSTEM was passed to
this function and SET-SYSTEM-FILE-P is nil. If both SYSTEM and
SET-SYSTEM-FILE-P are non-nil, this function will still set
`system-file'.
If SYSTEM is not passed, and `system-file' is set, simply return
its value /unless/ REFRESH-CACHE is non-nil, in which case
`system-load-alist' will be looped through to find the
appropriate system by testing the car of each cell there. When
one matches, use the cdr of that cell as SYSTEM. If none
matches, return nil.
This function will only look for system-specific files in
`system-load-directory'."
(let* ((system* (or system
(and system-file (not refresh-cache))
(cl-loop for (p . s) in system-load-alist
if (funcall p) return s)))
(file (expand-file-name (format "%s" system*) system-load-directory)))
(when (or (not system)
(and system set-system-file-p))
(setq system-file file))
file))
;;;###autoload
(defun system-settings-load (&optional system error nomessage)
"Load system settings.
If optional SYSTEM (a symbol or a string) is not provided, loop
through `system-load-alist', testing the car of each cell there.
When one matches, use the cdr of that cell as SYSTEM. Either
way, look in `system-load-directory' for the files to load.
Load settings from `system-file', or the `system-file' as
determined by SYSTEM, if passed. See `system-system-file' for
details on how the `system-file' is determined.
If none match, warn the user.
ERROR determines how to deal with errors: if nil, warn the user
when `system-file' can't be found or when the system being used
can't be determined. If t, those are elevated to errors. If any
other value, the errors are completely ignored.
Optional argument ERROR is similar to in `load', but negated: if
t, it will generate an error; if nil, it will warn the user;
otherwise, if ERROR is anything else, it will be completely
silent.
NOMESSAGE is passed as-is to `load'."
(let ((system (or system
(cl-loop for (p . s) in system-load-alist
if (funcall p)
return s))))
(if system
NOMESSAGE is passed directly to `load'."
(let ((file (system-system-file system)))
(if file
(condition-case e
(load (expand-file-name (format "%s" system) system-load-directory)
nil nomessage)
(load file nil nomessage)
(t (cond ((eq error t) (signal (car e) (cdr e)))
((null error) (system-warn
(concat
"Couldn't find file `%s' to load"
" (Looked in %s).")
system system-load-directory)))))
((null error) (system-warn "Couldn't find file `%s'."
file)))))
(funcall (cond ((eq error t) #'error)
((null error) #'system-warn)
(t #'ignore))
"Could not determine the system being used."))))
;;;###autoload
(defun system-find-system-file (&optional system)
"Find the current system's system-file."
(interactive (list (completing-read "System file: "
(mapcar (lambda (a) (format "%s" (cdr a)))
system-load-alist)
nil t nil nil
(cl-loop for (p . s) in system-load-alist
if (funcall p)
return (format "%s" s)))))
(find-file (cl-loop with file = (system-system-file system)
for cand in (list file
(concat file ".el"))
if (file-exists-p cand)
return cand
finally return cand)))
(provide 'system)
;;; system.el ends here