From: Stefan Monnier Date: Sun, 14 Apr 2013 00:59:48 +0000 (-0400) Subject: * lisp/files.el: Allow : in local variables. X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~2026^2~475 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a829b0dc898972de4b24b1a9a807f529ddd7b818;p=emacs.git * 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 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 47af4d55433..d111d40dab2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2013-04-14 Stefan Monnier + + * files.el: Allow : in local variables (bug#14089). + (hack-local-variable-regexp): New var. + (hack-local-variables-prop-line, hack-local-variables): Use it. + 2013-04-13 Roland Winkler * textmodes/bibtex.el (bibtex-search-entries): Bug fix. Use match 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))