Function: hpath:substitute-dir
hpath:substitute-dir is a byte-compiled function defined in hpath.el.
Signature
(hpath:substitute-dir PATH-PREFIX VAR-NAME REST-OF-PATH TRAILING-DIR-SEP-FLAG &optional RETURN-PATH-FLAG)
Documentation
Return directory after substitutions.
Return the concatenation of PATH-PREFIX, dir for VAR-NAME, TRAILING-DIR-SEP-FLAG and REST-OF-PATH when optional RETURN-PATH-FLAG is non-nil. Otherwise, return just the dir for VAR-NAME. Trigger an error when no match. With RETURN-PATH-FLAG non-nil, return path expanded and with first variable value substituted.
VAR-NAME's value may be a directory or a list of directories. If it is a list, return the first directory prepended to REST-OF-PATH which produces a valid local pathname.
Source Code
;; Defined in ~/.emacs.d/elpa/hyperbole-20260414.325/hpath.el
(defun hpath:substitute-dir (path-prefix var-name rest-of-path trailing-dir-sep-flag &optional return-path-flag)
"Return directory after substitutions.
Return the concatenation of PATH-PREFIX, dir for VAR-NAME,
TRAILING-DIR-SEP-FLAG and REST-OF-PATH when optional
RETURN-PATH-FLAG is non-nil. Otherwise, return just the dir for
VAR-NAME. Trigger an error when no match. With RETURN-PATH-FLAG
non-nil, return path expanded and with first variable value
substituted.
VAR-NAME's value may be a directory or a list of directories. If
it is a list, return the first directory prepended to
REST-OF-PATH which produces a valid local pathname."
(unless (stringp rest-of-path)
(setq rest-of-path ""))
(unless (string-match-p hpath:variable-regexp path-prefix)
(setq path-prefix (substitute-in-file-name path-prefix)))
(unless (string-match-p hpath:variable-regexp rest-of-path)
(setq rest-of-path (substitute-in-file-name rest-of-path)))
(let (path sym val)
(cond ((not (stringp var-name))
(error "(hpath:substitute-dir): var-name, `%s', must be a string" var-name))
((not (or (and (setq sym (intern-soft var-name))
(boundp sym))
(setq val (getenv var-name))))
(error "(hpath:substitute-dir): var-name, \"%s\", is not a bound variable nor a set environment variable"
var-name))
((let ((case-fold-search t))
(stringp (setq val (cond ((and (boundp sym) sym)
(symbol-value sym))
((and (string-match "path" var-name)
(seq-find (lambda (c) (memq c '(?: ?\;))) (or (getenv var-name) "")))
(split-string (getenv var-name) "[:;]"))
(t (getenv var-name)))))))
((listp val)
(unless (and (setq path (locate-file rest-of-path val (cons "" hpath:suffixes)
(lambda (f) (when (file-readable-p f)
'dir-ok))))
return-path-flag)
(let* ((suffix-added (car (delq nil (mapcar (lambda (suffix)
(when (string-suffix-p suffix path)
suffix))
hpath:suffixes))))
(path-with-dots rest-of-path)
(len-dot-paths 0))
(while (string-match "\\(\\`\\|[\\/]\\)\\(\\.\\.?[\\/]\\)" path-with-dots)
(setq len-dot-paths (+ len-dot-paths (length (match-string 2 path-with-dots)))
path-with-dots (substring path-with-dots (match-end 0))))
(when path
(setq val (substring path 0 (- (+ (length rest-of-path)
(- len-dot-paths)
(length suffix-added))))))
(or val
(error "(hpath:substitute-dir): Can't find match for \"%s\""
(concat "$\{" var-name "\}/" rest-of-path))))))
(t (error "(hpath:substitute-dir): Value of var-name, \"%s\", must be a string or list" var-name)))
(when (stringp val)
(setq val (directory-file-name val)))
(cond ((and return-path-flag path)
(concat path-prefix path))
((and return-path-flag rest-of-path)
(if (stringp val)
(concat path-prefix val trailing-dir-sep-flag rest-of-path)
(error "(hpath:substitute-dir): Can't find match for \"%s\""
(concat "$\{" var-name "\}/" rest-of-path))))
(t val))))