Make thingatpt respect fields

* lisp/thingatpt.el (thing-at-point): Make thingatpt respect
fields (bug#9454).
This commit is contained in:
Lars Ingebrigtsen 2021-08-25 18:04:43 +02:00
parent ab79950009
commit 7db376e560
3 changed files with 36 additions and 16 deletions

View file

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

View 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

View 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