]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new convenience function `buffer-local-boundp'
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 31 May 2021 05:21:09 +0000 (07:21 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 31 May 2021 05:21:09 +0000 (07:21 +0200)
* doc/lispref/variables.texi (Creating Buffer-Local): Document it.
* lisp/subr.el (buffer-local-boundp): New function.

* src/data.c (Flocal_variable_p): Mention it.

doc/lispref/variables.texi
etc/NEWS
lisp/subr.el
src/data.c
test/lisp/subr-tests.el

index 36abc316cbb21d85c2f2ec19d40629daee114572..62c76f09c0dd29edcf48236c27356d80824e2097 100644 (file)
@@ -1582,6 +1582,12 @@ buffer-local binding in buffer @var{buffer}, it returns the default
 value (@pxref{Default Value}) of @var{variable} instead.
 @end defun
 
+@defun buffer-local-boundp variable buffer
+This returns non-@code{nil} if there's either a buffer-local binding
+of @var{variable} (a symbol) in buffer @var{buffer}, or @var{variable}
+has a global binding.
+@end defun
+
 @defun buffer-local-variables &optional buffer
 This function returns a list describing the buffer-local variables in
 buffer @var{buffer}.  (If @var{buffer} is omitted, the current buffer
index c6e7084118fbfef7f61d668f14b1c06cc47d79e0..6622861aaf1a6ebcfded3a0663d4b3d568321a45 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2726,6 +2726,10 @@ customize them.
 \f
 * Lisp Changes in Emacs 28.1
 
++++
+** New function 'buffer-local-boundp'.
+This predicate says whether a symbol is bound in a specific buffer.
+
 ---
 ** Emacs now attempts to test for high-rate subprocess output more fairly.
 When several subprocesses produce output simultaneously at high rate,
index 88740159b934d0ea42b278870f26a6e27efefcfd..e49c2773357d740db84ece7e9830396e32bb87c0 100644 (file)
@@ -195,6 +195,14 @@ buffer-local wherever it is set."
   (list 'progn (list 'defvar var val docstring)
         (list 'make-variable-buffer-local (list 'quote var))))
 
+(defun buffer-local-boundp (symbol buffer)
+  "Return non-nil if SYMBOL is bound in BUFFER.
+Also see `local-variable-p'."
+  (condition-case nil
+      (buffer-local-value symbol buffer)
+    (:success t)
+    (void-variable nil)))
+
 (defmacro push (newelt place)
   "Add NEWELT to the list stored in the generalized variable PLACE.
 This is morally equivalent to (setf PLACE (cons NEWELT PLACE)),
index d547f5da5e0411ec95287cfd4f051806b7161e3d..059f31e514b6914cbf7e54c1074229e215882583 100644 (file)
@@ -2200,7 +2200,9 @@ From now on the default value will apply in this buffer.  Return VARIABLE.  */)
 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
        1, 2, 0,
        doc: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
-BUFFER defaults to the current buffer.  */)
+BUFFER defaults to the current buffer.
+
+Also see `buffer-local-boundp'.*/)
   (Lisp_Object variable, Lisp_Object buffer)
 {
   struct buffer *buf = decode_buffer (buffer);
index 1e146732163384fe9e082419327cf9fe0375dfff..375251cffc5f58192cff77cfd9d0ff6ed0620289 100644 (file)
@@ -684,5 +684,15 @@ See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=19350."
   (should (>= (length (apropos-internal "^help" #'commandp)) 15))
   (should-not (apropos-internal "^next-line$" #'keymapp)))
 
+\f
+(ert-deftest test-buffer-local-boundp ()
+  (let ((buf (generate-new-buffer "boundp")))
+    (with-current-buffer buf
+      (setq-local test-boundp t))
+    (setq test-global-boundp t)
+    (should (buffer-local-boundp 'test-boundp buf))
+    (should-not (buffer-local-boundp 'test-not-boundp buf))
+    (should (buffer-local-boundp 'test-global-boundp buf))))
+
 (provide 'subr-tests)
 ;;; subr-tests.el ends here