blob: f932353f24cd0907ade155d1a8ec4ad36578f8ba (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
;;; system-lib.el --- System utility library functions -*- lexical-binding: t; -*-
;;
;;; Commentary:
;; This module provides low-level system utility functions for checking
;; the availability of external programs and system capabilities.
;;
;; Functions include:
;; - Checking if external programs are available in PATH
;; - Silent logging to *Messages* buffer
;;
;;; Code:
(defun cj/executable-exists-p (program)
"Return non-nil if PROGRAM is available in PATH.
PROGRAM should be a string naming an executable program."
(and (stringp program)
(not (string-empty-p program))
(executable-find program)))
(defun cj/executable-find-or-warn (program feature &optional group)
"Return PROGRAM's executable path, or warn that FEATURE is unavailable.
When PROGRAM is in PATH, return its absolute path. When it isn't,
emit a `display-warning' naming PROGRAM and FEATURE so the user gets
a clear hint about what won't work, and return nil.
GROUP is the symbol passed to `display-warning' for filtering and
defaults to `cj/system-lib'. Callers should pass their own module
symbol (for example `mail-config') so per-feature warning filters
keep working."
(or (executable-find program)
(progn
(display-warning
(or group 'cj/system-lib)
(format "%s not found; %s unavailable" program feature)
:warning)
nil)))
(defun cj/log-silently (format-string &rest args)
"Append formatted message (FORMAT-STRING with ARGS) to *Messages* buffer.
This does so without echoing in the minibuffer."
(let ((inhibit-read-only t))
(with-current-buffer (get-buffer-create "*Messages*")
(goto-char (point-max))
(unless (bolp) (insert "\n"))
(insert (apply #'format format-string args))
(unless (bolp) (insert "\n")))))
(provide 'system-lib)
;;; system-lib.el ends here
|