Function: hack-local-variables-filter
hack-local-variables-filter is a byte-compiled function defined in
files.el.gz.
Signature
(hack-local-variables-filter VARIABLES DIR-NAME)
Documentation
Filter local variable settings, querying the user if necessary.
VARIABLES is the alist of variable-value settings. This alist is
filtered based on the values of ignored-local-variables,
enable-local-eval, enable-local-variables, and (if necessary)
user interaction. The results are added to
file-local-variables-alist, without applying them.
If these settings come from directory-local variables, then
DIR-NAME is the name of the associated directory. Otherwise it is nil.
Source Code
;; Defined in /usr/src/emacs/lisp/files.el.gz
(defun hack-local-variables-filter (variables dir-name)
"Filter local variable settings, querying the user if necessary.
VARIABLES is the alist of variable-value settings. This alist is
filtered based on the values of `ignored-local-variables',
`enable-local-eval', `enable-local-variables', and (if necessary)
user interaction. The results are added to
`file-local-variables-alist', without applying them.
If these settings come from directory-local variables, then
DIR-NAME is the name of the associated directory. Otherwise it is nil."
;; Find those variables that we may want to save to
;; `safe-local-variable-values'.
(let (all-vars risky-vars unsafe-vars)
(dolist (elt variables)
(let ((var (car elt))
(val (cdr elt)))
(cond ((memq var ignored-local-variables)
;; Ignore any variable in `ignored-local-variables'.
nil)
;; Ignore variables with the specified values.
((member elt ignored-local-variable-values)
nil)
;; Obey `enable-local-eval'.
((eq var 'eval)
(when enable-local-eval
(let ((safe (or (hack-one-local-variable-eval-safep val)
;; In case previously marked safe (bug#5636).
(safe-local-variable-p var val))))
;; If not safe and e-l-v = :safe, ignore totally.
(when (or safe (not (eq enable-local-variables :safe)))
(push elt all-vars)
(or (eq enable-local-eval t)
safe
(push elt unsafe-vars))))))
;; Ignore duplicates (except `mode') in the present list.
((and (assq var all-vars) (not (eq var 'mode))) nil)
;; Accept known-safe variables.
((or (memq var '(mode unibyte coding))
(safe-local-variable-p var val))
(push elt all-vars))
;; The variable is either risky or unsafe:
((not (eq enable-local-variables :safe))
(push elt all-vars)
(if (risky-local-variable-p var val)
(push elt risky-vars)
(push elt unsafe-vars))))))
(and all-vars
;; Query, unless all vars are safe or user wants no querying.
(or (and (eq enable-local-variables t)
(null unsafe-vars)
(null risky-vars))
(memq enable-local-variables '(:all :safe))
(delq nil (mapcar (lambda (dir)
(and dir-name dir
(file-equal-p dir dir-name)))
safe-local-variable-directories))
(hack-local-variables-confirm all-vars unsafe-vars
risky-vars dir-name))
(dolist (elt all-vars)
(unless (memq (car elt) '(eval mode))
(unless dir-name
(setq dir-local-variables-alist
(assq-delete-all (car elt) dir-local-variables-alist)))
(setq file-local-variables-alist
(assq-delete-all (car elt) file-local-variables-alist)))
(push elt file-local-variables-alist)))))