* 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
This commit is contained in:
Stefan Monnier 2013-04-13 20:59:48 -04:00
parent 7ae9f0fb99
commit a829b0dc89
2 changed files with 25 additions and 19 deletions

View file

@ -1,3 +1,9 @@
2013-04-14 Stefan Monnier <monnier@iro.umontreal.ca>
* 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 <winkler@gnu.org>
* textmodes/bibtex.el (bibtex-search-entries): Bug fix. Use match

View file

@ -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))