[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master df713b9 2/3: Ensure that setq-local take an even nu
From: |
Lars Ingebrigtsen |
Subject: |
[Emacs-diffs] master df713b9 2/3: Ensure that setq-local take an even number of symbol/value pairs |
Date: |
Fri, 11 Oct 2019 02:28:33 -0400 (EDT) |
branch: master
commit df713b9344e978eff4f0a6aff506932fcdb1a39c
Author: Lars Ingebrigtsen <address@hidden>
Commit: Lars Ingebrigtsen <address@hidden>
Ensure that setq-local take an even number of symbol/value pairs
* doc/lispref/variables.texi (Creating Buffer-Local): Document the
new syntax for setq-local.
* lisp/subr.el (setq-local): Ensure that there's an even number of
variable/value pairs, and expand the doc string by taking some
text from `setq'.
---
doc/lispref/variables.texi | 16 +++++++++++-----
etc/NEWS | 3 +++
lisp/subr.el | 35 ++++++++++++++++++++++++-----------
3 files changed, 38 insertions(+), 16 deletions(-)
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index 89dac4f..76bda787 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -1430,11 +1430,17 @@ needed if you use the @var{local} argument to
@code{add-hook} or
@code{remove-hook}.
@end deffn
-@defmac setq-local variable value
-This macro creates a buffer-local binding in the current buffer for
-@var{variable}, and gives it the buffer-local value @var{value}. It
-is equivalent to calling @code{make-local-variable} followed by
-@code{setq}. @var{variable} should be an unquoted symbol.
+@defmac setq-local &rest pairs
+@var{pairs} is a list of variable and value pairs. This macro creates
+a buffer-local binding in the current buffer for each of the
+variables, and gives them a buffer-local value. It is equivalent to
+calling @code{make-local-variable} followed by @code{setq} for each of
+the variables. The variables should be unquoted symbols.
+
+@lisp
+(setq-local var1 "value1"
+ var2 "value2")
+@end lisp
@end defmac
@deffn Command make-variable-buffer-local variable
diff --git a/etc/NEWS b/etc/NEWS
index b680e18..4135d47 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2351,6 +2351,9 @@ scrolling.
* Lisp Changes in Emacs 27.1
+** 'setq-local' can now set an arbitrary number of variables, which
+makes the syntax more like 'setq'.
+
** 'reveal-mode' can now also be used for more than to toggle between
invisible and visible: It can also toggle 'display' properties in
overlays. This is only done on 'display' properties that have the
diff --git a/lisp/subr.el b/lisp/subr.el
index 2acac3a..e50a52e 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -143,22 +143,35 @@ of previous VARs.
(push `(set-default ',(pop args) ,(pop args)) exps))
`(progn . ,(nreverse exps))))
-(defmacro setq-local (&rest args)
- "Set each SYM to the value of its VAL in the current buffer.
+(defmacro setq-local (&rest pairs)
+ "Make variables in PAIRS buffer-local and assign them the corresponding
values.
-\(fn [SYM VAL]...)"
- ;; Can't use backquote here, it's too early in the bootstrap.
- (declare (debug (symbolp form)))
- (let ((expr))
- (while args
+PAIRS is a list of variable/value pairs. For each variable, make
+it buffer-local and assign it the corresponding value. The
+variables are literal symbols and should not be quoted.
+
+The second VALUE is not computed until after the first VARIABLE
+is set, and so on; each VALUE can use the new value of variables
+set earlier in the ‘setq-local’. The return value of the
+‘setq-local’ form is the value of the last VALUE.
+
+\(fn [VARIABLE VALUE]...)"
+ (declare (debug setq))
+ (unless (zerop (mod (length pairs) 2))
+ (error "PAIRS must have an even number of variable/value members"))
+ (let ((expr nil))
+ (while pairs
+ (unless (symbolp (car pairs))
+ (error "Attempting to set a non-symbol: %s" (car pairs)))
+ ;; Can't use backquote here, it's too early in the bootstrap.
(setq expr
(cons
(list 'set
- (list 'make-local-variable (list 'quote (car args)))
- (car (cdr args)))
+ (list 'make-local-variable (list 'quote (car pairs)))
+ (car (cdr pairs)))
expr))
- (setq args (cdr (cdr args))))
- (cons 'progn (nreverse expr))))
+ (setq pairs (cdr (cdr pairs))))
+ (macroexp-progn (nreverse expr))))
(defmacro defvar-local (var val &optional docstring)
"Define VAR as a buffer-local variable with default value VAL.