summaryrefslogtreecommitdiff
path: root/lisp/files.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2013-04-13 20:59:48 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2013-04-13 20:59:48 -0400
commita829b0dc898972de4b24b1a9a807f529ddd7b818 (patch)
treec06b8613d12a9e41b99225f6bde94d764396c000 /lisp/files.el
parent7ae9f0fb9927a99846f164785d81e72ba639f359 (diff)
downloademacs-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.el38
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))