From bee4f93018a15202769938f112bf76ecc8bfcd53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=ADn?= Date: Sat, 18 Dec 2021 19:29:50 +0100 Subject: [PATCH] Add isearch-emoji-by-name * lisp/isearch.el (isearch-emoji-by-name): Add a new command to insert Emoji characters into incremental search strings. (Bug#52605) (isearch-mode-map): Bind it to 'C-x 8 e RET'. (isearch-menu-bar-map): Add it to the menu bar. * lisp/international/emoji.el (emoji--choose-emoji): Expand the prompt to say that the CLDR short name of an Emoji is expected. * doc/emacs/search.texi (Special Isearch): Update the documentation to mention the new command. * etc/NEWS: And advertise it. --- doc/emacs/search.texi | 8 ++++++++ etc/NEWS | 7 +++++++ lisp/international/emoji.el | 6 ++++-- lisp/isearch.el | 21 +++++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi index fbbb1f6e68..6c15c33e21 100644 --- a/doc/emacs/search.texi +++ b/doc/emacs/search.texi @@ -443,6 +443,14 @@ Special Isearch character into the search string, similar to the usual @code{insert-char} command (@pxref{Inserting Text}). +@item +@findex isearch-emoji-by-name +@kindex C-x 8 e RET @r{(Incremental Search)} +Type @kbd{C-x 8 e @key{RET}} (@code{isearch-emoji-by-name}), followed +by the CLDR short name of an Emoji (for example, @samp{smiling face} +or @samp{heart with arrow}). This adds the specified Emoji into the +search string. + @item @kindex C-^ @r{(Incremental Search)} @findex isearch-toggle-input-method diff --git a/etc/NEWS b/etc/NEWS index e3665b918a..b76de35958 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -341,6 +341,13 @@ received. *** New user option 'char-fold-override' omits the default character-folding. ++++ +*** New command 'isearch-emoji-by-name'. +It is bound to 'C-x 8 e RET' during an incremental search. The +command accepts the CLDR short name of an Emoji (for example, "smiling +face" or "heart with arrow"), with minibuffer completion, and inserts +the Emoji character into the search string. + ** New minor mode 'glyphless-display-mode'. This allows an easy way to toggle seeing all glyphless characters in the current buffer. diff --git a/lisp/international/emoji.el b/lisp/international/emoji.el index a4dec973fb..9d87c4febd 100644 --- a/lisp/international/emoji.el +++ b/lisp/international/emoji.el @@ -88,7 +88,9 @@ emoji-recent ;;;###autoload (defun emoji-search () - "Choose and insert an emoji glyph by searching for an emoji name." + "Choose and insert an emoji glyph by searching for an emoji name. +The command accepts CLDR short names like 'smiling face' or +'heart with arrow' and completion is available." (interactive "*") (emoji--init) (emoji--choose-emoji)) @@ -612,7 +614,7 @@ emoji--choose-emoji ;; Use the list of names. (let ((name (completing-read - "Insert emoji: " + "Insert emoji (CLDR short name): " (lambda (string pred action) (if (eq action 'metadata) (list 'metadata diff --git a/lisp/isearch.el b/lisp/isearch.el index 8815cb4f2d..af4130a75e 100644 --- a/lisp/isearch.el +++ b/lisp/isearch.el @@ -668,6 +668,7 @@ isearch-mode-map ;; The key translations defined in the C-x 8 prefix should add ;; characters to the search string. See iso-transl.el. (define-key map "\C-x8\r" 'isearch-char-by-name) + (define-key map "\C-x8e\r" 'isearch-emoji-by-name) map) "Keymap for `isearch-mode'.") @@ -758,6 +759,8 @@ isearch-menu-bar-map :help "Search for literal char"] ["Search for char by name" isearch-char-by-name :help "Search for character by name"] + ["Search for Emoji by name" isearch-emoji-by-name + :help "Search for Emoji by name"] "---" ["Toggle input method" isearch-toggle-input-method :help "Toggle input method for search"] @@ -2747,6 +2750,24 @@ isearch-char-by-name (mapconcat 'isearch-text-char-description string "")))))))) +(defun isearch-emoji-by-name (&optional count) + "Read an Emoji name and add it to the search string. +The command accepts CLDR short names like 'smiling face' or +'heart with arrow' and completion is available. With argument, +add COUNT copies of the Emoji." + (interactive "p") + (with-isearch-suspended + (let ((emoji (with-temp-buffer + (emoji-search) + (if (and (integerp count) (> count 1)) + (apply 'concat (make-list count (buffer-string))) + (buffer-string))))) + (when emoji + (setq isearch-new-string (concat isearch-string emoji) + isearch-new-message (concat isearch-message + (mapconcat 'isearch-text-char-description + emoji ""))))))) + (defun isearch-search-and-update () "Do the search and update the display." (when (or isearch-success -- 2.31.0