From bd917088e69e71e77c15069f0751096141ca3f1a Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 12 Sep 2021 20:32:02 +0300 Subject: [PATCH] * lisp/thingatpt.el (thing-at-mouse): New function (bug#50256). * lisp/net/dictionary.el: Add 'context-menu-dictionary' to 'context-menu-functions'. (dictionary-search-word-at-mouse): New function. (context-menu-dictionary): New function that uses 'thing-at-mouse'. (dictionary-mouse-popup-matching-words): Remove stray 'selected-window'. * lisp/textmodes/flyspell.el (flyspell-context-menu): Add '_click' arg. --- etc/NEWS | 2 ++ lisp/net/dictionary.el | 22 +++++++++++++++++++++- lisp/textmodes/flyspell.el | 2 +- lisp/thingatpt.el | 9 +++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index ca269aabaa4..8385128f698 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2503,6 +2503,8 @@ This allows mode-specific alterations to how 'thing-at-point' works. 'symbol-at-point') will narrow to the current field (if any) before trying to identify the thing at point. +*** New function 'thing-at-mouse'. + ** image-dired --- diff --git a/lisp/net/dictionary.el b/lisp/net/dictionary.el index 0f42af0911b..5a6f3b555d2 100644 --- a/lisp/net/dictionary.el +++ b/lisp/net/dictionary.el @@ -1211,7 +1211,6 @@ allows editing it." (save-excursion (mouse-set-point event) (current-word))))) - (selected-window) (dictionary-popup-matching-words word))) ;;;###autoload @@ -1368,5 +1367,26 @@ any buffer where (dictionary-tooltip-mode 1) has been called." (if on #'dictionary-tooltip-track-mouse #'ignore)) on)) +;;; Context menu support + +(defun dictionary-search-word-at-mouse (event) + (interactive "e") + (let ((word (save-window-excursion + (save-excursion + (mouse-set-point event) + (current-word))))) + (dictionary-search word))) + +(defun context-menu-dictionary (menu click) + "Dictionary context menu." + (when (thing-at-mouse click 'word) + (define-key menu [dictionary-separator] menu-bar-separator) + (define-key menu [dictionary-search-word-at-mouse] + '(menu-item "Dictionary Search" dictionary-search-word-at-mouse + :help "Search the word at mouse click in dictionary"))) + menu) + +(add-hook 'context-menu-functions 'context-menu-dictionary 15) + (provide 'dictionary) ;;; dictionary.el ends here diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el index 975f540936a..423f37762cf 100644 --- a/lisp/textmodes/flyspell.el +++ b/lisp/textmodes/flyspell.el @@ -470,7 +470,7 @@ See also `flyspell-duplicate-distance'." (defvar flyspell-overlay nil) -(defun flyspell-context-menu (_menu) +(defun flyspell-context-menu (_menu _click) "Context menu for `context-menu-mode'." ;; TODO: refactor `flyspell-correct-word' and related functions to return ;; a keymap menu where every menu item is bound to a lambda that calls diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el index ab17748df5b..8782c9eeb56 100644 --- a/lisp/thingatpt.el +++ b/lisp/thingatpt.el @@ -151,6 +151,15 @@ positions of the thing found." (if (and (<= real-beg orig) (<= orig end) (< real-beg end)) (cons real-beg end)))))))))) +;;;###autoload +(defun thing-at-mouse (event thing &optional no-properties) + "Return the THING at mouse click. +Like `thing-at-point', but tries to use the event +where the mouse button is clicked to find a thing nearby." + (save-excursion + (mouse-set-point event) + (thing-at-point thing no-properties))) + ;;;###autoload (defun thing-at-point (thing &optional no-properties) "Return the THING at point. -- 2.39.5