Make thingatpt respect fields
* lisp/thingatpt.el (thing-at-point): Make thingatpt respect fields (bug#9454).
This commit is contained in:
parent
ab79950009
commit
7db376e560
3 changed files with 36 additions and 16 deletions
6
etc/NEWS
6
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
|
||||
|
||||
---
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue