emacs/lisp/system.el

114 lines
4.0 KiB
EmacsLisp

;;; system.el --- System-specific configuration -*- lexical-binding: t; -*-
;;; Commentary:
;; When using Emacs on separate computers, some variables need different
;; settings. This library contains functions and variables to work with
;; different system configurations for Emacs.
;;; Code:
(require 'cl-lib)
(defgroup system nil
"System-specific configurations."
:group 'emacs
:prefix "system-")
;;; Variables
(defcustom system-load-alist '((system-microsoft-p . windows)
(system-linux-p . linux))
"Alist describing which system Emacs is on.
Each cell is of the form (PREDICATE . SYSTEM), where PREDICATE is
a function of no arguments and SYSTEM is a string or symbol that
will be passed to `system-settings-load'.
This list need not be exhaustive; see `system-settings-load' for
more details on what happens if this alist is exhausted."
:type '(alist :key-type function :value-type (choice string symbol)))
(defcustom system-load-directory (locate-user-emacs-file "systems")
"The directory from which to load system-specific configurations."
:type 'file)
;; `defcustoms' defined here are best-guess defaults.
(defcustom system-default-font (pcase system-type
((or 'ms-dos 'windows-nt)
"Consolas")
(_ "monospace"))
"The font used for the `default' face."
:type 'string)
(defcustom system-default-height 100
"The height used for the `default' face."
:type 'number)
(defcustom system-variable-pitch-font (pcase system-type
((or 'ms-dos 'windows-nt)
"Arial")
(_ "sans-serif"))
"The font used for the `variable-pitch' face."
:type 'string)
(defcustom system-variable-pitch-height 1.0
"The height used for the `variable-pitch' face.
A floating-point number is recommended, since that makes it
relative to the `default' face height."
:type 'number)
;;; Functions
;; Convenience functions for systems
(defun system-microsoft-p ()
"Return non-nil if running in a Microsoft system."
(memq system-type '(ms-dos windows-nt)))
(defun system-linux-p ()
"Return non-nil if running on a Linux system."
(memq system-type '(gnu/linux)))
(defun system-warn (message &rest args)
"Display a wraning message made from (format-message MESSAGE ARGS...).
This function is like `warn', except it uses the `system' type."
(display-warning 'system (apply #'format-message message args)))
;;;###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.
If none match, warn the user.
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
(condition-case e
(load (expand-file-name (format "%s" system) system-load-directory)
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)))))
(funcall (cond ((eq error t) #'error)
((null error) #'system-warn)
(t #'ignore))
"Could not determine the system being used."))))
(provide 'system)
;;; system.el ends here