diff options
| author | Alan Mackenzie | 2022-01-14 19:28:07 +0000 |
|---|---|---|
| committer | Alan Mackenzie | 2022-01-14 19:28:07 +0000 |
| commit | d87a34597c9f0be967f75ff8cfd0ace4392da63f (patch) | |
| tree | c9474eb0156af143ce61a0c5bcec659546b56300 | |
| parent | 57b698f15913385aec7bc9745016b961c0aa5c55 (diff) | |
| parent | d29291d665e808307126bf52c3e748fef78f0f9c (diff) | |
| download | emacs-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
73 files changed, 3247 insertions, 310 deletions
| @@ -226,6 +226,33 @@ e.g. 'emacs25'). On Red Hat-based systems, the corresponding command is | |||
| 226 | 226 | ||
| 227 | On FreeBSD, the command is 'pkg install -y `pkg rquery %dn emacs-devel`'. | 227 | On FreeBSD, the command is 'pkg install -y `pkg rquery %dn emacs-devel`'. |
| 228 | 228 | ||
| 229 | * Alternative window systems | ||
| 230 | |||
| 231 | If you want to use Emacs on one of the alternative window systems | ||
| 232 | available on GNU/Linux and some Unix systems, such as Wayland or | ||
| 233 | Broadway, you can build the PGTK ("Pure GTK") port of Emacs, which | ||
| 234 | utilizes the GTK+ toolkit to support those window systems. To this | ||
| 235 | end, invoke the configure script with the '--with-pgtk' option, like | ||
| 236 | this: | ||
| 237 | |||
| 238 | ./configure --with-pgtk | ||
| 239 | |||
| 240 | This build is only supported with GTK+ version 3, and it is an error | ||
| 241 | to specify any other X-specific configuration option when PGTK is | ||
| 242 | enabled. | ||
| 243 | |||
| 244 | With the PGTK build, you will be able to switch between running Emacs | ||
| 245 | on X, Wayland and Broadway using the 'GDK_BACKEND' environment | ||
| 246 | variable. GTK+ should automatically detect and use the correct value | ||
| 247 | for your system, but you can also specify it manually. For example, | ||
| 248 | to 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 | |||
| 254 | The GNUstep build also supports the Wayland window system. If that is | ||
| 255 | what you want, see nextstep/INSTALL. | ||
| 229 | 256 | ||
| 230 | DETAILED BUILDING AND INSTALLATION: | 257 | DETAILED 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. |
| 320 | TRANSFORM = @program_transform_name@ | 320 | TRANSFORM = @program_transform_name@ |
| 321 | 321 | ||
| 322 | # Prevent any settings in the user environment causing problems. | ||
| 323 | unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH | ||
| 324 | |||
| 322 | # What emacs should be called when installed. | 325 | # What emacs should be called when installed. |
| 323 | EMACS_NAME = `echo emacs | sed '$(TRANSFORM)'` | 326 | EMACS_NAME = `echo emacs | sed '$(TRANSFORM)'` |
| 324 | EMACS = ${EMACS_NAME}${EXEEXT} | 327 | EMACS = ${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. |
| 34 | unexport EMACSDATA EMACSDOC EMACSPATH | 34 | unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH |
| 35 | 35 | ||
| 36 | EMACS = ${top_builddir}/src/emacs | 36 | EMACS = ${top_builddir}/src/emacs |
| 37 | emacs = EMACSLOADPATH= "${EMACS}" -batch --no-site-file --no-site-lisp --eval '(setq load-prefer-newer t)' | 37 | emacs = "${EMACS}" -batch --no-site-file --no-site-lisp --eval '(setq load-prefer-newer t)' |
| 38 | 38 | ||
| 39 | make_bovine = ${emacs} -l semantic/bovine/grammar -f bovine-batch-make-parser | 39 | make_bovine = ${emacs} -l semantic/bovine/grammar -f bovine-batch-make-parser |
| 40 | make_wisent = ${emacs} -l semantic/wisent/grammar -f wisent-batch-make-parser | 40 | make_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@ | |||
| 29 | top_srcdir = @top_srcdir@ | 29 | top_srcdir = @top_srcdir@ |
| 30 | top_builddir = @top_builddir@ | 30 | top_builddir = @top_builddir@ |
| 31 | 31 | ||
| 32 | # Prevent any settings in the user environment causing problems. | ||
| 33 | unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH | ||
| 34 | |||
| 32 | EMACS = ${top_builddir}/src/emacs | 35 | EMACS = ${top_builddir}/src/emacs |
| 33 | unidir = ${top_srcdir}/lisp/international | 36 | unidir = ${top_srcdir}/lisp/international |
| 34 | emacs = "${EMACS}" -batch --no-site-file --no-site-lisp | 37 | emacs = "${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}. | |||
| 512 | Delete the selected frame (@code{delete-frame}). This signals an | 512 | Delete the selected frame (@code{delete-frame}). This signals an |
| 513 | error if there is only one frame. | 513 | error 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 | ||
| 519 | When @code{undelete-frame-mode} is enabled, undelete one of the 16 | ||
| 520 | most recently deleted frames. Without a prefix argument, undelete the | ||
| 521 | most recently deleted frame. With a numerical prefix argument between | ||
| 522 | 1 and 16, where 1 is the most recently deleted frame, undelete the | ||
| 523 | corresponding 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)} |
| 517 | Minimize (or iconify) the selected Emacs frame | 527 | Minimize (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-? |
| 2318 | Find all the references for the identifier at point. | 2318 | Find 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} | ||
| 2321 | Interactively replace @var{regexp} with @var{replacement} in the names | 2322 | Interactively replace @var{regexp} with @var{replacement} in the names |
| 2322 | of all the identifiers shown in the @file{*xref*} buffer. | 2323 | of 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} | ||
| 2326 | Interactively rename all instances of the identifier @var{from} to the | ||
| 2327 | new 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} |
| 2325 | Search for @var{regexp} through the files in the selected tags | 2330 | Search for @var{regexp} through the files in the selected tags |
| 2326 | table. | 2331 | table. |
| @@ -2358,13 +2363,21 @@ shown. The default value is @code{nil}, which just shows the results | |||
| 2358 | in the @file{*xref*} buffer, but doesn't select any of them. | 2363 | in 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} |
| 2362 | names and a replacement string, just like ordinary @kbd{M-x | 2367 | string, just like ordinary @kbd{M-x query-replace-regexp}. It then |
| 2363 | query-replace-regexp}. It then performs the specified replacement in | 2368 | renames the identifiers shown in the @file{*xref*} buffer in all the |
| 2364 | the names of the matching identifiers in all the places in all the | 2369 | places in all the files where these identifiers are referenced, such |
| 2365 | files where these identifiers are referenced. This is useful when you | 2370 | that their new name is @var{replacement}. This is useful when you |
| 2366 | rename your identifiers as part of refactoring. This command should | 2371 | rename your identifiers as part of refactoring. This command should |
| 2367 | be invoked in the @file{*xref*} buffer generated by @kbd{M-?}. | 2372 | be invoked in the @file{*xref*} buffer generated by @kbd{M-?}. With a |
| 2373 | prefix argument, the command also prompts for a regexp to match | ||
| 2374 | identifier names, and renames that regexp in the names of the matching | ||
| 2375 | identifiers 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 | ||
| 2380 | want 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 | |||
| 436 | string. | 436 | string. |
| 437 | 437 | ||
| 438 | @item | 438 | @item |
| 439 | @findex isearch-char-by-name | ||
| 440 | @kindex C-x 8 RET @r{(Incremental Search)} | ||
| 441 | Type @kbd{C-x 8 @key{RET}} (@code{isearch-char-by-name}), followed by | ||
| 442 | a Unicode name or code-point in hex. This adds the specified | ||
| 443 | character 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 | |||
| 473 | automatically disable the input method afterwards. | 465 | automatically 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)} | ||
| 470 | Type @kbd{C-x 8 @key{RET}} (@code{isearch-char-by-name}), followed by | ||
| 471 | a Unicode name or code-point in hex. This adds the specified | ||
| 472 | character 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 | ||
| 479 | by 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 | ||
| 481 | string. If you don't know the name of the Emoji you want to search | ||
| 482 | for, you can use @kbd{C-x 8 e l} (@code{emoji-list}) and @kbd{C-x 8 e | ||
| 483 | d} (@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 | |||
| 669 | records. @xref{Function Cells}. | 669 | records. @xref{Function Cells}. |
| 670 | @end defun | 670 | @end defun |
| 671 | 671 | ||
| 672 | @defun function-alias-p object &optional noerror | ||
| 673 | Checks whether @var{object} is a function alias. If it is, it returns | ||
| 674 | a 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 | |||
| 683 | If 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 | ||
| 685 | returned 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 |
| 674 | any symbol, even one such as @code{car} or @code{x-popup-menu} whose | 690 | any 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 |
| 763 | file in the proper mode according to the name sans @samp{.gz}. | 763 | file in the proper mode according to the name sans @samp{.gz}. |
| 764 | 764 | ||
| 765 | If @code{auto-mode-alist} has more than one element whose @var{regexp} | ||
| 766 | matches the file name, Emacs will use the first match. | ||
| 767 | |||
| 765 | Here is an example of how to prepend several pattern pairs to | 768 | Here 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 |
| 767 | init file.) | 770 | init 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 | |||
| 5281 | minibuffer is selected, it takes precedence over | 5281 | minibuffer is selected, it takes precedence over |
| 5282 | @code{other-window-scroll-buffer}. @xref{Definition of | 5282 | @code{other-window-scroll-buffer}. @xref{Definition of |
| 5283 | minibuffer-scroll-window}. | 5283 | minibuffer-scroll-window}. |
| 5284 | |||
| 5285 | When the minibuffer is active, it is the next window if the selected | ||
| 5286 | window is the one at the bottom right corner. In this case, | ||
| 5287 | @code{scroll-other-window} attempts to scroll the minibuffer. If the | ||
| 5288 | minibuffer contains just one line, it has nowhere to scroll to, so the | ||
| 5289 | line 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 | ||
| 236 | abs_top_builddir = @abs_top_builddir@ | 236 | abs_top_builddir = @abs_top_builddir@ |
| 237 | |||
| 238 | # Prevent any settings in the user environment causing problems. | ||
| 239 | unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH | ||
| 240 | |||
| 237 | EMACS = ${abs_top_builddir}/src/emacs | 241 | EMACS = ${abs_top_builddir}/src/emacs |
| 238 | emacs = "${EMACS}" -batch --no-site-file --no-site-lisp --eval '(setq load-prefer-newer t)' | 242 | emacs = "${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} | |||
| 694 | supports Tramp. | 694 | supports Tramp. |
| 695 | @end table | 695 | @end table |
| 696 | 696 | ||
| 697 | @subsection Defining new built-in commands | ||
| 698 | While Eshell can run Lisp functions directly as commands, it may be | ||
| 699 | more convenient to provide a special built-in command for | ||
| 700 | Eshell. Built-in commands are just ordinary Lisp functions designed | ||
| 701 | to be called from Eshell. When defining an Eshell-specific version of | ||
| 702 | an 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{} | ||
| 706 | This macro processes a list of @var{macro-args} for the command | ||
| 707 | @var{name} using a set of command line @var{options}. If the | ||
| 708 | arguments are parsed successfully, it will store the resulting values | ||
| 709 | in local symbols and execute @var{body}; any remaining arguments will | ||
| 710 | be available in the locally let-bound variable @code{args}. The | ||
| 711 | return value is the value of the last form in @var{body}. | ||
| 712 | |||
| 713 | If an unknown option was passed in @var{macro-args} and an external | ||
| 714 | command was specified (see below), this macro will start a process for | ||
| 715 | that command and throw the tag @code{eshell-external} with the new | ||
| 716 | process as its value. | ||
| 717 | |||
| 718 | @var{options} should be a list beginning with one or more elements of | ||
| 719 | the following form, with each element representing a particular | ||
| 720 | command-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 | ||
| 728 | This element, if non-nil, should be a character to be used as a short | ||
| 729 | switch, like @code{-@var{short}}. At least one of this element and | ||
| 730 | @var{long} must be non-nil. | ||
| 731 | |||
| 732 | @item long | ||
| 733 | This element, if non-nil, should be a string to be used as a long | ||
| 734 | switch, like @code{--@var{long}}. | ||
| 735 | |||
| 736 | @item value | ||
| 737 | This element is the value associated with the option. It can be | ||
| 738 | either: | ||
| 739 | |||
| 740 | @table @asis | ||
| 741 | @item @code{t} | ||
| 742 | The option needs a value to be specified after the switch. | ||
| 743 | |||
| 744 | @item @code{nil} | ||
| 745 | The option is given the value @code{t}. | ||
| 746 | |||
| 747 | @item anything else | ||
| 748 | The option is given the specified value. | ||
| 749 | @end table | ||
| 750 | |||
| 751 | @item symbol | ||
| 752 | This 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 | ||
| 758 | This element is a documentation string for the option, which will be | ||
| 759 | displayed when @code{eshell-show-usage} is invoked. | ||
| 760 | @end table | ||
| 761 | |||
| 762 | After the list of command-line switch elements, @var{options} can | ||
| 763 | include additional keyword arguments to control how | ||
| 764 | @code{eshell-eval-using-options} behaves. Some of these take | ||
| 765 | arguments, while others don't. The recognized keywords are: | ||
| 766 | |||
| 767 | @table @code | ||
| 768 | @item :external @var{string} | ||
| 769 | Specify @var{string} as an external command to run if there are | ||
| 770 | unknown switches in @var{macro-args}. | ||
| 771 | |||
| 772 | @item :usage @var{string} | ||
| 773 | Set @var{string} as the initial part of the command's documentation | ||
| 774 | string. It appears before the options are listed. | ||
| 775 | |||
| 776 | @item :post-usage @var{string} | ||
| 777 | Set @var{string} to be the (optional) trailing part of the command's | ||
| 778 | documentation string. It appears after the list of options, but | ||
| 779 | before the final part of the documentation about the associated | ||
| 780 | external command, if there is one. | ||
| 781 | |||
| 782 | @item :show-usage | ||
| 783 | If present, then show the usage message if the command is called with | ||
| 784 | no arguments. | ||
| 785 | |||
| 786 | @item :preserve-args | ||
| 787 | Normally, @code{eshell-eval-using-options} flattens the list of | ||
| 788 | arguments in @var{macro-args} and converts each to a string. If this | ||
| 789 | keyword is present, avoid doing that, instead preserving the original | ||
| 790 | arguments. This is useful for commands which want to accept arbitrary | ||
| 791 | Lisp objects. | ||
| 792 | |||
| 793 | @item :parse-leading-options-only | ||
| 794 | If present, do not parse dash or switch arguments after the first | ||
| 795 | positional argument. Instead, treat them as positional arguments | ||
| 796 | themselves. | ||
| 797 | @end table | ||
| 798 | |||
| 799 | For 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 |
| 698 | Eshell knows a few built-in variables: | 818 | Eshell 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 | |||
| 2857 | original file. | 2857 | original file. |
| 2858 | 2858 | ||
| 2859 | If you change @code{lock-file-name-transforms} in order to keep file | 2859 | If you change @code{lock-file-name-transforms} in order to keep file |
| 2860 | locks for remote files somewhere else, you will loose Emacs' feature | 2860 | locks for remote files somewhere else, you will lose Emacs's feature |
| 2861 | to warn you, if a file is changed in parallel from different Emacs | 2861 | to warn you, if a file is changed in parallel from different Emacs |
| 2862 | sessions, or via different remote connections. Be careful with such | 2862 | sessions, or via different remote connections. Be careful with such |
| 2863 | settings. | 2863 | settings. |
| @@ -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 |
| 2927 | configuration file is saved as | 2927 | configuration 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} |
| 2929 | in @code{user-emacs-directory}. Do not loose this file and the | 2929 | in @code{user-emacs-directory}. Do not lose this file and the |
| 2930 | corresponding password; otherwise there is no way to decrypt your | 2930 | corresponding password; otherwise there is no way to decrypt your |
| 2931 | encrypted files. | 2931 | encrypted files. |
| 2932 | 2932 | ||
| @@ -223,6 +223,8 @@ inserted. | |||
| 223 | This command will tell you the name of the Emoji at point. (This | 223 | This command will tell you the name of the Emoji at point. (This |
| 224 | command also works for non-Emoji characters.) | 224 | command 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. |
| 280 | The 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 | ||
| 282 | the most recently deleted frame. With a numerical prefix argument | ||
| 283 | between 1 and 16, where 1 is the most recently deleted frame, undelete | ||
| 284 | the 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 | |||
| 307 | are met. The conditions are given by the argument, which can be | 314 | are 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'. | ||
| 409 | It is bound to 'C-x 8 e RET' during an incremental search. The | ||
| 410 | command accepts the Unicode name of an Emoji (for example, "smiling | ||
| 411 | face" or "heart with arrow"), like 'C-x 8 e e', with minibuffer | ||
| 412 | completion, and adds the Emoji into the search string. | ||
| 413 | |||
| 395 | ** New minor mode 'glyphless-display-mode'. | 414 | ** New minor mode 'glyphless-display-mode'. |
| 396 | This allows an easy way to toggle seeing all glyphless characters in | 415 | This allows an easy way to toggle seeing all glyphless characters in |
| 397 | the current buffer. | 416 | the current buffer. |
| @@ -575,6 +594,12 @@ to enable the display of the buffer list. | |||
| 575 | It is bound to 'C-M-,' and jumps to the location where 'xref-go-back' | 594 | It 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 | ||
| 598 | called without prefix argument, to make the most common case faster: | ||
| 599 | replacing 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'. | ||
| 946 | This predicate says whether an object is a function alias, and if it | ||
| 947 | is, 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. | |||
| 1090 | Specifying a cons as the from argument allows to start measuring text | 1120 | Specifying a cons as the from argument allows to start measuring text |
| 1091 | from a specified amount of pixels above or below a position. | 1121 | from 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. | ||
| 1125 | Built-in commands in Eshell now accept command-line options with | ||
| 1126 | values 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. |
| 38 | unexport EMACSDATA EMACSDOC EMACSPATH | 38 | unexport 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. |
| 42 | EMACS = ../src/emacs${EXEEXT} | 42 | EMACS = ../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. | 45 | RUN_EMACS = '$(EMACS)' -batch --no-site-file --no-site-lisp |
| 46 | RUN_EMACS = EMACSLOADPATH= '$(EMACS)' -batch --no-site-file --no-site-lisp | ||
| 47 | 46 | ||
| 48 | MKDIR_P = @MKDIR_P@ | 47 | MKDIR_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 | ||
| 21 | SHELL = @SHELL@ | 21 | SHELL = @SHELL@ |
| 22 | 22 | ||
| 23 | # Prevent any settings in the user environment causing problems. | ||
| 24 | unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH | ||
| 25 | |||
| 23 | # Following ../lisp/Makefile.in. | 26 | # Following ../lisp/Makefile.in. |
| 24 | EMACS = ../src/emacs${EXEEXT} | 27 | EMACS = ../src/emacs${EXEEXT} |
| 25 | EMACSOPT = -batch --no-site-file --no-site-lisp | 28 | EMACSOPT = -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. |
| 104 | unexport EMACSDATA EMACSDOC EMACSPATH | 104 | unexport 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. | 107 | emacs = '$(EMACS)' $(EMACSOPT) |
| 108 | emacs = EMACSLOADPATH= '$(EMACS)' $(EMACSOPT) | ||
| 109 | 108 | ||
| 110 | ## Subdirectories, relative to builddir. | 109 | ## Subdirectories, relative to builddir. |
| 111 | SUBDIRS = $(sort $(shell find ${srcdir} -type d -print)) | 110 | SUBDIRS = $(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. | ||
| 196 | OT is the object target. DIR is the directory to start in." | 197 | OT 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'. |
| 699 | The M, BS, and ARGS arguments are as per that function. DOC is | 699 | The M, BS, and ARGS arguments are as per that function. DOC is |
| 700 | the constant's documentation." | 700 | the constant's documentation. |
| 701 | |||
| 702 | This 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' | |||
| 187 | will be called instead." extcmd))))) | 187 | will 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. | ||
| 192 | KIND should be the integer 0 if SWITCH is a short option, or 1 if it's | ||
| 193 | a 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. |
| 192 | If the option consumes an argument for its value, the argument list | 205 | VALUE is the potential value of the OPT, coming from args like |
| 193 | will be modified." | 206 | \"-fVALUE\" or \"--foo=VALUE\", or nil if no value was supplied. If |
| 207 | OPT doesn't consume a value, return VALUE unchanged so that it can be | ||
| 208 | processed later; otherwsie, return nil. | ||
| 209 | |||
| 210 | If the OPT consumes an argument for its value and VALUE is nil, the | ||
| 211 | argument 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. |
| 205 | The SWITCH will be looked up in the set of OPTIONS. | 228 | The SWITCH will be looked up in the set of OPTIONS. |
| 206 | 229 | ||
| 207 | SWITCH should be either a string or character. KIND should be the | 230 | SWITCH should be a string starting with the option to process, |
| 208 | integer 0 if it's a character, or 1 if it's a string. | 231 | possibly followed by its value, e.g. \"u\" or \"uUSER\". KIND should |
| 209 | 232 | be the integer 0 if it's a short option, or 1 if it's a long option. | |
| 210 | The SWITCH is then be matched against OPTIONS. If no matching handler | 233 | |
| 211 | is found, and an :external command is defined (and available), it will | 234 | The SWITCH is then be matched against OPTIONS. If KIND is 0 and the |
| 212 | be called; otherwise, an error will be triggered to say that the | 235 | SWITCH matches an option that doesn't take a value, return the |
| 213 | switch is unrecognized." | 236 | remaining characters in SWITCH to be processed later as further short |
| 214 | (let* ((opts options) | 237 | options. |
| 215 | found) | 238 | |
| 239 | If no matching handler is found, and an :external command is defined | ||
| 240 | (and available), it will be called; otherwise, an error will be | ||
| 241 | triggered 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. |
| 486 | This has the same syntax as | 486 | This has the same syntax as `auto-save-file-name-transforms', |
| 487 | `auto-save-file-name-transforms' (which see), but instead of | 487 | but applies to lock file names instead of auto-save file names. |
| 488 | applying to auto-save file names, it's applied to lock file names. | ||
| 489 | 488 | ||
| 490 | By default, a lock file is put into the same directory as the | 489 | By default, Emacs puts each lock file into the same directory as the |
| 491 | file it's locking, and it has the same name, but with \".#\" prepended." | 490 | file it locks, prepending \".#\" to the base file name. |
| 491 | |||
| 492 | Note that changing this could break lock file functionality, e.g.: | ||
| 493 | if different users access the same file, using different lock file settings; | ||
| 494 | if accessing files on a shared file system from different hosts, | ||
| 495 | using 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'. | ||
| 2539 | Only 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'. | ||
| 2575 | Without a prefix argument, undelete the most recently deleted | ||
| 2576 | frame. | ||
| 2577 | With a numerical prefix argument ARG between 1 and 16, where 1 is | ||
| 2578 | most recently deleted frame, undelete the ARGth deleted frame. | ||
| 2579 | When 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. |
| 1164 | Valid values are nil, t, `head', `first', `last', an integer or a | 1165 | Valid values are nil, t, `head', `first', `last', an integer or a |
| 1165 | predicate. See Info node `(gnus)Customizing Articles'." | 1166 | predicate. 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. | ||
| 2755 | COUNT (interactively, the prefix argument) defaults to 1. | ||
| 2756 | The 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'. | |||
| 8861 | The M, BS, and ARGS arguments are as per that function. DOC is | 8861 | The M, BS, and ARGS arguments are as per that function. DOC is |
| 8862 | the constant's documentation. | 8862 | the constant's documentation. |
| 8863 | 8863 | ||
| 8864 | This 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" "\ | ||
| 10301 | Toggle eliding (hiding) header material in the current buffer. | ||
| 10302 | |||
| 10303 | This is a minor mode. If called interactively, toggle the `Elide-Head | ||
| 10304 | mode' mode. If the prefix argument is positive, enable the mode, and | ||
| 10305 | if it is zero or negative, disable the mode. | ||
| 10306 | |||
| 10307 | If called from Lisp, toggle the mode if ARG is `toggle'. Enable the | ||
| 10308 | mode if ARG is nil, omitted, or is a positive number. Disable the | ||
| 10309 | mode if ARG is a negative number. | ||
| 10310 | |||
| 10311 | To check whether the minor mode is enabled in the current buffer, | ||
| 10312 | evaluate `elide-head-mode'. | ||
| 10313 | |||
| 10314 | The mode's hook is called both when the mode is enabled and when it is | ||
| 10315 | disabled. | ||
| 10316 | |||
| 10317 | When Elide Header mode is enabled, headers are hidden according | ||
| 10318 | to `elide-head-headers-to-hide'. | ||
| 10319 | |||
| 10320 | This is suitable as an entry on `find-file-hook' or appropriate | ||
| 10321 | mode hooks. | ||
| 10322 | |||
| 10323 | \(fn &optional ARG)" t nil) | ||
| 10324 | |||
| 10294 | (autoload 'elide-head "elide-head" "\ | 10325 | (autoload 'elide-head "elide-head" "\ |
| 10295 | Hide header material in buffer according to `elide-head-headers-to-hide'. | 10326 | Hide 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" "\ |
| 16765 | Add patterns from the current buffer to the list of hi-lock patterns." t nil) | 16798 | Add patterns from the current buffer to the list of hi-lock patterns." t nil) |
| 16766 | 16799 | ||
| 16800 | (autoload 'hi-lock-context-menu "hi-lock" "\ | ||
| 16801 | Populate 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" "\ |
| 19158 | Display the definition of SYMBOL, as found in the relevant manual. | 19196 | Look up and display documentation of SYMBOL in the relevant Info manual. |
| 19159 | When this command is called interactively, it reads SYMBOL from the | 19197 | SYMBOL should be an identifier: a function or method, a macro, a variable, |
| 19160 | minibuffer. In the minibuffer, use \\<minibuffer-local-completion-map>\\[next-history-element] to yank the default argument | 19198 | a data type, a class, etc. |
| 19161 | value into the minibuffer so you can edit it. The default symbol is the | ||
| 19162 | one found at point. | ||
| 19163 | 19199 | ||
| 19164 | With prefix arg MODE a query for the symbol help mode is offered. | 19200 | Interactively, prompt for SYMBOL; you can use \\<minibuffer-local-completion-map>\\[next-history-element] in the minibuffer |
| 19201 | to yank the default argument value into the minibuffer so you can edit it. | ||
| 19202 | The default symbol is the one found at point. | ||
| 19203 | |||
| 19204 | MODE is the major mode whose Info manuals to search for the documentation | ||
| 19205 | of SYMBOL. It defaults to the current buffer's `major-mode'; if that | ||
| 19206 | mode doesn't have any Info manuals known to Emacs, the command will | ||
| 19207 | prompt for MODE to use, with completion. With prefix arg, the command | ||
| 19208 | always 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" "\ |
| 19170 | Display the documentation of a file. | 19214 | Look up and display documentation of FILE in the relevant Info manual. |
| 19171 | When this command is called interactively, it reads FILE from the minibuffer. | 19215 | FILE should be the name of a file; a notable example is a standard header |
| 19172 | In the minibuffer, use \\<minibuffer-local-completion-map>\\[next-history-element] to yank the default file name | 19216 | file that is part of the C or C++ standard library. |
| 19173 | into the minibuffer so you can edit it. | 19217 | |
| 19218 | Interactively, prompt for FILE; you can use \\<minibuffer-local-completion-map>\\[next-history-element] in the minibuffer | ||
| 19219 | to yank the default argument value into the minibuffer so you can edit it. | ||
| 19174 | The default file name is the one found at point. | 19220 | The default file name is the one found at point. |
| 19175 | 19221 | ||
| 19176 | With prefix arg MODE a query for the file help mode is offered. | 19222 | MODE is the major mode whose Info manuals to search for the documentation |
| 19223 | of FILE. It defaults to the current buffer's `major-mode'; if that | ||
| 19224 | mode doesn't have any Info manuals known to Emacs, the command will | ||
| 19225 | prompt for MODE to use, with completion. With prefix arg, the command | ||
| 19226 | always 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" "\ | ||
| 21365 | Populate 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 "\ | ||
| 39455 | Non-nil if Windmove mode is enabled. | ||
| 39456 | See the `windmove-mode' command | ||
| 39457 | for a description of this minor mode.") | ||
| 39458 | |||
| 39459 | (custom-autoload 'windmove-mode "windmove" nil) | ||
| 39460 | |||
| 39461 | (autoload 'windmove-mode "windmove" "\ | ||
| 39462 | Global minor mode for default windmove commands. | ||
| 39463 | |||
| 39464 | This is a minor mode. If called interactively, toggle the `Windmove | ||
| 39465 | mode' mode. If the prefix argument is positive, enable the mode, and | ||
| 39466 | if it is zero or negative, disable the mode. | ||
| 39467 | |||
| 39468 | If called from Lisp, toggle the mode if ARG is `toggle'. Enable the | ||
| 39469 | mode if ARG is nil, omitted, or is a positive number. Disable the | ||
| 39470 | mode if ARG is a negative number. | ||
| 39471 | |||
| 39472 | To check whether the minor mode is enabled in the current buffer, | ||
| 39473 | evaluate `(default-value \\='windmove-mode)'. | ||
| 39474 | |||
| 39475 | The mode's hook is called both when the mode is enabled and when it is | ||
| 39476 | disabled. | ||
| 39477 | |||
| 39478 | \(fn &optional ARG)" t nil) | ||
| 39479 | |||
| 39397 | (autoload 'windmove-default-keybindings "windmove" "\ | 39480 | (autoload 'windmove-default-keybindings "windmove" "\ |
| 39398 | Set up keybindings for `windmove'. | 39481 | Set up keybindings for `windmove'. |
| 39399 | Keybindings are of the form MODIFIERS-{left,right,up,down}, | 39482 | Keybindings 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. | ||
| 42 | Examples: | ||
| 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. | ||
| 3236 | If a region is active, the entire region will be sent, otherwise | ||
| 3237 | the symbol at point will be used. This command uses EWW's | ||
| 3238 | default 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. |
| 3218 | Return the output." | 3218 | Return 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 | ||
| 740 | This command interactively replaces FROM with TO in the names of the | 740 | This command interactively replaces FROM with TO in the names of the |
| 741 | references displayed in the current *xref* buffer." | 741 | references displayed in the current *xref* buffer. |
| 742 | |||
| 743 | When called interactively, it uses '.*' as FROM, which means | ||
| 744 | replace the whole name. Unless called with prefix argument, in | ||
| 745 | which 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. | ||
| 6542 | If FUNC is a function alias, return the function alias chain. | ||
| 6543 | |||
| 6544 | If the function alias chain contains loops, an error will be | ||
| 6545 | signalled. 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 | ||
| 2384 | DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "", | 2384 | DEFUN ("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. |
| 2386 | FRAME must be a live frame and defaults to the selected one. | 2386 | FRAME must be a live frame and defaults to the selected one. |
| 2387 | 2387 | ||
| 2388 | When `undelete-frame-mode' is enabled, the 16 most recently deleted | ||
| 2389 | frames can be undeleted with `undelete-frame', which see. | ||
| 2390 | |||
| 2388 | A frame may not be deleted if its minibuffer serves as surrogate | 2391 | A frame may not be deleted if its minibuffer serves as surrogate |
| 2389 | minibuffer for another frame. Normally, you may not delete a frame if | 2392 | minibuffer for another frame. Normally, you may not delete a frame if |
| 2390 | all other frames are invisible, but if the second optional argument | 2393 | all 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 | ||
| 6264 | bool | 6262 | bool |
| 6265 | xg_filter_key (struct frame *frame, XEvent *xkey) | 6263 | xg_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 | |||
| 139 | static int | 148 | static int |
| 140 | keysym_from_raw_char (int32 raw, int32 key, unsigned *code) | 149 | keysym_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 | ||
| 2261 | static void | 2263 | static 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 = | |||
| 75 | EMACSOPT = --no-init-file --no-site-file --no-site-lisp -L "$(SEPCHAR)$(srcdir)" $(elpa_opts) $(EMACS_EXTRAOPT) | 75 | EMACSOPT = --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. |
| 78 | unexport EMACSDATA EMACSDOC EMACSPATH GREP_OPTIONS XDG_CONFIG_HOME | 78 | unexport 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". |
| 81 | GDB = | 81 | GDB = |
| @@ -118,10 +118,8 @@ MODULES_EMACSOPT := | |||
| 118 | endif | 118 | endif |
| 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. | 122 | emacs = LANG=C EMACS_TEST_DIRECTORY=$(abspath $(srcdir)) \ |
| 123 | emacs = 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 |