diff options
| author | Stefan Monnier <monnier@iro.umontreal.ca> | 2013-04-13 20:59:48 -0400 |
|---|---|---|
| committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2013-04-13 20:59:48 -0400 |
| commit | a829b0dc898972de4b24b1a9a807f529ddd7b818 (patch) | |
| tree | c06b8613d12a9e41b99225f6bde94d764396c000 /lisp/files.el | |
| parent | 7ae9f0fb9927a99846f164785d81e72ba639f359 (diff) | |
| download | emacs-a829b0dc898972de4b24b1a9a807f529ddd7b818.tar.gz | |
* lisp/files.el: Allow : in local variables.
(hack-local-variable-regexp): New var.
(hack-local-variables-prop-line, hack-local-variables): Use it.
Fixes: debbugs:14089
Diffstat (limited to 'lisp/files.el')
| -rw-r--r-- | lisp/files.el | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/lisp/files.el b/lisp/files.el index d098f0fcec7..6be3685c875 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -3029,6 +3029,9 @@ n -- to ignore the local variables list.") (prog1 (memq char '(?! ?\s ?y)) (quit-window t))))))) +(defconst hack-local-variable-regexp + "[ \t]*\\([^][;\"'?()\\ \t\n]+\\)[ \t]*:[ \t]*") + (defun hack-local-variables-prop-line (&optional mode-only) "Return local variables specified in the -*- line. Returns an alist of elements (VAR . VAL), where VAR is a variable @@ -3055,11 +3058,11 @@ mode, if there is one, otherwise nil." ;; (last ";" is optional). ;; If MODE-ONLY, just check for `mode'. ;; Otherwise, parse the -*- line into the RESULT alist. - (while (and (or (not mode-only) - (not result)) - (< (point) end)) - (unless (looking-at "[ \t]*\\([^ \t\n:]+\\)[ \t]*:[ \t]*") - (message "Malformed mode-line") + (while (not (or (and mode-only result) + (>= (point) end))) + (unless (looking-at hack-local-variable-regexp) + (message "Malformed mode-line: %S" + (buffer-substring-no-properties (point) end)) (throw 'malformed-line nil)) (goto-char (match-end 0)) ;; There used to be a downcase here, @@ -3211,8 +3214,7 @@ local variables, but directory-local variables may still be applied." (prefix (concat "^" (regexp-quote (buffer-substring (line-beginning-position) - (match-beginning 0))))) - beg) + (match-beginning 0)))))) (forward-line 1) (let ((startpos (point)) @@ -3247,18 +3249,16 @@ local variables, but directory-local variables may still be applied." (forward-line 1)) (goto-char (point-min)) - (while (and (not (eobp)) - (or (not mode-only) - (not result))) - ;; Find the variable name; strip whitespace. - (skip-chars-forward " \t") - (setq beg (point)) - (skip-chars-forward "^:\n") - (if (eolp) (error "Missing colon in local variables entry")) - (skip-chars-backward " \t") - (let* ((str (buffer-substring beg (point))) - (var (let ((read-circle nil)) - (read str))) + (while (not (or (eobp) + (and mode-only result))) + ;; Find the variable name; + (unless (looking-at hack-local-variable-regexp) + (error "Malformed local variable line: %S" + (buffer-substring-no-properties + (point) (line-end-position)))) + (goto-char (match-end 1)) + (let* ((str (match-string 1)) + (var (intern str)) val val2) (and (equal (downcase (symbol-name var)) "mode") (setq var 'mode)) |
