mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-23 07:19:15 +00:00
New thing-at-point target 'string' used in context-menu-region
* lisp/mouse.el (context-menu-region): Use separate "List" and "String". * lisp/thingatpt.el (string): New target 'string'. (thing-at-point-bounds-of-string-at-point): New function. (thing-at-point-bounds-of-list-at-point): Revert previous commit by removing optional args 'escape-strings' and 'no-syntax-crossing'. (list-or-string): Remove recently added target 'list-or-string'. (thing-at-point-bounds-of-list-or-string-at-point): Remove function. https://lists.gnu.org/archive/html/emacs-devel/2021-09/msg01737.html
This commit is contained in:
parent
4c891b2a05
commit
2abf143f81
7
etc/NEWS
7
etc/NEWS
@ -2593,11 +2593,8 @@ This new command (bound to 'C-c C-l') regenerates the current hunk.
|
|||||||
This is like 'filename', but is a full path, and is nil if the file
|
This is like 'filename', but is a full path, and is nil if the file
|
||||||
doesn't exist.
|
doesn't exist.
|
||||||
|
|
||||||
*** New 'thing-at-point' target: 'list-or-string'.
|
*** New 'thing-at-point' target: 'string'.
|
||||||
This is like 'list, but if point is inside a string that's enclosed in
|
If point is inside a string, it returns the enclosed string.
|
||||||
the list, it returns the enclosed string and not the enclosing list.
|
|
||||||
|
|
||||||
This is like 'list', but also prefers to find of any enclosing string.
|
|
||||||
|
|
||||||
+++
|
+++
|
||||||
*** New variable 'thing-at-point-provider-alist'.
|
*** New variable 'thing-at-point-provider-alist'.
|
||||||
|
@ -482,12 +482,17 @@ Some context functions add menu items below the separator."
|
|||||||
`(menu-item "Defun"
|
`(menu-item "Defun"
|
||||||
,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'defun))
|
,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'defun))
|
||||||
:help "Mark the defun at click for a subsequent cut/copy"))
|
:help "Mark the defun at click for a subsequent cut/copy"))
|
||||||
(define-key-after submenu [mark-list-or-string]
|
(define-key-after submenu [mark-list]
|
||||||
`(menu-item ,(if (nth 8 (save-excursion
|
`(menu-item "List"
|
||||||
(syntax-ppss (posn-point (event-end click)))))
|
,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'list))
|
||||||
"String" "List")
|
:help "Mark the list at click for a subsequent cut/copy"))
|
||||||
,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'list-or-string))
|
(when (let ((pos (posn-point (event-end click))))
|
||||||
:help "Mark list or string at click for a subsequent cut/copy"))
|
(or (eq (char-syntax (char-after pos)) ?\")
|
||||||
|
(nth 3 (save-excursion (syntax-ppss pos)))))
|
||||||
|
(define-key-after submenu [mark-string]
|
||||||
|
`(menu-item "String"
|
||||||
|
,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'string))
|
||||||
|
:help "Mark the string at click for a subsequent cut/copy")))
|
||||||
(define-key-after submenu [mark-line]
|
(define-key-after submenu [mark-line]
|
||||||
`(menu-item "Line"
|
`(menu-item "Line"
|
||||||
,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'line))
|
,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'line))
|
||||||
|
@ -231,7 +231,27 @@ The bounds of THING are determined by `bounds-of-thing-at-point'."
|
|||||||
(put 'line 'beginning-op
|
(put 'line 'beginning-op
|
||||||
(lambda () (if (bolp) (forward-line -1) (beginning-of-line))))
|
(lambda () (if (bolp) (forward-line -1) (beginning-of-line))))
|
||||||
|
|
||||||
;; Sexps
|
;; Strings
|
||||||
|
|
||||||
|
(put 'string 'bounds-of-thing-at-point 'thing-at-point-bounds-of-string-at-point)
|
||||||
|
|
||||||
|
(defun thing-at-point-bounds-of-string-at-point ()
|
||||||
|
"Return the bounds of the string at point.
|
||||||
|
Prefer the enclosing string with fallback on sexp at point.
|
||||||
|
\[Internal function used by `bounds-of-thing-at-point'.]"
|
||||||
|
(save-excursion
|
||||||
|
(let ((ppss (syntax-ppss)))
|
||||||
|
(if (nth 3 ppss)
|
||||||
|
;; Inside the string
|
||||||
|
(ignore-errors
|
||||||
|
(goto-char (nth 8 ppss))
|
||||||
|
(cons (point) (progn (forward-sexp) (point))))
|
||||||
|
;; At the beginning of the string
|
||||||
|
(if (eq (char-syntax (char-after)) ?\")
|
||||||
|
(let ((bound (bounds-of-thing-at-point 'sexp)))
|
||||||
|
(and bound
|
||||||
|
(<= (car bound) (point)) (< (point) (cdr bound))
|
||||||
|
bound)))))))
|
||||||
|
|
||||||
(defun in-string-p ()
|
(defun in-string-p ()
|
||||||
"Return non-nil if point is in a string."
|
"Return non-nil if point is in a string."
|
||||||
@ -241,6 +261,8 @@ The bounds of THING are determined by `bounds-of-thing-at-point'."
|
|||||||
(beginning-of-defun)
|
(beginning-of-defun)
|
||||||
(nth 3 (parse-partial-sexp (point) orig)))))
|
(nth 3 (parse-partial-sexp (point) orig)))))
|
||||||
|
|
||||||
|
;; Sexps
|
||||||
|
|
||||||
(defun thing-at-point--end-of-sexp ()
|
(defun thing-at-point--end-of-sexp ()
|
||||||
"Move point to the end of the current sexp."
|
"Move point to the end of the current sexp."
|
||||||
(let ((char-syntax (syntax-after (point))))
|
(let ((char-syntax (syntax-after (point))))
|
||||||
@ -284,29 +306,18 @@ The bounds of THING are determined by `bounds-of-thing-at-point'."
|
|||||||
|
|
||||||
(put 'list 'bounds-of-thing-at-point 'thing-at-point-bounds-of-list-at-point)
|
(put 'list 'bounds-of-thing-at-point 'thing-at-point-bounds-of-list-at-point)
|
||||||
|
|
||||||
(defun thing-at-point-bounds-of-list-at-point (&optional escape-strings no-syntax-crossing)
|
(defun thing-at-point-bounds-of-list-at-point ()
|
||||||
"Return the bounds of the list at point.
|
"Return the bounds of the list at point.
|
||||||
Prefer the enclosing list with fallback on sexp at point.
|
Prefer the enclosing list with fallback on sexp at point.
|
||||||
\[Internal function used by `bounds-of-thing-at-point'.]"
|
\[Internal function used by `bounds-of-thing-at-point'.]"
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(if (ignore-errors (up-list -1 escape-strings no-syntax-crossing))
|
(if (ignore-errors (up-list -1))
|
||||||
(ignore-errors (cons (point) (progn (forward-sexp) (point))))
|
(ignore-errors (cons (point) (progn (forward-sexp) (point))))
|
||||||
(let ((bound (bounds-of-thing-at-point 'sexp)))
|
(let ((bound (bounds-of-thing-at-point 'sexp)))
|
||||||
(and bound
|
(and bound
|
||||||
(<= (car bound) (point)) (< (point) (cdr bound))
|
(<= (car bound) (point)) (< (point) (cdr bound))
|
||||||
bound)))))
|
bound)))))
|
||||||
|
|
||||||
(put 'list-or-string 'bounds-of-thing-at-point
|
|
||||||
'thing-at-point-bounds-of-list-or-string-at-point)
|
|
||||||
|
|
||||||
(defun thing-at-point-bounds-of-list-or-string-at-point ()
|
|
||||||
"Return the bounds of the list or string at point.
|
|
||||||
Like `thing-at-point-bounds-of-list-at-point', but if
|
|
||||||
point is inside a string that's enclosed in the list, this
|
|
||||||
function will return the enclosed string and not the
|
|
||||||
enclosing list."
|
|
||||||
(thing-at-point-bounds-of-list-at-point t t))
|
|
||||||
|
|
||||||
;; Defuns
|
;; Defuns
|
||||||
|
|
||||||
(put 'defun 'beginning-op 'beginning-of-defun)
|
(put 'defun 'beginning-op 'beginning-of-defun)
|
||||||
|
Loading…
Reference in New Issue
Block a user