aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Mackenzie2022-01-14 19:28:07 +0000
committerAlan Mackenzie2022-01-14 19:28:07 +0000
commitd87a34597c9f0be967f75ff8cfd0ace4392da63f (patch)
treec9474eb0156af143ce61a0c5bcec659546b56300
parent57b698f15913385aec7bc9745016b961c0aa5c55 (diff)
parentd29291d665e808307126bf52c3e748fef78f0f9c (diff)
downloademacs-d87a34597c9f0be967f75ff8cfd0ace4392da63f.tar.gz
emacs-d87a34597c9f0be967f75ff8cfd0ace4392da63f.zip
Merge branch 'master' into scratch/correct-warning-pos
Merge branch: commit d29291d665e808307126bf52c3e748fef78f0f9c (HEAD -> master, origin/master, origin/HEAD) Author: Stefan Monnier <monnier@iro.umontreal.ca> Date: Fri Jan 14 12:26:30 2022 -0500 (macroexp--expand-all): Fix bug#53227 and bug#46636
-rw-r--r--INSTALL27
-rw-r--r--Makefile.in3
-rw-r--r--admin/grammars/Makefile.in4
-rw-r--r--admin/unidata/Makefile.in3
-rw-r--r--doc/emacs/frames.texi10
-rw-r--r--doc/emacs/maintaining.texi27
-rw-r--r--doc/emacs/search.texi25
-rw-r--r--doc/lispref/functions.texi16
-rw-r--r--doc/lispref/modes.texi3
-rw-r--r--doc/lispref/windows.texi7
-rw-r--r--doc/misc/Makefile.in4
-rw-r--r--doc/misc/eshell.texi120
-rw-r--r--doc/misc/gnus.texi3
-rw-r--r--doc/misc/tramp.texi4
-rw-r--r--etc/NEWS40
-rw-r--r--leim/Makefile.in5
-rw-r--r--lib-src/Makefile.in3
-rw-r--r--lisp/Makefile.in5
-rw-r--r--lisp/auth-source.el2
-rw-r--r--lisp/battery.el2
-rw-r--r--lisp/cedet/ede/project-am.el3
-rw-r--r--lisp/emacs-lisp/easy-mmode.el6
-rw-r--r--lisp/emacs-lisp/ert.el17
-rw-r--r--lisp/emacs-lisp/inline.el2
-rw-r--r--lisp/emacs-lisp/macroexp.el8
-rw-r--r--lisp/emacs-lisp/shortdoc.el3
-rw-r--r--lisp/eshell/esh-opt.el90
-rw-r--r--lisp/ffap.el11
-rw-r--r--lisp/files.el14
-rw-r--r--lisp/frame.el75
-rw-r--r--lisp/gnus/gnus-art.el6
-rw-r--r--lisp/gnus/gnus-registry.el25
-rw-r--r--lisp/gnus/nnimap.el2
-rw-r--r--lisp/gnus/nntp.el8
-rw-r--r--lisp/help-fns.el6
-rw-r--r--lisp/hi-lock.el20
-rw-r--r--lisp/image-dired.el4
-rw-r--r--lisp/isearch.el21
-rw-r--r--lisp/jsonrpc.el6
-rw-r--r--lisp/ldefs-boot.el203
-rw-r--r--lisp/leim/quail/emoji.el2003
-rw-r--r--lisp/man.el24
-rw-r--r--lisp/menu-bar.el10
-rw-r--r--lisp/mouse.el33
-rw-r--r--lisp/net/mailcap.el7
-rw-r--r--lisp/net/tramp-crypt.el2
-rw-r--r--lisp/progmodes/gud.el8
-rw-r--r--lisp/progmodes/python.el12
-rw-r--r--lisp/progmodes/xref.el33
-rw-r--r--lisp/subr.el24
-rw-r--r--lisp/vc/pcvs-info.el8
-rw-r--r--src/buffer.c2
-rw-r--r--src/data.c16
-rw-r--r--src/font.c43
-rw-r--r--src/frame.c5
-rw-r--r--src/ftfont.c21
-rw-r--r--src/gtkutil.c11
-rw-r--r--src/haiku_draw_support.cc2
-rw-r--r--src/haiku_support.cc30
-rw-r--r--src/haikuterm.c7
-rw-r--r--src/window.c3
-rw-r--r--src/xdisp.c14
-rw-r--r--src/xfns.c4
-rw-r--r--src/xterm.c157
-rw-r--r--src/xwidget.c4
-rw-r--r--test/Makefile.in8
-rw-r--r--test/lisp/emacs-lisp/edebug-tests.el10
-rw-r--r--test/lisp/emacs-lisp/ert-tests.el3
-rw-r--r--test/lisp/eshell/esh-opt-tests.el151
-rw-r--r--test/lisp/ffap-tests.el17
-rw-r--r--test/lisp/help-fns-tests.el9
-rw-r--r--test/lisp/so-long-tests/spelling-tests.el16
-rw-r--r--test/lisp/subr-tests.el17
73 files changed, 3247 insertions, 310 deletions
diff --git a/INSTALL b/INSTALL
index 02d5a09d63c..7cb7e0526a2 100644
--- a/INSTALL
+++ b/INSTALL
@@ -226,6 +226,33 @@ e.g. 'emacs25'). On Red Hat-based systems, the corresponding command is
226 226
227On FreeBSD, the command is 'pkg install -y `pkg rquery %dn emacs-devel`'. 227On FreeBSD, the command is 'pkg install -y `pkg rquery %dn emacs-devel`'.
228 228
229* Alternative window systems
230
231If you want to use Emacs on one of the alternative window systems
232available on GNU/Linux and some Unix systems, such as Wayland or
233Broadway, you can build the PGTK ("Pure GTK") port of Emacs, which
234utilizes the GTK+ toolkit to support those window systems. To this
235end, invoke the configure script with the '--with-pgtk' option, like
236this:
237
238 ./configure --with-pgtk
239
240This build is only supported with GTK+ version 3, and it is an error
241to specify any other X-specific configuration option when PGTK is
242enabled.
243
244With the PGTK build, you will be able to switch between running Emacs
245on X, Wayland and Broadway using the 'GDK_BACKEND' environment
246variable. GTK+ should automatically detect and use the correct value
247for your system, but you can also specify it manually. For example,
248to force GTK+ to run under Broadway, start Emacs like this:
249
250 GDK_BACKEND=broadway emacs ...
251
252(where '...' denotes any further options you may want to pass to Emacs).
253
254The GNUstep build also supports the Wayland window system. If that is
255what you want, see nextstep/INSTALL.
229 256
230DETAILED BUILDING AND INSTALLATION: 257DETAILED BUILDING AND INSTALLATION:
231 258
diff --git a/Makefile.in b/Makefile.in
index b72127dde67..8ac6f527469 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -319,6 +319,9 @@ GLIB_COMPILE_SCHEMAS = glib-compile-schemas
319# Program name transformation. 319# Program name transformation.
320TRANSFORM = @program_transform_name@ 320TRANSFORM = @program_transform_name@
321 321
322# Prevent any settings in the user environment causing problems.
323unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH
324
322# What emacs should be called when installed. 325# What emacs should be called when installed.
323EMACS_NAME = `echo emacs | sed '$(TRANSFORM)'` 326EMACS_NAME = `echo emacs | sed '$(TRANSFORM)'`
324EMACS = ${EMACS_NAME}${EXEEXT} 327EMACS = ${EMACS_NAME}${EXEEXT}
diff --git a/admin/grammars/Makefile.in b/admin/grammars/Makefile.in
index 83ac2ef46ef..6f699430895 100644
--- a/admin/grammars/Makefile.in
+++ b/admin/grammars/Makefile.in
@@ -31,10 +31,10 @@ top_builddir = @top_builddir@
31-include ${top_builddir}/src/verbose.mk 31-include ${top_builddir}/src/verbose.mk
32 32
33# Prevent any settings in the user environment causing problems. 33# Prevent any settings in the user environment causing problems.
34unexport EMACSDATA EMACSDOC EMACSPATH 34unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH
35 35
36EMACS = ${top_builddir}/src/emacs 36EMACS = ${top_builddir}/src/emacs
37emacs = EMACSLOADPATH= "${EMACS}" -batch --no-site-file --no-site-lisp --eval '(setq load-prefer-newer t)' 37emacs = "${EMACS}" -batch --no-site-file --no-site-lisp --eval '(setq load-prefer-newer t)'
38 38
39make_bovine = ${emacs} -l semantic/bovine/grammar -f bovine-batch-make-parser 39make_bovine = ${emacs} -l semantic/bovine/grammar -f bovine-batch-make-parser
40make_wisent = ${emacs} -l semantic/wisent/grammar -f wisent-batch-make-parser 40make_wisent = ${emacs} -l semantic/wisent/grammar -f wisent-batch-make-parser
diff --git a/admin/unidata/Makefile.in b/admin/unidata/Makefile.in
index 45bba85213b..e75010dc2b8 100644
--- a/admin/unidata/Makefile.in
+++ b/admin/unidata/Makefile.in
@@ -29,6 +29,9 @@ srcdir = @srcdir@
29top_srcdir = @top_srcdir@ 29top_srcdir = @top_srcdir@
30top_builddir = @top_builddir@ 30top_builddir = @top_builddir@
31 31
32# Prevent any settings in the user environment causing problems.
33unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH
34
32EMACS = ${top_builddir}/src/emacs 35EMACS = ${top_builddir}/src/emacs
33unidir = ${top_srcdir}/lisp/international 36unidir = ${top_srcdir}/lisp/international
34emacs = "${EMACS}" -batch --no-site-file --no-site-lisp 37emacs = "${EMACS}" -batch --no-site-file --no-site-lisp
diff --git a/doc/emacs/frames.texi b/doc/emacs/frames.texi
index ce43408101d..c641b8ccb14 100644
--- a/doc/emacs/frames.texi
+++ b/doc/emacs/frames.texi
@@ -512,6 +512,16 @@ frames by specifying @dfn{frame parameters}. @xref{Frame Parameters}.
512Delete the selected frame (@code{delete-frame}). This signals an 512Delete the selected frame (@code{delete-frame}). This signals an
513error if there is only one frame. 513error if there is only one frame.
514 514
515@item C-x 5 u
516@kindex C-x 5 u
517@findex undelete-frame
518@findex undelete-frame-mode
519When @code{undelete-frame-mode} is enabled, undelete one of the 16
520most recently deleted frames. Without a prefix argument, undelete the
521most recently deleted frame. With a numerical prefix argument between
5221 and 16, where 1 is the most recently deleted frame, undelete the
523corresponding deleted frame.
524
515@item C-z 525@item C-z
516@kindex C-z @r{(X windows)} 526@kindex C-z @r{(X windows)}
517Minimize (or iconify) the selected Emacs frame 527Minimize (or iconify) the selected Emacs frame
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index 9a23f23e0ed..edcc6075f75 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -2317,10 +2317,15 @@ them.
2317@item M-? 2317@item M-?
2318Find all the references for the identifier at point. 2318Find all the references for the identifier at point.
2319 2319
2320@item M-x xref-query-replace-in-results @key{RET} @var{regexp} @key{RET} @var{replacement} @key{RET} 2320@item M-x xref-query-replace-in-results @key{RET} @var{replacement} @key{RET}
2321@itemx C-u M-x xref-query-replace-in-results @key{RET} @var{regexp} @key{RET} @var{replacement} @key{RET}
2321Interactively replace @var{regexp} with @var{replacement} in the names 2322Interactively replace @var{regexp} with @var{replacement} in the names
2322of all the identifiers shown in the @file{*xref*} buffer. 2323of all the identifiers shown in the @file{*xref*} buffer.
2323 2324
2325@item M-x xref-find-references-and-replace @key{RET} @var{from} @key{RET} @var{to} @key{RET}
2326Interactively rename all instances of the identifier @var{from} to the
2327new name @var{to}.
2328
2324@item M-x tags-search @key{RET} @var{regexp} @key{RET} 2329@item M-x tags-search @key{RET} @var{regexp} @key{RET}
2325Search for @var{regexp} through the files in the selected tags 2330Search for @var{regexp} through the files in the selected tags
2326table. 2331table.
@@ -2358,13 +2363,21 @@ shown. The default value is @code{nil}, which just shows the results
2358in the @file{*xref*} buffer, but doesn't select any of them. 2363in the @file{*xref*} buffer, but doesn't select any of them.
2359 2364
2360@findex xref-query-replace-in-results 2365@findex xref-query-replace-in-results
2361 @kbd{M-x xref-query-replace-in-results} reads a regexp to match identifier 2366 @kbd{M-x xref-query-replace-in-results} reads a @var{replacement}
2362names and a replacement string, just like ordinary @kbd{M-x 2367string, just like ordinary @kbd{M-x query-replace-regexp}. It then
2363query-replace-regexp}. It then performs the specified replacement in 2368renames the identifiers shown in the @file{*xref*} buffer in all the
2364the names of the matching identifiers in all the places in all the 2369places in all the files where these identifiers are referenced, such
2365files where these identifiers are referenced. This is useful when you 2370that their new name is @var{replacement}. This is useful when you
2366rename your identifiers as part of refactoring. This command should 2371rename your identifiers as part of refactoring. This command should
2367be invoked in the @file{*xref*} buffer generated by @kbd{M-?}. 2372be invoked in the @file{*xref*} buffer generated by @kbd{M-?}. With a
2373prefix argument, the command also prompts for a regexp to match
2374identifier names, and renames that regexp in the names of the matching
2375identifiers with @var{replacement}.
2376
2377@findex xref-find-references-and-replace
2378 @kbd{M-x xref-find-references-and-replace} works similarly to
2379@code{xref-query-replace-in-results}, but is more convenient when you
2380want to rename a single identifier specified by its name @var{from}.
2368 2381
2369@findex tags-search 2382@findex tags-search
2370 @kbd{M-x tags-search} reads a regexp using the minibuffer, then 2383 @kbd{M-x tags-search} reads a regexp using the minibuffer, then
diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
index c12992c239a..fa1b0eee7c3 100644
--- a/doc/emacs/search.texi
+++ b/doc/emacs/search.texi
@@ -436,14 +436,6 @@ incremental search adds the @samp{control-S} character to the search
436string. 436string.
437 437
438@item 438@item
439@findex isearch-char-by-name
440@kindex C-x 8 RET @r{(Incremental Search)}
441Type @kbd{C-x 8 @key{RET}} (@code{isearch-char-by-name}), followed by
442a Unicode name or code-point in hex. This adds the specified
443character into the search string, similar to the usual
444@code{insert-char} command (@pxref{Inserting Text}).
445
446@item
447@kindex C-^ @r{(Incremental Search)} 439@kindex C-^ @r{(Incremental Search)}
448@findex isearch-toggle-input-method 440@findex isearch-toggle-input-method
449@findex isearch-toggle-specified-input-method 441@findex isearch-toggle-specified-input-method
@@ -473,6 +465,23 @@ character to the search string using an input method, and
473automatically disable the input method afterwards. 465automatically disable the input method afterwards.
474@end itemize 466@end itemize
475 467
468@findex isearch-char-by-name
469@kindex C-x 8 RET @r{(Incremental Search)}
470Type @kbd{C-x 8 @key{RET}} (@code{isearch-char-by-name}), followed by
471a Unicode name or code-point in hex. This adds the specified
472character into the search string, similar to the usual
473@code{insert-char} command (@pxref{Inserting Text}).
474
475@findex isearch-emoji-by-name
476@kindex C-x 8 e RET @r{(Incremental Search)}
477 You can also include Emoji sequences in the search string. Type
478@w{@kbd{C-x 8 e @key{RET}}} (@code{isearch-emoji-by-name}), followed
479by the Unicode name of an Emoji (for example, @kbd{smiling face} or
480@kbd{heart with arrow}). This adds the specified Emoji to the search
481string. If you don't know the name of the Emoji you want to search
482for, you can use @kbd{C-x 8 e l} (@code{emoji-list}) and @kbd{C-x 8 e
483d} (@code{emoji-describe}) (@pxref{Input Methods}).
484
476@kindex M-s o @r{(Incremental Search)} 485@kindex M-s o @r{(Incremental Search)}
477@findex isearch-occur 486@findex isearch-occur
478 Typing @kbd{M-s o} in incremental search invokes 487 Typing @kbd{M-s o} in incremental search invokes
diff --git a/doc/lispref/functions.texi b/doc/lispref/functions.texi
index 96fecc8c892..2378e9efd7e 100644
--- a/doc/lispref/functions.texi
+++ b/doc/lispref/functions.texi
@@ -669,6 +669,22 @@ purposes, it is better to use @code{fset}, which does not keep such
669records. @xref{Function Cells}. 669records. @xref{Function Cells}.
670@end defun 670@end defun
671 671
672@defun function-alias-p object &optional noerror
673Checks whether @var{object} is a function alias. If it is, it returns
674a list of symbols representing the function alias chain, else
675@code{nil}. For instance, if @code{a} is an alias for @code{b}, and
676@code{b} is an alias for @code{c}:
677
678@example
679(function-alias-p 'a)
680 @result{} (b c)
681@end example
682
683If there's a loop in the definitions, an error will be signalled. If
684@var{noerror} is non-@code{nil}, the non-looping parts of the chain is
685returned instead.
686@end defun
687
672 You cannot create a new primitive function with @code{defun} or 688 You cannot create a new primitive function with @code{defun} or
673@code{defalias}, but you can use them to change the function definition of 689@code{defalias}, but you can use them to change the function definition of
674any symbol, even one such as @code{car} or @code{x-popup-menu} whose 690any symbol, even one such as @code{car} or @code{x-popup-menu} whose
diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index 5fc831536e8..e2b39836e66 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -762,6 +762,9 @@ uncompression packages: an entry of the form @code{("\\.gz\\'"
762@var{function} t)} can uncompress the file and then put the uncompressed 762@var{function} t)} can uncompress the file and then put the uncompressed
763file in the proper mode according to the name sans @samp{.gz}. 763file in the proper mode according to the name sans @samp{.gz}.
764 764
765If @code{auto-mode-alist} has more than one element whose @var{regexp}
766matches the file name, Emacs will use the first match.
767
765Here is an example of how to prepend several pattern pairs to 768Here is an example of how to prepend several pattern pairs to
766@code{auto-mode-alist}. (You might use this sort of expression in your 769@code{auto-mode-alist}. (You might use this sort of expression in your
767init file.) 770init file.)
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 56b4bc5183e..bbf8988e5c4 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -5281,13 +5281,6 @@ other window is selected. When it is non-@code{nil} and the
5281minibuffer is selected, it takes precedence over 5281minibuffer is selected, it takes precedence over
5282@code{other-window-scroll-buffer}. @xref{Definition of 5282@code{other-window-scroll-buffer}. @xref{Definition of
5283minibuffer-scroll-window}. 5283minibuffer-scroll-window}.
5284
5285When the minibuffer is active, it is the next window if the selected
5286window is the one at the bottom right corner. In this case,
5287@code{scroll-other-window} attempts to scroll the minibuffer. If the
5288minibuffer contains just one line, it has nowhere to scroll to, so the
5289line reappears after the echo area momentarily displays the message
5290@samp{End of buffer}.
5291@end deffn 5284@end deffn
5292 5285
5293@deffn Command scroll-other-window-down &optional count 5286@deffn Command scroll-other-window-down &optional count
diff --git a/doc/misc/Makefile.in b/doc/misc/Makefile.in
index 6c1e9cbc910..d348dbc194b 100644
--- a/doc/misc/Makefile.in
+++ b/doc/misc/Makefile.in
@@ -234,6 +234,10 @@ ${buildinfodir}/tramp.info tramp.html: ${srcdir}/trampver.texi
234 234
235 235
236abs_top_builddir = @abs_top_builddir@ 236abs_top_builddir = @abs_top_builddir@
237
238# Prevent any settings in the user environment causing problems.
239unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH
240
237EMACS = ${abs_top_builddir}/src/emacs 241EMACS = ${abs_top_builddir}/src/emacs
238emacs = "${EMACS}" -batch --no-site-file --no-site-lisp --eval '(setq load-prefer-newer t)' 242emacs = "${EMACS}" -batch --no-site-file --no-site-lisp --eval '(setq load-prefer-newer t)'
239 243
diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi
index 83d324c7e1b..f1d7c638056 100644
--- a/doc/misc/eshell.texi
+++ b/doc/misc/eshell.texi
@@ -694,6 +694,126 @@ Print the current user. This Eshell version of @command{whoami}
694supports Tramp. 694supports Tramp.
695@end table 695@end table
696 696
697@subsection Defining new built-in commands
698While Eshell can run Lisp functions directly as commands, it may be
699more convenient to provide a special built-in command for
700Eshell. Built-in commands are just ordinary Lisp functions designed
701to be called from Eshell. When defining an Eshell-specific version of
702an existing function, you can give that function a name starting with
703@code{eshell/} so that Eshell knows to use it.
704
705@defmac eshell-eval-using-options name macro-args options body@dots{}
706This macro processes a list of @var{macro-args} for the command
707@var{name} using a set of command line @var{options}. If the
708arguments are parsed successfully, it will store the resulting values
709in local symbols and execute @var{body}; any remaining arguments will
710be available in the locally let-bound variable @code{args}. The
711return value is the value of the last form in @var{body}.
712
713If an unknown option was passed in @var{macro-args} and an external
714command was specified (see below), this macro will start a process for
715that command and throw the tag @code{eshell-external} with the new
716process as its value.
717
718@var{options} should be a list beginning with one or more elements of
719the following form, with each element representing a particular
720command-line switch:
721
722@example
723(@var{short} @var{long} @var{value} @var{symbol} @var{help-string})
724@end example
725
726@table @var
727@item short
728This element, if non-nil, should be a character to be used as a short
729switch, like @code{-@var{short}}. At least one of this element and
730@var{long} must be non-nil.
731
732@item long
733This element, if non-nil, should be a string to be used as a long
734switch, like @code{--@var{long}}.
735
736@item value
737This element is the value associated with the option. It can be
738either:
739
740@table @asis
741@item @code{t}
742The option needs a value to be specified after the switch.
743
744@item @code{nil}
745The option is given the value @code{t}.
746
747@item anything else
748The option is given the specified value.
749@end table
750
751@item symbol
752This element is the Lisp symbol that will be bound to @var{value}. If
753@var{symbol} is @code{nil}, specifying this switch will instead call
754@code{eshell-show-usage}, and so is appropriate for an option like
755@code{--help}.
756
757@item help-string
758This element is a documentation string for the option, which will be
759displayed when @code{eshell-show-usage} is invoked.
760@end table
761
762After the list of command-line switch elements, @var{options} can
763include additional keyword arguments to control how
764@code{eshell-eval-using-options} behaves. Some of these take
765arguments, while others don't. The recognized keywords are:
766
767@table @code
768@item :external @var{string}
769Specify @var{string} as an external command to run if there are
770unknown switches in @var{macro-args}.
771
772@item :usage @var{string}
773Set @var{string} as the initial part of the command's documentation
774string. It appears before the options are listed.
775
776@item :post-usage @var{string}
777Set @var{string} to be the (optional) trailing part of the command's
778documentation string. It appears after the list of options, but
779before the final part of the documentation about the associated
780external command, if there is one.
781
782@item :show-usage
783If present, then show the usage message if the command is called with
784no arguments.
785
786@item :preserve-args
787Normally, @code{eshell-eval-using-options} flattens the list of
788arguments in @var{macro-args} and converts each to a string. If this
789keyword is present, avoid doing that, instead preserving the original
790arguments. This is useful for commands which want to accept arbitrary
791Lisp objects.
792
793@item :parse-leading-options-only
794If present, do not parse dash or switch arguments after the first
795positional argument. Instead, treat them as positional arguments
796themselves.
797@end table
798
799For example, you could handle a subset of the options for the
800@code{ls} command like this:
801
802@example
803(eshell-eval-using-options
804 "ls" macro-args
805 '((?a nil nil show-all "show all files")
806 (?I "ignore" t ignore-pattern "ignore files matching pattern")
807 (nil "help" nil nil "show this help message")
808 :external "ls"
809 :usage "[OPTION]... [FILE]...
810 List information about FILEs (the current directory by default).")
811 ;; List the files in ARGS somehow...
812 )
813@end example
814
815@end defmac
816
697@subsection Built-in variables 817@subsection Built-in variables
698Eshell knows a few built-in variables: 818Eshell knows a few built-in variables:
699 819
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 61870311ed8..b3efdfbacba 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -12223,7 +12223,6 @@ controlling variable is a predicate list, as described above.
12223@vindex gnus-treat-highlight-citation 12223@vindex gnus-treat-highlight-citation
12224@vindex gnus-treat-highlight-headers 12224@vindex gnus-treat-highlight-headers
12225@vindex gnus-treat-highlight-signature 12225@vindex gnus-treat-highlight-signature
12226@vindex gnus-treat-play-sounds
12227@vindex gnus-treat-x-pgp-sig 12226@vindex gnus-treat-x-pgp-sig
12228@vindex gnus-treat-unfold-headers 12227@vindex gnus-treat-unfold-headers
12229@vindex gnus-treat-fold-headers 12228@vindex gnus-treat-fold-headers
@@ -12359,8 +12358,6 @@ is controlled by @code{gnus-body-boundary-delimiter}.
12359 12358
12360@xref{Article Highlighting}. 12359@xref{Article Highlighting}.
12361 12360
12362@vindex gnus-treat-play-sounds
12363@item gnus-treat-play-sounds
12364@item gnus-treat-ansi-sequences (t) 12361@item gnus-treat-ansi-sequences (t)
12365@vindex gnus-treat-x-pgp-sig 12362@vindex gnus-treat-x-pgp-sig
12366@item gnus-treat-x-pgp-sig (head) 12363@item gnus-treat-x-pgp-sig (head)
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 3c159558600..6a198e9bfb5 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -2857,7 +2857,7 @@ similar user option as auto-save files, called
2857original file. 2857original file.
2858 2858
2859If you change @code{lock-file-name-transforms} in order to keep file 2859If you change @code{lock-file-name-transforms} in order to keep file
2860locks for remote files somewhere else, you will loose Emacs' feature 2860locks for remote files somewhere else, you will lose Emacs's feature
2861to warn you, if a file is changed in parallel from different Emacs 2861to warn you, if a file is changed in parallel from different Emacs
2862sessions, or via different remote connections. Be careful with such 2862sessions, or via different remote connections. Be careful with such
2863settings. 2863settings.
@@ -2926,7 +2926,7 @@ you, for example, mark the remote directory
2926@file{@trampfn{nextcloud,user@@host,/path/to/dir}} for encryption, the 2926@file{@trampfn{nextcloud,user@@host,/path/to/dir}} for encryption, the
2927configuration file is saved as 2927configuration file is saved as
2928@file{tramp-%2Fnextcloud%3Auser%40host%3A%2Fpath%2Fto%2Fdir%2F.encfs6.xml} 2928@file{tramp-%2Fnextcloud%3Auser%40host%3A%2Fpath%2Fto%2Fdir%2F.encfs6.xml}
2929in @code{user-emacs-directory}. Do not loose this file and the 2929in @code{user-emacs-directory}. Do not lose this file and the
2930corresponding password; otherwise there is no way to decrypt your 2930corresponding password; otherwise there is no way to decrypt your
2931encrypted files. 2931encrypted files.
2932 2932
diff --git a/etc/NEWS b/etc/NEWS
index d7281467c68..ea9ba49892f 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -223,6 +223,8 @@ inserted.
223This command will tell you the name of the Emoji at point. (This 223This command will tell you the name of the Emoji at point. (This
224command also works for non-Emoji characters.) 224command also works for non-Emoji characters.)
225 225
226*** New input method 'emoji'.
227
226** Help 228** Help
227 229
228--- 230---
@@ -271,10 +273,15 @@ height use 'window-height' in combination with 'body-lines'.
271 273
272*** 'other-window-scroll-default' can define the other window to scroll. 274*** 'other-window-scroll-default' can define the other window to scroll.
273 275
274** Rcirc 276** Frames
275 277
276+++ 278+++
277*** New command 'rcirc-when'. 279*** Deleted frames can now be undeleted.
280The 16 most recently deleted frames can be undeleted with 'C-x 5 u' when
281'undelete-frame-mode' is enabled. Without a prefix argument, undelete
282the most recently deleted frame. With a numerical prefix argument
283between 1 and 16, where 1 is the most recently deleted frame, undelete
284the corresponding deleted frame.
278 285
279** Tab Bars and Tab Lines 286** Tab Bars and Tab Lines
280 287
@@ -307,6 +314,11 @@ The Emacs server will be automatically stopped when certain conditions
307are met. The conditions are given by the argument, which can be 314are met. The conditions are given by the argument, which can be
308'empty', 'delete-frame' or 'kill-terminal'. 315'empty', 'delete-frame' or 'kill-terminal'.
309 316
317** Rcirc
318
319+++
320*** New command 'rcirc-when'.
321
310* Editing Changes in Emacs 29.1 322* Editing Changes in Emacs 29.1
311 323
312--- 324---
@@ -392,6 +404,13 @@ the *Completions* buffer.
392+++ 404+++
393*** New user option 'char-fold-override' disables default character equivalences. 405*** New user option 'char-fold-override' disables default character equivalences.
394 406
407+++
408*** New command 'isearch-emoji-by-name'.
409It is bound to 'C-x 8 e RET' during an incremental search. The
410command accepts the Unicode name of an Emoji (for example, "smiling
411face" or "heart with arrow"), like 'C-x 8 e e', with minibuffer
412completion, and adds the Emoji into the search string.
413
395** New minor mode 'glyphless-display-mode'. 414** New minor mode 'glyphless-display-mode'.
396This allows an easy way to toggle seeing all glyphless characters in 415This allows an easy way to toggle seeing all glyphless characters in
397the current buffer. 416the current buffer.
@@ -575,6 +594,12 @@ to enable the display of the buffer list.
575It is bound to 'C-M-,' and jumps to the location where 'xref-go-back' 594It is bound to 'C-M-,' and jumps to the location where 'xref-go-back'
576('M-,', also known as 'xref-pop-marker-stack') was invoked previously. 595('M-,', also known as 'xref-pop-marker-stack') was invoked previously.
577 596
597*** 'xref-query-replace-in-results' does not prompt for FROM when
598called without prefix argument, to make the most common case faster:
599replacing entire matches.
600
601*** New command 'xref-find-references-and-replace' to rename one identifier.
602
578** File notifications 603** File notifications
579 604
580+++ 605+++
@@ -917,6 +942,11 @@ The input must be encoded text.
917* Lisp Changes in Emacs 29.1 942* Lisp Changes in Emacs 29.1
918 943
919+++ 944+++
945** New function 'function-alias-p'.
946This predicate says whether an object is a function alias, and if it
947is, the alias chain is returned.
948
949+++
920** New variable 'lisp-directory' holds the directory of Emacs's own Lisp files. 950** New variable 'lisp-directory' holds the directory of Emacs's own Lisp files.
921 951
922+++ 952+++
@@ -1090,6 +1120,12 @@ dimensions.
1090Specifying a cons as the from argument allows to start measuring text 1120Specifying a cons as the from argument allows to start measuring text
1091from a specified amount of pixels above or below a position. 1121from a specified amount of pixels above or below a position.
1092 1122
1123---
1124** 'eshell-eval-using-options' now follows POSIX/GNU argument syntax conventions.
1125Built-in commands in Eshell now accept command-line options with
1126values passed as a single token, such as '-oVALUE' or
1127'--option=VALUE'.
1128
1093** XDG support 1129** XDG support
1094 1130
1095*** New function 'xdg-state-home' returns 'XDG_STATE_HOME' environment variable. 1131*** New function 'xdg-state-home' returns 'XDG_STATE_HOME' environment variable.
diff --git a/leim/Makefile.in b/leim/Makefile.in
index a574a108454..2a477d868b3 100644
--- a/leim/Makefile.in
+++ b/leim/Makefile.in
@@ -35,15 +35,14 @@ EXEEXT = @EXEEXT@
35-include ${top_builddir}/src/verbose.mk 35-include ${top_builddir}/src/verbose.mk
36 36
37# Prevent any settings in the user environment causing problems. 37# Prevent any settings in the user environment causing problems.
38unexport EMACSDATA EMACSDOC EMACSPATH 38unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH
39 39
40# Which Emacs to use to convert TIT files to Emacs Lisp files, 40# Which Emacs to use to convert TIT files to Emacs Lisp files,
41# and generate the file leim-list.el. 41# and generate the file leim-list.el.
42EMACS = ../src/emacs${EXEEXT} 42EMACS = ../src/emacs${EXEEXT}
43 43
44# How to run Emacs. 44# How to run Emacs.
45# Prevent any setting of EMACSLOADPATH in user environment causing problems. 45RUN_EMACS = '$(EMACS)' -batch --no-site-file --no-site-lisp
46RUN_EMACS = EMACSLOADPATH= '$(EMACS)' -batch --no-site-file --no-site-lisp
47 46
48MKDIR_P = @MKDIR_P@ 47MKDIR_P = @MKDIR_P@
49 48
diff --git a/lib-src/Makefile.in b/lib-src/Makefile.in
index c25ba5c974d..0453b935068 100644
--- a/lib-src/Makefile.in
+++ b/lib-src/Makefile.in
@@ -20,6 +20,9 @@
20 20
21SHELL = @SHELL@ 21SHELL = @SHELL@
22 22
23# Prevent any settings in the user environment causing problems.
24unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH
25
23# Following ../lisp/Makefile.in. 26# Following ../lisp/Makefile.in.
24EMACS = ../src/emacs${EXEEXT} 27EMACS = ../src/emacs${EXEEXT}
25EMACSOPT = -batch --no-site-file --no-site-lisp 28EMACSOPT = -batch --no-site-file --no-site-lisp
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index d29dec08a5e..3a72034463c 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -101,11 +101,10 @@ MAIN_FIRST = ./emacs-lisp/eieio.el ./emacs-lisp/eieio-base.el \
101 ./cedet/semantic/db.el ./emacs-lisp/cconv.el 101 ./cedet/semantic/db.el ./emacs-lisp/cconv.el
102 102
103# Prevent any settings in the user environment causing problems. 103# Prevent any settings in the user environment causing problems.
104unexport EMACSDATA EMACSDOC EMACSPATH 104unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH
105 105
106# The actual Emacs command run in the targets below. 106# The actual Emacs command run in the targets below.
107# Prevent any setting of EMACSLOADPATH in user environment causing problems. 107emacs = '$(EMACS)' $(EMACSOPT)
108emacs = EMACSLOADPATH= '$(EMACS)' $(EMACSOPT)
109 108
110## Subdirectories, relative to builddir. 109## Subdirectories, relative to builddir.
111SUBDIRS = $(sort $(shell find ${srcdir} -type d -print)) 110SUBDIRS = $(sort $(shell find ${srcdir} -type d -print))
diff --git a/lisp/auth-source.el b/lisp/auth-source.el
index 046a685d744..8a425cf9bc0 100644
--- a/lisp/auth-source.el
+++ b/lisp/auth-source.el
@@ -861,7 +861,7 @@ while \(:host t) would find all host entries."
861 secret))) 861 secret)))
862 862
863(defun auth-source-pick-first-password (&rest spec) 863(defun auth-source-pick-first-password (&rest spec)
864 "Pick the first secret found from applying SPEC to `auth-source-search'." 864 "Pick the first secret found by applying 'auth-source-search' to SPEC."
865 (auth-info-password (car (apply #'auth-source-search (plist-put spec :max 1))))) 865 (auth-info-password (car (apply #'auth-source-search (plist-put spec :max 1)))))
866 866
867(defun auth-source-format-prompt (prompt alist) 867(defun auth-source-format-prompt (prompt alist)
diff --git a/lisp/battery.el b/lisp/battery.el
index 45334163fa6..b7b81a11a1c 100644
--- a/lisp/battery.el
+++ b/lisp/battery.el
@@ -96,12 +96,14 @@ Value does not include \".\" or \"..\"."
96 (cond ((member battery-upower-service (dbus-list-activatable-names)) 96 (cond ((member battery-upower-service (dbus-list-activatable-names))
97 #'battery-upower) 97 #'battery-upower)
98 ((and (eq system-type 'gnu/linux) 98 ((and (eq system-type 'gnu/linux)
99 (file-readable-p "/sys/")
99 (battery--find-linux-sysfs-batteries)) 100 (battery--find-linux-sysfs-batteries))
100 #'battery-linux-sysfs) 101 #'battery-linux-sysfs)
101 ((and (eq system-type 'gnu/linux) 102 ((and (eq system-type 'gnu/linux)
102 (file-directory-p "/proc/acpi/battery")) 103 (file-directory-p "/proc/acpi/battery"))
103 #'battery-linux-proc-acpi) 104 #'battery-linux-proc-acpi)
104 ((and (eq system-type 'gnu/linux) 105 ((and (eq system-type 'gnu/linux)
106 (file-readable-p "/proc/")
105 (file-readable-p "/proc/apm")) 107 (file-readable-p "/proc/apm"))
106 #'battery-linux-proc-apm) 108 #'battery-linux-proc-apm)
107 ((and (eq system-type 'berkeley-unix) 109 ((and (eq system-type 'berkeley-unix)
diff --git a/lisp/cedet/ede/project-am.el b/lisp/cedet/ede/project-am.el
index 2803e1c3071..544e39b8729 100644
--- a/lisp/cedet/ede/project-am.el
+++ b/lisp/cedet/ede/project-am.el
@@ -191,8 +191,9 @@ other meta-variable based on this name.")
191 "Encode one makefile.") 191 "Encode one makefile.")
192 192
193;;; Code: 193;;; Code:
194(cl-defmethod project-add-file ((ot project-am-target)) 194(cl-defmethod project-add-file ((ot project-am-target) &optional _file)
195 "Add the current buffer into a project. 195 "Add the current buffer into a project.
196_FILE is ignored.
196OT is the object target. DIR is the directory to start in." 197OT is the object target. DIR is the directory to start in."
197 (let* ((target (if ede-object (error "Already associated w/ a target") 198 (let* ((target (if ede-object (error "Already associated w/ a target")
198 (let ((amf (project-am-load default-directory))) 199 (let ((amf (project-am-load default-directory)))
diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el
index 56e84ab339a..7bcb2f2936d 100644
--- a/lisp/emacs-lisp/easy-mmode.el
+++ b/lisp/emacs-lisp/easy-mmode.el
@@ -697,7 +697,11 @@ Valid keywords and arguments are:
697(defmacro easy-mmode-defmap (m bs doc &rest args) 697(defmacro easy-mmode-defmap (m bs doc &rest args)
698 "Define a constant M whose value is the result of `easy-mmode-define-keymap'. 698 "Define a constant M whose value is the result of `easy-mmode-define-keymap'.
699The M, BS, and ARGS arguments are as per that function. DOC is 699The M, BS, and ARGS arguments are as per that function. DOC is
700the constant's documentation." 700the constant's documentation.
701
702This macro is deprecated; use `defvar-keymap' instead."
703 ;; FIXME: Declare obsolete in favor of `defvar-keymap'. It is still
704 ;; used for `gud-menu-map' and `gud-minor-mode-map', so fix that first.
701 (declare (doc-string 3) (indent 1)) 705 (declare (doc-string 3) (indent 1))
702 `(defconst ,m 706 `(defconst ,m
703 (easy-mmode-define-keymap ,bs nil (if (boundp ',m) ,m) ,(cons 'list args)) 707 (easy-mmode-define-keymap ,bs nil (if (boundp ',m) ,m) ,(cons 'list args))
diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el
index e31ebf5f7bb..9c6b0e15bbe 100644
--- a/lisp/emacs-lisp/ert.el
+++ b/lisp/emacs-lisp/ert.el
@@ -335,15 +335,20 @@ It should only be stopped when ran from inside `ert--run-test-internal'."
335 (unless (eql ,value ',default-value) 335 (unless (eql ,value ',default-value)
336 (list :value ,value)) 336 (list :value ,value))
337 (unless (eql ,value ',default-value) 337 (unless (eql ,value ',default-value)
338 (let ((-explainer- 338 (when-let ((-explainer-
339 (and (symbolp ',fn-name) 339 (ert--get-explainer ',fn-name)))
340 (get ',fn-name 'ert-explainer)))) 340 (list :explanation
341 (when -explainer- 341 (apply -explainer- ,args)))))
342 (list :explanation
343 (apply -explainer- ,args))))))
344 value) 342 value)
345 ,value)))))))) 343 ,value))))))))
346 344
345(defun ert--get-explainer (fn-name)
346 (when (symbolp fn-name)
347 (cl-loop for fn in (cons fn-name (function-alias-p fn-name))
348 for explainer = (get fn 'ert-explainer)
349 when explainer
350 return explainer)))
351
347(defun ert--expand-should (whole form inner-expander) 352(defun ert--expand-should (whole form inner-expander)
348 "Helper function for the `should' macro and its variants. 353 "Helper function for the `should' macro and its variants.
349 354
diff --git a/lisp/emacs-lisp/inline.el b/lisp/emacs-lisp/inline.el
index 963e117ff34..de0112db631 100644
--- a/lisp/emacs-lisp/inline.el
+++ b/lisp/emacs-lisp/inline.el
@@ -71,7 +71,7 @@
71 71
72(defmacro inline-quote (_exp) 72(defmacro inline-quote (_exp)
73 "Similar to backquote, but quotes code and only accepts , and not ,@." 73 "Similar to backquote, but quotes code and only accepts , and not ,@."
74 (declare (debug backquote-form)) 74 (declare (debug (backquote-form)))
75 (error "inline-quote can only be used within define-inline")) 75 (error "inline-quote can only be used within define-inline"))
76 76
77(defmacro inline-const-p (_exp) 77(defmacro inline-const-p (_exp)
diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el
index faf0b1619e0..27a7a8f8cf1 100644
--- a/lisp/emacs-lisp/macroexp.el
+++ b/lisp/emacs-lisp/macroexp.el
@@ -382,14 +382,17 @@ Assumes the caller has bound `macroexpand-all-environment'."
382 (macroexp--all-forms args) 382 (macroexp--all-forms args)
383 form) 383 form)
384 (macroexp--expand-all newform)))) 384 (macroexp--expand-all newform))))
385 (`(funcall . ,(or `(,exp . ,args) pcase--dontcare)) 385 (`(funcall ,exp . ,args)
386 (let ((eexp (macroexp--expand-all exp)) 386 (let ((eexp (macroexp--expand-all exp))
387 (eargs (macroexp--all-forms args))) 387 (eargs (macroexp--all-forms args)))
388 ;; Rewrite (funcall #'foo bar) to (foo bar), in case `foo' 388 ;; Rewrite (funcall #'foo bar) to (foo bar), in case `foo'
389 ;; has a compiler-macro, or to unfold it. 389 ;; has a compiler-macro, or to unfold it.
390 (pcase eexp 390 (pcase eexp
391 (`#',f (macroexp--expand-all `(,f . ,eargs))) 391 ((and `#',f
392 (guard (not (or (special-form-p f) (macrop f))))) ;; bug#46636
393 (macroexp--expand-all `(,f . ,eargs)))
392 (_ `(funcall ,eexp . ,eargs))))) 394 (_ `(funcall ,eexp . ,eargs)))))
395 (`(funcall . ,_) form) ;bug#53227
393 (`(,func . ,_) 396 (`(,func . ,_)
394 (let ((handler (function-get func 'compiler-macro)) 397 (let ((handler (function-get func 'compiler-macro))
395 (funargs (function-get func 'funarg-positions))) 398 (funargs (function-get func 'funarg-positions)))
@@ -430,7 +433,6 @@ Assumes the caller has bound `macroexpand-all-environment'."
430 newform 433 newform
431 (macroexp--expand-all newform))) 434 (macroexp--expand-all newform)))
432 (macroexp--expand-all newform)))))) 435 (macroexp--expand-all newform))))))
433
434 (_ form))) 436 (_ form)))
435 (pop byte-compile-form-stack))) 437 (pop byte-compile-form-stack)))
436 438
diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el
index 870d34527b0..658edd67527 100644
--- a/lisp/emacs-lisp/shortdoc.el
+++ b/lisp/emacs-lisp/shortdoc.el
@@ -1299,6 +1299,9 @@ If FUNCTION is non-nil, place point on the entry for FUNCTION (if any)."
1299 (text-property-search-forward 'shortdoc-function function t) 1299 (text-property-search-forward 'shortdoc-function function t)
1300 (beginning-of-line))) 1300 (beginning-of-line)))
1301 1301
1302;;;###autoload
1303(defalias 'shortdoc #'shortdoc-display-group)
1304
1302(defun shortdoc--display-function (data) 1305(defun shortdoc--display-function (data)
1303 (let ((function (pop data)) 1306 (let ((function (pop data))
1304 (start-section (point)) 1307 (start-section (point))
diff --git a/lisp/eshell/esh-opt.el b/lisp/eshell/esh-opt.el
index d96b77ddd37..bba1c4ad25d 100644
--- a/lisp/eshell/esh-opt.el
+++ b/lisp/eshell/esh-opt.el
@@ -187,49 +187,82 @@ passed to this command, the external version `%s'
187will be called instead." extcmd))))) 187will be called instead." extcmd)))))
188 (throw 'eshell-usage usage))) 188 (throw 'eshell-usage usage)))
189 189
190(defun eshell--set-option (name ai opt options opt-vals) 190(defun eshell--split-switch (switch kind)
191 "Split SWITCH into its option name and potential value, if any.
192KIND should be the integer 0 if SWITCH is a short option, or 1 if it's
193a long option."
194 (if (eq kind 0)
195 ;; Short option
196 (cons (aref switch 0)
197 (and (> (length switch) 1) (substring switch 1)))
198 ;; Long option
199 (save-match-data
200 (string-match "\\([^=]*\\)\\(?:=\\(.*\\)\\)?" switch)
201 (cons (match-string 1 switch) (match-string 2 switch)))))
202
203(defun eshell--set-option (name ai opt value options opt-vals)
191 "Using NAME's remaining args (index AI), set the OPT within OPTIONS. 204 "Using NAME's remaining args (index AI), set the OPT within OPTIONS.
192If the option consumes an argument for its value, the argument list 205VALUE is the potential value of the OPT, coming from args like
193will be modified." 206\"-fVALUE\" or \"--foo=VALUE\", or nil if no value was supplied. If
207OPT doesn't consume a value, return VALUE unchanged so that it can be
208processed later; otherwsie, return nil.
209
210If the OPT consumes an argument for its value and VALUE is nil, the
211argument list will be modified."
194 (if (not (nth 3 opt)) 212 (if (not (nth 3 opt))
195 (eshell-show-usage name options) 213 (eshell-show-usage name options)
196 (setcdr (assq (nth 3 opt) opt-vals) 214 (if (eq (nth 2 opt) t)
197 (if (eq (nth 2 opt) t) 215 (progn
198 (if (> ai (length eshell--args)) 216 (setcdr (assq (nth 3 opt) opt-vals)
199 (error "%s: missing option argument" name) 217 (or value
200 (pop (nthcdr ai eshell--args))) 218 (if (> ai (length eshell--args))
201 (or (nth 2 opt) t))))) 219 (error "%s: missing option argument" name)
220 (pop (nthcdr ai eshell--args)))))
221 nil)
222 (setcdr (assq (nth 3 opt) opt-vals)
223 (or (nth 2 opt) t))
224 value)))
202 225
203(defun eshell--process-option (name switch kind ai options opt-vals) 226(defun eshell--process-option (name switch kind ai options opt-vals)
204 "For NAME, process SWITCH (of type KIND), from args at index AI. 227 "For NAME, process SWITCH (of type KIND), from args at index AI.
205The SWITCH will be looked up in the set of OPTIONS. 228The SWITCH will be looked up in the set of OPTIONS.
206 229
207SWITCH should be either a string or character. KIND should be the 230SWITCH should be a string starting with the option to process,
208integer 0 if it's a character, or 1 if it's a string. 231possibly followed by its value, e.g. \"u\" or \"uUSER\". KIND should
209 232be the integer 0 if it's a short option, or 1 if it's a long option.
210The SWITCH is then be matched against OPTIONS. If no matching handler 233
211is found, and an :external command is defined (and available), it will 234The SWITCH is then be matched against OPTIONS. If KIND is 0 and the
212be called; otherwise, an error will be triggered to say that the 235SWITCH matches an option that doesn't take a value, return the
213switch is unrecognized." 236remaining characters in SWITCH to be processed later as further short
214 (let* ((opts options) 237options.
215 found) 238
239If no matching handler is found, and an :external command is defined
240(and available), it will be called; otherwise, an error will be
241triggered to say that the switch is unrecognized."
242 (let ((switch (eshell--split-switch switch kind))
243 (opts options)
244 found remaining)
216 (while opts 245 (while opts
217 (if (and (listp (car opts)) 246 (if (and (listp (car opts))
218 (nth kind (car opts)) 247 (equal (car switch) (nth kind (car opts))))
219 (equal switch (nth kind (car opts))))
220 (progn 248 (progn
221 (eshell--set-option name ai (car opts) options opt-vals) 249 (setq remaining (eshell--set-option name ai (car opts)
250 (cdr switch) options opt-vals))
251 (when (and remaining (eq kind 1))
252 (error "%s: option --%s doesn't allow an argument"
253 name (car switch)))
222 (setq found t opts nil)) 254 (setq found t opts nil))
223 (setq opts (cdr opts)))) 255 (setq opts (cdr opts))))
224 (unless found 256 (if found
257 remaining
225 (let ((extcmd (memq ':external options))) 258 (let ((extcmd (memq ':external options)))
226 (when extcmd 259 (when extcmd
227 (setq extcmd (eshell-search-path (cadr extcmd))) 260 (setq extcmd (eshell-search-path (cadr extcmd)))
228 (if extcmd 261 (if extcmd
229 (throw 'eshell-ext-command extcmd) 262 (throw 'eshell-ext-command extcmd)
230 (error (if (characterp switch) "%s: unrecognized option -%c" 263 (error (if (characterp (car switch)) "%s: unrecognized option -%c"
231 "%s: unrecognized option --%s") 264 "%s: unrecognized option --%s")
232 name switch))))))) 265 name (car switch))))))))
233 266
234(defun eshell--process-args (name args options) 267(defun eshell--process-args (name args options)
235 "Process the given ARGS using OPTIONS." 268 "Process the given ARGS using OPTIONS."
@@ -262,12 +295,9 @@ switch is unrecognized."
262 (if (> (length switch) 0) 295 (if (> (length switch) 0)
263 (eshell--process-option name switch 1 ai options opt-vals) 296 (eshell--process-option name switch 1 ai options opt-vals)
264 (setq ai (length eshell--args))) 297 (setq ai (length eshell--args)))
265 (let ((len (length switch)) 298 (while (> (length switch) 0)
266 (index 0)) 299 (setq switch (eshell--process-option name switch 0
267 (while (< index len) 300 ai options opt-vals)))))))
268 (eshell--process-option name (aref switch index)
269 0 ai options opt-vals)
270 (setq index (1+ index))))))))
271 (nconc (mapcar #'cdr opt-vals) eshell--args))) 301 (nconc (mapcar #'cdr opt-vals) eshell--args)))
272 302
273(provide 'esh-opt) 303(provide 'esh-opt)
diff --git a/lisp/ffap.el b/lisp/ffap.el
index f9220817a71..b5d2a02cd1d 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -1449,10 +1449,13 @@ which may actually result in an URL rather than a filename."
1449 (ffap-file-exists-string (substring name 0 (match-beginning 0))))) 1449 (ffap-file-exists-string (substring name 0 (match-beginning 0)))))
1450 ;; If it contains a colon, get rid of it (and return if exists) 1450 ;; If it contains a colon, get rid of it (and return if exists)
1451 ((and (string-match path-separator name) 1451 ((and (string-match path-separator name)
1452 (setq name (ffap-string-at-point 'nocolon)) 1452 (let ((this-name (ffap-string-at-point 'nocolon)))
1453 (> (length name) 0) 1453 ;; But don't interpret the first part if ":/bin" as
1454 (ffap-file-exists-string name))) 1454 ;; the empty string.
1455 ;; File does not exist, try the alist: 1455 (when (> (length this-name) 0)
1456 (setq name this-name)
1457 (ffap-file-exists-string name)))))
1458 ;; File does not exist, try the alist:
1456 ((let ((alist ffap-alist) tem try case-fold-search) 1459 ((let ((alist ffap-alist) tem try case-fold-search)
1457 (while (and alist (not try)) 1460 (while (and alist (not try))
1458 (setq tem (car alist) alist (cdr alist)) 1461 (setq tem (car alist) alist (cdr alist))
diff --git a/lisp/files.el b/lisp/files.el
index 48e0252e060..1d9d450e4d3 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -483,12 +483,16 @@ If `silently', don't ask the user before saving."
483 483
484(defcustom lock-file-name-transforms nil 484(defcustom lock-file-name-transforms nil
485 "Transforms to apply to buffer file name before making a lock file name. 485 "Transforms to apply to buffer file name before making a lock file name.
486This has the same syntax as 486This has the same syntax as `auto-save-file-name-transforms',
487`auto-save-file-name-transforms' (which see), but instead of 487but applies to lock file names instead of auto-save file names.
488applying to auto-save file names, it's applied to lock file names.
489 488
490By default, a lock file is put into the same directory as the 489By default, Emacs puts each lock file into the same directory as the
491file it's locking, and it has the same name, but with \".#\" prepended." 490file it locks, prepending \".#\" to the base file name.
491
492Note that changing this could break lock file functionality, e.g.:
493if different users access the same file, using different lock file settings;
494if accessing files on a shared file system from different hosts,
495using a transform that puts the lock files on a local file system."
492 :group 'files 496 :group 'files
493 :type '(repeat (list (regexp :tag "Regexp") 497 :type '(repeat (list (regexp :tag "Regexp")
494 (string :tag "Replacement") 498 (string :tag "Replacement")
diff --git a/lisp/frame.el b/lisp/frame.el
index 62b73f3157b..599ffe591a5 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -2529,6 +2529,80 @@ deleting them."
2529 (if iconify (iconify-frame this) (delete-frame this))) 2529 (if iconify (iconify-frame this) (delete-frame this)))
2530 (setq this next)))) 2530 (setq this next))))
2531 2531
2532(eval-when-compile (require 'frameset))
2533
2534(defvar undelete-frame--deleted-frames nil
2535 "Internal variable used by `undelete-frame--handle-delete-frame'.")
2536
2537(defun undelete-frame--handle-delete-frame (frame)
2538 "Save the configuration of frames deleted with `delete-frame'.
2539Only the 16 most recently deleted frames are saved."
2540 (when (frame-live-p frame)
2541 (setq undelete-frame--deleted-frames
2542 (cons
2543 (cons
2544 (display-graphic-p)
2545 (frameset-save
2546 (list frame)
2547 ;; When the daemon is started from a graphical
2548 ;; environment, TTY frames have a 'display' parameter set
2549 ;; to the value of $DISPLAY (see the note in
2550 ;; `server--on-display-p'). Do not store that parameter
2551 ;; in the frameset, otherwise `frameset-restore' attempts
2552 ;; to restore a graphical frame.
2553 :filters (if (display-graphic-p)
2554 frameset-filter-alist
2555 (cons '(display . :never)
2556 frameset-filter-alist))))
2557 undelete-frame--deleted-frames))
2558 (if (> (length undelete-frame--deleted-frames) 16)
2559 (setq undelete-frame--deleted-frames
2560 (butlast undelete-frame--deleted-frames)))))
2561
2562(define-minor-mode undelete-frame-mode
2563 "Enable the `undelete-frame' command."
2564 :group 'frames
2565 :global t
2566 (if undelete-frame-mode
2567 (add-hook 'delete-frame-functions
2568 #'undelete-frame--handle-delete-frame -75)
2569 (remove-hook 'delete-frame-functions
2570 #'undelete-frame--handle-delete-frame)
2571 (setq undelete-frame--deleted-frames nil)))
2572
2573(defun undelete-frame (&optional arg)
2574 "Undelete a frame deleted with `delete-frame'.
2575Without a prefix argument, undelete the most recently deleted
2576frame.
2577With a numerical prefix argument ARG between 1 and 16, where 1 is
2578most recently deleted frame, undelete the ARGth deleted frame.
2579When called from Lisp, returns the new frame."
2580 (interactive "P")
2581 (if (not undelete-frame-mode)
2582 (user-error "Undelete-Frame mode is disabled")
2583 (if (consp arg)
2584 (user-error "Missing deleted frame number argument")
2585 (let* ((number (pcase arg ('nil 1) ('- -1) (_ arg)))
2586 (frames (frame-list))
2587 (frameset (nth (1- number) undelete-frame--deleted-frames))
2588 (graphic (display-graphic-p)))
2589 (if (not (<= 1 number 16))
2590 (user-error "%d is not a valid deleted frame number argument"
2591 number)
2592 (if (not frameset)
2593 (user-error "No deleted frame with number %d" number)
2594 (if (not (eq graphic (car frameset)))
2595 (user-error
2596 "Cannot undelete a %s display frame on a %s display"
2597 (if graphic "non-graphic" "graphic")
2598 (if graphic "graphic" "non-graphic"))
2599 (setq undelete-frame--deleted-frames
2600 (delq frameset undelete-frame--deleted-frames))
2601 (frameset-restore (cdr frameset))
2602 (let ((frame (car (seq-difference (frame-list) frames))))
2603 (when frame
2604 (select-frame-set-input-focus frame)
2605 frame)))))))))
2532 2606
2533;;; Window dividers. 2607;;; Window dividers.
2534(defgroup window-divider nil 2608(defgroup window-divider nil
@@ -2873,6 +2947,7 @@ See also `toggle-frame-maximized'."
2873(define-key ctl-x-5-map "o" #'other-frame) 2947(define-key ctl-x-5-map "o" #'other-frame)
2874(define-key ctl-x-5-map "5" #'other-frame-prefix) 2948(define-key ctl-x-5-map "5" #'other-frame-prefix)
2875(define-key ctl-x-5-map "c" #'clone-frame) 2949(define-key ctl-x-5-map "c" #'clone-frame)
2950(define-key ctl-x-5-map "u" #'undelete-frame)
2876(define-key global-map [f11] #'toggle-frame-fullscreen) 2951(define-key global-map [f11] #'toggle-frame-fullscreen)
2877(define-key global-map [(meta f10)] #'toggle-frame-maximized) 2952(define-key global-map [(meta f10)] #'toggle-frame-maximized)
2878(define-key esc-map [f10] #'toggle-frame-maximized) 2953(define-key esc-map [f10] #'toggle-frame-maximized)
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index f26ab6ab4c7..a286c446724 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -1159,13 +1159,15 @@ predicate. See Info node `(gnus)Customizing Articles'."
1159 :link '(custom-manual "(gnus)Customizing Articles") 1159 :link '(custom-manual "(gnus)Customizing Articles")
1160 :type gnus-article-treat-head-custom) 1160 :type gnus-article-treat-head-custom)
1161 1161
1162(defcustom gnus-treat-emphasize 50000 1162(defcustom gnus-treat-emphasize '(and 50000
1163 (not (typep "text/html")))
1163 "Emphasize text. 1164 "Emphasize text.
1164Valid values are nil, t, `head', `first', `last', an integer or a 1165Valid values are nil, t, `head', `first', `last', an integer or a
1165predicate. See Info node `(gnus)Customizing Articles'." 1166predicate. See Info node `(gnus)Customizing Articles'."
1166 :group 'gnus-article-treat 1167 :group 'gnus-article-treat
1167 :link '(custom-manual "(gnus)Customizing Articles") 1168 :link '(custom-manual "(gnus)Customizing Articles")
1168 :type gnus-article-treat-custom) 1169 :type gnus-article-treat-custom
1170 :version "29.1")
1169(put 'gnus-treat-emphasize 'highlight t) 1171(put 'gnus-treat-emphasize 'highlight t)
1170 1172
1171(defcustom gnus-treat-strip-cr nil 1173(defcustom gnus-treat-strip-cr nil
diff --git a/lisp/gnus/gnus-registry.el b/lisp/gnus/gnus-registry.el
index 0c281a997f8..edeacbc919e 100644
--- a/lisp/gnus/gnus-registry.el
+++ b/lisp/gnus/gnus-registry.el
@@ -355,8 +355,13 @@ This is not required after changing `gnus-registry-cache-file'."
355 "Load the registry from the cache file." 355 "Load the registry from the cache file."
356 (interactive) 356 (interactive)
357 (let ((file gnus-registry-cache-file)) 357 (let ((file gnus-registry-cache-file))
358 (gnus-message 5 "Initializing the registry")
358 (condition-case nil 359 (condition-case nil
359 (gnus-registry-read file) 360 (progn
361 (gnus-registry-read file)
362 (gnus-registry-install-hooks)
363 (gnus-registry-install-shortcuts)
364 (setq gnus-registry-enabled t))
360 (file-error 365 (file-error
361 ;; Fix previous mis-naming of the registry file. 366 ;; Fix previous mis-naming of the registry file.
362 (let ((old-file-name 367 (let ((old-file-name
@@ -846,9 +851,9 @@ Overrides existing keywords with FORCE set non-nil."
846 851
847(defun gnus-registry-register-message-ids () 852(defun gnus-registry-register-message-ids ()
848 "Register the Message-ID of every article in the group." 853 "Register the Message-ID of every article in the group."
849 (unless (or (gnus-parameter-registry-ignore gnus-newsgroup-name) 854 (unless (or (null gnus-registry-enabled)
850 (null gnus-registry-register-all) 855 (null gnus-registry-register-all)
851 (null (eieio-object-p gnus-registry-db))) 856 (gnus-parameter-registry-ignore gnus-newsgroup-name))
852 (dolist (article gnus-newsgroup-articles) 857 (dolist (article gnus-newsgroup-articles)
853 (let* ((id (gnus-registry-fetch-message-id-fast article)) 858 (let* ((id (gnus-registry-fetch-message-id-fast article))
854 (groups (gnus-registry-get-id-key id 'group))) 859 (groups (gnus-registry-get-id-key id 'group)))
@@ -1175,7 +1180,8 @@ non-nil."
1175(defun gnus-registry-clear () 1180(defun gnus-registry-clear ()
1176 "Clear the registry." 1181 "Clear the registry."
1177 (gnus-registry-unload-hook) 1182 (gnus-registry-unload-hook)
1178 (setq gnus-registry-db nil)) 1183 (setq gnus-registry-db nil
1184 gnus-registry-enabled nil))
1179 1185
1180(gnus-add-shutdown 'gnus-registry-clear 'gnus) 1186(gnus-add-shutdown 'gnus-registry-clear 'gnus)
1181 1187
@@ -1183,16 +1189,12 @@ non-nil."
1183(defun gnus-registry-initialize () 1189(defun gnus-registry-initialize ()
1184 "Initialize the Gnus registry." 1190 "Initialize the Gnus registry."
1185 (interactive) 1191 (interactive)
1186 (gnus-message 5 "Initializing the registry")
1187 (gnus-registry-install-hooks)
1188 (gnus-registry-install-shortcuts)
1189 (if (gnus-alive-p) 1192 (if (gnus-alive-p)
1190 (gnus-registry-load) 1193 (gnus-registry-load)
1191 (add-hook 'gnus-read-newsrc-el-hook #'gnus-registry-load))) 1194 (add-hook 'gnus-read-newsrc-el-hook #'gnus-registry-load)))
1192 1195
1193(defun gnus-registry-install-hooks () 1196(defun gnus-registry-install-hooks ()
1194 "Install the registry hooks." 1197 "Install the registry hooks."
1195 (setq gnus-registry-enabled t)
1196 (add-hook 'gnus-summary-article-move-hook #'gnus-registry-action) 1198 (add-hook 'gnus-summary-article-move-hook #'gnus-registry-action)
1197 (add-hook 'gnus-summary-article-delete-hook #'gnus-registry-action) 1199 (add-hook 'gnus-summary-article-delete-hook #'gnus-registry-action)
1198 (add-hook 'gnus-summary-article-expire-hook #'gnus-registry-action) 1200 (add-hook 'gnus-summary-article-expire-hook #'gnus-registry-action)
@@ -1212,10 +1214,9 @@ non-nil."
1212 (remove-hook 'gnus-save-newsrc-hook #'gnus-registry-save) 1214 (remove-hook 'gnus-save-newsrc-hook #'gnus-registry-save)
1213 (remove-hook 'gnus-read-newsrc-el-hook #'gnus-registry-load) 1215 (remove-hook 'gnus-read-newsrc-el-hook #'gnus-registry-load)
1214 1216
1215 (remove-hook 'gnus-summary-prepare-hook #'gnus-registry-register-message-ids) 1217 (remove-hook 'gnus-summary-prepare-hook #'gnus-registry-register-message-ids))
1216 (setq gnus-registry-enabled nil))
1217 1218
1218(add-hook 'gnus-registry-unload-hook #'gnus-registry-unload-hook) 1219(add-hook 'gnus-registry-unload-hook #'gnus-registry-clear)
1219 1220
1220(defun gnus-registry-install-p () 1221(defun gnus-registry-install-p ()
1221 "Return non-nil if the registry is enabled (and maybe enable it first). 1222 "Return non-nil if the registry is enabled (and maybe enable it first).
diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el
index 090cb9b245b..cff628061e9 100644
--- a/lisp/gnus/nnimap.el
+++ b/lisp/gnus/nnimap.el
@@ -246,7 +246,7 @@ during splitting, which may be slow."
246 (nnimap-header-parameters)) 246 (nnimap-header-parameters))
247 t) 247 t)
248 (unless (process-live-p (get-buffer-process (current-buffer))) 248 (unless (process-live-p (get-buffer-process (current-buffer)))
249 (error "Server closed connection")) 249 (error "IMAP server %S closed connection" nnimap-address))
250 (nnimap-transform-headers) 250 (nnimap-transform-headers)
251 (nnheader-remove-cr-followed-by-lf)) 251 (nnheader-remove-cr-followed-by-lf))
252 (insert-buffer-substring 252 (insert-buffer-substring
diff --git a/lisp/gnus/nntp.el b/lisp/gnus/nntp.el
index 624c64d4d75..0dcff9743ad 100644
--- a/lisp/gnus/nntp.el
+++ b/lisp/gnus/nntp.el
@@ -306,7 +306,7 @@ backend doesn't catch this error.")
306 (nntp-record-command string)) 306 (nntp-record-command string))
307 (process-send-string process (concat string nntp-end-of-line)) 307 (process-send-string process (concat string nntp-end-of-line))
308 (or (memq (process-status process) '(open run)) 308 (or (memq (process-status process) '(open run))
309 (nntp-report "Server closed connection"))) 309 (nntp-report "NNTP server %S closed connection" nntp-address)))
310 310
311(defun nntp-record-command (string) 311(defun nntp-record-command (string)
312 "Record the command STRING." 312 "Record the command STRING."
@@ -369,7 +369,7 @@ retried once before actually displaying the error report."
369 (nntp-snarf-error-message) 369 (nntp-snarf-error-message)
370 nil)) 370 nil))
371 ((not (memq (process-status process) '(open run))) 371 ((not (memq (process-status process) '(open run)))
372 (nntp-report "Server closed connection")) 372 (nntp-report "NNTP server %S closed connection" nntp-address))
373 (t 373 (t
374 (goto-char (point-max)) 374 (goto-char (point-max))
375 (let ((limit (point-min)) 375 (let ((limit (point-min))
@@ -1431,7 +1431,7 @@ If SEND-IF-FORCE, only send authinfo to the server if the
1431 ;; be the process's former output buffer (i.e. now killed) 1431 ;; be the process's former output buffer (i.e. now killed)
1432 (or (and process 1432 (or (and process
1433 (memq (process-status process) '(open run))) 1433 (memq (process-status process) '(open run)))
1434 (nntp-report "Server closed connection"))))) 1434 (nntp-report "NNTP server %S closed connection" nntp-address)))))
1435 1435
1436(defun nntp-accept-response () 1436(defun nntp-accept-response ()
1437 "Wait for output from the process that outputs to BUFFER." 1437 "Wait for output from the process that outputs to BUFFER."
@@ -1450,7 +1450,7 @@ If SEND-IF-FORCE, only send authinfo to the server if the
1450 (when group 1450 (when group
1451 (let ((entry (nntp-find-connection-entry nntp-server-buffer))) 1451 (let ((entry (nntp-find-connection-entry nntp-server-buffer)))
1452 (cond ((not entry) 1452 (cond ((not entry)
1453 (nntp-report "Server closed connection")) 1453 (nntp-report "NNTP server %S closed connection" nntp-address))
1454 ((not (equal group (caddr entry))) 1454 ((not (equal group (caddr entry)))
1455 (with-current-buffer (process-buffer (car entry)) 1455 (with-current-buffer (process-buffer (car entry))
1456 (erase-buffer) 1456 (erase-buffer)
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index d408efeeb9e..e000a68a823 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -829,11 +829,7 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED REAL-DEF)."
829 (symbol-name function))))))) 829 (symbol-name function)))))))
830 (real-def (cond 830 (real-def (cond
831 ((and aliased (not (subrp def))) 831 ((and aliased (not (subrp def)))
832 (let ((f real-function)) 832 (car (function-alias-p real-function t)))
833 (while (and (fboundp f)
834 (symbolp (symbol-function f)))
835 (setq f (symbol-function f)))
836 f))
837 ((subrp def) (intern (subr-name def))) 833 ((subrp def) (intern (subr-name def)))
838 (t def)))) 834 (t def))))
839 835
diff --git a/lisp/hi-lock.el b/lisp/hi-lock.el
index fbd698e234a..b70d4a75690 100644
--- a/lisp/hi-lock.el
+++ b/lisp/hi-lock.el
@@ -854,6 +854,26 @@ SPACES-REGEXP is a regexp to substitute spaces in font-lock search."
854 ;; continue standard unloading 854 ;; continue standard unloading
855 nil) 855 nil)
856 856
857;;; Mouse support
858(defun hi-lock-symbol-at-mouse (event)
859 "Highlight symbol at mouse click EVENT."
860 (interactive "e")
861 (save-excursion
862 (mouse-set-point event)
863 (highlight-symbol-at-point)))
864
865;;;###autoload
866(defun hi-lock-context-menu (menu click)
867 "Populate MENU with a menu item to highlight symbol at CLICK."
868 (save-excursion
869 (mouse-set-point click)
870 (when (symbol-at-point)
871 (define-key-after menu [highlight-search-separator] menu-bar-separator)
872 (define-key-after menu [highlight-search-mouse]
873 '(menu-item "Highlight Symbol" highlight-symbol-at-mouse
874 :help "Highlight symbol at point"))))
875 menu)
876
857(provide 'hi-lock) 877(provide 'hi-lock)
858 878
859;;; hi-lock.el ends here 879;;; hi-lock.el ends here
diff --git a/lisp/image-dired.el b/lisp/image-dired.el
index 536f29441ae..b81df8567bd 100644
--- a/lisp/image-dired.el
+++ b/lisp/image-dired.el
@@ -609,9 +609,7 @@ See also `image-dired-thumbnail-storage'."
609 ((eq 'use-image-dired-dir image-dired-thumbnail-storage) 609 ((eq 'use-image-dired-dir image-dired-thumbnail-storage)
610 (let* ((f (expand-file-name file)) 610 (let* ((f (expand-file-name file))
611 (hash 611 (hash
612 ;; SHA1 is slightly faster than MD5, so let's use it. 612 (md5 (file-name-as-directory (file-name-directory f)))))
613 ;; (We don't need anything crytographically strong.)
614 (sha1 (file-name-as-directory (file-name-directory f)))))
615 (format "%s%s%s.thumb.%s" 613 (format "%s%s%s.thumb.%s"
616 (file-name-as-directory (expand-file-name (image-dired-dir))) 614 (file-name-as-directory (expand-file-name (image-dired-dir)))
617 (file-name-base f) 615 (file-name-base f)
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 7593a0ec980..833d031c562 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -668,6 +668,7 @@ This is like `describe-bindings', but displays only Isearch keys."
668 ;; The key translations defined in the C-x 8 prefix should add 668 ;; The key translations defined in the C-x 8 prefix should add
669 ;; characters to the search string. See iso-transl.el. 669 ;; characters to the search string. See iso-transl.el.
670 (define-key map "\C-x8\r" 'isearch-char-by-name) 670 (define-key map "\C-x8\r" 'isearch-char-by-name)
671 (define-key map "\C-x8e\r" 'isearch-emoji-by-name)
671 map) 672 map)
672 "Keymap for `isearch-mode'.") 673 "Keymap for `isearch-mode'.")
673 674
@@ -758,6 +759,8 @@ This is like `describe-bindings', but displays only Isearch keys."
758 :help "Search for literal char"] 759 :help "Search for literal char"]
759 ["Search for char by name" isearch-char-by-name 760 ["Search for char by name" isearch-char-by-name
760 :help "Search for character by name"] 761 :help "Search for character by name"]
762 ["Search for Emoji by name" isearch-emoji-by-name
763 :help "Search for Emoji by its Unicode name"]
761 "---" 764 "---"
762 ["Toggle input method" isearch-toggle-input-method 765 ["Toggle input method" isearch-toggle-input-method
763 :help "Toggle input method for search"] 766 :help "Toggle input method for search"]
@@ -2747,6 +2750,24 @@ With argument, add COUNT copies of the character."
2747 (mapconcat 'isearch-text-char-description 2750 (mapconcat 'isearch-text-char-description
2748 string "")))))))) 2751 string ""))))))))
2749 2752
2753(defun isearch-emoji-by-name (&optional count)
2754 "Read an Emoji name and add it to the search string COUNT times.
2755COUNT (interactively, the prefix argument) defaults to 1.
2756The command accepts Unicode names like \"smiling face\" or
2757\"heart with arrow\", and completion is available."
2758 (interactive "p")
2759 (with-isearch-suspended
2760 (let ((emoji (with-temp-buffer
2761 (emoji-search)
2762 (if (and (integerp count) (> count 1))
2763 (apply 'concat (make-list count (buffer-string)))
2764 (buffer-string)))))
2765 (when emoji
2766 (setq isearch-new-string (concat isearch-string emoji)
2767 isearch-new-message (concat isearch-message
2768 (mapconcat 'isearch-text-char-description
2769 emoji "")))))))
2770
2750(defun isearch-search-and-update () 2771(defun isearch-search-and-update ()
2751 "Do the search and update the display." 2772 "Do the search and update the display."
2752 (when (or isearch-success 2773 (when (or isearch-success
diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el
index 84d0ef9179b..b84e9b74b1f 100644
--- a/lisp/jsonrpc.el
+++ b/lisp/jsonrpc.el
@@ -4,7 +4,7 @@
4 4
5;; Author: João Távora <joaotavora@gmail.com> 5;; Author: João Távora <joaotavora@gmail.com>
6;; Keywords: processes, languages, extensions 6;; Keywords: processes, languages, extensions
7;; Version: 1.0.14 7;; Version: 1.0.15
8;; Package-Requires: ((emacs "25.2")) 8;; Package-Requires: ((emacs "25.2"))
9 9
10;; This is a GNU ELPA :core package. Avoid functionality that is not 10;; This is a GNU ELPA :core package. Avoid functionality that is not
@@ -698,7 +698,9 @@ TIMEOUT is nil)."
698(defun jsonrpc--debug (server format &rest args) 698(defun jsonrpc--debug (server format &rest args)
699 "Debug message for SERVER with FORMAT and ARGS." 699 "Debug message for SERVER with FORMAT and ARGS."
700 (jsonrpc--log-event 700 (jsonrpc--log-event
701 server (if (stringp format)`(:message ,(format format args)) format))) 701 server (if (stringp format)
702 `(:message ,(apply #'format format args))
703 format)))
702 704
703(defun jsonrpc--warn (format &rest args) 705(defun jsonrpc--warn (format &rest args)
704 "Warning message with FORMAT and ARGS." 706 "Warning message with FORMAT and ARGS."
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index 6d5b0d84e6b..05d461e41e9 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -8861,8 +8861,12 @@ Define a constant M whose value is the result of `easy-mmode-define-keymap'.
8861The M, BS, and ARGS arguments are as per that function. DOC is 8861The M, BS, and ARGS arguments are as per that function. DOC is
8862the constant's documentation. 8862the constant's documentation.
8863 8863
8864This macro is deprecated; use `defvar-keymap' instead.
8865
8864\(fn M BS DOC &rest ARGS)" nil t) 8866\(fn M BS DOC &rest ARGS)" nil t)
8865 8867
8868(function-put 'easy-mmode-defmap 'doc-string-elt '3)
8869
8866(function-put 'easy-mmode-defmap 'lisp-indent-function '1) 8870(function-put 'easy-mmode-defmap 'lisp-indent-function '1)
8867 8871
8868(autoload 'easy-mmode-defsyntax "easy-mmode" "\ 8872(autoload 'easy-mmode-defsyntax "easy-mmode" "\
@@ -8871,6 +8875,8 @@ CSS contains a list of syntax specifications of the form (CHAR . SYNTAX).
8871 8875
8872\(fn ST CSS DOC &rest ARGS)" nil t) 8876\(fn ST CSS DOC &rest ARGS)" nil t)
8873 8877
8878(function-put 'easy-mmode-defsyntax 'doc-string-elt '3)
8879
8874(function-put 'easy-mmode-defsyntax 'lisp-indent-function '1) 8880(function-put 'easy-mmode-defsyntax 'lisp-indent-function '1)
8875 8881
8876(register-definition-prefixes "easy-mmode" '("easy-mmode-")) 8882(register-definition-prefixes "easy-mmode" '("easy-mmode-"))
@@ -10291,6 +10297,31 @@ disabled.
10291;;;### (autoloads nil "elide-head" "elide-head.el" (0 0 0 0)) 10297;;;### (autoloads nil "elide-head" "elide-head.el" (0 0 0 0))
10292;;; Generated autoloads from elide-head.el 10298;;; Generated autoloads from elide-head.el
10293 10299
10300(autoload 'elide-head-mode "elide-head" "\
10301Toggle eliding (hiding) header material in the current buffer.
10302
10303This is a minor mode. If called interactively, toggle the `Elide-Head
10304mode' mode. If the prefix argument is positive, enable the mode, and
10305if it is zero or negative, disable the mode.
10306
10307If called from Lisp, toggle the mode if ARG is `toggle'. Enable the
10308mode if ARG is nil, omitted, or is a positive number. Disable the
10309mode if ARG is a negative number.
10310
10311To check whether the minor mode is enabled in the current buffer,
10312evaluate `elide-head-mode'.
10313
10314The mode's hook is called both when the mode is enabled and when it is
10315disabled.
10316
10317When Elide Header mode is enabled, headers are hidden according
10318to `elide-head-headers-to-hide'.
10319
10320This is suitable as an entry on `find-file-hook' or appropriate
10321mode hooks.
10322
10323\(fn &optional ARG)" t nil)
10324
10294(autoload 'elide-head "elide-head" "\ 10325(autoload 'elide-head "elide-head" "\
10295Hide header material in buffer according to `elide-head-headers-to-hide'. 10326Hide header material in buffer according to `elide-head-headers-to-hide'.
10296 10327
@@ -10301,6 +10332,8 @@ This is suitable as an entry on `find-file-hook' or appropriate mode hooks.
10301 10332
10302\(fn &optional ARG)" t nil) 10333\(fn &optional ARG)" t nil)
10303 10334
10335(make-obsolete 'elide-head 'elide-head-mode '"29.1")
10336
10304(register-definition-prefixes "elide-head" '("elide-head-")) 10337(register-definition-prefixes "elide-head" '("elide-head-"))
10305 10338
10306;;;*** 10339;;;***
@@ -16764,6 +16797,11 @@ be found in variable `hi-lock-interactive-patterns'." t nil)
16764(autoload 'hi-lock-find-patterns "hi-lock" "\ 16797(autoload 'hi-lock-find-patterns "hi-lock" "\
16765Add patterns from the current buffer to the list of hi-lock patterns." t nil) 16798Add patterns from the current buffer to the list of hi-lock patterns." t nil)
16766 16799
16800(autoload 'hi-lock-context-menu "hi-lock" "\
16801Populate MENU with a menu item to highlight symbol at CLICK.
16802
16803\(fn MENU CLICK)" nil nil)
16804
16767(register-definition-prefixes "hi-lock" '("hi-lock-" "turn-on-hi-lock-if-enabled")) 16805(register-definition-prefixes "hi-lock" '("hi-lock-" "turn-on-hi-lock-if-enabled"))
16768 16806
16769;;;*** 16807;;;***
@@ -19155,25 +19193,37 @@ system." t nil)
19155 (put 'info-lookup-symbol 'info-file "emacs") 19193 (put 'info-lookup-symbol 'info-file "emacs")
19156 19194
19157(autoload 'info-lookup-symbol "info-look" "\ 19195(autoload 'info-lookup-symbol "info-look" "\
19158Display the definition of SYMBOL, as found in the relevant manual. 19196Look up and display documentation of SYMBOL in the relevant Info manual.
19159When this command is called interactively, it reads SYMBOL from the 19197SYMBOL should be an identifier: a function or method, a macro, a variable,
19160minibuffer. In the minibuffer, use \\<minibuffer-local-completion-map>\\[next-history-element] to yank the default argument 19198a data type, a class, etc.
19161value into the minibuffer so you can edit it. The default symbol is the
19162one found at point.
19163 19199
19164With prefix arg MODE a query for the symbol help mode is offered. 19200Interactively, prompt for SYMBOL; you can use \\<minibuffer-local-completion-map>\\[next-history-element] in the minibuffer
19201to yank the default argument value into the minibuffer so you can edit it.
19202The default symbol is the one found at point.
19203
19204MODE is the major mode whose Info manuals to search for the documentation
19205of SYMBOL. It defaults to the current buffer's `major-mode'; if that
19206mode doesn't have any Info manuals known to Emacs, the command will
19207prompt for MODE to use, with completion. With prefix arg, the command
19208always prompts for MODE.
19165 19209
19166\(fn SYMBOL &optional MODE)" t nil) 19210\(fn SYMBOL &optional MODE)" t nil)
19167 (put 'info-lookup-file 'info-file "emacs") 19211 (put 'info-lookup-file 'info-file "emacs")
19168 19212
19169(autoload 'info-lookup-file "info-look" "\ 19213(autoload 'info-lookup-file "info-look" "\
19170Display the documentation of a file. 19214Look up and display documentation of FILE in the relevant Info manual.
19171When this command is called interactively, it reads FILE from the minibuffer. 19215FILE should be the name of a file; a notable example is a standard header
19172In the minibuffer, use \\<minibuffer-local-completion-map>\\[next-history-element] to yank the default file name 19216file that is part of the C or C++ standard library.
19173into the minibuffer so you can edit it. 19217
19218Interactively, prompt for FILE; you can use \\<minibuffer-local-completion-map>\\[next-history-element] in the minibuffer
19219to yank the default argument value into the minibuffer so you can edit it.
19174The default file name is the one found at point. 19220The default file name is the one found at point.
19175 19221
19176With prefix arg MODE a query for the file help mode is offered. 19222MODE is the major mode whose Info manuals to search for the documentation
19223of FILE. It defaults to the current buffer's `major-mode'; if that
19224mode doesn't have any Info manuals known to Emacs, the command will
19225prompt for MODE to use, with completion. With prefix arg, the command
19226always prompts for MODE.
19177 19227
19178\(fn FILE &optional MODE)" t nil) 19228\(fn FILE &optional MODE)" t nil)
19179 19229
@@ -19859,7 +19909,7 @@ one of the aforementioned options instead of using this mode.
19859 19909
19860;;;### (autoloads nil "jsonrpc" "jsonrpc.el" (0 0 0 0)) 19910;;;### (autoloads nil "jsonrpc" "jsonrpc.el" (0 0 0 0))
19861;;; Generated autoloads from jsonrpc.el 19911;;; Generated autoloads from jsonrpc.el
19862(push (purecopy '(jsonrpc 1 0 14)) package--builtin-versions) 19912(push (purecopy '(jsonrpc 1 0 15)) package--builtin-versions)
19863 19913
19864(register-definition-prefixes "jsonrpc" '("jsonrpc-")) 19914(register-definition-prefixes "jsonrpc" '("jsonrpc-"))
19865 19915
@@ -21311,6 +21361,11 @@ Default bookmark handler for Man buffers.
21311 21361
21312\(fn BOOKMARK)" nil nil) 21362\(fn BOOKMARK)" nil nil)
21313 21363
21364(autoload 'Man-context-menu "man" "\
21365Populate MENU with commands that open a man page at point.
21366
21367\(fn MENU CLICK)" nil nil)
21368
21314(register-definition-prefixes "man" '("Man-" "man")) 21369(register-definition-prefixes "man" '("Man-" "man"))
21315 21370
21316;;;*** 21371;;;***
@@ -31067,6 +31122,8 @@ If FUNCTION is non-nil, place point on the entry for FUNCTION (if any).
31067 31122
31068\(fn GROUP &optional FUNCTION)" t nil) 31123\(fn GROUP &optional FUNCTION)" t nil)
31069 31124
31125(defalias 'shortdoc #'shortdoc-display-group)
31126
31070(register-definition-prefixes "shortdoc" '("alist" "buffer" "define-short-documentation-group" "file" "hash-table" "keymaps" "list" "number" "overlay" "process" "regexp" "sequence" "shortdoc-" "string" "text-properties" "vector")) 31127(register-definition-prefixes "shortdoc" '("alist" "buffer" "define-short-documentation-group" "file" "hash-table" "keymaps" "list" "number" "overlay" "process" "regexp" "sequence" "shortdoc-" "string" "text-properties" "vector"))
31071 31128
31072;;;*** 31129;;;***
@@ -39394,6 +39451,32 @@ unless `windmove-create-window' is non-nil and a new window is created.
39394 39451
39395\(fn &optional ARG)" t nil) 39452\(fn &optional ARG)" t nil)
39396 39453
39454(defvar windmove-mode t "\
39455Non-nil if Windmove mode is enabled.
39456See the `windmove-mode' command
39457for a description of this minor mode.")
39458
39459(custom-autoload 'windmove-mode "windmove" nil)
39460
39461(autoload 'windmove-mode "windmove" "\
39462Global minor mode for default windmove commands.
39463
39464This is a minor mode. If called interactively, toggle the `Windmove
39465mode' mode. If the prefix argument is positive, enable the mode, and
39466if it is zero or negative, disable the mode.
39467
39468If called from Lisp, toggle the mode if ARG is `toggle'. Enable the
39469mode if ARG is nil, omitted, or is a positive number. Disable the
39470mode if ARG is a negative number.
39471
39472To check whether the minor mode is enabled in the current buffer,
39473evaluate `(default-value \\='windmove-mode)'.
39474
39475The mode's hook is called both when the mode is enabled and when it is
39476disabled.
39477
39478\(fn &optional ARG)" t nil)
39479
39397(autoload 'windmove-default-keybindings "windmove" "\ 39480(autoload 'windmove-default-keybindings "windmove" "\
39398Set up keybindings for `windmove'. 39481Set up keybindings for `windmove'.
39399Keybindings are of the form MODIFIERS-{left,right,up,down}, 39482Keybindings are of the form MODIFIERS-{left,right,up,down},
@@ -39969,24 +40052,23 @@ Zone out, completely." t nil)
39969 40052
39970;;;### (autoloads nil nil ("abbrev.el" "bindings.el" "buff-menu.el" 40053;;;### (autoloads nil nil ("abbrev.el" "bindings.el" "buff-menu.el"
39971;;;;;; "button.el" "calc/calc-aent.el" "calc/calc-embed.el" "calc/calc-misc.el" 40054;;;;;; "button.el" "calc/calc-aent.el" "calc/calc-embed.el" "calc/calc-misc.el"
39972;;;;;; "calc/calc-yank.el" "case-table.el" "cedet/ede/base.el" "cedet/ede/config.el" 40055;;;;;; "calc/calc-yank.el" "case-table.el" "cedet/ede/cpp-root.el"
39973;;;;;; "cedet/ede/cpp-root.el" "cedet/ede/custom.el" "cedet/ede/dired.el" 40056;;;;;; "cedet/ede/custom.el" "cedet/ede/dired.el" "cedet/ede/emacs.el"
39974;;;;;; "cedet/ede/emacs.el" "cedet/ede/files.el" "cedet/ede/generic.el" 40057;;;;;; "cedet/ede/files.el" "cedet/ede/generic.el" "cedet/ede/linux.el"
39975;;;;;; "cedet/ede/linux.el" "cedet/ede/locate.el" "cedet/ede/make.el" 40058;;;;;; "cedet/ede/locate.el" "cedet/ede/make.el" "cedet/ede/speedbar.el"
39976;;;;;; "cedet/ede/shell.el" "cedet/ede/speedbar.el" "cedet/ede/system.el" 40059;;;;;; "cedet/ede/system.el" "cedet/ede/util.el" "cedet/semantic/analyze.el"
39977;;;;;; "cedet/ede/util.el" "cedet/semantic/analyze.el" "cedet/semantic/analyze/complete.el" 40060;;;;;; "cedet/semantic/analyze/complete.el" "cedet/semantic/analyze/refs.el"
39978;;;;;; "cedet/semantic/analyze/refs.el" "cedet/semantic/bovine.el" 40061;;;;;; "cedet/semantic/bovine.el" "cedet/semantic/bovine/c-by.el"
39979;;;;;; "cedet/semantic/bovine/c-by.el" "cedet/semantic/bovine/c.el" 40062;;;;;; "cedet/semantic/bovine/c.el" "cedet/semantic/bovine/el.el"
39980;;;;;; "cedet/semantic/bovine/el.el" "cedet/semantic/bovine/gcc.el" 40063;;;;;; "cedet/semantic/bovine/gcc.el" "cedet/semantic/bovine/make-by.el"
39981;;;;;; "cedet/semantic/bovine/make-by.el" "cedet/semantic/bovine/make.el" 40064;;;;;; "cedet/semantic/bovine/make.el" "cedet/semantic/bovine/scm-by.el"
39982;;;;;; "cedet/semantic/bovine/scm-by.el" "cedet/semantic/bovine/scm.el" 40065;;;;;; "cedet/semantic/bovine/scm.el" "cedet/semantic/complete.el"
39983;;;;;; "cedet/semantic/complete.el" "cedet/semantic/ctxt.el" "cedet/semantic/db-file.el" 40066;;;;;; "cedet/semantic/ctxt.el" "cedet/semantic/db-file.el" "cedet/semantic/db-find.el"
39984;;;;;; "cedet/semantic/db-find.el" "cedet/semantic/db-global.el" 40067;;;;;; "cedet/semantic/db-global.el" "cedet/semantic/db-mode.el"
39985;;;;;; "cedet/semantic/db-mode.el" "cedet/semantic/db-typecache.el" 40068;;;;;; "cedet/semantic/db-typecache.el" "cedet/semantic/db.el" "cedet/semantic/debug.el"
39986;;;;;; "cedet/semantic/db.el" "cedet/semantic/debug.el" "cedet/semantic/decorate/include.el" 40069;;;;;; "cedet/semantic/decorate/include.el" "cedet/semantic/decorate/mode.el"
39987;;;;;; "cedet/semantic/decorate/mode.el" "cedet/semantic/dep.el" 40070;;;;;; "cedet/semantic/dep.el" "cedet/semantic/doc.el" "cedet/semantic/edit.el"
39988;;;;;; "cedet/semantic/doc.el" "cedet/semantic/edit.el" "cedet/semantic/find.el" 40071;;;;;; "cedet/semantic/find.el" "cedet/semantic/format.el" "cedet/semantic/grammar-wy.el"
39989;;;;;; "cedet/semantic/format.el" "cedet/semantic/grammar-wy.el"
39990;;;;;; "cedet/semantic/grm-wy-boot.el" "cedet/semantic/html.el" 40072;;;;;; "cedet/semantic/grm-wy-boot.el" "cedet/semantic/html.el"
39991;;;;;; "cedet/semantic/ia-sb.el" "cedet/semantic/ia.el" "cedet/semantic/idle.el" 40073;;;;;; "cedet/semantic/ia-sb.el" "cedet/semantic/ia.el" "cedet/semantic/idle.el"
39992;;;;;; "cedet/semantic/imenu.el" "cedet/semantic/lex-spp.el" "cedet/semantic/lex.el" 40074;;;;;; "cedet/semantic/imenu.el" "cedet/semantic/lex-spp.el" "cedet/semantic/lex.el"
@@ -40005,8 +40087,8 @@ Zone out, completely." t nil)
40005;;;;;; "cedet/srecode/insert.el" "cedet/srecode/java.el" "cedet/srecode/map.el" 40087;;;;;; "cedet/srecode/insert.el" "cedet/srecode/java.el" "cedet/srecode/map.el"
40006;;;;;; "cedet/srecode/mode.el" "cedet/srecode/srt-wy.el" "cedet/srecode/srt.el" 40088;;;;;; "cedet/srecode/mode.el" "cedet/srecode/srt-wy.el" "cedet/srecode/srt.el"
40007;;;;;; "cedet/srecode/template.el" "cedet/srecode/texi.el" "composite.el" 40089;;;;;; "cedet/srecode/template.el" "cedet/srecode/texi.el" "composite.el"
40008;;;;;; "cus-face.el" "cus-start.el" "custom.el" "dired-aux.el" "dired-x.el" 40090;;;;;; "cus-face.el" "cus-load.el" "cus-start.el" "custom.el" "dired-aux.el"
40009;;;;;; "electric.el" "emacs-lisp/backquote.el" "emacs-lisp/byte-run.el" 40091;;;;;; "dired-x.el" "electric.el" "emacs-lisp/backquote.el" "emacs-lisp/byte-run.el"
40010;;;;;; "emacs-lisp/cl-extra.el" "emacs-lisp/cl-macs.el" "emacs-lisp/cl-preloaded.el" 40092;;;;;; "emacs-lisp/cl-extra.el" "emacs-lisp/cl-macs.el" "emacs-lisp/cl-preloaded.el"
40011;;;;;; "emacs-lisp/cl-seq.el" "emacs-lisp/easymenu.el" "emacs-lisp/eieio-custom.el" 40093;;;;;; "emacs-lisp/cl-seq.el" "emacs-lisp/easymenu.el" "emacs-lisp/eieio-custom.el"
40012;;;;;; "emacs-lisp/eieio-opt.el" "emacs-lisp/float-sup.el" "emacs-lisp/lisp-mode.el" 40094;;;;;; "emacs-lisp/eieio-opt.el" "emacs-lisp/float-sup.el" "emacs-lisp/lisp-mode.el"
@@ -40028,30 +40110,41 @@ Zone out, completely." t nil)
40028;;;;;; "eshell/em-pred.el" "eshell/em-prompt.el" "eshell/em-rebind.el" 40110;;;;;; "eshell/em-pred.el" "eshell/em-prompt.el" "eshell/em-rebind.el"
40029;;;;;; "eshell/em-script.el" "eshell/em-smart.el" "eshell/em-term.el" 40111;;;;;; "eshell/em-script.el" "eshell/em-smart.el" "eshell/em-term.el"
40030;;;;;; "eshell/em-tramp.el" "eshell/em-unix.el" "eshell/em-xtra.el" 40112;;;;;; "eshell/em-tramp.el" "eshell/em-unix.el" "eshell/em-xtra.el"
40031;;;;;; "faces.el" "files.el" "font-core.el" "font-lock.el" "format.el" 40113;;;;;; "eshell/esh-groups.el" "faces.el" "files.el" "finder-inf.el"
40032;;;;;; "frame.el" "help.el" "hfy-cmap.el" "ibuf-ext.el" "indent.el" 40114;;;;;; "font-core.el" "font-lock.el" "format.el" "frame.el" "help.el"
40033;;;;;; "international/characters.el" "international/charscript.el" 40115;;;;;; "hfy-cmap.el" "ibuf-ext.el" "indent.el" "international/characters.el"
40034;;;;;; "international/cp51932.el" "international/emoji-zwj.el" "international/eucjp-ms.el" 40116;;;;;; "international/charprop.el" "international/charscript.el"
40117;;;;;; "international/cp51932.el" "international/emoji-labels.el"
40118;;;;;; "international/emoji-zwj.el" "international/eucjp-ms.el"
40035;;;;;; "international/iso-transl.el" "international/mule-cmds.el" 40119;;;;;; "international/iso-transl.el" "international/mule-cmds.el"
40036;;;;;; "international/mule-conf.el" "international/mule.el" "isearch.el" 40120;;;;;; "international/mule-conf.el" "international/mule.el" "international/uni-bidi.el"
40037;;;;;; "jit-lock.el" "jka-cmpr-hook.el" "keymap.el" "language/burmese.el" 40121;;;;;; "international/uni-brackets.el" "international/uni-category.el"
40038;;;;;; "language/cham.el" "language/chinese.el" "language/cyrillic.el" 40122;;;;;; "international/uni-combining.el" "international/uni-comment.el"
40039;;;;;; "language/czech.el" "language/english.el" "language/ethiopic.el" 40123;;;;;; "international/uni-decimal.el" "international/uni-decomposition.el"
40040;;;;;; "language/european.el" "language/georgian.el" "language/greek.el" 40124;;;;;; "international/uni-digit.el" "international/uni-lowercase.el"
40041;;;;;; "language/hebrew.el" "language/indian.el" "language/japanese.el" 40125;;;;;; "international/uni-mirrored.el" "international/uni-name.el"
40042;;;;;; "language/khmer.el" "language/korean.el" "language/lao.el" 40126;;;;;; "international/uni-numeric.el" "international/uni-old-name.el"
40043;;;;;; "language/misc-lang.el" "language/romanian.el" "language/sinhala.el" 40127;;;;;; "international/uni-special-lowercase.el" "international/uni-special-titlecase.el"
40044;;;;;; "language/slovak.el" "language/tai-viet.el" "language/thai.el" 40128;;;;;; "international/uni-special-uppercase.el" "international/uni-titlecase.el"
40045;;;;;; "language/tibetan.el" "language/utf-8-lang.el" "language/vietnamese.el" 40129;;;;;; "international/uni-uppercase.el" "isearch.el" "jit-lock.el"
40046;;;;;; "ldefs-boot.el" "leim/ja-dic/ja-dic.el" "leim/leim-list.el" 40130;;;;;; "jka-cmpr-hook.el" "keymap.el" "language/burmese.el" "language/cham.el"
40047;;;;;; "leim/quail/4Corner.el" "leim/quail/ARRAY30.el" "leim/quail/CCDOSPY.el" 40131;;;;;; "language/chinese.el" "language/cyrillic.el" "language/czech.el"
40048;;;;;; "leim/quail/CTLau-b5.el" "leim/quail/CTLau.el" "leim/quail/ECDICT.el" 40132;;;;;; "language/english.el" "language/ethiopic.el" "language/european.el"
40049;;;;;; "leim/quail/ETZY.el" "leim/quail/PY-b5.el" "leim/quail/PY.el" 40133;;;;;; "language/georgian.el" "language/greek.el" "language/hebrew.el"
40050;;;;;; "leim/quail/Punct-b5.el" "leim/quail/Punct.el" "leim/quail/QJ-b5.el" 40134;;;;;; "language/indian.el" "language/japanese.el" "language/khmer.el"
40051;;;;;; "leim/quail/QJ.el" "leim/quail/SW.el" "leim/quail/TONEPY.el" 40135;;;;;; "language/korean.el" "language/lao.el" "language/misc-lang.el"
40052;;;;;; "leim/quail/ZIRANMA.el" "leim/quail/ZOZY.el" "leim/quail/arabic.el" 40136;;;;;; "language/romanian.el" "language/sinhala.el" "language/slovak.el"
40053;;;;;; "leim/quail/cham.el" "leim/quail/compose.el" "leim/quail/croatian.el" 40137;;;;;; "language/tai-viet.el" "language/thai.el" "language/tibetan.el"
40054;;;;;; "leim/quail/cyril-jis.el" "leim/quail/cyrillic.el" "leim/quail/czech.el" 40138;;;;;; "language/utf-8-lang.el" "language/vietnamese.el" "ldefs-boot.el"
40139;;;;;; "leim/ja-dic/ja-dic.el" "leim/leim-list.el" "leim/quail/4Corner.el"
40140;;;;;; "leim/quail/ARRAY30.el" "leim/quail/CCDOSPY.el" "leim/quail/CTLau-b5.el"
40141;;;;;; "leim/quail/CTLau.el" "leim/quail/ECDICT.el" "leim/quail/ETZY.el"
40142;;;;;; "leim/quail/PY-b5.el" "leim/quail/PY.el" "leim/quail/Punct-b5.el"
40143;;;;;; "leim/quail/Punct.el" "leim/quail/QJ-b5.el" "leim/quail/QJ.el"
40144;;;;;; "leim/quail/SW.el" "leim/quail/TONEPY.el" "leim/quail/ZIRANMA.el"
40145;;;;;; "leim/quail/ZOZY.el" "leim/quail/arabic.el" "leim/quail/cham.el"
40146;;;;;; "leim/quail/compose.el" "leim/quail/croatian.el" "leim/quail/cyril-jis.el"
40147;;;;;; "leim/quail/cyrillic.el" "leim/quail/czech.el" "leim/quail/emoji.el"
40055;;;;;; "leim/quail/georgian.el" "leim/quail/greek.el" "leim/quail/hanja-jis.el" 40148;;;;;; "leim/quail/georgian.el" "leim/quail/greek.el" "leim/quail/hanja-jis.el"
40056;;;;;; "leim/quail/hanja.el" "leim/quail/hanja3.el" "leim/quail/hebrew.el" 40149;;;;;; "leim/quail/hanja.el" "leim/quail/hanja3.el" "leim/quail/hebrew.el"
40057;;;;;; "leim/quail/ipa-praat.el" "leim/quail/latin-alt.el" "leim/quail/latin-ltx.el" 40150;;;;;; "leim/quail/ipa-praat.el" "leim/quail/latin-alt.el" "leim/quail/latin-ltx.el"
diff --git a/lisp/leim/quail/emoji.el b/lisp/leim/quail/emoji.el
new file mode 100644
index 00000000000..f9d3e170be5
--- /dev/null
+++ b/lisp/leim/quail/emoji.el
@@ -0,0 +1,2003 @@
1;;; emoji.el --- Quail package for emoji character composition -*- lexical-binding: t -*-
2
3;; Copyright (C) 2022 Free Software Foundation, Inc.
4
5;; Author: Juri Linkov <juri@linkov.net>
6;; Keywords: multilingual, input method, i18n
7
8;; This file is part of GNU Emacs.
9
10;; GNU Emacs is free software: you can redistribute it and/or modify
11;; it under the terms of the GNU General Public License as published by
12;; the Free Software Foundation, either version 3 of the License, or
13;; (at your option) any later version.
14
15;; GNU Emacs is distributed in the hope that it will be useful,
16;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18;; GNU General Public License for more details.
19
20;; You should have received a copy of the GNU General Public License
21;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
22
23;;; Commentary:
24
25;; This input method supports the same key sequences as the names
26;; defined by the `C-x 8 e s' completions in emoji.el. Also it adds
27;; more emoji that enclosed in double colons.
28
29;; You can enable this input method transiently with `C-u C-x \ emoji RET'.
30;; Then typing `C-x \' will enable this input method temporarily, and
31;; after typing a key sequence it will be disabled. So typing
32;; e.g. `C-x \ : )' will insert the smiling character, and disable
33;; this input method automatically afterwards.
34
35;;; Code:
36
37(require 'quail)
38
39(quail-define-package
40 "emoji" "UTF-8" "🙂" t
41 "Emoji input method for inserting emoji characters.
42Examples:
43 slightly smiling face -> 🙂
44 :slightly_smiling_face: -> 🙂
45 :-) -> 🙂"
46 '(("\t" . quail-completion))
47 t nil nil nil nil nil nil nil nil t)
48
49(eval-when-compile
50 (require 'emoji)
51 (emoji--init)
52 (defmacro emoji--define-rules ()
53 `(quail-define-rules
54 ,@(let ((rules nil))
55 (maphash (lambda (from to)
56 (push (list from (if (stringp to)
57 (vector to)
58 to))
59 rules))
60 emoji--all-bases)
61 (append
62 rules
63 '((":hash:" ["#️⃣"])
64 (":keycap_star:" ["*️⃣"])
65 (":zero:" ["0️⃣"])
66 (":one:" ["1️⃣"])
67 (":two:" ["2️⃣"])
68 (":three:" ["3️⃣"])
69 (":four:" ["4️⃣"])
70 (":five:" ["5️⃣"])
71 (":six:" ["6️⃣"])
72 (":seven:" ["7️⃣"])
73 (":eight:" ["8️⃣"])
74 (":nine:" ["9️⃣"])
75 (":copyright:" ["©️"])
76 (":registered:" ["®️"])
77 (":mahjong:" ["🀄"])
78 (":black_joker:" ["🃏"])
79 (":a:" ["🅰️"])
80 (":b:" ["🅱️"])
81 (":o2:" ["🅾️"])
82 (":parking:" ["🅿️"])
83 (":ab:" ["🆎"])
84 (":cl:" ["🆑"])
85 (":cool:" ["🆒"])
86 (":free:" ["🆓"])
87 (":id:" ["🆔"])
88 (":new:" ["🆕"])
89 (":ng:" ["🆖"])
90 (":ok:" ["🆗"])
91 (":sos:" ["🆘"])
92 (":up:" ["🆙"])
93 (":vs:" ["🆚"])
94 (":flag-ac:" ["🇦🇨"])
95 (":flag-ad:" ["🇦🇩"])
96 (":flag-ae:" ["🇦🇪"])
97 (":flag-af:" ["🇦🇫"])
98 (":flag-ag:" ["🇦🇬"])
99 (":flag-ai:" ["🇦🇮"])
100 (":flag-al:" ["🇦🇱"])
101 (":flag-am:" ["🇦🇲"])
102 (":flag-ao:" ["🇦🇴"])
103 (":flag-aq:" ["🇦🇶"])
104 (":flag-ar:" ["🇦🇷"])
105 (":flag-as:" ["🇦🇸"])
106 (":flag-at:" ["🇦🇹"])
107 (":flag-au:" ["🇦🇺"])
108 (":flag-aw:" ["🇦🇼"])
109 (":flag-ax:" ["🇦🇽"])
110 (":flag-az:" ["🇦🇿"])
111 (":flag-ba:" ["🇧🇦"])
112 (":flag-bb:" ["🇧🇧"])
113 (":flag-bd:" ["🇧🇩"])
114 (":flag-be:" ["🇧🇪"])
115 (":flag-bf:" ["🇧🇫"])
116 (":flag-bg:" ["🇧🇬"])
117 (":flag-bh:" ["🇧🇭"])
118 (":flag-bi:" ["🇧🇮"])
119 (":flag-bj:" ["🇧🇯"])
120 (":flag-bl:" ["🇧🇱"])
121 (":flag-bm:" ["🇧🇲"])
122 (":flag-bn:" ["🇧🇳"])
123 (":flag-bo:" ["🇧🇴"])
124 (":flag-bq:" ["🇧🇶"])
125 (":flag-br:" ["🇧🇷"])
126 (":flag-bs:" ["🇧🇸"])
127 (":flag-bt:" ["🇧🇹"])
128 (":flag-bv:" ["🇧🇻"])
129 (":flag-bw:" ["🇧🇼"])
130 (":flag-by:" ["🇧🇾"])
131 (":flag-bz:" ["🇧🇿"])
132 (":flag-ca:" ["🇨🇦"])
133 (":flag-cc:" ["🇨🇨"])
134 (":flag-cd:" ["🇨🇩"])
135 (":flag-cf:" ["🇨🇫"])
136 (":flag-cg:" ["🇨🇬"])
137 (":flag-ch:" ["🇨🇭"])
138 (":flag-ci:" ["🇨🇮"])
139 (":flag-ck:" ["🇨🇰"])
140 (":flag-cl:" ["🇨🇱"])
141 (":flag-cm:" ["🇨🇲"])
142 (":cn:" ["🇨🇳"])
143 (":flag-cn:" ["🇨🇳"])
144 (":flag-co:" ["🇨🇴"])
145 (":flag-cp:" ["🇨🇵"])
146 (":flag-cr:" ["🇨🇷"])
147 (":flag-cu:" ["🇨🇺"])
148 (":flag-cv:" ["🇨🇻"])
149 (":flag-cw:" ["🇨🇼"])
150 (":flag-cx:" ["🇨🇽"])
151 (":flag-cy:" ["🇨🇾"])
152 (":flag-cz:" ["🇨🇿"])
153 (":de:" ["🇩🇪"])
154 (":flag-de:" ["🇩🇪"])
155 (":flag-dg:" ["🇩🇬"])
156 (":flag-dj:" ["🇩🇯"])
157 (":flag-dk:" ["🇩🇰"])
158 (":flag-dm:" ["🇩🇲"])
159 (":flag-do:" ["🇩🇴"])
160 (":flag-dz:" ["🇩🇿"])
161 (":flag-ea:" ["🇪🇦"])
162 (":flag-ec:" ["🇪🇨"])
163 (":flag-ee:" ["🇪🇪"])
164 (":flag-eg:" ["🇪🇬"])
165 (":flag-eh:" ["🇪🇭"])
166 (":flag-er:" ["🇪🇷"])
167 (":es:" ["🇪🇸"])
168 (":flag-es:" ["🇪🇸"])
169 (":flag-et:" ["🇪🇹"])
170 (":flag-eu:" ["🇪🇺"])
171 (":flag-fi:" ["🇫🇮"])
172 (":flag-fj:" ["🇫🇯"])
173 (":flag-fk:" ["🇫🇰"])
174 (":flag-fm:" ["🇫🇲"])
175 (":flag-fo:" ["🇫🇴"])
176 (":fr:" ["🇫🇷"])
177 (":flag-fr:" ["🇫🇷"])
178 (":flag-ga:" ["🇬🇦"])
179 (":gb:" ["🇬🇧"])
180 (":uk:" ["🇬🇧"])
181 (":flag-gb:" ["🇬🇧"])
182 (":flag-gd:" ["🇬🇩"])
183 (":flag-ge:" ["🇬🇪"])
184 (":flag-gf:" ["🇬🇫"])
185 (":flag-gg:" ["🇬🇬"])
186 (":flag-gh:" ["🇬🇭"])
187 (":flag-gi:" ["🇬🇮"])
188 (":flag-gl:" ["🇬🇱"])
189 (":flag-gm:" ["🇬🇲"])
190 (":flag-gn:" ["🇬🇳"])
191 (":flag-gp:" ["🇬🇵"])
192 (":flag-gq:" ["🇬🇶"])
193 (":flag-gr:" ["🇬🇷"])
194 (":flag-gs:" ["🇬🇸"])
195 (":flag-gt:" ["🇬🇹"])
196 (":flag-gu:" ["🇬🇺"])
197 (":flag-gw:" ["🇬🇼"])
198 (":flag-gy:" ["🇬🇾"])
199 (":flag-hk:" ["🇭🇰"])
200 (":flag-hm:" ["🇭🇲"])
201 (":flag-hn:" ["🇭🇳"])
202 (":flag-hr:" ["🇭🇷"])
203 (":flag-ht:" ["🇭🇹"])
204 (":flag-hu:" ["🇭🇺"])
205 (":flag-ic:" ["🇮🇨"])
206 (":flag-id:" ["🇮🇩"])
207 (":flag-ie:" ["🇮🇪"])
208 (":flag-il:" ["🇮🇱"])
209 (":flag-im:" ["🇮🇲"])
210 (":flag-in:" ["🇮🇳"])
211 (":flag-io:" ["🇮🇴"])
212 (":flag-iq:" ["🇮🇶"])
213 (":flag-ir:" ["🇮🇷"])
214 (":flag-is:" ["🇮🇸"])
215 (":it:" ["🇮🇹"])
216 (":flag-it:" ["🇮🇹"])
217 (":flag-je:" ["🇯🇪"])
218 (":flag-jm:" ["🇯🇲"])
219 (":flag-jo:" ["🇯🇴"])
220 (":jp:" ["🇯🇵"])
221 (":flag-jp:" ["🇯🇵"])
222 (":flag-ke:" ["🇰🇪"])
223 (":flag-kg:" ["🇰🇬"])
224 (":flag-kh:" ["🇰🇭"])
225 (":flag-ki:" ["🇰🇮"])
226 (":flag-km:" ["🇰🇲"])
227 (":flag-kn:" ["🇰🇳"])
228 (":flag-kp:" ["🇰🇵"])
229 (":kr:" ["🇰🇷"])
230 (":flag-kr:" ["🇰🇷"])
231 (":flag-kw:" ["🇰🇼"])
232 (":flag-ky:" ["🇰🇾"])
233 (":flag-kz:" ["🇰🇿"])
234 (":flag-la:" ["🇱🇦"])
235 (":flag-lb:" ["🇱🇧"])
236 (":flag-lc:" ["🇱🇨"])
237 (":flag-li:" ["🇱🇮"])
238 (":flag-lk:" ["🇱🇰"])
239 (":flag-lr:" ["🇱🇷"])
240 (":flag-ls:" ["🇱🇸"])
241 (":flag-lt:" ["🇱🇹"])
242 (":flag-lu:" ["🇱🇺"])
243 (":flag-lv:" ["🇱🇻"])
244 (":flag-ly:" ["🇱🇾"])
245 (":flag-ma:" ["🇲🇦"])
246 (":flag-mc:" ["🇲🇨"])
247 (":flag-md:" ["🇲🇩"])
248 (":flag-me:" ["🇲🇪"])
249 (":flag-mf:" ["🇲🇫"])
250 (":flag-mg:" ["🇲🇬"])
251 (":flag-mh:" ["🇲🇭"])
252 (":flag-mk:" ["🇲🇰"])
253 (":flag-ml:" ["🇲🇱"])
254 (":flag-mm:" ["🇲🇲"])
255 (":flag-mn:" ["🇲🇳"])
256 (":flag-mo:" ["🇲🇴"])
257 (":flag-mp:" ["🇲🇵"])
258 (":flag-mq:" ["🇲🇶"])
259 (":flag-mr:" ["🇲🇷"])
260 (":flag-ms:" ["🇲🇸"])
261 (":flag-mt:" ["🇲🇹"])
262 (":flag-mu:" ["🇲🇺"])
263 (":flag-mv:" ["🇲🇻"])
264 (":flag-mw:" ["🇲🇼"])
265 (":flag-mx:" ["🇲🇽"])
266 (":flag-my:" ["🇲🇾"])
267 (":flag-mz:" ["🇲🇿"])
268 (":flag-na:" ["🇳🇦"])
269 (":flag-nc:" ["🇳🇨"])
270 (":flag-ne:" ["🇳🇪"])
271 (":flag-nf:" ["🇳🇫"])
272 (":flag-ng:" ["🇳🇬"])
273 (":flag-ni:" ["🇳🇮"])
274 (":flag-nl:" ["🇳🇱"])
275 (":flag-no:" ["🇳🇴"])
276 (":flag-np:" ["🇳🇵"])
277 (":flag-nr:" ["🇳🇷"])
278 (":flag-nu:" ["🇳🇺"])
279 (":flag-nz:" ["🇳🇿"])
280 (":flag-om:" ["🇴🇲"])
281 (":flag-pa:" ["🇵🇦"])
282 (":flag-pe:" ["🇵🇪"])
283 (":flag-pf:" ["🇵🇫"])
284 (":flag-pg:" ["🇵🇬"])
285 (":flag-ph:" ["🇵🇭"])
286 (":flag-pk:" ["🇵🇰"])
287 (":flag-pl:" ["🇵🇱"])
288 (":flag-pm:" ["🇵🇲"])
289 (":flag-pn:" ["🇵🇳"])
290 (":flag-pr:" ["🇵🇷"])
291 (":flag-ps:" ["🇵🇸"])
292 (":flag-pt:" ["🇵🇹"])
293 (":flag-pw:" ["🇵🇼"])
294 (":flag-py:" ["🇵🇾"])
295 (":flag-qa:" ["🇶🇦"])
296 (":flag-re:" ["🇷🇪"])
297 (":flag-ro:" ["🇷🇴"])
298 (":flag-rs:" ["🇷🇸"])
299 (":ru:" ["🇷🇺"])
300 (":flag-ru:" ["🇷🇺"])
301 (":flag-rw:" ["🇷🇼"])
302 (":flag-sa:" ["🇸🇦"])
303 (":flag-sb:" ["🇸🇧"])
304 (":flag-sc:" ["🇸🇨"])
305 (":flag-sd:" ["🇸🇩"])
306 (":flag-se:" ["🇸🇪"])
307 (":flag-sg:" ["🇸🇬"])
308 (":flag-sh:" ["🇸🇭"])
309 (":flag-si:" ["🇸🇮"])
310 (":flag-sj:" ["🇸🇯"])
311 (":flag-sk:" ["🇸🇰"])
312 (":flag-sl:" ["🇸🇱"])
313 (":flag-sm:" ["🇸🇲"])
314 (":flag-sn:" ["🇸🇳"])
315 (":flag-so:" ["🇸🇴"])
316 (":flag-sr:" ["🇸🇷"])
317 (":flag-ss:" ["🇸🇸"])
318 (":flag-st:" ["🇸🇹"])
319 (":flag-sv:" ["🇸🇻"])
320 (":flag-sx:" ["🇸🇽"])
321 (":flag-sy:" ["🇸🇾"])
322 (":flag-sz:" ["🇸🇿"])
323 (":flag-ta:" ["🇹🇦"])
324 (":flag-tc:" ["🇹🇨"])
325 (":flag-td:" ["🇹🇩"])
326 (":flag-tf:" ["🇹🇫"])
327 (":flag-tg:" ["🇹🇬"])
328 (":flag-th:" ["🇹🇭"])
329 (":flag-tj:" ["🇹🇯"])
330 (":flag-tk:" ["🇹🇰"])
331 (":flag-tl:" ["🇹🇱"])
332 (":flag-tm:" ["🇹🇲"])
333 (":flag-tn:" ["🇹🇳"])
334 (":flag-to:" ["🇹🇴"])
335 (":flag-tr:" ["🇹🇷"])
336 (":flag-tt:" ["🇹🇹"])
337 (":flag-tv:" ["🇹🇻"])
338 (":flag-tw:" ["🇹🇼"])
339 (":flag-tz:" ["🇹🇿"])
340 (":flag-ua:" ["🇺🇦"])
341 (":flag-ug:" ["🇺🇬"])
342 (":flag-um:" ["🇺🇲"])
343 (":flag-un:" ["🇺🇳"])
344 (":us:" ["🇺🇸"])
345 (":flag-us:" ["🇺🇸"])
346 (":flag-uy:" ["🇺🇾"])
347 (":flag-uz:" ["🇺🇿"])
348 (":flag-va:" ["🇻🇦"])
349 (":flag-vc:" ["🇻🇨"])
350 (":flag-ve:" ["🇻🇪"])
351 (":flag-vg:" ["🇻🇬"])
352 (":flag-vi:" ["🇻🇮"])
353 (":flag-vn:" ["🇻🇳"])
354 (":flag-vu:" ["🇻🇺"])
355 (":flag-wf:" ["🇼🇫"])
356 (":flag-ws:" ["🇼🇸"])
357 (":flag-xk:" ["🇽🇰"])
358 (":flag-ye:" ["🇾🇪"])
359 (":flag-yt:" ["🇾🇹"])
360 (":flag-za:" ["🇿🇦"])
361 (":flag-zm:" ["🇿🇲"])
362 (":flag-zw:" ["🇿🇼"])
363 (":koko:" ["🈁"])
364 (":sa:" ["🈂️"])
365 (":u7121:" ["🈚"])
366 (":u6307:" ["🈯"])
367 (":u7981:" ["🈲"])
368 (":u7a7a:" ["🈳"])
369 (":u5408:" ["🈴"])
370 (":u6e80:" ["🈵"])
371 (":u6709:" ["🈶"])
372 (":u6708:" ["🈷️"])
373 (":u7533:" ["🈸"])
374 (":u5272:" ["🈹"])
375 (":u55b6:" ["🈺"])
376 (":ideograph_advantage:" ["🉐"])
377 (":accept:" ["🉑"])
378 (":cyclone:" ["🌀"])
379 (":foggy:" ["🌁"])
380 (":closed_umbrella:" ["🌂"])
381 (":night_with_stars:" ["🌃"])
382 (":sunrise_over_mountains:" ["🌄"])
383 (":sunrise:" ["🌅"])
384 (":city_sunset:" ["🌆"])
385 (":city_sunrise:" ["🌇"])
386 (":rainbow:" ["🌈"])
387 (":bridge_at_night:" ["🌉"])
388 (":ocean:" ["🌊"])
389 (":volcano:" ["🌋"])
390 (":milky_way:" ["🌌"])
391 (":earth_africa:" ["🌍"])
392 (":earth_americas:" ["🌎"])
393 (":earth_asia:" ["🌏"])
394 (":globe_with_meridians:" ["🌐"])
395 (":new_moon:" ["🌑"])
396 (":waxing_crescent_moon:" ["🌒"])
397 (":first_quarter_moon:" ["🌓"])
398 (":moon:" ["🌔"])
399 (":waxing_gibbous_moon:" ["🌔"])
400 (":full_moon:" ["🌕"])
401 (":waning_gibbous_moon:" ["🌖"])
402 (":last_quarter_moon:" ["🌗"])
403 (":waning_crescent_moon:" ["🌘"])
404 (":crescent_moon:" ["🌙"])
405 (":new_moon_with_face:" ["🌚"])
406 (":first_quarter_moon_with_face:" ["🌛"])
407 (":last_quarter_moon_with_face:" ["🌜"])
408 (":full_moon_with_face:" ["🌝"])
409 (":sun_with_face:" ["🌞"])
410 (":star2:" ["🌟"])
411 (":stars:" ["🌠"])
412 (":thermometer:" ["🌡️"])
413 (":mostly_sunny:" ["🌤️"])
414 (":sun_small_cloud:" ["🌤️"])
415 (":barely_sunny:" ["🌥️"])
416 (":sun_behind_cloud:" ["🌥️"])
417 (":partly_sunny_rain:" ["🌦️"])
418 (":sun_behind_rain_cloud:" ["🌦️"])
419 (":rain_cloud:" ["🌧️"])
420 (":snow_cloud:" ["🌨️"])
421 (":lightning:" ["🌩️"])
422 (":lightning_cloud:" ["🌩️"])
423 (":tornado:" ["🌪️"])
424 (":tornado_cloud:" ["🌪️"])
425 (":fog:" ["🌫️"])
426 (":wind_blowing_face:" ["🌬️"])
427 (":hotdog:" ["🌭"])
428 (":taco:" ["🌮"])
429 (":burrito:" ["🌯"])
430 (":chestnut:" ["🌰"])
431 (":seedling:" ["🌱"])
432 (":evergreen_tree:" ["🌲"])
433 (":deciduous_tree:" ["🌳"])
434 (":palm_tree:" ["🌴"])
435 (":cactus:" ["🌵"])
436 (":hot_pepper:" ["🌶️"])
437 (":tulip:" ["🌷"])
438 (":cherry_blossom:" ["🌸"])
439 (":rose:" ["🌹"])
440 (":hibiscus:" ["🌺"])
441 (":sunflower:" ["🌻"])
442 (":blossom:" ["🌼"])
443 (":corn:" ["🌽"])
444 (":ear_of_rice:" ["🌾"])
445 (":herb:" ["🌿"])
446 (":four_leaf_clover:" ["🍀"])
447 (":maple_leaf:" ["🍁"])
448 (":fallen_leaf:" ["🍂"])
449 (":leaves:" ["🍃"])
450 (":mushroom:" ["🍄"])
451 (":tomato:" ["🍅"])
452 (":eggplant:" ["🍆"])
453 (":grapes:" ["🍇"])
454 (":melon:" ["🍈"])
455 (":watermelon:" ["🍉"])
456 (":tangerine:" ["🍊"])
457 (":lemon:" ["🍋"])
458 (":banana:" ["🍌"])
459 (":pineapple:" ["🍍"])
460 (":apple:" ["🍎"])
461 (":green_apple:" ["🍏"])
462 (":pear:" ["🍐"])
463 (":peach:" ["🍑"])
464 (":cherries:" ["🍒"])
465 (":strawberry:" ["🍓"])
466 (":hamburger:" ["🍔"])
467 (":pizza:" ["🍕"])
468 (":meat_on_bone:" ["🍖"])
469 (":poultry_leg:" ["🍗"])
470 (":rice_cracker:" ["🍘"])
471 (":rice_ball:" ["🍙"])
472 (":rice:" ["🍚"])
473 (":curry:" ["🍛"])
474 (":ramen:" ["🍜"])
475 (":spaghetti:" ["🍝"])
476 (":bread:" ["🍞"])
477 (":fries:" ["🍟"])
478 (":sweet_potato:" ["🍠"])
479 (":dango:" ["🍡"])
480 (":oden:" ["🍢"])
481 (":sushi:" ["🍣"])
482 (":fried_shrimp:" ["🍤"])
483 (":fish_cake:" ["🍥"])
484 (":icecream:" ["🍦"])
485 (":shaved_ice:" ["🍧"])
486 (":ice_cream:" ["🍨"])
487 (":doughnut:" ["🍩"])
488 (":cookie:" ["🍪"])
489 (":chocolate_bar:" ["🍫"])
490 (":candy:" ["🍬"])
491 (":lollipop:" ["🍭"])
492 (":custard:" ["🍮"])
493 (":honey_pot:" ["🍯"])
494 (":cake:" ["🍰"])
495 (":bento:" ["🍱"])
496 (":stew:" ["🍲"])
497 (":fried_egg:" ["🍳"])
498 (":cooking:" ["🍳"])
499 (":fork_and_knife:" ["🍴"])
500 (":tea:" ["🍵"])
501 (":sake:" ["🍶"])
502 (":wine_glass:" ["🍷"])
503 (":cocktail:" ["🍸"])
504 (":tropical_drink:" ["🍹"])
505 (":beer:" ["🍺"])
506 (":beers:" ["🍻"])
507 (":baby_bottle:" ["🍼"])
508 (":knife_fork_plate:" ["🍽️"])
509 (":champagne:" ["🍾"])
510 (":popcorn:" ["🍿"])
511 (":ribbon:" ["🎀"])
512 (":gift:" ["🎁"])
513 (":birthday:" ["🎂"])
514 (":jack_o_lantern:" ["🎃"])
515 (":christmas_tree:" ["🎄"])
516 (":santa:" ["🎅"])
517 (":fireworks:" ["🎆"])
518 (":sparkler:" ["🎇"])
519 (":balloon:" ["🎈"])
520 (":tada:" ["🎉"])
521 (":confetti_ball:" ["🎊"])
522 (":tanabata_tree:" ["🎋"])
523 (":crossed_flags:" ["🎌"])
524 (":bamboo:" ["🎍"])
525 (":dolls:" ["🎎"])
526 (":flags:" ["🎏"])
527 (":wind_chime:" ["🎐"])
528 (":rice_scene:" ["🎑"])
529 (":school_satchel:" ["🎒"])
530 (":mortar_board:" ["🎓"])
531 (":medal:" ["🎖️"])
532 (":reminder_ribbon:" ["🎗️"])
533 (":studio_microphone:" ["🎙️"])
534 (":level_slider:" ["🎚️"])
535 (":control_knobs:" ["🎛️"])
536 (":film_frames:" ["🎞️"])
537 (":admission_tickets:" ["🎟️"])
538 (":carousel_horse:" ["🎠"])
539 (":ferris_wheel:" ["🎡"])
540 (":roller_coaster:" ["🎢"])
541 (":fishing_pole_and_fish:" ["🎣"])
542 (":microphone:" ["🎤"])
543 (":movie_camera:" ["🎥"])
544 (":cinema:" ["🎦"])
545 (":headphones:" ["🎧"])
546 (":art:" ["🎨"])
547 (":tophat:" ["🎩"])
548 (":circus_tent:" ["🎪"])
549 (":ticket:" ["🎫"])
550 (":clapper:" ["🎬"])
551 (":performing_arts:" ["🎭"])
552 (":video_game:" ["🎮"])
553 (":dart:" ["🎯"])
554 (":slot_machine:" ["🎰"])
555 (":8ball:" ["🎱"])
556 (":game_die:" ["🎲"])
557 (":bowling:" ["🎳"])
558 (":flower_playing_cards:" ["🎴"])
559 (":musical_note:" ["🎵"])
560 (":notes:" ["🎶"])
561 (":saxophone:" ["🎷"])
562 (":guitar:" ["🎸"])
563 (":musical_keyboard:" ["🎹"])
564 (":trumpet:" ["🎺"])
565 (":violin:" ["🎻"])
566 (":musical_score:" ["🎼"])
567 (":running_shirt_with_sash:" ["🎽"])
568 (":tennis:" ["🎾"])
569 (":ski:" ["🎿"])
570 (":basketball:" ["🏀"])
571 (":checkered_flag:" ["🏁"])
572 (":snowboarder:" ["🏂"])
573 (":woman-running:" ["🏃‍♀️"])
574 (":man-running:" ["🏃‍♂️"])
575 (":runner:" ["🏃"])
576 (":running:" ["🏃"])
577 (":woman-surfing:" ["🏄‍♀️"])
578 (":man-surfing:" ["🏄‍♂️"])
579 (":surfer:" ["🏄"])
580 (":sports_medal:" ["🏅"])
581 (":trophy:" ["🏆"])
582 (":horse_racing:" ["🏇"])
583 (":football:" ["🏈"])
584 (":rugby_football:" ["🏉"])
585 (":woman-swimming:" ["🏊‍♀️"])
586 (":man-swimming:" ["🏊‍♂️"])
587 (":swimmer:" ["🏊"])
588 (":woman-lifting-weights:" ["🏋️‍♀️"])
589 (":man-lifting-weights:" ["🏋️‍♂️"])
590 (":weight_lifter:" ["🏋️"])
591 (":woman-golfing:" ["🏌️‍♀️"])
592 (":man-golfing:" ["🏌️‍♂️"])
593 (":golfer:" ["🏌️"])
594 (":racing_motorcycle:" ["🏍️"])
595 (":racing_car:" ["🏎️"])
596 (":cricket_bat_and_ball:" ["🏏"])
597 (":volleyball:" ["🏐"])
598 (":field_hockey_stick_and_ball:" ["🏑"])
599 (":ice_hockey_stick_and_puck:" ["🏒"])
600 (":table_tennis_paddle_and_ball:" ["🏓"])
601 (":snow_capped_mountain:" ["🏔️"])
602 (":camping:" ["🏕️"])
603 (":beach_with_umbrella:" ["🏖️"])
604 (":building_construction:" ["🏗️"])
605 (":house_buildings:" ["🏘️"])
606 (":cityscape:" ["🏙️"])
607 (":derelict_house_building:" ["🏚️"])
608 (":classical_building:" ["🏛️"])
609 (":desert:" ["🏜️"])
610 (":desert_island:" ["🏝️"])
611 (":national_park:" ["🏞️"])
612 (":stadium:" ["🏟️"])
613 (":house:" ["🏠"])
614 (":house_with_garden:" ["🏡"])
615 (":office:" ["🏢"])
616 (":post_office:" ["🏣"])
617 (":european_post_office:" ["🏤"])
618 (":hospital:" ["🏥"])
619 (":bank:" ["🏦"])
620 (":atm:" ["🏧"])
621 (":hotel:" ["🏨"])
622 (":love_hotel:" ["🏩"])
623 (":convenience_store:" ["🏪"])
624 (":school:" ["🏫"])
625 (":department_store:" ["🏬"])
626 (":factory:" ["🏭"])
627 (":izakaya_lantern:" ["🏮"])
628 (":lantern:" ["🏮"])
629 (":japanese_castle:" ["🏯"])
630 (":european_castle:" ["🏰"])
631 (":rainbow-flag:" ["🏳️‍🌈"])
632 (":transgender_flag:" ["🏳️‍⚧️"])
633 (":waving_white_flag:" ["🏳️"])
634 (":pirate_flag:" ["🏴‍☠️"])
635 (":flag-england:" ["🏴󠁧󠁢󠁥󠁮󠁧󠁿"])
636 (":flag-scotland:" ["🏴󠁧󠁢󠁳󠁣󠁴󠁿"])
637 (":flag-wales:" ["🏴󠁧󠁢󠁷󠁬󠁳󠁿"])
638 (":waving_black_flag:" ["🏴"])
639 (":rosette:" ["🏵️"])
640 (":label:" ["🏷️"])
641 (":badminton_racquet_and_shuttlecock:" ["🏸"])
642 (":bow_and_arrow:" ["🏹"])
643 (":amphora:" ["🏺"])
644 (":skin-tone-2:" ["🏻"])
645 (":skin-tone-3:" ["🏼"])
646 (":skin-tone-4:" ["🏽"])
647 (":skin-tone-5:" ["🏾"])
648 (":skin-tone-6:" ["🏿"])
649 (":rat:" ["🐀"])
650 (":mouse2:" ["🐁"])
651 (":ox:" ["🐂"])
652 (":water_buffalo:" ["🐃"])
653 (":cow2:" ["🐄"])
654 (":tiger2:" ["🐅"])
655 (":leopard:" ["🐆"])
656 (":rabbit2:" ["🐇"])
657 (":black_cat:" ["🐈‍⬛"])
658 (":cat2:" ["🐈"])
659 (":dragon:" ["🐉"])
660 (":crocodile:" ["🐊"])
661 (":whale2:" ["🐋"])
662 (":snail:" ["🐌"])
663 (":snake:" ["🐍"])
664 (":racehorse:" ["🐎"])
665 (":ram:" ["🐏"])
666 (":goat:" ["🐐"])
667 (":sheep:" ["🐑"])
668 (":monkey:" ["🐒"])
669 (":rooster:" ["🐓"])
670 (":chicken:" ["🐔"])
671 (":service_dog:" ["🐕‍🦺"])
672 (":dog2:" ["🐕"])
673 (":pig2:" ["🐖"])
674 (":boar:" ["🐗"])
675 (":elephant:" ["🐘"])
676 (":octopus:" ["🐙"])
677 (":shell:" ["🐚"])
678 (":bug:" ["🐛"])
679 (":ant:" ["🐜"])
680 (":bee:" ["🐝"])
681 (":honeybee:" ["🐝"])
682 (":ladybug:" ["🐞"])
683 (":lady_beetle:" ["🐞"])
684 (":fish:" ["🐟"])
685 (":tropical_fish:" ["🐠"])
686 (":blowfish:" ["🐡"])
687 (":turtle:" ["🐢"])
688 (":hatching_chick:" ["🐣"])
689 (":baby_chick:" ["🐤"])
690 (":hatched_chick:" ["🐥"])
691 (":bird:" ["🐦"])
692 (":penguin:" ["🐧"])
693 (":koala:" ["🐨"])
694 (":poodle:" ["🐩"])
695 (":dromedary_camel:" ["🐪"])
696 (":camel:" ["🐫"])
697 (":dolphin:" ["🐬"])
698 (":flipper:" ["🐬"])
699 (":mouse:" ["🐭"])
700 (":cow:" ["🐮"])
701 (":tiger:" ["🐯"])
702 (":rabbit:" ["🐰"])
703 (":cat:" ["🐱"])
704 (":dragon_face:" ["🐲"])
705 (":whale:" ["🐳"])
706 (":horse:" ["🐴"])
707 (":monkey_face:" ["🐵"])
708 (":o)" ["🐵"])
709 (":dog:" ["🐶"])
710 (":pig:" ["🐷"])
711 (":frog:" ["🐸"])
712 (":hamster:" ["🐹"])
713 (":wolf:" ["🐺"])
714 (":polar_bear:" ["🐻‍❄️"])
715 (":bear:" ["🐻"])
716 (":panda_face:" ["🐼"])
717 (":pig_nose:" ["🐽"])
718 (":feet:" ["🐾"])
719 (":paw_prints:" ["🐾"])
720 (":chipmunk:" ["🐿️"])
721 (":eyes:" ["👀"])
722 (":eye-in-speech-bubble:" ["👁️‍🗨️"])
723 (":eye:" ["👁️"])
724 (":ear:" ["👂"])
725 (":nose:" ["👃"])
726 (":lips:" ["👄"])
727 (":tongue:" ["👅"])
728 (":point_up_2:" ["👆"])
729 (":point_down:" ["👇"])
730 (":point_left:" ["👈"])
731 (":point_right:" ["👉"])
732 (":facepunch:" ["👊"])
733 (":punch:" ["👊"])
734 (":wave:" ["👋"])
735 (":ok_hand:" ["👌"])
736 (":+1:" ["👍"])
737 (":thumbsup:" ["👍"])
738 (":-1:" ["👎"])
739 (":thumbsdown:" ["👎"])
740 (":clap:" ["👏"])
741 (":open_hands:" ["👐"])
742 (":crown:" ["👑"])
743 (":womans_hat:" ["👒"])
744 (":eyeglasses:" ["👓"])
745 (":necktie:" ["👔"])
746 (":shirt:" ["👕"])
747 (":tshirt:" ["👕"])
748 (":jeans:" ["👖"])
749 (":dress:" ["👗"])
750 (":kimono:" ["👘"])
751 (":bikini:" ["👙"])
752 (":womans_clothes:" ["👚"])
753 (":purse:" ["👛"])
754 (":handbag:" ["👜"])
755 (":pouch:" ["👝"])
756 (":mans_shoe:" ["👞"])
757 (":shoe:" ["👞"])
758 (":athletic_shoe:" ["👟"])
759 (":high_heel:" ["👠"])
760 (":sandal:" ["👡"])
761 (":boot:" ["👢"])
762 (":footprints:" ["👣"])
763 (":bust_in_silhouette:" ["👤"])
764 (":busts_in_silhouette:" ["👥"])
765 (":boy:" ["👦"])
766 (":girl:" ["👧"])
767 (":male-farmer:" ["👨‍🌾"])
768 (":male-cook:" ["👨‍🍳"])
769 (":man_feeding_baby:" ["👨‍🍼"])
770 (":male-student:" ["👨‍🎓"])
771 (":male-singer:" ["👨‍🎤"])
772 (":male-artist:" ["👨‍🎨"])
773 (":male-teacher:" ["👨‍🏫"])
774 (":male-factory-worker:" ["👨‍🏭"])
775 (":man-boy-boy:" ["👨‍👦‍👦"])
776 (":man-boy:" ["👨‍👦"])
777 (":man-girl-boy:" ["👨‍👧‍👦"])
778 (":man-girl-girl:" ["👨‍👧‍👧"])
779 (":man-girl:" ["👨‍👧"])
780 (":man-man-boy:" ["👨‍👨‍👦"])
781 (":man-man-boy-boy:" ["👨‍👨‍👦‍👦"])
782 (":man-man-girl:" ["👨‍👨‍👧"])
783 (":man-man-girl-boy:" ["👨‍👨‍👧‍👦"])
784 (":man-man-girl-girl:" ["👨‍👨‍👧‍👧"])
785 (":man-woman-boy:" ["👨‍👩‍👦"])
786 (":man-woman-boy-boy:" ["👨‍👩‍👦‍👦"])
787 (":man-woman-girl:" ["👨‍👩‍👧"])
788 (":man-woman-girl-boy:" ["👨‍👩‍👧‍👦"])
789 (":man-woman-girl-girl:" ["👨‍👩‍👧‍👧"])
790 (":male-technologist:" ["👨‍💻"])
791 (":male-office-worker:" ["👨‍💼"])
792 (":male-mechanic:" ["👨‍🔧"])
793 (":male-scientist:" ["👨‍🔬"])
794 (":male-astronaut:" ["👨‍🚀"])
795 (":male-firefighter:" ["👨‍🚒"])
796 (":man_with_probing_cane:" ["👨‍🦯"])
797 (":red_haired_man:" ["👨‍🦰"])
798 (":curly_haired_man:" ["👨‍🦱"])
799 (":bald_man:" ["👨‍🦲"])
800 (":white_haired_man:" ["👨‍🦳"])
801 (":man_in_motorized_wheelchair:" ["👨‍🦼"])
802 (":man_in_manual_wheelchair:" ["👨‍🦽"])
803 (":male-doctor:" ["👨‍⚕️"])
804 (":male-judge:" ["👨‍⚖️"])
805 (":male-pilot:" ["👨‍✈️"])
806 (":man-heart-man:" ["👨‍❤️‍👨"])
807 (":man-kiss-man:" ["👨‍❤️‍💋‍👨"])
808 (":man:" ["👨"])
809 (":female-farmer:" ["👩‍🌾"])
810 (":female-cook:" ["👩‍🍳"])
811 (":woman_feeding_baby:" ["👩‍🍼"])
812 (":female-student:" ["👩‍🎓"])
813 (":female-singer:" ["👩‍🎤"])
814 (":female-artist:" ["👩‍🎨"])
815 (":female-teacher:" ["👩‍🏫"])
816 (":female-factory-worker:" ["👩‍🏭"])
817 (":woman-boy-boy:" ["👩‍👦‍👦"])
818 (":woman-boy:" ["👩‍👦"])
819 (":woman-girl-boy:" ["👩‍👧‍👦"])
820 (":woman-girl-girl:" ["👩‍👧‍👧"])
821 (":woman-girl:" ["👩‍👧"])
822 (":woman-woman-boy:" ["👩‍👩‍👦"])
823 (":woman-woman-boy-boy:" ["👩‍👩‍👦‍👦"])
824 (":woman-woman-girl:" ["👩‍👩‍👧"])
825 (":woman-woman-girl-boy:" ["👩‍👩‍👧‍👦"])
826 (":woman-woman-girl-girl:" ["👩‍👩‍👧‍👧"])
827 (":female-technologist:" ["👩‍💻"])
828 (":female-office-worker:" ["👩‍💼"])
829 (":female-mechanic:" ["👩‍🔧"])
830 (":female-scientist:" ["👩‍🔬"])
831 (":female-astronaut:" ["👩‍🚀"])
832 (":female-firefighter:" ["👩‍🚒"])
833 (":woman_with_probing_cane:" ["👩‍🦯"])
834 (":red_haired_woman:" ["👩‍🦰"])
835 (":curly_haired_woman:" ["👩‍🦱"])
836 (":bald_woman:" ["👩‍🦲"])
837 (":white_haired_woman:" ["👩‍🦳"])
838 (":woman_in_motorized_wheelchair:" ["👩‍🦼"])
839 (":woman_in_manual_wheelchair:" ["👩‍🦽"])
840 (":female-doctor:" ["👩‍⚕️"])
841 (":female-judge:" ["👩‍⚖️"])
842 (":female-pilot:" ["👩‍✈️"])
843 (":woman-heart-man:" ["👩‍❤️‍👨"])
844 (":woman-heart-woman:" ["👩‍❤️‍👩"])
845 (":woman-kiss-man:" ["👩‍❤️‍💋‍👨"])
846 (":woman-kiss-woman:" ["👩‍❤️‍💋‍👩"])
847 (":woman:" ["👩"])
848 (":family:" ["👪"])
849 (":man_and_woman_holding_hands:" ["👫"])
850 (":woman_and_man_holding_hands:" ["👫"])
851 (":couple:" ["👫"])
852 (":two_men_holding_hands:" ["👬"])
853 (":men_holding_hands:" ["👬"])
854 (":two_women_holding_hands:" ["👭"])
855 (":women_holding_hands:" ["👭"])
856 (":female-police-officer:" ["👮‍♀️"])
857 (":male-police-officer:" ["👮‍♂️"])
858 (":cop:" ["👮"])
859 (":women-with-bunny-ears-partying:" ["👯‍♀️"])
860 (":woman-with-bunny-ears-partying:" ["👯‍♀️"])
861 (":men-with-bunny-ears-partying:" ["👯‍♂️"])
862 (":man-with-bunny-ears-partying:" ["👯‍♂️"])
863 (":dancers:" ["👯"])
864 (":woman_with_veil:" ["👰‍♀️"])
865 (":man_with_veil:" ["👰‍♂️"])
866 (":bride_with_veil:" ["👰"])
867 (":blond-haired-woman:" ["👱‍♀️"])
868 (":blond-haired-man:" ["👱‍♂️"])
869 (":person_with_blond_hair:" ["👱"])
870 (":man_with_gua_pi_mao:" ["👲"])
871 (":woman-wearing-turban:" ["👳‍♀️"])
872 (":man-wearing-turban:" ["👳‍♂️"])
873 (":man_with_turban:" ["👳"])
874 (":older_man:" ["👴"])
875 (":older_woman:" ["👵"])
876 (":baby:" ["👶"])
877 (":female-construction-worker:" ["👷‍♀️"])
878 (":male-construction-worker:" ["👷‍♂️"])
879 (":construction_worker:" ["👷"])
880 (":princess:" ["👸"])
881 (":japanese_ogre:" ["👹"])
882 (":japanese_goblin:" ["👺"])
883 (":ghost:" ["👻"])
884 (":angel:" ["👼"])
885 (":alien:" ["👽"])
886 (":space_invader:" ["👾"])
887 (":imp:" ["👿"])
888 (":skull:" ["💀"])
889 (":woman-tipping-hand:" ["💁‍♀️"])
890 (":man-tipping-hand:" ["💁‍♂️"])
891 (":information_desk_person:" ["💁"])
892 (":female-guard:" ["💂‍♀️"])
893 (":male-guard:" ["💂‍♂️"])
894 (":guardsman:" ["💂"])
895 (":dancer:" ["💃"])
896 (":lipstick:" ["💄"])
897 (":nail_care:" ["💅"])
898 (":woman-getting-massage:" ["💆‍♀️"])
899 (":man-getting-massage:" ["💆‍♂️"])
900 (":massage:" ["💆"])
901 (":woman-getting-haircut:" ["💇‍♀️"])
902 (":man-getting-haircut:" ["💇‍♂️"])
903 (":haircut:" ["💇"])
904 (":barber:" ["💈"])
905 (":syringe:" ["💉"])
906 (":pill:" ["💊"])
907 (":kiss:" ["💋"])
908 (":love_letter:" ["💌"])
909 (":ring:" ["💍"])
910 (":gem:" ["💎"])
911 (":couplekiss:" ["💏"])
912 (":bouquet:" ["💐"])
913 (":couple_with_heart:" ["💑"])
914 (":wedding:" ["💒"])
915 (":heartbeat:" ["💓"])
916 (":broken_heart:" ["💔"])
917 ("</3" ["💔"])
918 (":two_hearts:" ["💕"])
919 (":sparkling_heart:" ["💖"])
920 (":heartpulse:" ["💗"])
921 (":cupid:" ["💘"])
922 (":blue_heart:" ["💙"])
923 ("<3" ["💙"])
924 (":green_heart:" ["💚"])
925 ("<3" ["💚"])
926 (":yellow_heart:" ["💛"])
927 ("<3" ["💛"])
928 (":purple_heart:" ["💜"])
929 ("<3" ["💜"])
930 (":gift_heart:" ["💝"])
931 (":revolving_hearts:" ["💞"])
932 (":heart_decoration:" ["💟"])
933 (":diamond_shape_with_a_dot_inside:" ["💠"])
934 (":bulb:" ["💡"])
935 (":anger:" ["💢"])
936 (":bomb:" ["💣"])
937 (":zzz:" ["💤"])
938 (":boom:" ["💥"])
939 (":collision:" ["💥"])
940 (":sweat_drops:" ["💦"])
941 (":droplet:" ["💧"])
942 (":dash:" ["💨"])
943 (":hankey:" ["💩"])
944 (":poop:" ["💩"])
945 (":shit:" ["💩"])
946 (":muscle:" ["💪"])
947 (":dizzy:" ["💫"])
948 (":speech_balloon:" ["💬"])
949 (":thought_balloon:" ["💭"])
950 (":white_flower:" ["💮"])
951 (":100:" ["💯"])
952 (":moneybag:" ["💰"])
953 (":currency_exchange:" ["💱"])
954 (":heavy_dollar_sign:" ["💲"])
955 (":credit_card:" ["💳"])
956 (":yen:" ["💴"])
957 (":dollar:" ["💵"])
958 (":euro:" ["💶"])
959 (":pound:" ["💷"])
960 (":money_with_wings:" ["💸"])
961 (":chart:" ["💹"])
962 (":seat:" ["💺"])
963 (":computer:" ["💻"])
964 (":briefcase:" ["💼"])
965 (":minidisc:" ["💽"])
966 (":floppy_disk:" ["💾"])
967 (":cd:" ["💿"])
968 (":dvd:" ["📀"])
969 (":file_folder:" ["📁"])
970 (":open_file_folder:" ["📂"])
971 (":page_with_curl:" ["📃"])
972 (":page_facing_up:" ["📄"])
973 (":date:" ["📅"])
974 (":calendar:" ["📆"])
975 (":card_index:" ["📇"])
976 (":chart_with_upwards_trend:" ["📈"])
977 (":chart_with_downwards_trend:" ["📉"])
978 (":bar_chart:" ["📊"])
979 (":clipboard:" ["📋"])
980 (":pushpin:" ["📌"])
981 (":round_pushpin:" ["📍"])
982 (":paperclip:" ["📎"])
983 (":straight_ruler:" ["📏"])
984 (":triangular_ruler:" ["📐"])
985 (":bookmark_tabs:" ["📑"])
986 (":ledger:" ["📒"])
987 (":notebook:" ["📓"])
988 (":notebook_with_decorative_cover:" ["📔"])
989 (":closed_book:" ["📕"])
990 (":book:" ["📖"])
991 (":open_book:" ["📖"])
992 (":green_book:" ["📗"])
993 (":blue_book:" ["📘"])
994 (":orange_book:" ["📙"])
995 (":books:" ["📚"])
996 (":name_badge:" ["📛"])
997 (":scroll:" ["📜"])
998 (":memo:" ["📝"])
999 (":pencil:" ["📝"])
1000 (":telephone_receiver:" ["📞"])
1001 (":pager:" ["📟"])
1002 (":fax:" ["📠"])
1003 (":satellite_antenna:" ["📡"])
1004 (":loudspeaker:" ["📢"])
1005 (":mega:" ["📣"])
1006 (":outbox_tray:" ["📤"])
1007 (":inbox_tray:" ["📥"])
1008 (":package:" ["📦"])
1009 (":e-mail:" ["📧"])
1010 (":incoming_envelope:" ["📨"])
1011 (":envelope_with_arrow:" ["📩"])
1012 (":mailbox_closed:" ["📪"])
1013 (":mailbox:" ["📫"])
1014 (":mailbox_with_mail:" ["📬"])
1015 (":mailbox_with_no_mail:" ["📭"])
1016 (":postbox:" ["📮"])
1017 (":postal_horn:" ["📯"])
1018 (":newspaper:" ["📰"])
1019 (":iphone:" ["📱"])
1020 (":calling:" ["📲"])
1021 (":vibration_mode:" ["📳"])
1022 (":mobile_phone_off:" ["📴"])
1023 (":no_mobile_phones:" ["📵"])
1024 (":signal_strength:" ["📶"])
1025 (":camera:" ["📷"])
1026 (":camera_with_flash:" ["📸"])
1027 (":video_camera:" ["📹"])
1028 (":tv:" ["📺"])
1029 (":radio:" ["📻"])
1030 (":vhs:" ["📼"])
1031 (":film_projector:" ["📽️"])
1032 (":prayer_beads:" ["📿"])
1033 (":twisted_rightwards_arrows:" ["🔀"])
1034 (":repeat:" ["🔁"])
1035 (":repeat_one:" ["🔂"])
1036 (":arrows_clockwise:" ["🔃"])
1037 (":arrows_counterclockwise:" ["🔄"])
1038 (":low_brightness:" ["🔅"])
1039 (":high_brightness:" ["🔆"])
1040 (":mute:" ["🔇"])
1041 (":speaker:" ["🔈"])
1042 (":sound:" ["🔉"])
1043 (":loud_sound:" ["🔊"])
1044 (":battery:" ["🔋"])
1045 (":electric_plug:" ["🔌"])
1046 (":mag:" ["🔍"])
1047 (":mag_right:" ["🔎"])
1048 (":lock_with_ink_pen:" ["🔏"])
1049 (":closed_lock_with_key:" ["🔐"])
1050 (":key:" ["🔑"])
1051 (":lock:" ["🔒"])
1052 (":unlock:" ["🔓"])
1053 (":bell:" ["🔔"])
1054 (":no_bell:" ["🔕"])
1055 (":bookmark:" ["🔖"])
1056 (":link:" ["🔗"])
1057 (":radio_button:" ["🔘"])
1058 (":back:" ["🔙"])
1059 (":end:" ["🔚"])
1060 (":on:" ["🔛"])
1061 (":soon:" ["🔜"])
1062 (":top:" ["🔝"])
1063 (":underage:" ["🔞"])
1064 (":keycap_ten:" ["🔟"])
1065 (":capital_abcd:" ["🔠"])
1066 (":abcd:" ["🔡"])
1067 (":1234:" ["🔢"])
1068 (":symbols:" ["🔣"])
1069 (":abc:" ["🔤"])
1070 (":fire:" ["🔥"])
1071 (":flashlight:" ["🔦"])
1072 (":wrench:" ["🔧"])
1073 (":hammer:" ["🔨"])
1074 (":nut_and_bolt:" ["🔩"])
1075 (":hocho:" ["🔪"])
1076 (":knife:" ["🔪"])
1077 (":gun:" ["🔫"])
1078 (":microscope:" ["🔬"])
1079 (":telescope:" ["🔭"])
1080 (":crystal_ball:" ["🔮"])
1081 (":six_pointed_star:" ["🔯"])
1082 (":beginner:" ["🔰"])
1083 (":trident:" ["🔱"])
1084 (":black_square_button:" ["🔲"])
1085 (":white_square_button:" ["🔳"])
1086 (":red_circle:" ["🔴"])
1087 (":large_blue_circle:" ["🔵"])
1088 (":large_orange_diamond:" ["🔶"])
1089 (":large_blue_diamond:" ["🔷"])
1090 (":small_orange_diamond:" ["🔸"])
1091 (":small_blue_diamond:" ["🔹"])
1092 (":small_red_triangle:" ["🔺"])
1093 (":small_red_triangle_down:" ["🔻"])
1094 (":arrow_up_small:" ["🔼"])
1095 (":arrow_down_small:" ["🔽"])
1096 (":om_symbol:" ["🕉️"])
1097 (":dove_of_peace:" ["🕊️"])
1098 (":kaaba:" ["🕋"])
1099 (":mosque:" ["🕌"])
1100 (":synagogue:" ["🕍"])
1101 (":menorah_with_nine_branches:" ["🕎"])
1102 (":clock1:" ["🕐"])
1103 (":clock2:" ["🕑"])
1104 (":clock3:" ["🕒"])
1105 (":clock4:" ["🕓"])
1106 (":clock5:" ["🕔"])
1107 (":clock6:" ["🕕"])
1108 (":clock7:" ["🕖"])
1109 (":clock8:" ["🕗"])
1110 (":clock9:" ["🕘"])
1111 (":clock10:" ["🕙"])
1112 (":clock11:" ["🕚"])
1113 (":clock12:" ["🕛"])
1114 (":clock130:" ["🕜"])
1115 (":clock230:" ["🕝"])
1116 (":clock330:" ["🕞"])
1117 (":clock430:" ["🕟"])
1118 (":clock530:" ["🕠"])
1119 (":clock630:" ["🕡"])
1120 (":clock730:" ["🕢"])
1121 (":clock830:" ["🕣"])
1122 (":clock930:" ["🕤"])
1123 (":clock1030:" ["🕥"])
1124 (":clock1130:" ["🕦"])
1125 (":clock1230:" ["🕧"])
1126 (":candle:" ["🕯️"])
1127 (":mantelpiece_clock:" ["🕰️"])
1128 (":hole:" ["🕳️"])
1129 (":man_in_business_suit_levitating:" ["🕴️"])
1130 (":female-detective:" ["🕵️‍♀️"])
1131 (":male-detective:" ["🕵️‍♂️"])
1132 (":sleuth_or_spy:" ["🕵️"])
1133 (":dark_sunglasses:" ["🕶️"])
1134 (":spider:" ["🕷️"])
1135 (":spider_web:" ["🕸️"])
1136 (":joystick:" ["🕹️"])
1137 (":man_dancing:" ["🕺"])
1138 (":linked_paperclips:" ["🖇️"])
1139 (":lower_left_ballpoint_pen:" ["🖊️"])
1140 (":lower_left_fountain_pen:" ["🖋️"])
1141 (":lower_left_paintbrush:" ["🖌️"])
1142 (":lower_left_crayon:" ["🖍️"])
1143 (":raised_hand_with_fingers_splayed:" ["🖐️"])
1144 (":middle_finger:" ["🖕"])
1145 (":reversed_hand_with_middle_finger_extended:" ["🖕"])
1146 (":spock-hand:" ["🖖"])
1147 (":black_heart:" ["🖤"])
1148 (":desktop_computer:" ["🖥️"])
1149 (":printer:" ["🖨️"])
1150 (":three_button_mouse:" ["🖱️"])
1151 (":trackball:" ["🖲️"])
1152 (":frame_with_picture:" ["🖼️"])
1153 (":card_index_dividers:" ["🗂️"])
1154 (":card_file_box:" ["🗃️"])
1155 (":file_cabinet:" ["🗄️"])
1156 (":wastebasket:" ["🗑️"])
1157 (":spiral_note_pad:" ["🗒️"])
1158 (":spiral_calendar_pad:" ["🗓️"])
1159 (":compression:" ["🗜️"])
1160 (":old_key:" ["🗝️"])
1161 (":rolled_up_newspaper:" ["🗞️"])
1162 (":dagger_knife:" ["🗡️"])
1163 (":speaking_head_in_silhouette:" ["🗣️"])
1164 (":left_speech_bubble:" ["🗨️"])
1165 (":right_anger_bubble:" ["🗯️"])
1166 (":ballot_box_with_ballot:" ["🗳️"])
1167 (":world_map:" ["🗺️"])
1168 (":mount_fuji:" ["🗻"])
1169 (":tokyo_tower:" ["🗼"])
1170 (":statue_of_liberty:" ["🗽"])
1171 (":japan:" ["🗾"])
1172 (":moyai:" ["🗿"])
1173 (":grinning:" ["😀"])
1174 (":D" ["😀"])
1175 (":grin:" ["😁"])
1176 (":joy:" ["😂"])
1177 (":smiley:" ["😃"])
1178 (":)" ["😃"])
1179 ("=)" ["😃"])
1180 ("=-)" ["😃"])
1181 (":smile:" ["😄"])
1182 (":)" ["😄"])
1183 ("C:" ["😄"])
1184 ("c:" ["😄"])
1185 (":D" ["😄"])
1186 (":-D" ["😄"])
1187 (":sweat_smile:" ["😅"])
1188 (":laughing:" ["😆"])
1189 (":satisfied:" ["😆"])
1190 (":>" ["😆"])
1191 (":->" ["😆"])
1192 (":innocent:" ["😇"])
1193 (":smiling_imp:" ["😈"])
1194 (":wink:" ["😉"])
1195 (";)" ["😉"])
1196 (";-)" ["😉"])
1197 (":blush:" ["😊"])
1198 (":)" ["😊"])
1199 (":yum:" ["😋"])
1200 (":relieved:" ["😌"])
1201 (":heart_eyes:" ["😍"])
1202 (":sunglasses:" ["😎"])
1203 ("8)" ["😎"])
1204 (":smirk:" ["😏"])
1205 (":neutral_face:" ["😐"])
1206 (":|" ["😐"])
1207 (":-|" ["😐"])
1208 (":expressionless:" ["😑"])
1209 (":unamused:" ["😒"])
1210 (":(" ["😒"])
1211 (":sweat:" ["😓"])
1212 (":pensive:" ["😔"])
1213 (":confused:" ["😕"])
1214 (":\\" ["😕"])
1215 (":-\\" ["😕"])
1216 (":/" ["😕"])
1217 (":-/" ["😕"])
1218 (":confounded:" ["😖"])
1219 (":kissing:" ["😗"])
1220 (":kissing_heart:" ["😘"])
1221 (":*" ["😘"])
1222 (":-*" ["😘"])
1223 (":kissing_smiling_eyes:" ["😙"])
1224 (":kissing_closed_eyes:" ["😚"])
1225 (":stuck_out_tongue:" ["😛"])
1226 (":p" ["😛"])
1227 (":-p" ["😛"])
1228 (":P" ["😛"])
1229 (":-P" ["😛"])
1230 (":b" ["😛"])
1231 (":-b" ["😛"])
1232 (":stuck_out_tongue_winking_eye:" ["😜"])
1233 (";p" ["😜"])
1234 (";-p" ["😜"])
1235 (";b" ["😜"])
1236 (";-b" ["😜"])
1237 (";P" ["😜"])
1238 (";-P" ["😜"])
1239 (":stuck_out_tongue_closed_eyes:" ["😝"])
1240 (":disappointed:" ["😞"])
1241 (":(" ["😞"])
1242 ("):" ["😞"])
1243 (":-(" ["😞"])
1244 (":worried:" ["😟"])
1245 (":angry:" ["😠"])
1246 (">:(" ["😠"])
1247 (">:-(" ["😠"])
1248 (":rage:" ["😡"])
1249 (":cry:" ["😢"])
1250 (":'(" ["😢"])
1251 (":persevere:" ["😣"])
1252 (":triumph:" ["😤"])
1253 (":disappointed_relieved:" ["😥"])
1254 (":frowning:" ["😦"])
1255 (":anguished:" ["😧"])
1256 ("D:" ["😧"])
1257 (":fearful:" ["😨"])
1258 (":weary:" ["😩"])
1259 (":sleepy:" ["😪"])
1260 (":tired_face:" ["😫"])
1261 (":grimacing:" ["😬"])
1262 (":sob:" ["😭"])
1263 (":'(" ["😭"])
1264 (":face_exhaling:" ["😮‍💨"])
1265 (":open_mouth:" ["😮"])
1266 (":o" ["😮"])
1267 (":-o" ["😮"])
1268 (":O" ["😮"])
1269 (":-O" ["😮"])
1270 (":hushed:" ["😯"])
1271 (":cold_sweat:" ["😰"])
1272 (":scream:" ["😱"])
1273 (":astonished:" ["😲"])
1274 (":flushed:" ["😳"])
1275 (":sleeping:" ["😴"])
1276 (":face_with_spiral_eyes:" ["😵‍💫"])
1277 (":dizzy_face:" ["😵"])
1278 (":face_in_clouds:" ["😶‍🌫️"])
1279 (":no_mouth:" ["😶"])
1280 (":mask:" ["😷"])
1281 (":smile_cat:" ["😸"])
1282 (":joy_cat:" ["😹"])
1283 (":smiley_cat:" ["😺"])
1284 (":heart_eyes_cat:" ["😻"])
1285 (":smirk_cat:" ["😼"])
1286 (":kissing_cat:" ["😽"])
1287 (":pouting_cat:" ["😾"])
1288 (":crying_cat_face:" ["😿"])
1289 (":scream_cat:" ["🙀"])
1290 (":slightly_frowning_face:" ["🙁"])
1291 (":slightly_smiling_face:" ["🙂"])
1292 (":)" ["🙂"])
1293 ("(:" ["🙂"])
1294 (":-)" ["🙂"])
1295 (":upside_down_face:" ["🙃"])
1296 (":face_with_rolling_eyes:" ["🙄"])
1297 (":woman-gesturing-no:" ["🙅‍♀️"])
1298 (":man-gesturing-no:" ["🙅‍♂️"])
1299 (":no_good:" ["🙅"])
1300 (":woman-gesturing-ok:" ["🙆‍♀️"])
1301 (":man-gesturing-ok:" ["🙆‍♂️"])
1302 (":ok_woman:" ["🙆"])
1303 (":woman-bowing:" ["🙇‍♀️"])
1304 (":man-bowing:" ["🙇‍♂️"])
1305 (":bow:" ["🙇"])
1306 (":see_no_evil:" ["🙈"])
1307 (":hear_no_evil:" ["🙉"])
1308 (":speak_no_evil:" ["🙊"])
1309 (":woman-raising-hand:" ["🙋‍♀️"])
1310 (":man-raising-hand:" ["🙋‍♂️"])
1311 (":raising_hand:" ["🙋"])
1312 (":raised_hands:" ["🙌"])
1313 (":woman-frowning:" ["🙍‍♀️"])
1314 (":man-frowning:" ["🙍‍♂️"])
1315 (":person_frowning:" ["🙍"])
1316 (":woman-pouting:" ["🙎‍♀️"])
1317 (":man-pouting:" ["🙎‍♂️"])
1318 (":person_with_pouting_face:" ["🙎"])
1319 (":pray:" ["🙏"])
1320 (":rocket:" ["🚀"])
1321 (":helicopter:" ["🚁"])
1322 (":steam_locomotive:" ["🚂"])
1323 (":railway_car:" ["🚃"])
1324 (":bullettrain_side:" ["🚄"])
1325 (":bullettrain_front:" ["🚅"])
1326 (":train2:" ["🚆"])
1327 (":metro:" ["🚇"])
1328 (":light_rail:" ["🚈"])
1329 (":station:" ["🚉"])
1330 (":tram:" ["🚊"])
1331 (":train:" ["🚋"])
1332 (":bus:" ["🚌"])
1333 (":oncoming_bus:" ["🚍"])
1334 (":trolleybus:" ["🚎"])
1335 (":busstop:" ["🚏"])
1336 (":minibus:" ["🚐"])
1337 (":ambulance:" ["🚑"])
1338 (":fire_engine:" ["🚒"])
1339 (":police_car:" ["🚓"])
1340 (":oncoming_police_car:" ["🚔"])
1341 (":taxi:" ["🚕"])
1342 (":oncoming_taxi:" ["🚖"])
1343 (":car:" ["🚗"])
1344 (":red_car:" ["🚗"])
1345 (":oncoming_automobile:" ["🚘"])
1346 (":blue_car:" ["🚙"])
1347 (":truck:" ["🚚"])
1348 (":articulated_lorry:" ["🚛"])
1349 (":tractor:" ["🚜"])
1350 (":monorail:" ["🚝"])
1351 (":mountain_railway:" ["🚞"])
1352 (":suspension_railway:" ["🚟"])
1353 (":mountain_cableway:" ["🚠"])
1354 (":aerial_tramway:" ["🚡"])
1355 (":ship:" ["🚢"])
1356 (":woman-rowing-boat:" ["🚣‍♀️"])
1357 (":man-rowing-boat:" ["🚣‍♂️"])
1358 (":rowboat:" ["🚣"])
1359 (":speedboat:" ["🚤"])
1360 (":traffic_light:" ["🚥"])
1361 (":vertical_traffic_light:" ["🚦"])
1362 (":construction:" ["🚧"])
1363 (":rotating_light:" ["🚨"])
1364 (":triangular_flag_on_post:" ["🚩"])
1365 (":door:" ["🚪"])
1366 (":no_entry_sign:" ["🚫"])
1367 (":smoking:" ["🚬"])
1368 (":no_smoking:" ["🚭"])
1369 (":put_litter_in_its_place:" ["🚮"])
1370 (":do_not_litter:" ["🚯"])
1371 (":potable_water:" ["🚰"])
1372 (":non-potable_water:" ["🚱"])
1373 (":bike:" ["🚲"])
1374 (":no_bicycles:" ["🚳"])
1375 (":woman-biking:" ["🚴‍♀️"])
1376 (":man-biking:" ["🚴‍♂️"])
1377 (":bicyclist:" ["🚴"])
1378 (":woman-mountain-biking:" ["🚵‍♀️"])
1379 (":man-mountain-biking:" ["🚵‍♂️"])
1380 (":mountain_bicyclist:" ["🚵"])
1381 (":woman-walking:" ["🚶‍♀️"])
1382 (":man-walking:" ["🚶‍♂️"])
1383 (":walking:" ["🚶"])
1384 (":no_pedestrians:" ["🚷"])
1385 (":children_crossing:" ["🚸"])
1386 (":mens:" ["🚹"])
1387 (":womens:" ["🚺"])
1388 (":restroom:" ["🚻"])
1389 (":baby_symbol:" ["🚼"])
1390 (":toilet:" ["🚽"])
1391 (":wc:" ["🚾"])
1392 (":shower:" ["🚿"])
1393 (":bath:" ["🛀"])
1394 (":bathtub:" ["🛁"])
1395 (":passport_control:" ["🛂"])
1396 (":customs:" ["🛃"])
1397 (":baggage_claim:" ["🛄"])
1398 (":left_luggage:" ["🛅"])
1399 (":couch_and_lamp:" ["🛋️"])
1400 (":sleeping_accommodation:" ["🛌"])
1401 (":shopping_bags:" ["🛍️"])
1402 (":bellhop_bell:" ["🛎️"])
1403 (":bed:" ["🛏️"])
1404 (":place_of_worship:" ["🛐"])
1405 (":octagonal_sign:" ["🛑"])
1406 (":shopping_trolley:" ["🛒"])
1407 (":hindu_temple:" ["🛕"])
1408 (":hut:" ["🛖"])
1409 (":elevator:" ["🛗"])
1410 (":hammer_and_wrench:" ["🛠️"])
1411 (":shield:" ["🛡️"])
1412 (":oil_drum:" ["🛢️"])
1413 (":motorway:" ["🛣️"])
1414 (":railway_track:" ["🛤️"])
1415 (":motor_boat:" ["🛥️"])
1416 (":small_airplane:" ["🛩️"])
1417 (":airplane_departure:" ["🛫"])
1418 (":airplane_arriving:" ["🛬"])
1419 (":satellite:" ["🛰️"])
1420 (":passenger_ship:" ["🛳️"])
1421 (":scooter:" ["🛴"])
1422 (":motor_scooter:" ["🛵"])
1423 (":canoe:" ["🛶"])
1424 (":sled:" ["🛷"])
1425 (":flying_saucer:" ["🛸"])
1426 (":skateboard:" ["🛹"])
1427 (":auto_rickshaw:" ["🛺"])
1428 (":pickup_truck:" ["🛻"])
1429 (":roller_skate:" ["🛼"])
1430 (":large_orange_circle:" ["🟠"])
1431 (":large_yellow_circle:" ["🟡"])
1432 (":large_green_circle:" ["🟢"])
1433 (":large_purple_circle:" ["🟣"])
1434 (":large_brown_circle:" ["🟤"])
1435 (":large_red_square:" ["🟥"])
1436 (":large_blue_square:" ["🟦"])
1437 (":large_orange_square:" ["🟧"])
1438 (":large_yellow_square:" ["🟨"])
1439 (":large_green_square:" ["🟩"])
1440 (":large_purple_square:" ["🟪"])
1441 (":large_brown_square:" ["🟫"])
1442 (":pinched_fingers:" ["🤌"])
1443 (":white_heart:" ["🤍"])
1444 (":brown_heart:" ["🤎"])
1445 (":pinching_hand:" ["🤏"])
1446 (":zipper_mouth_face:" ["🤐"])
1447 (":money_mouth_face:" ["🤑"])
1448 (":face_with_thermometer:" ["🤒"])
1449 (":nerd_face:" ["🤓"])
1450 (":thinking_face:" ["🤔"])
1451 (":face_with_head_bandage:" ["🤕"])
1452 (":robot_face:" ["🤖"])
1453 (":hugging_face:" ["🤗"])
1454 (":the_horns:" ["🤘"])
1455 (":sign_of_the_horns:" ["🤘"])
1456 (":call_me_hand:" ["🤙"])
1457 (":raised_back_of_hand:" ["🤚"])
1458 (":left-facing_fist:" ["🤛"])
1459 (":right-facing_fist:" ["🤜"])
1460 (":handshake:" ["🤝"])
1461 (":crossed_fingers:" ["🤞"])
1462 (":hand_with_index_and_middle_fingers_crossed:" ["🤞"])
1463 (":i_love_you_hand_sign:" ["🤟"])
1464 (":face_with_cowboy_hat:" ["🤠"])
1465 (":clown_face:" ["🤡"])
1466 (":nauseated_face:" ["🤢"])
1467 (":rolling_on_the_floor_laughing:" ["🤣"])
1468 (":drooling_face:" ["🤤"])
1469 (":lying_face:" ["🤥"])
1470 (":woman-facepalming:" ["🤦‍♀️"])
1471 (":man-facepalming:" ["🤦‍♂️"])
1472 (":face_palm:" ["🤦"])
1473 (":sneezing_face:" ["🤧"])
1474 (":face_with_raised_eyebrow:" ["🤨"])
1475 (":face_with_one_eyebrow_raised:" ["🤨"])
1476 (":star-struck:" ["🤩"])
1477 (":grinning_face_with_star_eyes:" ["🤩"])
1478 (":zany_face:" ["🤪"])
1479 (":grinning_face_with_one_large_and_one_small_eye:" ["🤪"])
1480 (":shushing_face:" ["🤫"])
1481 (":face_with_finger_covering_closed_lips:" ["🤫"])
1482 (":face_with_symbols_on_mouth:" ["🤬"])
1483 (":serious_face_with_symbols_covering_mouth:" ["🤬"])
1484 (":face_with_hand_over_mouth:" ["🤭"])
1485 (":smiling_face_with_smiling_eyes_and_hand_covering_mouth:" ["🤭"])
1486 (":face_vomiting:" ["🤮"])
1487 (":face_with_open_mouth_vomiting:" ["🤮"])
1488 (":exploding_head:" ["🤯"])
1489 (":shocked_face_with_exploding_head:" ["🤯"])
1490 (":pregnant_woman:" ["🤰"])
1491 (":breast-feeding:" ["🤱"])
1492 (":palms_up_together:" ["🤲"])
1493 (":selfie:" ["🤳"])
1494 (":prince:" ["🤴"])
1495 (":woman_in_tuxedo:" ["🤵‍♀️"])
1496 (":man_in_tuxedo:" ["🤵‍♂️"])
1497 (":person_in_tuxedo:" ["🤵"])
1498 (":mrs_claus:" ["🤶"])
1499 (":mother_christmas:" ["🤶"])
1500 (":woman-shrugging:" ["🤷‍♀️"])
1501 (":man-shrugging:" ["🤷‍♂️"])
1502 (":shrug:" ["🤷"])
1503 (":woman-cartwheeling:" ["🤸‍♀️"])
1504 (":man-cartwheeling:" ["🤸‍♂️"])
1505 (":person_doing_cartwheel:" ["🤸"])
1506 (":woman-juggling:" ["🤹‍♀️"])
1507 (":man-juggling:" ["🤹‍♂️"])
1508 (":juggling:" ["🤹"])
1509 (":fencer:" ["🤺"])
1510 (":woman-wrestling:" ["🤼‍♀️"])
1511 (":man-wrestling:" ["🤼‍♂️"])
1512 (":wrestlers:" ["🤼"])
1513 (":woman-playing-water-polo:" ["🤽‍♀️"])
1514 (":man-playing-water-polo:" ["🤽‍♂️"])
1515 (":water_polo:" ["🤽"])
1516 (":woman-playing-handball:" ["🤾‍♀️"])
1517 (":man-playing-handball:" ["🤾‍♂️"])
1518 (":handball:" ["🤾"])
1519 (":diving_mask:" ["🤿"])
1520 (":wilted_flower:" ["🥀"])
1521 (":drum_with_drumsticks:" ["🥁"])
1522 (":clinking_glasses:" ["🥂"])
1523 (":tumbler_glass:" ["🥃"])
1524 (":spoon:" ["🥄"])
1525 (":goal_net:" ["🥅"])
1526 (":first_place_medal:" ["🥇"])
1527 (":second_place_medal:" ["🥈"])
1528 (":third_place_medal:" ["🥉"])
1529 (":boxing_glove:" ["🥊"])
1530 (":martial_arts_uniform:" ["🥋"])
1531 (":curling_stone:" ["🥌"])
1532 (":lacrosse:" ["🥍"])
1533 (":softball:" ["🥎"])
1534 (":flying_disc:" ["🥏"])
1535 (":croissant:" ["🥐"])
1536 (":avocado:" ["🥑"])
1537 (":cucumber:" ["🥒"])
1538 (":bacon:" ["🥓"])
1539 (":potato:" ["🥔"])
1540 (":carrot:" ["🥕"])
1541 (":baguette_bread:" ["🥖"])
1542 (":green_salad:" ["🥗"])
1543 (":shallow_pan_of_food:" ["🥘"])
1544 (":stuffed_flatbread:" ["🥙"])
1545 (":egg:" ["🥚"])
1546 (":glass_of_milk:" ["🥛"])
1547 (":peanuts:" ["🥜"])
1548 (":kiwifruit:" ["🥝"])
1549 (":pancakes:" ["🥞"])
1550 (":dumpling:" ["🥟"])
1551 (":fortune_cookie:" ["🥠"])
1552 (":takeout_box:" ["🥡"])
1553 (":chopsticks:" ["🥢"])
1554 (":bowl_with_spoon:" ["🥣"])
1555 (":cup_with_straw:" ["🥤"])
1556 (":coconut:" ["🥥"])
1557 (":broccoli:" ["🥦"])
1558 (":pie:" ["🥧"])
1559 (":pretzel:" ["🥨"])
1560 (":cut_of_meat:" ["🥩"])
1561 (":sandwich:" ["🥪"])
1562 (":canned_food:" ["🥫"])
1563 (":leafy_green:" ["🥬"])
1564 (":mango:" ["🥭"])
1565 (":moon_cake:" ["🥮"])
1566 (":bagel:" ["🥯"])
1567 (":smiling_face_with_3_hearts:" ["🥰"])
1568 (":yawning_face:" ["🥱"])
1569 (":smiling_face_with_tear:" ["🥲"])
1570 (":partying_face:" ["🥳"])
1571 (":woozy_face:" ["🥴"])
1572 (":hot_face:" ["🥵"])
1573 (":cold_face:" ["🥶"])
1574 (":ninja:" ["🥷"])
1575 (":disguised_face:" ["🥸"])
1576 (":pleading_face:" ["🥺"])
1577 (":sari:" ["🥻"])
1578 (":lab_coat:" ["🥼"])
1579 (":goggles:" ["🥽"])
1580 (":hiking_boot:" ["🥾"])
1581 (":womans_flat_shoe:" ["🥿"])
1582 (":crab:" ["🦀"])
1583 (":lion_face:" ["🦁"])
1584 (":scorpion:" ["🦂"])
1585 (":turkey:" ["🦃"])
1586 (":unicorn_face:" ["🦄"])
1587 (":eagle:" ["🦅"])
1588 (":duck:" ["🦆"])
1589 (":bat:" ["🦇"])
1590 (":shark:" ["🦈"])
1591 (":owl:" ["🦉"])
1592 (":fox_face:" ["🦊"])
1593 (":butterfly:" ["🦋"])
1594 (":deer:" ["🦌"])
1595 (":gorilla:" ["🦍"])
1596 (":lizard:" ["🦎"])
1597 (":rhinoceros:" ["🦏"])
1598 (":shrimp:" ["🦐"])
1599 (":squid:" ["🦑"])
1600 (":giraffe_face:" ["🦒"])
1601 (":zebra_face:" ["🦓"])
1602 (":hedgehog:" ["🦔"])
1603 (":sauropod:" ["🦕"])
1604 (":t-rex:" ["🦖"])
1605 (":cricket:" ["🦗"])
1606 (":kangaroo:" ["🦘"])
1607 (":llama:" ["🦙"])
1608 (":peacock:" ["🦚"])
1609 (":hippopotamus:" ["🦛"])
1610 (":parrot:" ["🦜"])
1611 (":raccoon:" ["🦝"])
1612 (":lobster:" ["🦞"])
1613 (":mosquito:" ["🦟"])
1614 (":microbe:" ["🦠"])
1615 (":badger:" ["🦡"])
1616 (":swan:" ["🦢"])
1617 (":mammoth:" ["🦣"])
1618 (":dodo:" ["🦤"])
1619 (":sloth:" ["🦥"])
1620 (":otter:" ["🦦"])
1621 (":orangutan:" ["🦧"])
1622 (":skunk:" ["🦨"])
1623 (":flamingo:" ["🦩"])
1624 (":oyster:" ["🦪"])
1625 (":beaver:" ["🦫"])
1626 (":bison:" ["🦬"])
1627 (":seal:" ["🦭"])
1628 (":guide_dog:" ["🦮"])
1629 (":probing_cane:" ["🦯"])
1630 (":bone:" ["🦴"])
1631 (":leg:" ["🦵"])
1632 (":foot:" ["🦶"])
1633 (":tooth:" ["🦷"])
1634 (":female_superhero:" ["🦸‍♀️"])
1635 (":male_superhero:" ["🦸‍♂️"])
1636 (":superhero:" ["🦸"])
1637 (":female_supervillain:" ["🦹‍♀️"])
1638 (":male_supervillain:" ["🦹‍♂️"])
1639 (":supervillain:" ["🦹"])
1640 (":safety_vest:" ["🦺"])
1641 (":ear_with_hearing_aid:" ["🦻"])
1642 (":motorized_wheelchair:" ["🦼"])
1643 (":manual_wheelchair:" ["🦽"])
1644 (":mechanical_arm:" ["🦾"])
1645 (":mechanical_leg:" ["🦿"])
1646 (":cheese_wedge:" ["🧀"])
1647 (":cupcake:" ["🧁"])
1648 (":salt:" ["🧂"])
1649 (":beverage_box:" ["🧃"])
1650 (":garlic:" ["🧄"])
1651 (":onion:" ["🧅"])
1652 (":falafel:" ["🧆"])
1653 (":waffle:" ["🧇"])
1654 (":butter:" ["🧈"])
1655 (":mate_drink:" ["🧉"])
1656 (":ice_cube:" ["🧊"])
1657 (":bubble_tea:" ["🧋"])
1658 (":woman_standing:" ["🧍‍♀️"])
1659 (":man_standing:" ["🧍‍♂️"])
1660 (":standing_person:" ["🧍"])
1661 (":woman_kneeling:" ["🧎‍♀️"])
1662 (":man_kneeling:" ["🧎‍♂️"])
1663 (":kneeling_person:" ["🧎"])
1664 (":deaf_woman:" ["🧏‍♀️"])
1665 (":deaf_man:" ["🧏‍♂️"])
1666 (":deaf_person:" ["🧏"])
1667 (":face_with_monocle:" ["🧐"])
1668 (":farmer:" ["🧑‍🌾"])
1669 (":cook:" ["🧑‍🍳"])
1670 (":person_feeding_baby:" ["🧑‍🍼"])
1671 (":mx_claus:" ["🧑‍🎄"])
1672 (":student:" ["🧑‍🎓"])
1673 (":singer:" ["🧑‍🎤"])
1674 (":artist:" ["🧑‍🎨"])
1675 (":teacher:" ["🧑‍🏫"])
1676 (":factory_worker:" ["🧑‍🏭"])
1677 (":technologist:" ["🧑‍💻"])
1678 (":office_worker:" ["🧑‍💼"])
1679 (":mechanic:" ["🧑‍🔧"])
1680 (":scientist:" ["🧑‍🔬"])
1681 (":astronaut:" ["🧑‍🚀"])
1682 (":firefighter:" ["🧑‍🚒"])
1683 (":people_holding_hands:" ["🧑‍🤝‍🧑"])
1684 (":person_with_probing_cane:" ["🧑‍🦯"])
1685 (":red_haired_person:" ["🧑‍🦰"])
1686 (":curly_haired_person:" ["🧑‍🦱"])
1687 (":bald_person:" ["🧑‍🦲"])
1688 (":white_haired_person:" ["🧑‍🦳"])
1689 (":person_in_motorized_wheelchair:" ["🧑‍🦼"])
1690 (":person_in_manual_wheelchair:" ["🧑‍🦽"])
1691 (":health_worker:" ["🧑‍⚕️"])
1692 (":judge:" ["🧑‍⚖️"])
1693 (":pilot:" ["🧑‍✈️"])
1694 (":adult:" ["🧑"])
1695 (":child:" ["🧒"])
1696 (":older_adult:" ["🧓"])
1697 (":woman_with_beard:" ["🧔‍♀️"])
1698 (":man_with_beard:" ["🧔‍♂️"])
1699 (":bearded_person:" ["🧔"])
1700 (":person_with_headscarf:" ["🧕"])
1701 (":woman_in_steamy_room:" ["🧖‍♀️"])
1702 (":man_in_steamy_room:" ["🧖‍♂️"])
1703 (":person_in_steamy_room:" ["🧖"])
1704 (":woman_climbing:" ["🧗‍♀️"])
1705 (":man_climbing:" ["🧗‍♂️"])
1706 (":person_climbing:" ["🧗"])
1707 (":woman_in_lotus_position:" ["🧘‍♀️"])
1708 (":man_in_lotus_position:" ["🧘‍♂️"])
1709 (":person_in_lotus_position:" ["🧘"])
1710 (":female_mage:" ["🧙‍♀️"])
1711 (":male_mage:" ["🧙‍♂️"])
1712 (":mage:" ["🧙"])
1713 (":female_fairy:" ["🧚‍♀️"])
1714 (":male_fairy:" ["🧚‍♂️"])
1715 (":fairy:" ["🧚"])
1716 (":female_vampire:" ["🧛‍♀️"])
1717 (":male_vampire:" ["🧛‍♂️"])
1718 (":vampire:" ["🧛"])
1719 (":mermaid:" ["🧜‍♀️"])
1720 (":merman:" ["🧜‍♂️"])
1721 (":merperson:" ["🧜"])
1722 (":female_elf:" ["🧝‍♀️"])
1723 (":male_elf:" ["🧝‍♂️"])
1724 (":elf:" ["🧝"])
1725 (":female_genie:" ["🧞‍♀️"])
1726 (":male_genie:" ["🧞‍♂️"])
1727 (":genie:" ["🧞"])
1728 (":female_zombie:" ["🧟‍♀️"])
1729 (":male_zombie:" ["🧟‍♂️"])
1730 (":zombie:" ["🧟"])
1731 (":brain:" ["🧠"])
1732 (":orange_heart:" ["🧡"])
1733 (":billed_cap:" ["🧢"])
1734 (":scarf:" ["🧣"])
1735 (":gloves:" ["🧤"])
1736 (":coat:" ["🧥"])
1737 (":socks:" ["🧦"])
1738 (":red_envelope:" ["🧧"])
1739 (":firecracker:" ["🧨"])
1740 (":jigsaw:" ["🧩"])
1741 (":test_tube:" ["🧪"])
1742 (":petri_dish:" ["🧫"])
1743 (":dna:" ["🧬"])
1744 (":compass:" ["🧭"])
1745 (":abacus:" ["🧮"])
1746 (":fire_extinguisher:" ["🧯"])
1747 (":toolbox:" ["🧰"])
1748 (":bricks:" ["🧱"])
1749 (":magnet:" ["🧲"])
1750 (":luggage:" ["🧳"])
1751 (":lotion_bottle:" ["🧴"])
1752 (":thread:" ["🧵"])
1753 (":yarn:" ["🧶"])
1754 (":safety_pin:" ["🧷"])
1755 (":teddy_bear:" ["🧸"])
1756 (":broom:" ["🧹"])
1757 (":basket:" ["🧺"])
1758 (":roll_of_paper:" ["🧻"])
1759 (":soap:" ["🧼"])
1760 (":sponge:" ["🧽"])
1761 (":receipt:" ["🧾"])
1762 (":nazar_amulet:" ["🧿"])
1763 (":ballet_shoes:" ["🩰"])
1764 (":one-piece_swimsuit:" ["🩱"])
1765 (":briefs:" ["🩲"])
1766 (":shorts:" ["🩳"])
1767 (":thong_sandal:" ["🩴"])
1768 (":drop_of_blood:" ["🩸"])
1769 (":adhesive_bandage:" ["🩹"])
1770 (":stethoscope:" ["🩺"])
1771 (":yo-yo:" ["🪀"])
1772 (":kite:" ["🪁"])
1773 (":parachute:" ["🪂"])
1774 (":boomerang:" ["🪃"])
1775 (":magic_wand:" ["🪄"])
1776 (":pinata:" ["🪅"])
1777 (":nesting_dolls:" ["🪆"])
1778 (":ringed_planet:" ["🪐"])
1779 (":chair:" ["🪑"])
1780 (":razor:" ["🪒"])
1781 (":axe:" ["🪓"])
1782 (":diya_lamp:" ["🪔"])
1783 (":banjo:" ["🪕"])
1784 (":military_helmet:" ["🪖"])
1785 (":accordion:" ["🪗"])
1786 (":long_drum:" ["🪘"])
1787 (":coin:" ["🪙"])
1788 (":carpentry_saw:" ["🪚"])
1789 (":screwdriver:" ["🪛"])
1790 (":ladder:" ["🪜"])
1791 (":hook:" ["🪝"])
1792 (":mirror:" ["🪞"])
1793 (":window:" ["🪟"])
1794 (":plunger:" ["🪠"])
1795 (":sewing_needle:" ["🪡"])
1796 (":knot:" ["🪢"])
1797 (":bucket:" ["🪣"])
1798 (":mouse_trap:" ["🪤"])
1799 (":toothbrush:" ["🪥"])
1800 (":headstone:" ["🪦"])
1801 (":placard:" ["🪧"])
1802 (":rock:" ["🪨"])
1803 (":fly:" ["🪰"])
1804 (":worm:" ["🪱"])
1805 (":beetle:" ["🪲"])
1806 (":cockroach:" ["🪳"])
1807 (":potted_plant:" ["🪴"])
1808 (":wood:" ["🪵"])
1809 (":feather:" ["🪶"])
1810 (":anatomical_heart:" ["🫀"])
1811 (":lungs:" ["🫁"])
1812 (":people_hugging:" ["🫂"])
1813 (":blueberries:" ["🫐"])
1814 (":bell_pepper:" ["🫑"])
1815 (":olive:" ["🫒"])
1816 (":flatbread:" ["🫓"])
1817 (":tamale:" ["🫔"])
1818 (":fondue:" ["🫕"])
1819 (":teapot:" ["🫖"])
1820 (":bangbang:" ["‼️"])
1821 (":interrobang:" ["⁉️"])
1822 (":tm:" ["™️"])
1823 (":information_source:" ["ℹ️"])
1824 (":left_right_arrow:" ["↔️"])
1825 (":arrow_up_down:" ["↕️"])
1826 (":arrow_upper_left:" ["↖️"])
1827 (":arrow_upper_right:" ["↗️"])
1828 (":arrow_lower_right:" ["↘️"])
1829 (":arrow_lower_left:" ["↙️"])
1830 (":leftwards_arrow_with_hook:" ["↩️"])
1831 (":arrow_right_hook:" ["↪️"])
1832 (":watch:" ["⌚"])
1833 (":hourglass:" ["⌛"])
1834 (":keyboard:" ["⌨️"])
1835 (":eject:" ["⏏️"])
1836 (":fast_forward:" ["⏩"])
1837 (":rewind:" ["⏪"])
1838 (":arrow_double_up:" ["⏫"])
1839 (":arrow_double_down:" ["⏬"])
1840 (":black_right_pointing_double_triangle_with_vertical_bar:" ["⏭️"])
1841 (":black_left_pointing_double_triangle_with_vertical_bar:" ["⏮️"])
1842 (":black_right_pointing_triangle_with_double_vertical_bar:" ["⏯️"])
1843 (":alarm_clock:" ["⏰"])
1844 (":stopwatch:" ["⏱️"])
1845 (":timer_clock:" ["⏲️"])
1846 (":hourglass_flowing_sand:" ["⏳"])
1847 (":double_vertical_bar:" ["⏸️"])
1848 (":black_square_for_stop:" ["⏹️"])
1849 (":black_circle_for_record:" ["⏺️"])
1850 (":m:" ["Ⓜ️"])
1851 (":black_small_square:" ["▪️"])
1852 (":white_small_square:" ["▫️"])
1853 (":arrow_forward:" ["▶️"])
1854 (":arrow_backward:" ["◀️"])
1855 (":white_medium_square:" ["◻️"])
1856 (":black_medium_square:" ["◼️"])
1857 (":white_medium_small_square:" ["◽"])
1858 (":black_medium_small_square:" ["◾"])
1859 (":sunny:" ["☀️"])
1860 (":cloud:" ["☁️"])
1861 (":umbrella:" ["☂️"])
1862 (":snowman:" ["☃️"])
1863 (":comet:" ["☄️"])
1864 (":phone:" ["☎️"])
1865 (":telephone:" ["☎️"])
1866 (":ballot_box_with_check:" ["☑️"])
1867 (":umbrella_with_rain_drops:" ["☔"])
1868 (":coffee:" ["☕"])
1869 (":shamrock:" ["☘️"])
1870 (":point_up:" ["☝️"])
1871 (":skull_and_crossbones:" ["☠️"])
1872 (":radioactive_sign:" ["☢️"])
1873 (":biohazard_sign:" ["☣️"])
1874 (":orthodox_cross:" ["☦️"])
1875 (":star_and_crescent:" ["☪️"])
1876 (":peace_symbol:" ["☮️"])
1877 (":yin_yang:" ["☯️"])
1878 (":wheel_of_dharma:" ["☸️"])
1879 (":white_frowning_face:" ["☹️"])
1880 (":relaxed:" ["☺️"])
1881 (":female_sign:" ["♀️"])
1882 (":male_sign:" ["♂️"])
1883 (":aries:" ["♈"])
1884 (":taurus:" ["♉"])
1885 (":gemini:" ["♊"])
1886 (":cancer:" ["♋"])
1887 (":leo:" ["♌"])
1888 (":virgo:" ["♍"])
1889 (":libra:" ["♎"])
1890 (":scorpius:" ["♏"])
1891 (":sagittarius:" ["♐"])
1892 (":capricorn:" ["♑"])
1893 (":aquarius:" ["♒"])
1894 (":pisces:" ["♓"])
1895 (":chess_pawn:" ["♟️"])
1896 (":spades:" ["♠️"])
1897 (":clubs:" ["♣️"])
1898 (":hearts:" ["♥️"])
1899 (":diamonds:" ["♦️"])
1900 (":hotsprings:" ["♨️"])
1901 (":recycle:" ["♻️"])
1902 (":infinity:" ["♾️"])
1903 (":wheelchair:" ["♿"])
1904 (":hammer_and_pick:" ["⚒️"])
1905 (":anchor:" ["⚓"])
1906 (":crossed_swords:" ["⚔️"])
1907 (":medical_symbol:" ["⚕️"])
1908 (":staff_of_aesculapius:" ["⚕️"])
1909 (":scales:" ["⚖️"])
1910 (":alembic:" ["⚗️"])
1911 (":gear:" ["⚙️"])
1912 (":atom_symbol:" ["⚛️"])
1913 (":fleur_de_lis:" ["⚜️"])
1914 (":warning:" ["⚠️"])
1915 (":zap:" ["⚡"])
1916 (":transgender_symbol:" ["⚧️"])
1917 (":white_circle:" ["⚪"])
1918 (":black_circle:" ["⚫"])
1919 (":coffin:" ["⚰️"])
1920 (":funeral_urn:" ["⚱️"])
1921 (":soccer:" ["⚽"])
1922 (":baseball:" ["⚾"])
1923 (":snowman_without_snow:" ["⛄"])
1924 (":partly_sunny:" ["⛅"])
1925 (":thunder_cloud_and_rain:" ["⛈️"])
1926 (":ophiuchus:" ["⛎"])
1927 (":pick:" ["⛏️"])
1928 (":helmet_with_white_cross:" ["⛑️"])
1929 (":chains:" ["⛓️"])
1930 (":no_entry:" ["⛔"])
1931 (":shinto_shrine:" ["⛩️"])
1932 (":church:" ["⛪"])
1933 (":mountain:" ["⛰️"])
1934 (":umbrella_on_ground:" ["⛱️"])
1935 (":fountain:" ["⛲"])
1936 (":golf:" ["⛳"])
1937 (":ferry:" ["⛴️"])
1938 (":boat:" ["⛵"])
1939 (":sailboat:" ["⛵"])
1940 (":skier:" ["⛷️"])
1941 (":ice_skate:" ["⛸️"])
1942 (":woman-bouncing-ball:" ["⛹️‍♀️"])
1943 (":man-bouncing-ball:" ["⛹️‍♂️"])
1944 (":person_with_ball:" ["⛹️"])
1945 (":tent:" ["⛺"])
1946 (":fuelpump:" ["⛽"])
1947 (":scissors:" ["✂️"])
1948 (":white_check_mark:" ["✅"])
1949 (":airplane:" ["✈️"])
1950 (":email:" ["✉️"])
1951 (":envelope:" ["✉️"])
1952 (":fist:" ["✊"])
1953 (":hand:" ["✋"])
1954 (":raised_hand:" ["✋"])
1955 (":v:" ["✌️"])
1956 (":writing_hand:" ["✍️"])
1957 (":pencil2:" ["✏️"])
1958 (":black_nib:" ["✒️"])
1959 (":heavy_check_mark:" ["✔️"])
1960 (":heavy_multiplication_x:" ["✖️"])
1961 (":latin_cross:" ["✝️"])
1962 (":star_of_david:" ["✡️"])
1963 (":sparkles:" ["✨"])
1964 (":eight_spoked_asterisk:" ["✳️"])
1965 (":eight_pointed_black_star:" ["✴️"])
1966 (":snowflake:" ["❄️"])
1967 (":sparkle:" ["❇️"])
1968 (":x:" ["❌"])
1969 (":negative_squared_cross_mark:" ["❎"])
1970 (":question:" ["❓"])
1971 (":grey_question:" ["❔"])
1972 (":grey_exclamation:" ["❕"])
1973 (":exclamation:" ["❗"])
1974 (":heavy_exclamation_mark:" ["❗"])
1975 (":heavy_heart_exclamation_mark_ornament:" ["❣️"])
1976 (":heart_on_fire:" ["❤️‍🔥"])
1977 (":mending_heart:" ["❤️‍🩹"])
1978 (":heart:" ["❤️"])
1979 ("<3" ["❤️"])
1980 (":heavy_plus_sign:" ["➕"])
1981 (":heavy_minus_sign:" ["➖"])
1982 (":heavy_division_sign:" ["➗"])
1983 (":arrow_right:" ["➡️"])
1984 (":curly_loop:" ["➰"])
1985 (":loop:" ["➿"])
1986 (":arrow_heading_up:" ["⤴️"])
1987 (":arrow_heading_down:" ["⤵️"])
1988 (":arrow_left:" ["⬅️"])
1989 (":arrow_up:" ["⬆️"])
1990 (":arrow_down:" ["⬇️"])
1991 (":black_large_square:" ["⬛"])
1992 (":white_large_square:" ["⬜"])
1993 (":star:" ["⭐"])
1994 (":o:" ["⭕"])
1995 (":wavy_dash:" ["〰️"])
1996 (":part_alternation_mark:" ["〽️"])
1997 (":congratulations:" ["㊗️"])
1998 (":secret:" ["㊙️"])))))))
1999
2000(emoji--define-rules)
2001
2002(provide 'emoji)
2003;;; emoji.el ends here
diff --git a/lisp/man.el b/lisp/man.el
index adf244a11ad..d6146a2c4dc 100644
--- a/lisp/man.el
+++ b/lisp/man.el
@@ -1976,6 +1976,30 @@ Uses `Man-name-local-regexp'."
1976 (bookmark-default-handler 1976 (bookmark-default-handler
1977 `("" (buffer . ,buf) . ,(bookmark-get-bookmark-record bookmark))))) 1977 `("" (buffer . ,buf) . ,(bookmark-get-bookmark-record bookmark)))))
1978 1978
1979;;; Mouse support
1980(defun Man-at-mouse (e)
1981 "Open man manual at point."
1982 (interactive "e")
1983 (save-excursion
1984 (mouse-set-point e)
1985 (man (Man-default-man-entry))))
1986
1987;;;###autoload
1988(defun Man-context-menu (menu click)
1989 "Populate MENU with commands that open a man page at point."
1990 (save-excursion
1991 (mouse-set-point click)
1992 (when (save-excursion
1993 (skip-syntax-backward "^ ")
1994 (and (looking-at
1995 "[[:space:]]*\\([[:alnum:]_-]+([[:alnum:]]+)\\)")
1996 (match-string 1)))
1997 (define-key-after menu [man-separator] menu-bar-separator)
1998 (define-key-after menu [man-at-mouse]
1999 '(menu-item "Open man page" man-at-mouse
2000 :help "Open man page around mouse click"))))
2001 menu)
2002
1979 2003
1980;; Init the man package variables, if not already done. 2004;; Init the man package variables, if not already done.
1981(Man-init-defvars) 2005(Man-init-defvars)
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index e0cf6c588c4..36cbd6a9c51 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -109,6 +109,16 @@
109 (bindings--define-key menu [separator-tab] 109 (bindings--define-key menu [separator-tab]
110 menu-bar-separator)) 110 menu-bar-separator))
111 111
112 (bindings--define-key menu [enable-undelete-frame-mode]
113 '(menu-item "Enable Undeleting Frames" undelete-frame-mode
114 :visible (null undelete-frame-mode)
115 :help "Enable undeleting frames in this session"))
116 (bindings--define-key menu [undelete-last-deleted-frame]
117 '(menu-item "Undelete Frame" undelete-frame
118 :visible (and undelete-frame-mode
119 (car undelete-frame--deleted-frames))
120 :help "Undelete the most recently deleted frame"))
121
112 ;; Don't use delete-frame as event name because that is a special 122 ;; Don't use delete-frame as event name because that is a special
113 ;; event. 123 ;; event.
114 (bindings--define-key menu [delete-this-frame] 124 (bindings--define-key menu [delete-this-frame]
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 1a76b9a0b66..46dd0397d7f 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -298,6 +298,9 @@ and should return the same menu with changes such as added new menu items."
298 (function-item context-menu-buffers) 298 (function-item context-menu-buffers)
299 (function-item context-menu-vc) 299 (function-item context-menu-vc)
300 (function-item context-menu-ffap) 300 (function-item context-menu-ffap)
301 (function-item Man-context-menu)
302 (function-item hi-lock-context-menu)
303 (function-item context-menu-online-search)
301 (function :tag "Custom function"))) 304 (function :tag "Custom function")))
302 :version "28.1") 305 :version "28.1")
303 306
@@ -531,6 +534,16 @@ Some context functions add menu items below the separator."
531 :help "Find file or URL from text around mouse click")))) 534 :help "Find file or URL from text around mouse click"))))
532 menu) 535 menu)
533 536
537(defun context-menu-online-search (menu click)
538 "Populate MENU with command to search online."
539 (save-excursion
540 (mouse-set-point click)
541 (define-key-after menu [online-search-separator] menu-bar-separator)
542 (define-key-after menu [online-search-at-mouse]
543 '(menu-item "Online search" mouse-online-search-at-point
544 :help "Search for region or word online")))
545 menu)
546
534(defvar context-menu-entry 547(defvar context-menu-entry
535 `(menu-item ,(purecopy "Context Menu") ,(make-sparse-keymap) 548 `(menu-item ,(purecopy "Context Menu") ,(make-sparse-keymap)
536 :filter ,(lambda (_) (context-menu-map))) 549 :filter ,(lambda (_) (context-menu-map)))
@@ -3217,6 +3230,26 @@ is copied instead of being cut."
3217 (with-current-buffer (window-buffer window) 3230 (with-current-buffer (window-buffer window)
3218 (setq cursor-type (nth 3 state))))))) 3231 (setq cursor-type (nth 3 state)))))))
3219 3232
3233(defvar eww-search-prefix)
3234(defun mouse-online-search-at-point (event)
3235 "Query an online search engine at EVENT.
3236If a region is active, the entire region will be sent, otherwise
3237the symbol at point will be used. This command uses EWW's
3238default search engine, as configured by `eww-search-prefix'."
3239 (interactive "e")
3240 (require 'eww)
3241 (let ((query (if (use-region-p)
3242 (buffer-substring (region-beginning)
3243 (region-end))
3244 (save-excursion
3245 (mouse-set-point event)
3246 (thing-at-point 'symbol)))))
3247 (unless query
3248 (user-error "Nothing to search for"))
3249 (browse-url (concat
3250 eww-search-prefix
3251 (mapconcat #'url-hexify-string (split-string query) "+")))))
3252
3220 3253
3221;;; Bindings for mouse commands. 3254;;; Bindings for mouse commands.
3222 3255
diff --git a/lisp/net/mailcap.el b/lisp/net/mailcap.el
index bf3c8edd1e3..daa2d5a3fb3 100644
--- a/lisp/net/mailcap.el
+++ b/lisp/net/mailcap.el
@@ -439,9 +439,10 @@ MAILCAPS if set; otherwise (on Unix) use the path from RFC 1524, plus
439 ("/usr/local/etc/mailcap" system))))) 439 ("/usr/local/etc/mailcap" system)))))
440 (when (stringp path) 440 (when (stringp path)
441 (setq path (mapcar #'list (split-string path path-separator t)))) 441 (setq path (mapcar #'list (split-string path path-separator t))))
442 (when (seq-some (lambda (f) 442 (when (or (null mailcap--computed-mime-data)
443 (file-has-changed-p (car f) 'mail-parse-mailcaps)) 443 (seq-some (lambda (f)
444 path) 444 (file-has-changed-p (car f) 'mail-parse-mailcaps))
445 path))
445 ;; Clear out all old data. 446 ;; Clear out all old data.
446 (setq mailcap--computed-mime-data nil) 447 (setq mailcap--computed-mime-data nil)
447 ;; Add the Emacs-distributed defaults (which will be used as 448 ;; Add the Emacs-distributed defaults (which will be used as
diff --git a/lisp/net/tramp-crypt.el b/lisp/net/tramp-crypt.el
index 36443e09830..c2c3689c610 100644
--- a/lisp/net/tramp-crypt.el
+++ b/lisp/net/tramp-crypt.el
@@ -39,7 +39,7 @@
39;; first time you access a crypted remote directory. It is kept in 39;; first time you access a crypted remote directory. It is kept in
40;; your user directory "~/.emacs.d/" with the url-encoded directory 40;; your user directory "~/.emacs.d/" with the url-encoded directory
41;; name as part of the basename, and ".encfs6.xml" as suffix. Do not 41;; name as part of the basename, and ".encfs6.xml" as suffix. Do not
42;; loose this file and the corresponding password; otherwise there is 42;; lose this file and the corresponding password; otherwise there is
43;; no way to decrypt your crypted files. 43;; no way to decrypt your crypted files.
44 44
45;; If the user option `tramp-crypt-save-encfs-config-remote' is 45;; If the user option `tramp-crypt-save-encfs-config-remote' is
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index b1bef82842d..3f78c9eb15b 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -744,10 +744,10 @@ The option \"--fullname\" must be included in this value."
744 744
745 output)) 745 output))
746 746
747(easy-mmode-defmap gud-minibuffer-local-map 747(defvar-keymap gud-minibuffer-local-map
748 '(("\C-i" . comint-dynamic-complete-filename)) 748 :doc "Keymap for minibuffer prompting of gud startup command."
749 "Keymap for minibuffer prompting of gud startup command." 749 :parent minibuffer-local-map
750 :inherit minibuffer-local-map) 750 "C-i" #'comint-dynamic-complete-filename)
751 751
752(defun gud-query-cmdline (minor-mode &optional init) 752(defun gud-query-cmdline (minor-mode &optional init)
753 (let* ((hist-sym (gud-symbol 'history nil minor-mode)) 753 (let* ((hist-sym (gud-symbol 'history nil minor-mode))
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index edd3139a7aa..5889f2ab670 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -3216,11 +3216,13 @@ detecting a prompt at the end of the buffer."
3216(defun python-shell-send-string-no-output (string &optional process) 3216(defun python-shell-send-string-no-output (string &optional process)
3217 "Send STRING to PROCESS and inhibit output. 3217 "Send STRING to PROCESS and inhibit output.
3218Return the output." 3218Return the output."
3219 (let ((process (or process (python-shell-get-process-or-error))) 3219 (or process (setq process (python-shell-get-process-or-error)))
3220 (comint-preoutput-filter-functions 3220 (cl-letf (((process-filter process)
3221 '(python-shell-output-filter)) 3221 (lambda (_proc str)
3222 (python-shell-output-filter-in-progress t) 3222 (with-current-buffer (process-buffer process)
3223 (inhibit-quit t)) 3223 (python-shell-output-filter str))))
3224 (python-shell-output-filter-in-progress t)
3225 (inhibit-quit t))
3224 (or 3226 (or
3225 (with-local-quit 3227 (with-local-quit
3226 (python-shell-send-string string process) 3228 (python-shell-send-string string process)
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 9ce63a8f8a1..066c051cfc3 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -738,11 +738,20 @@ quit the *xref* buffer."
738 "Perform interactive replacement of FROM with TO in all displayed xrefs. 738 "Perform interactive replacement of FROM with TO in all displayed xrefs.
739 739
740This command interactively replaces FROM with TO in the names of the 740This command interactively replaces FROM with TO in the names of the
741references displayed in the current *xref* buffer." 741references displayed in the current *xref* buffer.
742
743When called interactively, it uses '.*' as FROM, which means
744replace the whole name. Unless called with prefix argument, in
745which case the user is prompted for both FROM and TO."
742 (interactive 746 (interactive
743 (let ((fr (read-regexp "Xref query-replace (regexp)" ".*"))) 747 (let* ((fr
744 (list fr 748 (if current-prefix-arg
745 (read-regexp (format "Xref query-replace (regexp) %s with: " fr))))) 749 (read-regexp "Query-replace (regexp)" ".*")
750 ".*"))
751 (prompt (if current-prefix-arg
752 (format "Query-replace (regexp) %s with: " fr)
753 "Query-replace all matches with: ")))
754 (list fr (read-regexp prompt))))
746 (let* (item xrefs iter) 755 (let* (item xrefs iter)
747 (save-excursion 756 (save-excursion
748 (while (setq item (xref--search-property 'xref-item)) 757 (while (setq item (xref--search-property 'xref-item))
@@ -1469,6 +1478,22 @@ is nil, prompt only if there's no usable symbol at point."
1469 (interactive (list (xref--read-identifier "Find references of: "))) 1478 (interactive (list (xref--read-identifier "Find references of: ")))
1470 (xref--find-xrefs identifier 'references identifier nil)) 1479 (xref--find-xrefs identifier 'references identifier nil))
1471 1480
1481(defun xref-find-references-and-replace (from to)
1482 "Replace all references to identifier FROM with TO."
1483 (interactive
1484 (let ((common
1485 (query-replace-read-args "Query replace identifier" nil)))
1486 (list (nth 0 common) (nth 1 common))))
1487 (require 'xref)
1488 (with-current-buffer
1489 (let ((xref-show-xrefs-function
1490 ;; Some future-proofing (bug#44905).
1491 (custom--standard-value 'xref-show-xrefs-function))
1492 ;; Disable auto-jumping, it will mess up replacement logic.
1493 xref-auto-jump-to-first-xref)
1494 (xref-find-references from))
1495 (xref-query-replace-in-results ".*" to)))
1496
1472;;;###autoload 1497;;;###autoload
1473(defun xref-find-definitions-at-mouse (event) 1498(defun xref-find-definitions-at-mouse (event)
1474 "Find the definition of identifier at or around mouse click. 1499 "Find the definition of identifier at or around mouse click.
diff --git a/lisp/subr.el b/lisp/subr.el
index 7906324f80c..dd260dfe418 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1971,7 +1971,7 @@ one will be removed."
1971 (format "%s hook to remove: " 1971 (format "%s hook to remove: "
1972 (if local "Buffer-local" "Global")) 1972 (if local "Buffer-local" "Global"))
1973 fn-alist 1973 fn-alist
1974 nil t) 1974 nil t nil 'set-variable-value-history)
1975 fn-alist nil nil #'string=))) 1975 fn-alist nil nil #'string=)))
1976 (list hook function local))) 1976 (list hook function local)))
1977 (or (boundp hook) (set hook nil)) 1977 (or (boundp hook) (set hook nil))
@@ -6537,4 +6537,26 @@ string will be displayed only if BODY takes longer than TIMEOUT seconds.
6537 (lambda () 6537 (lambda ()
6538 ,@body))) 6538 ,@body)))
6539 6539
6540(defun function-alias-p (func &optional noerror)
6541 "Return nil if FUNC is not a function alias.
6542If FUNC is a function alias, return the function alias chain.
6543
6544If the function alias chain contains loops, an error will be
6545signalled. If NOERROR, the non-loop parts of the chain is returned."
6546 (declare (side-effect-free t))
6547 (let ((chain nil)
6548 (orig-func func))
6549 (nreverse
6550 (catch 'loop
6551 (while (and (symbolp func)
6552 (setq func (symbol-function func))
6553 (symbolp func))
6554 (when (or (memq func chain)
6555 (eq func orig-func))
6556 (if noerror
6557 (throw 'loop chain)
6558 (signal 'cyclic-function-indirection (list orig-func))))
6559 (push func chain))
6560 chain))))
6561
6540;;; subr.el ends here 6562;;; subr.el ends here
diff --git a/lisp/vc/pcvs-info.el b/lisp/vc/pcvs-info.el
index 11d14f95766..341fa243cfa 100644
--- a/lisp/vc/pcvs-info.el
+++ b/lisp/vc/pcvs-info.el
@@ -130,9 +130,11 @@ to confuse some users sometimes."
130(defvar cvs-bakprefix ".#" 130(defvar cvs-bakprefix ".#"
131 "The prefix that CVS prepends to files when rcsmerge'ing.") 131 "The prefix that CVS prepends to files when rcsmerge'ing.")
132 132
133(easy-mmode-defmap cvs-status-map 133(autoload 'cvs-mode-toggle-mark "pcvs")
134 '(([(mouse-2)] . cvs-mode-toggle-mark)) 134
135 "Local keymap for text properties of status.") 135(defvar-keymap cvs-status-map
136 :doc "Local keymap for text properties of status."
137 "<mouse-2>" #'cvs-mode-toggle-mark)
136 138
137;; Constructor: 139;; Constructor:
138 140
diff --git a/src/buffer.c b/src/buffer.c
index 10ac91915c6..a3091015d9b 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1247,7 +1247,7 @@ buffer_local_value (Lisp_Object variable, Lisp_Object buffer)
1247 { /* Look in local_var_alist. */ 1247 { /* Look in local_var_alist. */
1248 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym); 1248 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1249 XSETSYMBOL (variable, sym); /* Update In case of aliasing. */ 1249 XSETSYMBOL (variable, sym); /* Update In case of aliasing. */
1250 result = Fassoc (variable, BVAR (buf, local_var_alist), Qnil); 1250 result = assq_no_quit (variable, BVAR (buf, local_var_alist));
1251 if (!NILP (result)) 1251 if (!NILP (result))
1252 { 1252 {
1253 if (blv->fwd.fwdptr) 1253 if (blv->fwd.fwdptr)
diff --git a/src/data.c b/src/data.c
index e999cee242e..7422348e392 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2180,7 +2180,7 @@ Instead, use `add-hook' and specify t for the LOCAL argument. */)
2180 2180
2181 /* Make sure this buffer has its own value of symbol. */ 2181 /* Make sure this buffer has its own value of symbol. */
2182 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */ 2182 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */
2183 tem = Fassq (variable, BVAR (current_buffer, local_var_alist)); 2183 tem = assq_no_quit (variable, BVAR (current_buffer, local_var_alist));
2184 if (NILP (tem)) 2184 if (NILP (tem))
2185 { 2185 {
2186 if (let_shadows_buffer_binding_p (sym)) 2186 if (let_shadows_buffer_binding_p (sym))
@@ -2260,7 +2260,7 @@ From now on the default value will apply in this buffer. Return VARIABLE. */)
2260 2260
2261 /* Get rid of this buffer's alist element, if any. */ 2261 /* Get rid of this buffer's alist element, if any. */
2262 XSETSYMBOL (variable, sym); /* Propagate variable indirection. */ 2262 XSETSYMBOL (variable, sym); /* Propagate variable indirection. */
2263 tem = Fassq (variable, BVAR (current_buffer, local_var_alist)); 2263 tem = assq_no_quit (variable, BVAR (current_buffer, local_var_alist));
2264 if (!NILP (tem)) 2264 if (!NILP (tem))
2265 bset_local_var_alist 2265 bset_local_var_alist
2266 (current_buffer, 2266 (current_buffer,
@@ -2301,7 +2301,7 @@ Also see `buffer-local-boundp'.*/)
2301 case SYMBOL_PLAINVAL: return Qnil; 2301 case SYMBOL_PLAINVAL: return Qnil;
2302 case SYMBOL_LOCALIZED: 2302 case SYMBOL_LOCALIZED:
2303 { 2303 {
2304 Lisp_Object tail, elt, tmp; 2304 Lisp_Object tmp;
2305 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym); 2305 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
2306 XSETBUFFER (tmp, buf); 2306 XSETBUFFER (tmp, buf);
2307 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */ 2307 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */
@@ -2309,13 +2309,9 @@ Also see `buffer-local-boundp'.*/)
2309 if (EQ (blv->where, tmp)) /* The binding is already loaded. */ 2309 if (EQ (blv->where, tmp)) /* The binding is already loaded. */
2310 return blv_found (blv) ? Qt : Qnil; 2310 return blv_found (blv) ? Qt : Qnil;
2311 else 2311 else
2312 for (tail = BVAR (buf, local_var_alist); CONSP (tail); tail = XCDR (tail)) 2312 return NILP (assq_no_quit (variable, BVAR (buf, local_var_alist)))
2313 { 2313 ? Qnil
2314 elt = XCAR (tail); 2314 : Qt;
2315 if (EQ (variable, XCAR (elt)))
2316 return Qt;
2317 }
2318 return Qnil;
2319 } 2315 }
2320 case SYMBOL_FORWARDED: 2316 case SYMBOL_FORWARDED:
2321 { 2317 {
diff --git a/src/font.c b/src/font.c
index 266e5bc75c6..7e0219181c9 100644
--- a/src/font.c
+++ b/src/font.c
@@ -2183,7 +2183,9 @@ font_score (Lisp_Object entity, Lisp_Object *spec_prop)
2183 2183
2184 /* Score three style numeric fields. Maximum difference is 127. */ 2184 /* Score three style numeric fields. Maximum difference is 127. */
2185 for (i = FONT_WEIGHT_INDEX; i <= FONT_WIDTH_INDEX; i++) 2185 for (i = FONT_WEIGHT_INDEX; i <= FONT_WIDTH_INDEX; i++)
2186 if (! NILP (spec_prop[i]) && ! EQ (AREF (entity, i), spec_prop[i])) 2186 if (! NILP (spec_prop[i])
2187 && ! EQ (AREF (entity, i), spec_prop[i])
2188 && FIXNUMP (AREF (entity, i)))
2187 { 2189 {
2188 EMACS_INT diff = ((XFIXNUM (AREF (entity, i)) >> 8) 2190 EMACS_INT diff = ((XFIXNUM (AREF (entity, i)) >> 8)
2189 - (XFIXNUM (spec_prop[i]) >> 8)); 2191 - (XFIXNUM (spec_prop[i]) >> 8));
@@ -2764,26 +2766,31 @@ font_delete_unmatched (Lisp_Object vec, Lisp_Object spec, int size)
2764 { 2766 {
2765 if (FIXNUMP (AREF (spec, prop))) 2767 if (FIXNUMP (AREF (spec, prop)))
2766 { 2768 {
2767 int required = XFIXNUM (AREF (spec, prop)) >> 8; 2769 if (!FIXNUMP (AREF (entity, prop)))
2768 int candidate = XFIXNUM (AREF (entity, prop)) >> 8; 2770 prop = FONT_SPEC_MAX;
2771 else
2772 {
2773 int required = XFIXNUM (AREF (spec, prop)) >> 8;
2774 int candidate = XFIXNUM (AREF (entity, prop)) >> 8;
2769 2775
2770 if (candidate != required 2776 if (candidate != required
2771#ifdef HAVE_NTGUI 2777#ifdef HAVE_NTGUI
2772 /* A kludge for w32 font search, where listing a 2778 /* A kludge for w32 font search, where listing a
2773 family returns only 4 standard weights: regular, 2779 family returns only 4 standard weights: regular,
2774 italic, bold, bold-italic. For other values one 2780 italic, bold, bold-italic. For other values one
2775 must specify the font, not just the family in the 2781 must specify the font, not just the family in the
2776 :family attribute of the face. But specifying 2782 :family attribute of the face. But specifying
2777 :family in the face attributes looks for regular 2783 :family in the face attributes looks for regular
2778 weight, so if we require exact match, the 2784 weight, so if we require exact match, the
2779 non-regular font will be rejected. So we relax 2785 non-regular font will be rejected. So we relax
2780 the accuracy of the match here, and let 2786 the accuracy of the match here, and let
2781 font_sort_entities find the best match. */ 2787 font_sort_entities find the best match. */
2782 && (prop != FONT_WEIGHT_INDEX 2788 && (prop != FONT_WEIGHT_INDEX
2783 || eabs (candidate - required) > 100) 2789 || eabs (candidate - required) > 100)
2784#endif 2790#endif
2785 ) 2791 )
2786 prop = FONT_SPEC_MAX; 2792 prop = FONT_SPEC_MAX;
2793 }
2787 } 2794 }
2788 } 2795 }
2789 if (prop < FONT_SPEC_MAX 2796 if (prop < FONT_SPEC_MAX
diff --git a/src/frame.c b/src/frame.c
index c0f4f3ecde3..e5d74edc168 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -2382,9 +2382,12 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
2382} 2382}
2383 2383
2384DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "", 2384DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "",
2385 doc: /* Delete FRAME, permanently eliminating it from use. 2385 doc: /* Delete FRAME, eliminating it from use.
2386FRAME must be a live frame and defaults to the selected one. 2386FRAME must be a live frame and defaults to the selected one.
2387 2387
2388When `undelete-frame-mode' is enabled, the 16 most recently deleted
2389frames can be undeleted with `undelete-frame', which see.
2390
2388A frame may not be deleted if its minibuffer serves as surrogate 2391A frame may not be deleted if its minibuffer serves as surrogate
2389minibuffer for another frame. Normally, you may not delete a frame if 2392minibuffer for another frame. Normally, you may not delete a frame if
2390all other frames are invisible, but if the second optional argument 2393all other frames are invisible, but if the second optional argument
diff --git a/src/ftfont.c b/src/ftfont.c
index 2bdcce306bc..5797300d231 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -189,6 +189,24 @@ ftfont_pattern_entity (FcPattern *p, Lisp_Object extra)
189 return Qnil; 189 return Qnil;
190 if (FcPatternGetInteger (p, FC_INDEX, 0, &idx) != FcResultMatch) 190 if (FcPatternGetInteger (p, FC_INDEX, 0, &idx) != FcResultMatch)
191 return Qnil; 191 return Qnil;
192#ifdef FC_VARIABLE
193 /* This is a virtual/meta FcPattern for a variable weight font, from
194 which it is possible to extract an FcRange value specifying the
195 minimum and maximum weights available in this file. We don't
196 need to know that information explicitly, so skip it. We will be
197 called with an FcPattern for each actually available, non-virtual
198 weight.
199
200 Fontconfig started generating virtual/meta patterns for variable
201 weight fonts in the same release that FC_VARIABLE was added, so
202 we conditionalize on that constant. This also ensures that
203 FcPatternGetRange is available. */
204 FcRange *range;
205 if (FcPatternGetRange (p, FC_WEIGHT, 0, &range) == FcResultMatch
206 && FcPatternGetBool (p, FC_VARIABLE, 0, &b) == FcResultMatch
207 && b == FcTrue)
208 return Qnil;
209#endif /* FC_VARIABLE */
192 210
193 file = (char *) str; 211 file = (char *) str;
194 key = Fcons (build_unibyte_string (file), make_fixnum (idx)); 212 key = Fcons (build_unibyte_string (file), make_fixnum (idx));
@@ -863,6 +881,9 @@ ftfont_list (struct frame *f, Lisp_Object spec)
863#if defined HAVE_XFT && defined FC_COLOR 881#if defined HAVE_XFT && defined FC_COLOR
864 FC_COLOR, 882 FC_COLOR,
865#endif 883#endif
884#ifdef FC_VARIABLE
885 FC_VARIABLE,
886#endif /* FC_VARIABLE */
866 NULL); 887 NULL);
867 if (! objset) 888 if (! objset)
868 goto err; 889 goto err;
diff --git a/src/gtkutil.c b/src/gtkutil.c
index 1db166b1bad..36ed55bc039 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -6255,16 +6255,19 @@ xg_widget_key_press_event_cb (GtkWidget *widget, GdkEvent *event,
6255 kbd_buffer_store_buffered_event (&inev, &xg_pending_quit_event); 6255 kbd_buffer_store_buffered_event (&inev, &xg_pending_quit_event);
6256 } 6256 }
6257 6257
6258#ifdef USABLE_SIGIO 6258 XNoOp (FRAME_X_DISPLAY (f));
6259 raise (SIGIO);
6260#endif
6261 return true; 6259 return true;
6262} 6260}
6263 6261
6264bool 6262bool
6265xg_filter_key (struct frame *frame, XEvent *xkey) 6263xg_filter_key (struct frame *frame, XEvent *xkey)
6266{ 6264{
6267 GdkEvent *xg_event = gdk_event_new (GDK_KEY_PRESS); 6265 GdkEvent *xg_event = gdk_event_new ((xkey->type == ButtonPress
6266#ifdef HAVE_XINPUT2
6267 || (xkey->type == GenericEvent
6268 && xkey->xgeneric.evtype == XI_KeyPress)
6269#endif
6270 ) ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
6268 GdkDisplay *dpy = gtk_widget_get_display (FRAME_GTK_WIDGET (frame)); 6271 GdkDisplay *dpy = gtk_widget_get_display (FRAME_GTK_WIDGET (frame));
6269 GdkKeymap *keymap = gdk_keymap_get_for_display (dpy); 6272 GdkKeymap *keymap = gdk_keymap_get_for_display (dpy);
6270 GdkModifierType consumed; 6273 GdkModifierType consumed;
diff --git a/src/haiku_draw_support.cc b/src/haiku_draw_support.cc
index 5d355ac2058..270a619b89b 100644
--- a/src/haiku_draw_support.cc
+++ b/src/haiku_draw_support.cc
@@ -313,7 +313,7 @@ BView_DrawBitmapWithEraseOp (void *view, void *bitmap, int x,
313 BRect bounds = bc.Bounds (); 313 BRect bounds = bc.Bounds ();
314 for (int y = 0; y < BE_RECT_HEIGHT (bounds); ++y) 314 for (int y = 0; y < BE_RECT_HEIGHT (bounds); ++y)
315 { 315 {
316 for (int x = 0; x <= BE_RECT_WIDTH (bounds); ++x) 316 for (int x = 0; x < BE_RECT_WIDTH (bounds); ++x)
317 { 317 {
318 if (bits[y * (stride / 4) + x] == 0xFF000000) 318 if (bits[y * (stride / 4) + x] == 0xFF000000)
319 bits[y * (stride / 4) + x] = RGB_COLOR_UINT32 (low_color); 319 bits[y * (stride / 4) + x] = RGB_COLOR_UINT32 (low_color);
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 531dfb5c642..d49e319b98c 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -136,6 +136,15 @@ gui_abort (const char *msg)
136 emacs_abort (); 136 emacs_abort ();
137} 137}
138 138
139/* Convert a raw character RAW produced by the keycode KEY into a key
140 symbol and place it in KEYSYM.
141
142 If RAW cannot be converted into a keysym, value is 0. If RAW can
143 be converted into a keysym, but it should be ignored, value is -1.
144
145 Any other value means success, and that the keysym should be used
146 instead of mapping the keycode into a character. */
147
139static int 148static int
140keysym_from_raw_char (int32 raw, int32 key, unsigned *code) 149keysym_from_raw_char (int32 raw, int32 key, unsigned *code)
141{ 150{
@@ -186,6 +195,19 @@ keysym_from_raw_char (int32 raw, int32 key, unsigned *code)
186 195
187 case B_FUNCTION_KEY: 196 case B_FUNCTION_KEY:
188 *code = XK_F1 + key - 2; 197 *code = XK_F1 + key - 2;
198
199 if (*code - XK_F1 == 12)
200 *code = XK_Print;
201 else if (*code - XK_F1 == 13)
202 /* Okay, Scroll Lock is a bit too much: keyboard.c doesn't
203 know about it yet, and it shouldn't, since that's a
204 modifier key.
205
206 *code = XK_Scroll_Lock; */
207 return -1;
208 else if (*code - XK_F1 == 14)
209 *code = XK_Pause;
210
189 break; 211 break;
190 212
191 default: 213 default:
@@ -693,6 +715,7 @@ public:
693 rq.window = this; 715 rq.window = this;
694 716
695 int32 raw, key; 717 int32 raw, key;
718 int ret;
696 msg->FindInt32 ("raw_char", &raw); 719 msg->FindInt32 ("raw_char", &raw);
697 msg->FindInt32 ("key", &key); 720 msg->FindInt32 ("key", &key);
698 721
@@ -711,9 +734,14 @@ public:
711 if (mods & B_OPTION_KEY) 734 if (mods & B_OPTION_KEY)
712 rq.modifiers |= HAIKU_MODIFIER_SUPER; 735 rq.modifiers |= HAIKU_MODIFIER_SUPER;
713 736
714 if (!keysym_from_raw_char (raw, key, &rq.keysym)) 737 ret = keysym_from_raw_char (raw, key, &rq.keysym);
738
739 if (!ret)
715 rq.keysym = 0; 740 rq.keysym = 0;
716 741
742 if (ret < 0)
743 return;
744
717 rq.multibyte_char = 0; 745 rq.multibyte_char = 0;
718 746
719 if (!rq.keysym) 747 if (!rq.keysym)
diff --git a/src/haikuterm.c b/src/haikuterm.c
index be28649aef2..3e99cc1c8d9 100644
--- a/src/haikuterm.c
+++ b/src/haikuterm.c
@@ -2222,6 +2222,7 @@ haiku_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
2222 void *view = FRAME_HAIKU_VIEW (XFRAME (WINDOW_FRAME (w))); 2222 void *view = FRAME_HAIKU_VIEW (XFRAME (WINDOW_FRAME (w)));
2223 struct face *face = p->face; 2223 struct face *face = p->face;
2224 2224
2225 block_input ();
2225 BView_draw_lock (view); 2226 BView_draw_lock (view);
2226 BView_StartClip (view); 2227 BView_StartClip (view);
2227 2228
@@ -2256,6 +2257,7 @@ haiku_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
2256 } 2257 }
2257 BView_EndClip (view); 2258 BView_EndClip (view);
2258 BView_draw_unlock (view); 2259 BView_draw_unlock (view);
2260 unblock_input ();
2259} 2261}
2260 2262
2261static void 2263static void
@@ -3233,7 +3235,10 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
3233 struct frame *f = haiku_window_to_frame (b->window); 3235 struct frame *f = haiku_window_to_frame (b->window);
3234 3236
3235 if (!f) 3237 if (!f)
3236 continue; 3238 {
3239 free (b->ref);
3240 continue;
3241 }
3237 3242
3238 inev.kind = DRAG_N_DROP_EVENT; 3243 inev.kind = DRAG_N_DROP_EVENT;
3239 inev.arg = build_string_from_utf8 (b->ref); 3244 inev.arg = build_string_from_utf8 (b->ref);
diff --git a/src/window.c b/src/window.c
index 7155f0e6bc3..2a5e4042a48 100644
--- a/src/window.c
+++ b/src/window.c
@@ -5861,7 +5861,8 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, bool noerror)
5861 5861
5862 /* We moved the window start towards ZV, so PT may be now 5862 /* We moved the window start towards ZV, so PT may be now
5863 in the scroll margin at the top. */ 5863 in the scroll margin at the top. */
5864 move_it_to (&it, PT, -1, -1, -1, MOVE_TO_POS); 5864 if (IT_CHARPOS (it) < PT)
5865 move_it_to (&it, PT, -1, -1, -1, MOVE_TO_POS);
5865 if (IT_CHARPOS (it) == PT 5866 if (IT_CHARPOS (it) == PT
5866 && it.current_y >= this_scroll_margin 5867 && it.current_y >= this_scroll_margin
5867 && it.current_y <= last_y - WINDOW_TAB_LINE_HEIGHT (w) 5868 && it.current_y <= last_y - WINDOW_TAB_LINE_HEIGHT (w)
diff --git a/src/xdisp.c b/src/xdisp.c
index 2326df4300d..977d31703fb 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -18557,6 +18557,20 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp,
18557 || (NILP (g->object) 18557 || (NILP (g->object)
18558 && (g->charpos == PT 18558 && (g->charpos == PT
18559 || (g->charpos == 0 && endpos - 1 == PT))); 18559 || (g->charpos == 0 && endpos - 1 == PT)));
18560 /* Perhaps the point position is inside
18561 invisible text? In that case, we trust
18562 'set_cursor_from_row' to do its job and
18563 find the best position for the cursor. */
18564 if (!exact_match_p)
18565 {
18566 Lisp_Object val =
18567 get_char_property_and_overlay (make_fixnum (PT),
18568 Qinvisible,
18569 Qnil, NULL);
18570
18571 if (TEXT_PROP_MEANS_INVISIBLE (val) != 0)
18572 exact_match_p = true;
18573 }
18560 } 18574 }
18561 if (at_zv_p || exact_match_p) 18575 if (at_zv_p || exact_match_p)
18562 { 18576 {
diff --git a/src/xfns.c b/src/xfns.c
index 028ee29a4aa..ffad0bc3d1a 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -3347,6 +3347,8 @@ setup_xi_event_mask (struct frame *f)
3347 XISetMask (m, XI_Motion); 3347 XISetMask (m, XI_Motion);
3348 XISetMask (m, XI_Enter); 3348 XISetMask (m, XI_Enter);
3349 XISetMask (m, XI_Leave); 3349 XISetMask (m, XI_Leave);
3350 XISetMask (m, XI_FocusIn);
3351 XISetMask (m, XI_FocusOut);
3350 XISetMask (m, XI_KeyPress); 3352 XISetMask (m, XI_KeyPress);
3351 XISetMask (m, XI_KeyRelease); 3353 XISetMask (m, XI_KeyRelease);
3352 XISelectEvents (FRAME_X_DISPLAY (f), 3354 XISelectEvents (FRAME_X_DISPLAY (f),
@@ -3359,6 +3361,8 @@ setup_xi_event_mask (struct frame *f)
3359#ifdef USE_X_TOOLKIT 3361#ifdef USE_X_TOOLKIT
3360 XISetMask (m, XI_KeyPress); 3362 XISetMask (m, XI_KeyPress);
3361 XISetMask (m, XI_KeyRelease); 3363 XISetMask (m, XI_KeyRelease);
3364 XISetMask (m, XI_FocusIn);
3365 XISetMask (m, XI_FocusOut);
3362 3366
3363 XISelectEvents (FRAME_X_DISPLAY (f), 3367 XISelectEvents (FRAME_X_DISPLAY (f),
3364 FRAME_OUTER_WINDOW (f), 3368 FRAME_OUTER_WINDOW (f),
diff --git a/src/xterm.c b/src/xterm.c
index 52715892703..ec415f5ffaf 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -20,6 +20,72 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
20/* New display code by Gerd Moellmann <gerd@gnu.org>. */ 20/* New display code by Gerd Moellmann <gerd@gnu.org>. */
21/* Xt features made by Fred Pierresteguy. */ 21/* Xt features made by Fred Pierresteguy. */
22 22
23/* X window system support for GNU Emacs
24
25 This file is part of the X window system support for GNU Emacs. It
26 contains subroutines comprising the redisplay interface, setting up
27 scroll bars and widgets, and handling input.
28
29 INPUT
30
31 Emacs handles input by running pselect in a loop, which returns
32 whenever there is input available on the connection to the X
33 server. On some systems, Emacs also arranges for any new input on
34 that connection to send an asynchronous signal. Whenever pselect
35 returns, or such a signal is received and input is not blocked,
36 XTread_socket is called and translates X11 events read by Xlib into
37 struct input_events, which are then stored in the keyboard buffer,
38 to be processed and acted upon at some later time. The function
39 handle_one_xevent is responsible for handling core events after
40 they are filtered, and filtering X Input Extension events. It also
41 performs actions on some special events, such as updating the
42 dimensions of a frame after a ConfigureNotify is sent by the X
43 server to inform us that it changed.
44
45 Before such events are translated, an Emacs build with
46 internationalization enabled (the default since X11R6) will filter
47 events through an X Input Method (XIM) or GTK, which might decide
48 to intercept the event and send a different one in its place, for
49 reasons such as enabling the user to insert international
50 characters that aren't on his keyboard by typing a sequence of
51 characters which are. See the function x_filter_event and its
52 callers for more details.
53
54 Events that cause Emacs to quit are treated specially by the code
55 that stores them in the keyboard buffer and generally cause an
56 immediate interrupt. Such an interrupt can lead to a longjmp from
57 the code that stored the keyboard event, which isn't safe inside
58 XTread_socket. To avoid this problem, XTread_socket is provided a
59 special event buffer named hold_quit. When a quit event is
60 encountered, it is stored inside this special buffer, which will
61 cause the keyboard code that called XTread_socket to store it at a
62 later time when it is safe to do so.
63
64 handle_one_xevent will generally have to determine which frame an
65 event should be attributed to. This is not easy, because events
66 can come from multiple X windows, and a frame can also have
67 multiple windows. handle_one_xevent usually calls the function
68 x_any_window_to_frame, which searches for a frame by toplevel
69 window and widget windows. There are also some other functions for
70 searching by specific types of window, such as
71 x_top_window_to_frame (which only searches for frames by toplevel
72 window), and x_menubar_window_to_frame (which will only search
73 through frame menu bars).
74
75 INPUT FOCUS
76
77 Under X, the window where keyboard input is sent is not always
78 explictly defined. When there is a focus window, it receives what
79 is referred to as "explicit focus", but when there is none, it
80 receives "implicit focus" whenever the pointer enters it, and loses
81 that focus when the pointer leaves. When the toplevel window of a
82 frame receives an explicit focus event (FocusIn or FocusOut), we
83 treat that frame as having the current input focus, but when there
84 is no focus window, we treat each frame as having the input focus
85 whenever the pointer enters it, and undo that treatment when the
86 pointer leaves it. See the callers of x_detect_focus_change for
87 more details. */
88
23#include <config.h> 89#include <config.h>
24#include <stdlib.h> 90#include <stdlib.h>
25#include <math.h> 91#include <math.h>
@@ -4126,7 +4192,9 @@ x_draw_glyph_string (struct glyph_string *s)
4126 area_max_x = area_x + area_width - 1; 4192 area_max_x = area_x + area_width - 1;
4127 4193
4128 decoration_width = s->width; 4194 decoration_width = s->width;
4129 if (area_max_x < (s->x + decoration_width - 1)) 4195 if (!s->row->mode_line_p
4196 && !s->row->tab_line_p
4197 && area_max_x < (s->x + decoration_width - 1))
4130 decoration_width -= (s->x + decoration_width - 1) - area_max_x; 4198 decoration_width -= (s->x + decoration_width - 1) - area_max_x;
4131 4199
4132 /* Draw relief if not yet drawn. */ 4200 /* Draw relief if not yet drawn. */
@@ -5252,21 +5320,18 @@ x_detect_focus_change (struct x_display_info *dpyinfo, struct frame *frame,
5252 int focus_state 5320 int focus_state
5253 = focus_frame ? focus_frame->output_data.x->focus_state : 0; 5321 = focus_frame ? focus_frame->output_data.x->focus_state : 0;
5254 5322
5255#ifdef USE_GTK
5256 if (xi_event->evtype == XI_FocusIn 5323 if (xi_event->evtype == XI_FocusIn
5257 || xi_event->evtype == XI_FocusOut) 5324 || xi_event->evtype == XI_FocusOut)
5258 x_focus_changed ((xi_event->evtype == XI_FocusIn 5325 x_focus_changed ((xi_event->evtype == XI_FocusIn
5259 ? FocusIn : FocusOut), 5326 ? FocusIn : FocusOut),
5260 FOCUS_EXPLICIT, 5327 FOCUS_EXPLICIT,
5261 dpyinfo, frame, bufp); 5328 dpyinfo, frame, bufp);
5262 else 5329 else if ((xi_event->evtype == XI_Enter
5263#endif 5330 || xi_event->evtype == XI_Leave)
5264 if ((xi_event->evtype == XI_Enter 5331 && (((XIEnterEvent *) xi_event)->detail
5265 || xi_event->evtype == XI_Leave) 5332 != XINotifyInferior)
5266 && (((XIEnterEvent *) xi_event)->detail 5333 && ((XIEnterEvent *) xi_event)->focus
5267 != XINotifyInferior) 5334 && !(focus_state & FOCUS_EXPLICIT))
5268 && ((XIEnterEvent *) xi_event)->focus
5269 && !(focus_state & FOCUS_EXPLICIT))
5270 x_focus_changed ((xi_event->evtype == XI_Enter 5335 x_focus_changed ((xi_event->evtype == XI_Enter
5271 ? FocusIn : FocusOut), 5336 ? FocusIn : FocusOut),
5272 FOCUS_IMPLICIT, 5337 FOCUS_IMPLICIT,
@@ -5386,8 +5451,6 @@ x_find_modifier_meanings (struct x_display_info *dpyinfo)
5386 dpyinfo->super_mod_mask = 0; 5451 dpyinfo->super_mod_mask = 0;
5387 dpyinfo->hyper_mod_mask = 0; 5452 dpyinfo->hyper_mod_mask = 0;
5388 5453
5389 XDisplayKeycodes (dpyinfo->display, &min_code, &max_code);
5390
5391#ifdef HAVE_XKB 5454#ifdef HAVE_XKB
5392 if (dpyinfo->xkb_desc) 5455 if (dpyinfo->xkb_desc)
5393 { 5456 {
@@ -5432,6 +5495,8 @@ x_find_modifier_meanings (struct x_display_info *dpyinfo)
5432 } 5495 }
5433#endif 5496#endif
5434 5497
5498 XDisplayKeycodes (dpyinfo->display, &min_code, &max_code);
5499
5435 syms = XGetKeyboardMapping (dpyinfo->display, 5500 syms = XGetKeyboardMapping (dpyinfo->display,
5436 min_code, max_code - min_code + 1, 5501 min_code, max_code - min_code + 1,
5437 &syms_per_code); 5502 &syms_per_code);
@@ -5924,7 +5989,7 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
5924 if (!f1 && insist > 0) 5989 if (!f1 && insist > 0)
5925 f1 = SELECTED_FRAME (); 5990 f1 = SELECTED_FRAME ();
5926 5991
5927 if (f1) 5992 if (f1 && FRAME_X_P (f1))
5928 { 5993 {
5929 /* Ok, we found a frame. Store all the values. 5994 /* Ok, we found a frame. Store all the values.
5930 last_mouse_glyph is a rectangle used to reduce the 5995 last_mouse_glyph is a rectangle used to reduce the
@@ -5934,7 +5999,6 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
5934 on it, i.e. into the same rectangles that matrices on 5999 on it, i.e. into the same rectangles that matrices on
5935 the frame are divided into. */ 6000 the frame are divided into. */
5936 6001
5937 /* FIXME: what if F1 is not an X frame? */
5938 dpyinfo = FRAME_DISPLAY_INFO (f1); 6002 dpyinfo = FRAME_DISPLAY_INFO (f1);
5939 remember_mouse_glyph (f1, win_x, win_y, &dpyinfo->last_mouse_glyph); 6003 remember_mouse_glyph (f1, win_x, win_y, &dpyinfo->last_mouse_glyph);
5940 dpyinfo->last_mouse_glyph_frame = f1; 6004 dpyinfo->last_mouse_glyph_frame = f1;
@@ -8285,8 +8349,10 @@ x_filter_event (struct x_display_info *dpyinfo, XEvent *event)
8285 && event->type == GenericEvent 8349 && event->type == GenericEvent
8286 && (event->xgeneric.extension 8350 && (event->xgeneric.extension
8287 == dpyinfo->xi2_opcode) 8351 == dpyinfo->xi2_opcode)
8288 && (event->xgeneric.evtype 8352 && ((event->xgeneric.evtype
8289 == XI_KeyPress)) 8353 == XI_KeyPress)
8354 || (event->xgeneric.evtype
8355 == XI_KeyRelease)))
8290 { 8356 {
8291 f1 = x_any_window_to_frame (dpyinfo, 8357 f1 = x_any_window_to_frame (dpyinfo,
8292 ((XIDeviceEvent *) 8358 ((XIDeviceEvent *)
@@ -9458,7 +9524,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
9458 9524
9459 case EnterNotify: 9525 case EnterNotify:
9460 x_display_set_last_user_time (dpyinfo, event->xcrossing.time); 9526 x_display_set_last_user_time (dpyinfo, event->xcrossing.time);
9461 x_detect_focus_change (dpyinfo, any, event, &inev.ie); 9527
9528 if (x_top_window_to_frame (dpyinfo, event->xcrossing.window))
9529 x_detect_focus_change (dpyinfo, any, event, &inev.ie);
9462 9530
9463#ifdef HAVE_XWIDGETS 9531#ifdef HAVE_XWIDGETS
9464 { 9532 {
@@ -9540,7 +9608,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
9540 } 9608 }
9541#endif 9609#endif
9542 x_display_set_last_user_time (dpyinfo, event->xcrossing.time); 9610 x_display_set_last_user_time (dpyinfo, event->xcrossing.time);
9543 x_detect_focus_change (dpyinfo, any, event, &inev.ie); 9611
9612 if (x_top_window_to_frame (dpyinfo, event->xcrossing.window))
9613 x_detect_focus_change (dpyinfo, any, event, &inev.ie);
9544 9614
9545 f = x_top_window_to_frame (dpyinfo, event->xcrossing.window); 9615 f = x_top_window_to_frame (dpyinfo, event->xcrossing.window);
9546#if defined HAVE_X_TOOLKIT && defined HAVE_XINPUT2 9616#if defined HAVE_X_TOOLKIT && defined HAVE_XINPUT2
@@ -10151,13 +10221,23 @@ handle_one_xevent (struct x_display_info *dpyinfo,
10151 x_detect_focus_change (dpyinfo, any, event, &inev.ie); 10221 x_detect_focus_change (dpyinfo, any, event, &inev.ie);
10152 goto XI_OTHER; 10222 goto XI_OTHER;
10153 case XI_Enter: 10223 case XI_Enter:
10154 any = x_any_window_to_frame (dpyinfo, enter->event); 10224
10225 any = x_top_window_to_frame (dpyinfo, enter->event);
10155 ev.x = lrint (enter->event_x); 10226 ev.x = lrint (enter->event_x);
10156 ev.y = lrint (enter->event_y); 10227 ev.y = lrint (enter->event_y);
10157 ev.window = leave->event; 10228 ev.window = enter->event;
10158
10159 x_display_set_last_user_time (dpyinfo, xi_event->time); 10229 x_display_set_last_user_time (dpyinfo, xi_event->time);
10160 x_detect_focus_change (dpyinfo, any, event, &inev.ie); 10230
10231 /* There is no need to handle entry/exit events for
10232 passive focus from non-top windows at all, since they
10233 are an inferiors of the frame's top window, which will
10234 get virtual events. */
10235 if (any)
10236 x_detect_focus_change (dpyinfo, any, event, &inev.ie);
10237
10238 if (!any)
10239 any = x_any_window_to_frame (dpyinfo, enter->event);
10240
10161 { 10241 {
10162#ifdef HAVE_XWIDGETS 10242#ifdef HAVE_XWIDGETS
10163 struct xwidget_view *xwidget_view = xwidget_view_from_window (enter->event); 10243 struct xwidget_view *xwidget_view = xwidget_view_from_window (enter->event);
@@ -10221,11 +10301,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
10221 x_note_mouse_movement (dpyinfo->last_mouse_glyph_frame, &ev); 10301 x_note_mouse_movement (dpyinfo->last_mouse_glyph_frame, &ev);
10222#endif 10302#endif
10223 goto XI_OTHER; 10303 goto XI_OTHER;
10304
10224 case XI_Leave: 10305 case XI_Leave:
10225 ev.x = lrint (leave->event_x); 10306 ev.x = lrint (leave->event_x);
10226 ev.y = lrint (leave->event_y); 10307 ev.y = lrint (leave->event_y);
10227 ev.window = leave->event; 10308 ev.window = leave->event;
10228 any = x_any_window_to_frame (dpyinfo, leave->event); 10309 any = x_top_window_to_frame (dpyinfo, leave->event);
10229 10310
10230#ifdef HAVE_XWIDGETS 10311#ifdef HAVE_XWIDGETS
10231 { 10312 {
@@ -10243,7 +10324,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
10243#endif 10324#endif
10244 10325
10245 x_display_set_last_user_time (dpyinfo, xi_event->time); 10326 x_display_set_last_user_time (dpyinfo, xi_event->time);
10246 x_detect_focus_change (dpyinfo, any, event, &inev.ie); 10327
10328 if (any)
10329 x_detect_focus_change (dpyinfo, any, event, &inev.ie);
10330
10331 if (!any)
10332 any = x_any_window_to_frame (dpyinfo, leave->event);
10247 10333
10248#ifndef USE_X_TOOLKIT 10334#ifndef USE_X_TOOLKIT
10249 f = x_top_window_to_frame (dpyinfo, leave->event); 10335 f = x_top_window_to_frame (dpyinfo, leave->event);
@@ -11167,6 +11253,13 @@ handle_one_xevent (struct x_display_info *dpyinfo,
11167 case XI_PropertyEvent: 11253 case XI_PropertyEvent:
11168 case XI_HierarchyChanged: 11254 case XI_HierarchyChanged:
11169 case XI_DeviceChanged: 11255 case XI_DeviceChanged:
11256
11257#ifdef XISlaveSwitch
11258 if (xi_event->evtype == XI_DeviceChanged
11259 && (((XIDeviceChangedEvent *) xi_event)->reason
11260 == XISlaveSwitch))
11261 goto XI_OTHER;
11262#endif
11170 x_init_master_valuators (dpyinfo); 11263 x_init_master_valuators (dpyinfo);
11171 goto XI_OTHER; 11264 goto XI_OTHER;
11172#ifdef XI_TouchBegin 11265#ifdef XI_TouchBegin
@@ -11433,6 +11526,22 @@ handle_one_xevent (struct x_display_info *dpyinfo,
11433 11526
11434 x_find_modifier_meanings (dpyinfo); 11527 x_find_modifier_meanings (dpyinfo);
11435 } 11528 }
11529 else
11530 {
11531 dpyinfo->xkb_desc = XkbGetMap (dpyinfo->display,
11532 (XkbKeySymsMask
11533 | XkbKeyTypesMask
11534 | XkbModifierMapMask
11535 | XkbVirtualModsMask),
11536 XkbUseCoreKbd);
11537
11538 if (dpyinfo->xkb_desc)
11539 XkbGetNames (dpyinfo->display,
11540 XkbGroupNamesMask | XkbVirtualModNamesMask,
11541 dpyinfo->xkb_desc);
11542 }
11543
11544 XkbRefreshKeyboardMapping (&xkbevent->map);
11436 } 11545 }
11437 } 11546 }
11438#endif 11547#endif
diff --git a/src/xwidget.c b/src/xwidget.c
index 7d6d256a191..45879b15cbe 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -1447,8 +1447,8 @@ xwidget_motion_or_crossing (struct xwidget_view *view, const XEvent *event)
1447#ifdef HAVE_XINPUT2 1447#ifdef HAVE_XINPUT2
1448 else if (event->type == GenericEvent) 1448 else if (event->type == GenericEvent)
1449 { 1449 {
1450 xg_event->crossing.x = (gdouble) xev->event_x; 1450 xg_event->crossing.x = x;
1451 xg_event->crossing.y = (gdouble) xev->event_y; 1451 xg_event->crossing.y = y;
1452 xg_event->crossing.x_root = (gdouble) xev->root_x; 1452 xg_event->crossing.x_root = (gdouble) xev->root_x;
1453 xg_event->crossing.y_root = (gdouble) xev->root_y; 1453 xg_event->crossing.y_root = (gdouble) xev->root_y;
1454 xg_event->crossing.time = xev->time; 1454 xg_event->crossing.time = xev->time;
diff --git a/test/Makefile.in b/test/Makefile.in
index d6ab7b244d2..9ad994e1101 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -75,7 +75,7 @@ EMACS_EXTRAOPT =
75EMACSOPT = --no-init-file --no-site-file --no-site-lisp -L "$(SEPCHAR)$(srcdir)" $(elpa_opts) $(EMACS_EXTRAOPT) 75EMACSOPT = --no-init-file --no-site-file --no-site-lisp -L "$(SEPCHAR)$(srcdir)" $(elpa_opts) $(EMACS_EXTRAOPT)
76 76
77# Prevent any settings in the user environment causing problems. 77# Prevent any settings in the user environment causing problems.
78unexport EMACSDATA EMACSDOC EMACSPATH GREP_OPTIONS XDG_CONFIG_HOME 78unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH GREP_OPTIONS XDG_CONFIG_HOME
79 79
80# To run tests under a debugger, set this to eg: "gdb --args". 80# To run tests under a debugger, set this to eg: "gdb --args".
81GDB = 81GDB =
@@ -118,10 +118,8 @@ MODULES_EMACSOPT :=
118endif 118endif
119 119
120# The actual Emacs command run in the targets below. 120# The actual Emacs command run in the targets below.
121# Prevent any setting of EMACSLOADPATH in user environment causing problems, 121# Prevent locales influencing the text of the errors we expect to receive.
122# and prevent locals to influence the text of the errors we expect to receive. 122emacs = LANG=C EMACS_TEST_DIRECTORY=$(abspath $(srcdir)) \
123emacs = LANG=C EMACSLOADPATH= \
124 EMACS_TEST_DIRECTORY=$(abspath $(srcdir)) \
125 $(GDB) $(TEST_TIMEOUT) "$(EMACS)" $(MODULES_EMACSOPT) $(EMACSOPT) 123 $(GDB) $(TEST_TIMEOUT) "$(EMACS)" $(MODULES_EMACSOPT) $(EMACSOPT)
126 124
127# Set HOME to a nonexistent directory to prevent tests from accessing 125# Set HOME to a nonexistent directory to prevent tests from accessing
diff --git a/test/lisp/emacs-lisp/edebug-tests.el b/test/lisp/emacs-lisp/edebug-tests.el
index d238bffdaa1..35259a796a0 100644
--- a/test/lisp/emacs-lisp/edebug-tests.el
+++ b/test/lisp/emacs-lisp/edebug-tests.el
@@ -1094,5 +1094,15 @@ This avoids potential duplicate definitions (Bug#41988)."
1094 (edebug-new-definition name)))) 1094 (edebug-new-definition name))))
1095 (should-error (eval-buffer) :type 'invalid-read-syntax)))) 1095 (should-error (eval-buffer) :type 'invalid-read-syntax))))
1096 1096
1097(ert-deftest edebug-tests-inline ()
1098 "Check that Edebug can instrument inline functions (Bug#53068)."
1099 (with-temp-buffer
1100 (print '(define-inline edebug-tests-inline (arg)
1101 (inline-quote ,arg))
1102 (current-buffer))
1103 (let ((edebug-all-defs t)
1104 (edebug-initial-mode 'Go-nonstop))
1105 (eval-buffer))))
1106
1097(provide 'edebug-tests) 1107(provide 'edebug-tests)
1098;;; edebug-tests.el ends here 1108;;; edebug-tests.el ends here
diff --git a/test/lisp/emacs-lisp/ert-tests.el b/test/lisp/emacs-lisp/ert-tests.el
index ac130644743..270cca1c2e7 100644
--- a/test/lisp/emacs-lisp/ert-tests.el
+++ b/test/lisp/emacs-lisp/ert-tests.el
@@ -881,6 +881,9 @@ This macro is used to test if macroexpansion in `should' works."
881 "Check that `lexical-binding' in `ert-deftest' has the file value." 881 "Check that `lexical-binding' in `ert-deftest' has the file value."
882 (should (equal lexical-binding t))) 882 (should (equal lexical-binding t)))
883 883
884(ert-deftest ert-test-get-explainer ()
885 (should (eq (ert--get-explainer 'string-equal) 'ert--explain-string-equal))
886 (should (eq (ert--get-explainer 'string=) 'ert--explain-string-equal)))
884 887
885(provide 'ert-tests) 888(provide 'ert-tests)
886 889
diff --git a/test/lisp/eshell/esh-opt-tests.el b/test/lisp/eshell/esh-opt-tests.el
index 532adfb733a..255768635b1 100644
--- a/test/lisp/eshell/esh-opt-tests.el
+++ b/test/lisp/eshell/esh-opt-tests.el
@@ -57,7 +57,7 @@
57 '((?u "user" t user "execute a command as another USER") 57 '((?u "user" t user "execute a command as another USER")
58 :parse-leading-options-only)))) 58 :parse-leading-options-only))))
59 (should 59 (should
60 (equal '("world" "emerge") 60 (equal '("DN" "emerge" "world")
61 (eshell--process-args 61 (eshell--process-args
62 "sudo" 62 "sudo"
63 '("-u" "root" "emerge" "-uDN" "world") 63 '("-u" "root" "emerge" "-uDN" "world")
@@ -65,59 +65,132 @@
65 65
66(ert-deftest test-eshell-eval-using-options () 66(ert-deftest test-eshell-eval-using-options ()
67 "Tests for `eshell-eval-using-options'." 67 "Tests for `eshell-eval-using-options'."
68 ;; Test short options.
68 (eshell-eval-using-options 69 (eshell-eval-using-options
69 "sudo" '("-u" "root" "whoami") 70 "ls" '("-a" "/some/path")
70 '((?u "user" t user "execute a command as another USER") 71 '((?a "all" nil show-all
71 :parse-leading-options-only) 72 "do not ignore entries starting with ."))
72 (should (equal user "root"))) 73 (should (eq show-all t))
74 (should (equal args '("/some/path"))))
73 (eshell-eval-using-options 75 (eshell-eval-using-options
74 "sudo" '("--user" "root" "whoami") 76 "ls" '("/some/path")
75 '((?u "user" t user "execute a command as another USER") 77 '((?a "all" nil show-all
76 :parse-leading-options-only) 78 "do not ignore entries starting with ."))
77 (should (equal user "root"))) 79 (should (eq show-all nil))
80 (should (equal args '("/some/path"))))
78 81
82 ;; Test long options.
79 (eshell-eval-using-options 83 (eshell-eval-using-options
80 "sudo" '("emerge" "-uDN" "world") 84 "ls" '("--all" "/some/path")
81 '((?u "user" t user "execute a command as another USER")) 85 '((?a "all" nil show-all
82 (should (equal user "world"))) 86 "do not ignore entries starting with ."))
87 (should (eq show-all t))
88 (should (equal args '("/some/path"))))
89
90 ;; Test options with constant values.
83 (eshell-eval-using-options 91 (eshell-eval-using-options
84 "sudo" '("emerge" "-uDN" "world") 92 "ls" '("/some/path" "-h")
85 '((?u "user" t user "execute a command as another USER") 93 '((?h "human-readable" 1024 human-readable
86 :parse-leading-options-only) 94 "print sizes in human readable format"))
87 (should (eq user nil))) 95 (should (eql human-readable 1024))
96 (should (equal args '("/some/path"))))
97 (eshell-eval-using-options
98 "ls" '("/some/path" "--human-readable")
99 '((?h "human-readable" 1024 human-readable
100 "print sizes in human readable format"))
101 (should (eql human-readable 1024))
102 (should (equal args '("/some/path"))))
103 (eshell-eval-using-options
104 "ls" '("/some/path")
105 '((?h "human-readable" 1024 human-readable
106 "print sizes in human readable format"))
107 (should (eq human-readable nil))
108 (should (equal args '("/some/path"))))
88 109
110 ;; Test options with user-specified values.
111 (eshell-eval-using-options
112 "ls" '("-I" "*.txt" "/some/path")
113 '((?I "ignore" t ignore-pattern
114 "do not list implied entries matching pattern"))
115 (should (equal ignore-pattern "*.txt"))
116 (should (equal args '("/some/path"))))
117 (eshell-eval-using-options
118 "ls" '("-I*.txt" "/some/path")
119 '((?I "ignore" t ignore-pattern
120 "do not list implied entries matching pattern"))
121 (should (equal ignore-pattern "*.txt"))
122 (should (equal args '("/some/path"))))
89 (eshell-eval-using-options 123 (eshell-eval-using-options
90 "ls" '("-I" "*.txt" "/dev/null") 124 "ls" '("--ignore" "*.txt" "/some/path")
91 '((?I "ignore" t ignore-pattern 125 '((?I "ignore" t ignore-pattern
92 "do not list implied entries matching pattern")) 126 "do not list implied entries matching pattern"))
93 (should (equal ignore-pattern "*.txt"))) 127 (should (equal ignore-pattern "*.txt"))
128 (should (equal args '("/some/path"))))
129 (eshell-eval-using-options
130 "ls" '("--ignore=*.txt" "/some/path")
131 '((?I "ignore" t ignore-pattern
132 "do not list implied entries matching pattern"))
133 (should (equal ignore-pattern "*.txt"))
134 (should (equal args '("/some/path"))))
94 135
136 ;; Test multiple short options in a single token.
95 (eshell-eval-using-options 137 (eshell-eval-using-options
96 "ls" '("-l" "/dev/null") 138 "ls" '("-al" "/some/path")
97 '((?l nil long-listing listing-style 139 '((?a "all" nil show-all
98 "use a long listing format")) 140 "do not ignore entries starting with .")
99 (should (eql listing-style 'long-listing))) 141 (?l nil long-listing listing-style
142 "use a long listing format"))
143 (should (eq t show-all))
144 (should (eql listing-style 'long-listing))
145 (should (equal args '("/some/path"))))
100 (eshell-eval-using-options 146 (eshell-eval-using-options
101 "ls" '("/dev/null") 147 "ls" '("-aI*.txt" "/some/path")
102 '((?l nil long-listing listing-style 148 '((?a "all" nil show-all
103 "use a long listing format")) 149 "do not ignore entries starting with .")
104 (should (eq listing-style nil))) 150 (?I "ignore" t ignore-pattern
151 "do not list implied entries matching pattern"))
152 (should (eq t show-all))
153 (should (equal ignore-pattern "*.txt"))
154 (should (equal args '("/some/path"))))
105 155
156 ;; Test that "--" terminates options.
106 (eshell-eval-using-options 157 (eshell-eval-using-options
107 "ls" '("/dev/null" "-h") 158 "ls" '("--" "-a")
108 '((?h "human-readable" 1024 human-readable 159 '((?a "all" nil show-all
109 "print sizes in human readable format")) 160 "do not ignore entries starting with ."))
110 (should (eql human-readable 1024))) 161 (should (eq show-all nil))
162 (should (equal args '("-a"))))
111 (eshell-eval-using-options 163 (eshell-eval-using-options
112 "ls" '("/dev/null" "--human-readable") 164 "ls" '("--" "--all")
113 '((?h "human-readable" 1024 human-readable 165 '((?a "all" nil show-all
114 "print sizes in human readable format")) 166 "do not ignore entries starting with ."))
115 (should (eql human-readable 1024))) 167 (should (eq show-all nil))
168 (should (equal args '("--all"))))
169
170 ;; Test :parse-leading-options-only.
116 (eshell-eval-using-options 171 (eshell-eval-using-options
117 "ls" '("/dev/null") 172 "sudo" '("-u" "root" "whoami")
118 '((?h "human-readable" 1024 human-readable 173 '((?u "user" t user "execute a command as another USER")
119 "print sizes in human readable format")) 174 :parse-leading-options-only)
120 (should (eq human-readable nil)))) 175 (should (equal user "root"))
176 (should (equal args '("whoami"))))
177 (eshell-eval-using-options
178 "sudo" '("--user" "root" "whoami")
179 '((?u "user" t user "execute a command as another USER")
180 :parse-leading-options-only)
181 (should (equal user "root"))
182 (should (equal args '("whoami"))))
183 (eshell-eval-using-options
184 "sudo" '("emerge" "-uDN" "world")
185 '((?u "user" t user "execute a command as another USER"))
186 (should (equal user "DN"))
187 (should (equal args '("emerge" "world"))))
188 (eshell-eval-using-options
189 "sudo" '("emerge" "-uDN" "world")
190 '((?u "user" t user "execute a command as another USER")
191 :parse-leading-options-only)
192 (should (eq user nil))
193 (should (equal args '("emerge" "-uDN" "world")))))
121 194
122(provide 'esh-opt-tests) 195(provide 'esh-opt-tests)
123 196
diff --git a/test/lisp/ffap-tests.el b/test/lisp/ffap-tests.el
index aebc9b6dbb9..0fdc31e8b61 100644
--- a/test/lisp/ffap-tests.el
+++ b/test/lisp/ffap-tests.el
@@ -141,6 +141,23 @@ left alone when opening a URL in an external browser."
141 (let (kill-buffer-query-functions) 141 (let (kill-buffer-query-functions)
142 (kill-buffer (call-interactively #'find-file-at-point))))))) 142 (kill-buffer (call-interactively #'find-file-at-point)))))))
143 143
144(ert-deftest ffap-test-path ()
145 (skip-unless (file-exists-p "/bin"))
146 (skip-unless (file-exists-p "/usr/bin"))
147 (with-temp-buffer
148 (insert "/usr/bin:/bin")
149 (goto-char (point-min))
150 (should (equal (ffap-file-at-point) "/usr/bin")))
151 (with-temp-buffer
152 (insert "/usr/bin:/bin")
153 (goto-char (point-min))
154 (search-forward ":")
155 (should (equal (ffap-file-at-point) "/bin")))
156 (with-temp-buffer
157 (insert ":/bin")
158 (goto-char (point-min))
159 (should (equal (ffap-file-at-point) nil))))
160
144(provide 'ffap-tests) 161(provide 'ffap-tests)
145 162
146;;; ffap-tests.el ends here 163;;; ffap-tests.el ends here
diff --git a/test/lisp/help-fns-tests.el b/test/lisp/help-fns-tests.el
index 6ee7b4f3eb1..4df8e3c9ef6 100644
--- a/test/lisp/help-fns-tests.el
+++ b/test/lisp/help-fns-tests.el
@@ -177,4 +177,13 @@ Return first line of the output of (describe-function-1 FUNC)."
177 (should-not (find-lisp-object-file-name help-fns--test-var 'defface)) 177 (should-not (find-lisp-object-file-name help-fns--test-var 'defface))
178 (should-not (find-lisp-object-file-name help-fns--test-var 1)))) 178 (should-not (find-lisp-object-file-name help-fns--test-var 1))))
179 179
180(ert-deftest help-fns--analyze-function-recursive ()
181 (defalias 'help-fns--a 'help-fns--b)
182 (should (equal (help-fns--analyze-function 'help-fns--a)
183 '(help-fns--a help-fns--b t help-fns--b)))
184 ;; Make a loop and see that it doesn't infloop.
185 (defalias 'help-fns--b 'help-fns--a)
186 (should (equal (help-fns--analyze-function 'help-fns--a)
187 '(help-fns--a help-fns--b t help-fns--b))))
188
180;;; help-fns-tests.el ends here 189;;; help-fns-tests.el ends here
diff --git a/test/lisp/so-long-tests/spelling-tests.el b/test/lisp/so-long-tests/spelling-tests.el
index 317513e9a91..ce4b0844c99 100644
--- a/test/lisp/so-long-tests/spelling-tests.el
+++ b/test/lisp/so-long-tests/spelling-tests.el
@@ -36,12 +36,11 @@
36;; make lisp/so-long-tests/spelling-tests SELECTOR=t 36;; make lisp/so-long-tests/spelling-tests SELECTOR=t
37 37
38;; Only define the test if spell-checking is possible. 38;; Only define the test if spell-checking is possible.
39(when (and ispell-program-name 39(when (ignore-errors
40 (executable-find ispell-program-name) 40 (and ispell-program-name
41 (condition-case () 41 (executable-find ispell-program-name)
42 (progn (ispell-check-version) t) 42 (progn (ispell-check-version) t)
43 (error nil)) 43 (member "british" (ispell-valid-dictionary-list))))
44 (member "british" (ispell-valid-dictionary-list)))
45 (ert-deftest so-long-spelling () 44 (ert-deftest so-long-spelling ()
46 "Check the spelling in the source code." 45 "Check the spelling in the source code."
47 :tags '(:unstable) ;; It works for me, but I'm not sure about others. 46 :tags '(:unstable) ;; It works for me, but I'm not sure about others.
@@ -51,8 +50,9 @@
51 ;; The Emacs test Makefile's use of HOME=/nonexistent triggers an error 50 ;; The Emacs test Makefile's use of HOME=/nonexistent triggers an error
52 ;; when starting the inferior ispell process, so we set HOME to a valid 51 ;; when starting the inferior ispell process, so we set HOME to a valid
53 ;; (but empty) temporary directory for this test. 52 ;; (but empty) temporary directory for this test.
54 (ert-with-temp-file tmpdir 53 (ert-with-temp-directory tmpdir
55 :suffix "so-long.ispell" 54 :prefix "so-long."
55 :suffix ".ispell"
56 (let* ((process-environment (cons (format "HOME=%s" tmpdir) 56 (let* ((process-environment (cons (format "HOME=%s" tmpdir)
57 process-environment)) 57 process-environment))
58 (find-spelling-mistake 58 (find-spelling-mistake
diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el
index 9be7511bdc9..512b6545355 100644
--- a/test/lisp/subr-tests.el
+++ b/test/lisp/subr-tests.el
@@ -1007,5 +1007,22 @@ final or penultimate step during initialization."))
1007 (should (equal (ensure-list :foo) '(:foo))) 1007 (should (equal (ensure-list :foo) '(:foo)))
1008 (should (equal (ensure-list '(1 2 3)) '(1 2 3)))) 1008 (should (equal (ensure-list '(1 2 3)) '(1 2 3))))
1009 1009
1010(ert-deftest test-alias-p ()
1011 (should-not (function-alias-p 1))
1012
1013 (defun subr-tests--fun ())
1014 (should-not (function-alias-p 'subr-tests--fun))
1015
1016 (defalias 'subr-tests--a 'subr-tests--b)
1017 (defalias 'subr-tests--b 'subr-tests--c)
1018 (should (equal (function-alias-p 'subr-tests--a)
1019 '(subr-tests--b subr-tests--c)))
1020
1021 (defalias 'subr-tests--d 'subr-tests--e)
1022 (defalias 'subr-tests--e 'subr-tests--d)
1023 (should-error (function-alias-p 'subr-tests--d))
1024 (should (equal (function-alias-p 'subr-tests--d t)
1025 '(subr-tests--e))))
1026
1010(provide 'subr-tests) 1027(provide 'subr-tests)
1011;;; subr-tests.el ends here 1028;;; subr-tests.el ends here