]> git.eshelyaron.com Git - emacs.git/commitdiff
Make thingatpt respect fields
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 25 Aug 2021 16:04:43 +0000 (18:04 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 25 Aug 2021 16:04:43 +0000 (18:04 +0200)
* lisp/thingatpt.el (thing-at-point): Make thingatpt respect
fields (bug#9454).

etc/NEWS
lisp/thingatpt.el
test/lisp/thingatpt-tests.el

index 2c929e4a6295ddc685b054f7bb67388ca07f4155..04e482364aa8b9f9c51c87862f6d0ae1cba217f9 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2432,6 +2432,12 @@ that makes it a valid button.
 *** New variable 'thing-at-point-provider-alist'.
 This allows mode-specific alterations to how 'thing-at-point' works.
 
+---
+*** thingatpt now respects fields.
+'thing-at-point' (and all functions that use it, like
+'symbol-at-point') will narrow to the current field (if any) before
+trying to identify the thing at point.
+
 ** Enriched mode
 
 ---
index 66bbfb0f9f63eea08cee0fa43b754c1a64bb87ae..ab17748df5b96d3b0e5652a1f4687885f486e384 100644 (file)
@@ -162,24 +162,30 @@ Possibilities include `symbol', `list', `sexp', `defun',
 When the optional argument NO-PROPERTIES is non-nil,
 strip text properties from the return value.
 
+If the current buffer uses fields (see Info node `(elisp)Fields'),
+this function will narrow to the field before identifying the
+thing at point.
+
 See the file `thingatpt.el' for documentation on how to define
 a symbol as a valid THING."
-  (let ((text
-         (cond
-          ((cl-loop for (pthing . function) in thing-at-point-provider-alist
-                    when (eq pthing thing)
-                    for result = (funcall function)
-                    when result
-                    return result))
-          ((get thing 'thing-at-point)
-           (funcall (get thing 'thing-at-point)))
-          (t
-           (let ((bounds (bounds-of-thing-at-point thing)))
-             (when bounds
-               (buffer-substring (car bounds) (cdr bounds))))))))
-    (when (and text no-properties (sequencep text))
-      (set-text-properties 0 (length text) nil text))
-    text))
+  (save-restriction
+    (narrow-to-region (field-beginning) (field-end))
+    (let ((text
+           (cond
+            ((cl-loop for (pthing . function) in thing-at-point-provider-alist
+                      when (eq pthing thing)
+                      for result = (funcall function)
+                      when result
+                      return result))
+            ((get thing 'thing-at-point)
+             (funcall (get thing 'thing-at-point)))
+            (t
+             (let ((bounds (bounds-of-thing-at-point thing)))
+               (when bounds
+                 (buffer-substring (car bounds) (cdr bounds))))))))
+      (when (and text no-properties (sequencep text))
+        (set-text-properties 0 (length text) nil text))
+      text)))
 
 ;; Go to beginning/end
 
index fba6f21d5dc353a6eb4580804affde8855d0a6e5..1849480347eafa8799ce5ecc99f14151454ade7e 100644 (file)
@@ -223,4 +223,12 @@ position to retrieve THING.")
   (should (equal (test--number "0xf00" 2) 3840))
   (should (equal (test--number "0xf00" 3) 3840)))
 
+(ert-deftest test-fields ()
+  (with-temp-buffer
+    (insert (propertize "foo" 'field 1) "bar" (propertize "zot" 'field 2))
+    (goto-char 1)
+    (should (eq (symbol-at-point) 'foo))
+    (goto-char 5)
+    (should (eq (symbol-at-point) 'bar))))
+
 ;;; thingatpt.el ends here