Subject: [PATCH] Add isearch-emoji-by-name

From: Daniel Martín <[email-masked]>
Date: Sat, 18 Dec 2021 19:55:02 +0100

This patch adds support for searching a buffer for Emojis without
needing to copy and paste them from another buffer or leaving isearch.
Isearch already provides some methods to search for non-ASCII
characters, so I decided to extend the package to search for Emoji as
well.

With this patch, during an incremental search, if you press 'C-x 8 e
RET', it will ask you for an Emoji character by name and insert it into
the search string.  A prefix argument N will insert N copies of the
character.

If you agree that this feature is sound and makes sense, please review
it and send me feedback or install it for me (I don't have commit
rights).  Perhaps a similar feature is also needed for query and
replace.

Thanks.

>From a899d6199d27ffefd01b764da9c7f37bb11466f7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Mart=C3=ADn?= <[email-masked]>
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.
(isearch-mode-map): Bind it to 'C-x 8 e RET'.
(isearch-menu-bar-map): Add it to the menu bar.
* doc/emacs/search.texi (Special Isearch): Update the documentation to
mention the new command.
* etc/NEWS: And advertise it.
---
 doc/emacs/search.texi |  7 +++++++
 etc/NEWS              |  5 +++++
 lisp/isearch.el       | 19 +++++++++++++++++++
 3 files changed, 31 insertions(+)

diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
index fbbb1f6e68..59f6551815 100644
--- a/doc/emacs/search.texi
+++ b/doc/emacs/search.texi
@@ -443,6 +443,13 @@ 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 name of an Emoji.  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..07f498dab3 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -341,6 +341,11 @@ 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 and it
+inserts an 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/isearch.el b/lisp/isearch.el
index 8815cb4f2d..18ef101fc0 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,22 @@ isearch-char-by-name
 					   (mapconcat 'isearch-text-char-description
 						      string ""))))))))
 
+(defun isearch-emoji-by-name (&optional count)
+  "Read an Emoji and add it to the search string.
+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