commit 2557c009bb1b7b9bc001aee5e6cd1c0054de83d6 (HEAD, refs/remotes/origin/master) Author: Michael Albinus Date: Sat Sep 18 10:23:32 2021 +0200 Skip "fast" tests on emba CI * test/infra/gitlab-ci.yml (stages): Comment "fast" stage out. (test-fast-inotify): Comment out. diff --git a/test/infra/gitlab-ci.yml b/test/infra/gitlab-ci.yml index 5082b08e01..0b12f96f4c 100644 --- a/test/infra/gitlab-ci.yml +++ b/test/infra/gitlab-ci.yml @@ -200,7 +200,7 @@ default: stages: - prep-images - build-images - - fast +# - fast - normal - platform-images - platforms @@ -221,12 +221,12 @@ build-image-inotify: variables: target: emacs-inotify -test-fast-inotify: - stage: fast - extends: [.job-template, .test-template] - variables: - target: emacs-inotify - make_params: "-C test check" +# test-fast-inotify: +# stage: fast +# extends: [.job-template, .test-template] +# variables: +# target: emacs-inotify +# make_params: "-C test check" test-lisp-inotify: stage: normal commit 0788ab9e5c5c780f050f73c10ad3c71e9defd6dc Author: Eli Zaretskii Date: Sat Sep 18 10:56:05 2021 +0300 ; * lisp/loadup.el: Fix "Eager macro-expansion error" on w32. diff --git a/lisp/loadup.el b/lisp/loadup.el index 0ea441de01..1889ff562c 100644 --- a/lisp/loadup.el +++ b/lisp/loadup.el @@ -275,7 +275,6 @@ (load "textmodes/paragraphs") (load "progmodes/prog-mode") (load "emacs-lisp/lisp-mode") -(load "progmodes/elisp-mode") (load "textmodes/text-mode") (load "textmodes/fill") (load "newcomment") @@ -339,6 +338,13 @@ ;; Do it after loading term/foo-win.el since the value of the ;; mouse-wheel-*-event vars depends on those files being loaded or not. (load "mwheel")) + +;; progmodes/elisp-mode.el must be after w32-fns.el, to avoid this: +;;"Eager macro-expansion failure: (void-function w32-convert-standard-filename)" +;; which happens while processing 'elisp-flymake-byte-compile', when +;; elisp-mode.elc is outdated. +(load "progmodes/elisp-mode") + ;; Preload some constants and floating point functions. (load "emacs-lisp/float-sup") commit dc0f1eddd4ea940e41d493e6ba5ed8b17dd9671f Author: Stefan Kangas Date: Sat Sep 18 09:40:29 2021 +0200 Add indent declaration to emerge-defvar-local * lisp/vc/emerge.el (emerge-defvar-local): Add indent declaration for docstring. Fix wrongly indented callers. diff --git a/lisp/vc/emerge.el b/lisp/vc/emerge.el index 1c3ab8b96c..b2fdb07d5f 100644 --- a/lisp/vc/emerge.el +++ b/lisp/vc/emerge.el @@ -34,6 +34,7 @@ and its docstring to DOC. Then set the `permanent-local' property, so that `kill-all-local-variables' (called by major-mode setting commands) won't destroy Emerge control variables." + (declare (indent defun) (doc-string 3)) `(progn (defvar-local ,symbol ,value ,doc) (put ',symbol 'permanent-local t))) @@ -481,10 +482,10 @@ replaced by emerge-fast-keymap.") (emerge-defvar-local emerge-old-keymap nil "The original local keymap for the merge buffer.") (emerge-defvar-local emerge-auto-advance nil - "If non-nil, emerge-select-A and emerge-select-B automatically advance to + "If non-nil, emerge-select-A and emerge-select-B automatically advance to the next difference.") (emerge-defvar-local emerge-skip-prefers nil - "If non-nil, differences for which there is a preference are automatically + "If non-nil, differences for which there is a preference are automatically skipped.") (emerge-defvar-local emerge-quit-hook nil "Hooks to run in the merge buffer after the merge has been finished. commit e0726bca4072d57bba2e8145a48ed36f45d7087c Author: Stefan Kangas Date: Sat Sep 18 09:38:45 2021 +0200 Make doc argument of emerge-defvar-local optional * lisp/vc/emerge.el (emerge-defvar-local): Make doc argument optional. diff --git a/lisp/vc/emerge.el b/lisp/vc/emerge.el index 25de2f0e9e..1c3ab8b96c 100644 --- a/lisp/vc/emerge.el +++ b/lisp/vc/emerge.el @@ -26,7 +26,7 @@ ;;; Macros -(defmacro emerge-defvar-local (symbol value doc) +(defmacro emerge-defvar-local (symbol value &optional doc) "Define SYMBOL as an advertised buffer-local variable. Run `defvar-local', setting the value of the variable to VALUE and its docstring to DOC. commit 4dcbdb90d572c05b19828879fae48e536e941646 Author: Stefan Kangas Date: Sat Sep 18 09:33:53 2021 +0200 Make doc argument of ediff-defvar-local optional * lisp/vc/ediff-init.el (ediff-defvar-local): Make DOC argument optional. Update callers passing the empty string to not use it. diff --git a/lisp/vc/ediff-init.el b/lisp/vc/ediff-init.el index 3ee27cd109..bd494d87be 100644 --- a/lisp/vc/ediff-init.el +++ b/lisp/vc/ediff-init.el @@ -81,7 +81,7 @@ that Ediff doesn't know about.") ;; commands) won't destroy Ediff control variables. ;; ;; Plagiarized from `emerge-defvar-local'. -(defmacro ediff-defvar-local (symbol value doc) +(defmacro ediff-defvar-local (symbol value &optional doc) "Define SYMBOL as an advertised buffer-local variable. Run `defvar-local', setting the value of the variable to VALUE and its docstring to DOC. @@ -166,10 +166,10 @@ It needs to be killed when we quit the session.") ;; no-fine-diffs-flag says if there are fine differences. ;; state-of-difference is A, B, C, or nil, indicating which buffer is ;; different from the other two (used only in 3-way jobs. -(ediff-defvar-local ediff-difference-vector-A nil "") -(ediff-defvar-local ediff-difference-vector-B nil "") -(ediff-defvar-local ediff-difference-vector-C nil "") -(ediff-defvar-local ediff-difference-vector-Ancestor nil "") +(ediff-defvar-local ediff-difference-vector-A nil) +(ediff-defvar-local ediff-difference-vector-B nil) +(ediff-defvar-local ediff-difference-vector-C nil) +(ediff-defvar-local ediff-difference-vector-Ancestor nil) ;; A-list of diff vector types associated with buffer types (defconst ediff-difference-vector-alist '((A . ediff-difference-vector-A) @@ -275,7 +275,7 @@ It needs to be killed when we quit the session.") '(memq ediff-job-name '(ediff-files3 ediff-buffers3))) -(ediff-defvar-local ediff-3way-comparison-job nil "") +(ediff-defvar-local ediff-3way-comparison-job nil) (defmacro ediff-merge-job () '(memq @@ -286,7 +286,7 @@ It needs to be killed when we quit the session.") ediff-merge-buffers-with-ancestor ediff-merge-revisions ediff-merge-revisions-with-ancestor))) -(ediff-defvar-local ediff-merge-job nil "") +(ediff-defvar-local ediff-merge-job nil) (defmacro ediff-patch-job () '(eq ediff-job-name 'epatch)) @@ -297,18 +297,18 @@ It needs to be killed when we quit the session.") '(ediff-merge-files-with-ancestor ediff-merge-buffers-with-ancestor ediff-merge-revisions-with-ancestor))) -(ediff-defvar-local ediff-merge-with-ancestor-job nil "") +(ediff-defvar-local ediff-merge-with-ancestor-job nil) (defmacro ediff-3way-job () '(or ediff-3way-comparison-job ediff-merge-job)) -(ediff-defvar-local ediff-3way-job nil "") +(ediff-defvar-local ediff-3way-job nil) ;; A diff3 job is like a 3way job, but ediff-merge doesn't require the use ;; of diff3. (defmacro ediff-diff3-job () '(or ediff-3way-comparison-job ediff-merge-with-ancestor-job)) -(ediff-defvar-local ediff-diff3-job nil "") +(ediff-defvar-local ediff-diff3-job nil) (defmacro ediff-windows-job () '(memq ediff-job-name '(ediff-windows-wordwise ediff-windows-linewise))) @@ -316,14 +316,14 @@ It needs to be killed when we quit the session.") (defmacro ediff-word-mode-job () '(memq ediff-job-name '(ediff-windows-wordwise ediff-regions-wordwise))) -(ediff-defvar-local ediff-word-mode-job nil "") +(ediff-defvar-local ediff-word-mode-job nil) (defmacro ediff-narrow-job () '(memq ediff-job-name '(ediff-windows-wordwise ediff-regions-wordwise ediff-windows-linewise ediff-regions-linewise))) -(ediff-defvar-local ediff-narrow-job nil "") +(ediff-defvar-local ediff-narrow-job nil) ;; Note: ediff-merge-directory-revisions-with-ancestor is not treated as an ;; ancestor metajob, since it behaves differently. @@ -528,7 +528,7 @@ See the documentation string of `ediff-focus-on-regexp-matches' for details.") "Regexp that determines buf C regions to focus on when skipping to diff.") ;; connective that determines whether to focus regions that match both or ;; one of the regexps -(ediff-defvar-local ediff-focus-regexp-connective 'and "") +(ediff-defvar-local ediff-focus-regexp-connective 'and) (ediff-defvar-local ediff-regexp-hide-A "" "Regexp that determines buf A regions to ignore when skipping to diff.") @@ -538,7 +538,7 @@ See the documentation string of `ediff-focus-on-regexp-matches' for details.") "Regexp that determines buf C regions to ignore when skipping to diff.") ;; connective that determines whether to hide regions that match both or ;; one of the regexps -(ediff-defvar-local ediff-hide-regexp-connective 'and "") +(ediff-defvar-local ediff-hide-regexp-connective 'and) ;;; Copying difference regions between buffers. @@ -548,12 +548,12 @@ See the documentation string of `ediff-focus-on-regexp-matches' for details.") ;; from another buffer. This alist has the form: ;; \((num (buff-object . diff) (buff-object . diff) (buff-object . diff)) ...), ;; where some buffer-objects may be missing. -(ediff-defvar-local ediff-killed-diffs-alist nil "") +(ediff-defvar-local ediff-killed-diffs-alist nil) ;; Syntax table to use in ediff-forward-word-function ;; This is chosen by a heuristic. The important thing is for all buffers to ;; have the same syntax table. Which is not too important. -(ediff-defvar-local ediff-syntax-table nil "") +(ediff-defvar-local ediff-syntax-table nil) ;; Highlighting @@ -593,25 +593,25 @@ highlighted using ASCII flags." ;; this indicates that diff regions are word-size, so fine diffs are ;; permanently nixed; used in ediff-windows-wordwise and ediff-regions-wordwise -(ediff-defvar-local ediff-word-mode nil "") +(ediff-defvar-local ediff-word-mode nil) ;; Name of the job (ediff-files, ediff-windows, etc.) -(ediff-defvar-local ediff-job-name nil "") +(ediff-defvar-local ediff-job-name nil) ;; Narrowing and ediff-region/windows support ;; This is a list (overlay-A overlay-B overlay-C) ;; If set, Ediff compares only those parts of buffers A/B/C that lie within ;; the bounds of these overlays. -(ediff-defvar-local ediff-narrow-bounds nil "") +(ediff-defvar-local ediff-narrow-bounds nil) ;; List (overlay-A overlay-B overlay-C), where each overlay spans the ;; entire corresponding buffer. -(ediff-defvar-local ediff-wide-bounds nil "") +(ediff-defvar-local ediff-wide-bounds nil) ;; Current visibility boundaries in buffers A, B, and C. ;; This is also a list of overlays. When the user toggles narrow/widen, ;; this list changes from ediff-wide-bounds to ediff-narrow-bounds. ;; and back. -(ediff-defvar-local ediff-visible-bounds nil "") +(ediff-defvar-local ediff-visible-bounds nil) (ediff-defvar-local ediff-start-narrowed t "Non-nil means start narrowed, if doing ediff-windows-* or ediff-regions-*") @@ -744,8 +744,7 @@ Ediff needs to find fine differences." ;; in effect for this buffer: `face', `ascii', ;; `off' -- turned off (on a dumb terminal only). (ediff-defvar-local ediff-highlighting-style - (if (and (ediff-has-face-support-p) ediff-use-faces) 'face 'ascii) - "") + (if (and (ediff-has-face-support-p) ediff-use-faces) 'face 'ascii)) (define-obsolete-function-alias 'ediff-display-pixel-width @@ -1226,7 +1225,7 @@ This property can be toggled interactively." ;; Store orig value of `ediff-show-ancestor' when changed in ;; `ediff-toggle-show-ancestor' and restore it on exit. -(ediff-defvar-local ediff--show-ancestor-orig nil "") +(ediff-defvar-local ediff--show-ancestor-orig nil) (defcustom ediff-autostore-merges 'group-jobs-only "Save the results of merge jobs automatically. diff --git a/lisp/vc/ediff-mult.el b/lisp/vc/ediff-mult.el index a26db3c4ff..fa26b0b32f 100644 --- a/lisp/vc/ediff-mult.el +++ b/lisp/vc/ediff-mult.el @@ -114,8 +114,8 @@ (require 'ediff-util) ;; meta-buffer -(ediff-defvar-local ediff-meta-buffer nil "") -(ediff-defvar-local ediff-parent-meta-buffer nil "") +(ediff-defvar-local ediff-meta-buffer nil) +(ediff-defvar-local ediff-parent-meta-buffer nil) ;; the registry buffer (defvar ediff-registry-buffer nil) @@ -161,23 +161,23 @@ Useful commands (type ? to hide them and free up screen): ;; Variable specifying the action to take when the use invokes ediff in the ;; meta buffer. This is usually ediff-registry-action or ediff-filegroup-action -(ediff-defvar-local ediff-meta-action-function nil "") +(ediff-defvar-local ediff-meta-action-function nil) ;; Tells ediff-update-meta-buffer how to redraw it -(ediff-defvar-local ediff-meta-redraw-function nil "") +(ediff-defvar-local ediff-meta-redraw-function nil) ;; Tells ediff-filegroup-action and similar procedures how to invoke Ediff for ;; the sessions in a given session group -(ediff-defvar-local ediff-session-action-function nil "") +(ediff-defvar-local ediff-session-action-function nil) -(ediff-defvar-local ediff-metajob-name nil "") +(ediff-defvar-local ediff-metajob-name nil) ;; buffer used to collect custom diffs from individual sessions in the group -(ediff-defvar-local ediff-meta-diff-buffer nil "") +(ediff-defvar-local ediff-meta-diff-buffer nil) ;; t means recurse into subdirs when deciding which files have same contents -(ediff-defvar-local ediff-recurse-to-subdirectories nil "") +(ediff-defvar-local ediff-recurse-to-subdirectories nil) ;; history var to use for filtering groups of files -(defvar ediff-filtering-regexp-history nil "") +(defvar ediff-filtering-regexp-history nil) (defcustom ediff-default-filtering-regexp nil "Default regular expression used as a filename filter in multifile comparisons. @@ -194,14 +194,14 @@ Should be a sexp. For instance (car ediff-filtering-regexp-history) or nil." ;; buffer, this means ediff is still working on the pair. ;; Eq-status of a file is t if the file equals some other file in the same ;; group. -(ediff-defvar-local ediff-meta-list nil "") +(ediff-defvar-local ediff-meta-list nil) -(ediff-defvar-local ediff-meta-session-number nil "") +(ediff-defvar-local ediff-meta-session-number nil) ;; the difference list between directories in a directory session group -(ediff-defvar-local ediff-dir-difference-list nil "") -(ediff-defvar-local ediff-dir-diffs-buffer nil "") +(ediff-defvar-local ediff-dir-difference-list nil) +(ediff-defvar-local ediff-dir-diffs-buffer nil) ;; The registry of Ediff sessions. A list of control buffers. (defvar ediff-session-registry nil) diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el index d079711f61..5646fd3d42 100644 --- a/lisp/vc/ediff-util.el +++ b/lisp/vc/ediff-util.el @@ -4074,7 +4074,7 @@ Mail anyway? (y or n) ") ;;; Debug -(ediff-defvar-local ediff-command-begin-time '(0 0 0) "") +(ediff-defvar-local ediff-command-begin-time '(0 0 0)) ;; calculate time used by command (defun ediff-calc-command-time () commit b2164df86ba80cf4b7f3499596fbcf803395b6e7 Author: Stefan Kangas Date: Sat Sep 18 09:13:37 2021 +0200 ; More stylistic docfixes in vc/*.el found by checkdoc diff --git a/lisp/vc/compare-w.el b/lisp/vc/compare-w.el index 7c2e125831..29dfaa7668 100644 --- a/lisp/vc/compare-w.el +++ b/lisp/vc/compare-w.el @@ -188,7 +188,7 @@ If both windows display the same buffer, the mark is pushed twice in that buffer: first in the other window, then in the selected window. -A prefix arg means reverse the value of variable +A prefix arg IGNORE-WHITESPACE, means reverse the value of variable `compare-ignore-whitespace'. If `compare-ignore-whitespace' is nil, then a prefix arg means ignore changes in whitespace. If `compare-ignore-whitespace' is non-nil, then a prefix arg means diff --git a/lisp/vc/diff.el b/lisp/vc/diff.el index 7bb1151602..352fa693ff 100644 --- a/lisp/vc/diff.el +++ b/lisp/vc/diff.el @@ -87,10 +87,10 @@ minibuffer. The default for NEW is the current buffer's file name, and the default for OLD is a backup file for NEW, if one exists. If NO-ASYNC is non-nil, call diff synchronously. -When called interactively with a prefix argument, prompt +When called interactively with a prefix argument SWITCHES, prompt interactively for diff switches. Otherwise, the switches -specified in the variable `diff-switches' are passed to the -diff command. +specified in the variable `diff-switches' are passed to the diff +command. Non-interactively, OLD and NEW may each be a file or a buffer." (interactive @@ -229,7 +229,7 @@ returns the buffer used." Uses the latest backup, if there are several numerical backups. If this file is a backup, diff it with its original. The backup file is the first file given to `diff'. -With prefix arg, prompt for diff switches." +With prefix arg SWITCHES, prompt for diff switches." (interactive (list (read-file-name "Diff (file with backup): ") (diff-switches))) (let (bak ori) @@ -243,7 +243,7 @@ With prefix arg, prompt for diff switches." ;;;###autoload (defun diff-latest-backup-file (fn) - "Return the latest existing backup of FILE, or nil." + "Return the latest existing backup of file FN, or nil." (let ((handler (find-file-name-handler fn 'diff-latest-backup-file))) (if handler (funcall handler 'diff-latest-backup-file fn) diff --git a/lisp/vc/ediff-diff.el b/lisp/vc/ediff-diff.el index 0f90bef2c5..68abea794f 100644 --- a/lisp/vc/ediff-diff.el +++ b/lisp/vc/ediff-diff.el @@ -103,8 +103,8 @@ Use `setq-default' if setting it in .emacs") GNU diff3 doesn't have such an option." :type 'string) -;; the actual options used in comparison -(ediff-defvar-local ediff-actual-diff-options ediff-diff-options "") +(ediff-defvar-local ediff-actual-diff-options ediff-diff-options + "The actual options used in comparison.") (defcustom ediff-custom-diff-program ediff-diff-program "Program to use for generating custom diff output for saving it in a file. @@ -123,8 +123,8 @@ This output is not used by Ediff internally." :set 'ediff-set-diff-options :type 'string) -;; the actual options used in comparison -(ediff-defvar-local ediff-actual-diff3-options ediff-diff3-options "") +(ediff-defvar-local ediff-actual-diff3-options ediff-diff3-options + "The actual options used in comparison.") (defcustom ediff-diff3-ok-lines-regexp "^\\([1-3]:\\|====\\| \\|.*Warning *:\\|.*No newline\\|.*missing newline\\|^\C-m$\\)" @@ -132,16 +132,16 @@ This output is not used by Ediff internally." Lines that do not match are assumed to be error messages." :type 'regexp) -;; keeps the status of the current diff in 3-way jobs. -;; the status can be =diff(A), =diff(B), or =diff(A+B) -(ediff-defvar-local ediff-diff-status "" "") +(ediff-defvar-local ediff-diff-status "" + "Keeps the status of the current diff in 3-way jobs. +The status can be =diff(A), =diff(B), or =diff(A+B).") ;;; Fine differences (ediff-defvar-local ediff-auto-refine (if (ediff-has-face-support-p) 'on 'nix) "If `on', Ediff auto-highlights fine diffs for the current diff region. -If `off', auto-highlighting is not used. If `nix', no fine diffs are shown +If `off', auto-highlighting is not used. If `nix', no fine diffs are shown at all, unless the user force-refines the region by hitting `*'. This variable can be set either in .emacs or toggled interactively. @@ -179,12 +179,12 @@ Lines that do not match are assumed to be error messages.") "Pattern to match lines produced by diff that describe differences.") (ediff-defvar-local ediff-setup-diff-regions-function nil - "value is a function symbol depending on the kind of job is to be done. -For 2-way jobs and for ediff-merge, it should be `ediff-setup-diff-regions'. + "Value is a function symbol depending on the kind of job is to be done. +For 2-way jobs and for `ediff-merge', it should be `ediff-setup-diff-regions'. For jobs requiring diff3, it should be `ediff-setup-diff-regions3'. The function should take three mandatory arguments, file-A, file-B, and -file-C. It may ignore file C for diff2 jobs. It should also take +file-C. It may ignore file C for diff2 jobs. It should also take one optional arguments, diff-number to refine.") @@ -823,13 +823,10 @@ one optional arguments, diff-number to refine.") (setq overlay-list (cons overlay overlay-list)) (if (> (length diff-list) 1) (setq diff-list (cdr (cdr diff-list))) - (error "ediff-set-fine-overlays-for-combined-merge: corrupt list of -delimiter regions")) - ) + (error "Corrupt list of delimiter regions"))) (setq overlay-list (reverse overlay-list)) (ediff-set-fine-diff-vector - reg-num 'C (apply #'vector overlay-list)) - )) + reg-num 'C (apply #'vector overlay-list)))) ;; Convert diff list to overlays for a given DIFF-REGION @@ -1461,8 +1458,7 @@ affects only files whose names match the expression." (message "Ignoring letter case is not supported by this diff program")) (t (sit-for 1) - (ediff-update-diffs))) - ) + (ediff-update-diffs)))) (provide 'ediff-diff) ;;; ediff-diff.el ends here diff --git a/lisp/vc/ediff-help.el b/lisp/vc/ediff-help.el index 2f8f596ed1..0450cd7f23 100644 --- a/lisp/vc/ediff-help.el +++ b/lisp/vc/ediff-help.el @@ -126,9 +126,9 @@ Normally, not a user option. See `ediff-help-message' for details.") (defconst ediff-brief-message-string " Type ? for help" "Contents of the brief help message.") -;; The actual brief help message (ediff-defvar-local ediff-brief-help-message "" - "Normally, not a user option. See `ediff-help-message' for details.") + "The actual brief help message. +Normally, not a user option. See `ediff-help-message' for details.") (ediff-defvar-local ediff-brief-help-message-function nil "The brief help message that the user can customize. @@ -143,7 +143,6 @@ See `ediff-brief-help-message-function' for more.") :type 'boolean :group 'ediff-window) -;; The actual help message. (ediff-defvar-local ediff-help-message "" "The actual help message. Normally, the user shouldn't touch this. However, if you want Ediff to diff --git a/lisp/vc/ediff-init.el b/lisp/vc/ediff-init.el index 1d87b081f2..3ee27cd109 100644 --- a/lisp/vc/ediff-init.el +++ b/lisp/vc/ediff-init.el @@ -81,39 +81,44 @@ that Ediff doesn't know about.") ;; commands) won't destroy Ediff control variables. ;; ;; Plagiarized from `emerge-defvar-local'. -(defmacro ediff-defvar-local (var value doc) - "Defines VAR as a local variable." +(defmacro ediff-defvar-local (symbol value doc) + "Define SYMBOL as an advertised buffer-local variable. +Run `defvar-local', setting the value of the variable to VALUE +and its docstring to DOC. + +Then set the `permanent-local' property, so that +`kill-all-local-variables' (called by major-mode setting +commands) won't destroy Ediff control variables." (declare (indent defun) (doc-string 3)) `(progn - (defvar-local ,var ,value ,doc) - (put ',var 'permanent-local t))) + (defvar-local ,symbol ,value ,doc) + (put ',symbol 'permanent-local t))) ;; Variables that control each Ediff session---local to the control buffer. ;; Mode variables -;; The buffer in which the A variant is stored. -(ediff-defvar-local ediff-buffer-A nil "") -;; The buffer in which the B variant is stored. -(ediff-defvar-local ediff-buffer-B nil "") -;; The buffer in which the C variant is stored or where the merge buffer lives. -(ediff-defvar-local ediff-buffer-C nil "") -;; Ancestor buffer -(ediff-defvar-local ediff-ancestor-buffer nil "") -;; The Ediff control buffer -(ediff-defvar-local ediff-control-buffer nil "") +(ediff-defvar-local ediff-buffer-A nil + "The buffer in which the A variant is stored.") +(ediff-defvar-local ediff-buffer-B nil + "The buffer in which the B variant is stored.") +(ediff-defvar-local ediff-buffer-C nil + "The buffer in which the C variant is stored or where the merge buffer lives.") +(ediff-defvar-local ediff-ancestor-buffer nil + "Ancestor buffer.") +(ediff-defvar-local ediff-control-buffer nil + "The Ediff control buffer.") (ediff-defvar-local ediff-temp-indirect-buffer nil "If t, the buffer is a temporary indirect buffer. It needs to be killed when we quit the session.") - -;; Association between buff-type and ediff-buffer-* (defconst ediff-buffer-alist '((?A . ediff-buffer-A) (?B . ediff-buffer-B) - (?C . ediff-buffer-C))) + (?C . ediff-buffer-C)) + "Association between `buff-type' and `ediff-buffer-*'.") ;;; Macros (defsubst ediff-buffer-live-p (buf) @@ -515,22 +520,22 @@ See the documentation string of `ediff-hide-regexp-matches' for details.") "Function to use in determining which regions to focus on. See the documentation string of `ediff-focus-on-regexp-matches' for details.") -;; Regexp that determines buf A regions to focus on when skipping to diff -(ediff-defvar-local ediff-regexp-focus-A "" "") -;; Regexp that determines buf B regions to focus on when skipping to diff -(ediff-defvar-local ediff-regexp-focus-B "" "") -;; Regexp that determines buf C regions to focus on when skipping to diff -(ediff-defvar-local ediff-regexp-focus-C "" "") +(ediff-defvar-local ediff-regexp-focus-A "" + "Regexp that determines buf A regions to focus on when skipping to diff.") +(ediff-defvar-local ediff-regexp-focus-B "" + "Regexp that determines buf B regions to focus on when skipping to diff.") +(ediff-defvar-local ediff-regexp-focus-C "" + "Regexp that determines buf C regions to focus on when skipping to diff.") ;; connective that determines whether to focus regions that match both or ;; one of the regexps (ediff-defvar-local ediff-focus-regexp-connective 'and "") -;; Regexp that determines buf A regions to ignore when skipping to diff -(ediff-defvar-local ediff-regexp-hide-A "" "") -;; Regexp that determines buf B regions to ignore when skipping to diff -(ediff-defvar-local ediff-regexp-hide-B "" "") -;; Regexp that determines buf C regions to ignore when skipping to diff -(ediff-defvar-local ediff-regexp-hide-C "" "") +(ediff-defvar-local ediff-regexp-hide-A "" + "Regexp that determines buf A regions to ignore when skipping to diff.") +(ediff-defvar-local ediff-regexp-hide-B "" + "Regexp that determines buf B regions to ignore when skipping to diff.") +(ediff-defvar-local ediff-regexp-hide-C "" + "Regexp that determines buf C regions to ignore when skipping to diff.") ;; connective that determines whether to hide regions that match both or ;; one of the regexps (ediff-defvar-local ediff-hide-regexp-connective 'and "") @@ -631,28 +636,28 @@ shown in brighter colors." (put 'ediff-highlight-all-diffs 'permanent-local t) -;; The suffix of the control buffer name. -(ediff-defvar-local ediff-control-buffer-suffix nil "") -;; Same as ediff-control-buffer-suffix, but without <,>. -;; It's a number rather than string. -(ediff-defvar-local ediff-control-buffer-number nil "") +(ediff-defvar-local ediff-control-buffer-suffix nil + "The suffix of the control buffer name.") +(ediff-defvar-local ediff-control-buffer-number nil + "Same as `ediff-control-buffer-suffix', but without \"<,>\". +It's a number rather than string.") -;; The original values of ediff-protected-variables for buffer A -(ediff-defvar-local ediff-buffer-values-orig-A nil "") -;; The original values of ediff-protected-variables for buffer B -(ediff-defvar-local ediff-buffer-values-orig-B nil "") -;; The original values of ediff-protected-variables for buffer C -(ediff-defvar-local ediff-buffer-values-orig-C nil "") -;; The original values of ediff-protected-variables for buffer Ancestor -(ediff-defvar-local ediff-buffer-values-orig-Ancestor nil "") +(ediff-defvar-local ediff-buffer-values-orig-A nil + "The original values of ediff-protected-variables for buffer A.") +(ediff-defvar-local ediff-buffer-values-orig-B nil + "The original values of ediff-protected-variables for buffer B.") +(ediff-defvar-local ediff-buffer-values-orig-C nil + "The original values of ediff-protected-variables for buffer C.") +(ediff-defvar-local ediff-buffer-values-orig-Ancestor nil + "The original values of ediff-protected-variables for buffer Ancestor.") -;; association between buff-type and ediff-buffer-values-orig-* (defconst ediff-buffer-values-orig-alist '((A . ediff-buffer-values-orig-A) (B . ediff-buffer-values-orig-B) (C . ediff-buffer-values-orig-C) - (Ancestor . ediff-buffer-values-orig-Ancestor))) + (Ancestor . ediff-buffer-values-orig-Ancestor)) + "Association between buff-type and `ediff-buffer-values-orig-*'.") ;; Buffer-local variables to be saved then restored during Ediff sessions (defconst ediff-protected-variables '( @@ -665,37 +670,37 @@ shown in brighter colors." ;; indicates the way a diff region was created in buffer C. ;; state-of-ancestor says if the corresponding region in ancestor buffer is ;; empty. -(ediff-defvar-local ediff-state-of-merge nil "") - -;; The difference that is currently selected. -(ediff-defvar-local ediff-current-difference -1 "") -;; Number of differences found. -(ediff-defvar-local ediff-number-of-differences nil "") - -;; Buffer containing the output of diff, which is used by Ediff to step -;; through files. -(ediff-defvar-local ediff-diff-buffer nil "") -;; Like ediff-diff-buffer, but contains context diff. It is not used by -;; Ediff, but it is saved in a file, if user requests so. -(ediff-defvar-local ediff-custom-diff-buffer nil "") -;; Buffer used for diff-style fine differences between regions. -(ediff-defvar-local ediff-fine-diff-buffer nil "") +(ediff-defvar-local ediff-state-of-merge nil) + +(ediff-defvar-local ediff-current-difference -1 + "The difference that is currently selected.") +(ediff-defvar-local ediff-number-of-differences nil + "Number of differences found.") + +(ediff-defvar-local ediff-diff-buffer nil + "Buffer containing the output of diff, which is used to step through files.") +(ediff-defvar-local ediff-custom-diff-buffer nil + "Like `ediff-diff-buffer', but contains context diff. +It is not used by Ediff, but it is saved in a file, if user +requests so.") +(ediff-defvar-local ediff-fine-diff-buffer nil + "Buffer used for diff-style fine differences between regions.") (defconst ediff-tmp-buffer " *ediff-tmp*" "Temporary buffer used for computing fine differences.") (defconst ediff-msg-buffer " *ediff-message*" "Buffer used for messages.") -;; Buffer containing the output of diff when diff returns errors. -(ediff-defvar-local ediff-error-buffer nil "") -;; Buffer to display debug info -(ediff-defvar-local ediff-debug-buffer "*ediff-debug*" "") +(ediff-defvar-local ediff-error-buffer nil + "Buffer containing the output of diff when diff returns errors.") +(ediff-defvar-local ediff-debug-buffer "*ediff-debug*" + "Buffer to display debug info.") -;; List of ediff control panels associated with each buffer A/B/C/Ancestor. -;; Not used any more, but may be needed in the future. -(ediff-defvar-local ediff-this-buffer-ediff-sessions nil "") +(ediff-defvar-local ediff-this-buffer-ediff-sessions nil + "List of ediff control panels associated with each buffer A/B/C/Ancestor. +Not used any more, but may be needed in the future.") ;; to be deleted in due time ;; List of difference overlays disturbed by working with the current diff. -(defvar ediff-disturbed-overlays nil "") +(defvar ediff-disturbed-overlays nil) (defcustom ediff-version-control-package 'vc "Version control package used. @@ -707,7 +712,7 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire." :group 'ediff) (defcustom ediff-coding-system-for-read 'raw-text - "The coding system for read to use when running the diff program as a subprocess. + "Coding system for read to use when running the diff program as a subprocess. In most cases, the default will do. However, under certain circumstances in MS-Windows you might need to use something like `raw-text-dos' here. So, if the output that your diff program sends to Emacs contains extra ^M's, @@ -717,8 +722,9 @@ work." :group 'ediff) (defcustom ediff-coding-system-for-write 'emacs-internal - "The coding system for write to use when writing out difference regions -to temp files in buffer jobs and when Ediff needs to find fine differences." + "Coding system for write to use when writing out difference regions. +This is used when writing to temp files in buffer jobs and when +Ediff needs to find fine differences." :type 'symbol :group 'ediff) @@ -789,7 +795,7 @@ to temp files in buffer jobs and when Ediff needs to find fine differences." (defun ediff-set-face-pixmap (face pixmap) - "Set face pixmap on a monochrome display." + "Set stipple pixmap of FACE to PIXMAP on a monochrome display." (if (and (ediff-window-display-p) (not (display-color-p))) (condition-case nil (set-face-background-pixmap face pixmap) @@ -1232,8 +1238,8 @@ or `ediff-merge-directory-revisions'." :group 'ediff-merge) (make-variable-buffer-local 'ediff-autostore-merges) -;; file where the result of the merge is to be saved. used internally -(ediff-defvar-local ediff-merge-store-file nil "") +(ediff-defvar-local ediff-merge-store-file nil + "File where the result of the merge is to be saved. Internal.") (defcustom ediff-merge-filename-prefix "merge_" "Prefix to be attached to saved merge buffers." @@ -1266,12 +1272,12 @@ This default should work without changes." (make-obsolete-variable 'ediff-H-glyph nil "28.1") -;; Temporary file used for refining difference regions in buffer A. -(ediff-defvar-local ediff-temp-file-A nil "") -;; Temporary file used for refining difference regions in buffer B. -(ediff-defvar-local ediff-temp-file-B nil "") -;; Temporary file used for refining difference regions in buffer C. -(ediff-defvar-local ediff-temp-file-C nil "") +(ediff-defvar-local ediff-temp-file-A nil + "Temporary file used for refining difference regions in buffer A.") +(ediff-defvar-local ediff-temp-file-B nil + "Temporary file used for refining difference regions in buffer B.") +(ediff-defvar-local ediff-temp-file-C nil + "Temporary file used for refining difference regions in buffer C.") (defun ediff-file-remote-p (file-name) diff --git a/lisp/vc/ediff-mult.el b/lisp/vc/ediff-mult.el index cfb58349eb..a26db3c4ff 100644 --- a/lisp/vc/ediff-mult.el +++ b/lisp/vc/ediff-mult.el @@ -232,8 +232,8 @@ on `ediff-quit', `ediff-suspend', or `ediff-quit-session-group-hook'." (make-obsolete-variable 'ediff-before-session-group-setup-hooks nil "27.1") (defcustom ediff-after-session-group-setup-hook nil - "Hooks run just after a meta-buffer controlling a session group, such as -ediff-directories, is run." + "Hooks run just after a meta-buffer controlling a session group is run. +One example of this is `ediff-directories'." :type 'hook) (defcustom ediff-quit-session-group-hook nil "Hooks run just before exiting a session group." @@ -251,8 +251,8 @@ This means that you can set different bindings for different kinds of meta buffers." :type 'hook) -;; Buffer holding the multi-file patch. Local to the meta buffer -(ediff-defvar-local ediff-meta-patchbufer nil "") +(ediff-defvar-local ediff-meta-patchbufer nil + "Buffer holding the multi-file patch. Local to the meta buffer.") ;;; API for ediff-meta-list @@ -366,8 +366,8 @@ buffers." (ediff-defvar-local ediff-verbose-help-enabled nil - "If t, display redundant help in ediff-directories and other meta buffers. -Toggled by ediff-toggle-verbose-help-meta-buffer" ) + "If t, display redundant help in `ediff-directories' and other meta buffers. +Toggled by `ediff-toggle-verbose-help-meta-buffer'.") ;; Toggle verbose help in meta-buffers ;; TODO: Someone who understands all this can make it better. @@ -459,7 +459,9 @@ Commands: (defun ediff-next-meta-item (count) "Move to the next item in Ediff registry or session group buffer. -Moves in circular fashion. With numeric prefix arg, skip this many items." +Moves in circular fashion. + +With numeric prefix arg COUNT, skip this many items." (interactive "p") (or count (setq count 1)) (let (overl) @@ -487,7 +489,9 @@ Moves in circular fashion. With numeric prefix arg, skip this many items." (defun ediff-previous-meta-item (count) "Move to the previous item in Ediff registry or session group buffer. -Moves in circular fashion. With numeric prefix arg, skip this many items." +Moves in circular fashion. + +With numeric prefix arg COUNT, skip this many items." (interactive "p") (or count (setq count 1)) (let (overl) @@ -1530,7 +1534,9 @@ Useful commands: (ediff-overlay-put overl 'ediff-meta-session-number session-number)))) (defun ediff-mark-for-hiding-at-pos (unmark) - "Mark session for hiding. With prefix arg, unmark." + "Mark session for hiding. + +With prefix arg UNMARK, unmark instead." (interactive "P") (let* ((pos (ediff-event-point last-command-event)) (meta-buf (ediff-event-buffer last-command-event)) @@ -1540,10 +1546,9 @@ Useful commands: (ediff-mark-session-for-hiding info unmark) (ediff-next-meta-item 1) (save-excursion - (ediff-update-meta-buffer meta-buf nil session-number)) - )) + (ediff-update-meta-buffer meta-buf nil session-number)))) -;; Returns whether session was marked or unmarked +;; Return whether session was marked or unmarked. (defun ediff-mark-session-for-hiding (info unmark) (let (ignore) (cond ((eq unmark 'mark) (setq unmark nil)) @@ -1559,7 +1564,9 @@ Useful commands: (defun ediff-mark-for-operation-at-pos (unmark) - "Mark session for a group operation. With prefix arg, unmark." + "Mark session for a group operation. + +With prefix arg UNMARK, unmark instead." (interactive "P") (let* ((pos (ediff-event-point last-command-event)) (meta-buf (ediff-event-buffer last-command-event)) @@ -1588,7 +1595,9 @@ Useful commands: (defun ediff-hide-marked-sessions (unhide) - "Hide marked sessions. With prefix arg, unhide." + "Hide marked sessions. + +With prefix arg UNHIDE, unhide instead." (interactive "P") (let ((grp-buf (ediff-get-group-buffer ediff-meta-list)) (meta-list (cdr ediff-meta-list)) diff --git a/lisp/vc/ediff-ptch.el b/lisp/vc/ediff-ptch.el index d52910efce..4135e8b470 100644 --- a/lisp/vc/ediff-ptch.el +++ b/lisp/vc/ediff-ptch.el @@ -128,18 +128,19 @@ You probably don't want to change that, unless you are using an obscure patch program." :type 'regexp) -;; The buffer of the patch file. Local to control buffer. -(ediff-defvar-local ediff-patchbufer nil "") - -;; The buffer where patch displays its diagnostics. -(ediff-defvar-local ediff-patch-diagnostics nil "") - -;; Map of patch buffer. Has the form: -;; ((filename1 marker1 marker2) (filename2 marker1 marker2) ...) -;; where filenames are files to which patch would have applied the patch; -;; marker1 delimits the beginning of the corresponding patch and marker2 does -;; it for the end. -(ediff-defvar-local ediff-patch-map nil "") +(ediff-defvar-local ediff-patchbufer nil + "The buffer of the patch file. Local to control buffer.") + +(ediff-defvar-local ediff-patch-diagnostics nil + "The buffer where patch displays its diagnostics.") + +(ediff-defvar-local ediff-patch-map nil + "Map of patch buffer. +Has the form: + ((filename1 marker1 marker2) (filename2 marker1 marker2) ...) +where filenames are files to which patch would have applied the patch; +marker1 delimits the beginning of the corresponding patch and marker2 does +it for the end.") ;; strip prefix from filename ;; returns /dev/null, if can't strip prefix diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el index 74c6aba1e4..d079711f61 100644 --- a/lisp/vc/ediff-util.el +++ b/lisp/vc/ediff-util.el @@ -513,7 +513,7 @@ to invocation.") ;; This function assumes that we are in the window where control buffer is ;; to reside. (defun ediff-setup-control-buffer (ctl-buf) - "Set up window for control buffer." + "Set up window for control buffer CTL-BUF." (if (window-dedicated-p) (set-buffer ctl-buf) ; we are in control frame but just in case (switch-to-buffer ctl-buf)) @@ -661,7 +661,7 @@ if necessary." (message "") )) -;; Not bound to any key---to dangerous. A user can do it if necessary. +;; Not bound to any key---too dangerous. A user can do it if necessary. (defun ediff-revert-buffers-then-recompute-diffs (noconfirm) "Revert buffers A, B and C. Then rerun Ediff on file A and file B." (interactive "P") @@ -696,11 +696,12 @@ if necessary." (ediff-merge-buffers bufA bufB))) (ediff-update-diffs)))) - -;; optional NO-REHIGHLIGHT says to not rehighlight buffers (defun ediff-recenter (&optional no-rehighlight) "Bring the highlighted region of all buffers being compared into view. -Reestablish the default window display." +Reestablish the default window display. + +If optional NO-REHIGHLIGHT is non-nil, do not rehighlight +buffers." (interactive) (ediff-barf-if-not-control-buffer) (let (buffer-read-only) @@ -965,7 +966,7 @@ Please report this bug to bug-gnu-emacs@gnu.org") (message "Showing ancestor buffer"))) (defun ediff-make-or-kill-fine-diffs (arg) - "Compute fine diffs. With negative prefix arg, kill fine diffs. + "Compute fine diffs. With negative prefix ARG, kill fine diffs. In both cases, operates on the current difference region." (interactive "P") (ediff-barf-if-not-control-buffer) @@ -1329,7 +1330,7 @@ To change the default, set the variable `ediff-use-toolbar-p', which see." ;; Merging (defun ediff-toggle-show-clashes-only () - "Toggle the mode that shows only the merge regions where both variants differ from the ancestor." + "Toggle mode showing only merge regions where both variants differ from ancestor." (interactive) (ediff-barf-if-not-control-buffer) (if (not ediff-merge-with-ancestor-job) @@ -1510,7 +1511,7 @@ the one half of the height of window-A." (defun ediff-scroll-horizontally (&optional arg) "Horizontally scroll buffers A, B (and C if appropriate). -If an argument is given, that is how many columns are scrolled, else nearly +With prefix argument ARG, scroll that many columns, else nearly the width of the A/B/C windows." (interactive "P") (ediff-barf-if-not-control-buffer) @@ -1678,7 +1679,7 @@ the width of the A/B/C windows." (defun ediff-next-difference (&optional arg) "Advance to the next difference. -With a prefix argument, go forward that many differences." +With a prefix argument ARG, go forward that many differences." (interactive "p") (ediff-barf-if-not-control-buffer) (if (< ediff-current-difference ediff-number-of-differences) @@ -1729,7 +1730,7 @@ With a prefix argument, go forward that many differences." (defun ediff-previous-difference (&optional arg) "Go to the previous difference. -With a prefix argument, go back that many differences." +With a prefix argument ARG, go back that many differences." (interactive "p") (ediff-barf-if-not-control-buffer) (if (> ediff-current-difference -1) @@ -1779,8 +1780,9 @@ With a prefix argument, go back that many differences." ;; The diff number is as perceived by the user (i.e., 1+ the internal ;; representation) (defun ediff-jump-to-difference (difference-number) - "Go to the difference specified as a prefix argument. -If the prefix is negative, count differences from the end." + "Go to the difference specified as a prefix argument DIFFERENCE-NUMBER. +If the prefix argument is negative, count differences from the +end." (interactive "p") (ediff-barf-if-not-control-buffer) (setq difference-number @@ -1801,8 +1803,9 @@ If the prefix is negative, count differences from the end." The buffer depends on last command character \(a, b, or c) that invoked this command. For instance, if the command was `ga' then the point value in buffer A is used. -With a prefix argument, synchronize all files around the current point position -in the specified buffer." + +With a prefix argument ARG, synchronize all files around the +current point position in the specified buffer." (interactive "P") (ediff-barf-if-not-control-buffer) (let* ((buf-type (ediff-char-to-buftype last-command-event)) @@ -1898,15 +1901,17 @@ in the specified buffer." (defun ediff-diff-to-diff (arg &optional keys) "Copy buffer-X'th difference region to buffer Y (X,Y are A, B, or C). -If numerical prefix argument, copy the difference specified in the arg. +With numerical prefix argument ARG, copy the difference specified +in the arg. Otherwise, copy the difference given by `ediff-current-difference'. This command assumes it is bound to a 2-character key sequence, `ab', `ba', `ac', etc., which is used to determine the types of buffers to be used for copying difference regions. The first character in the sequence specifies the source buffer and the second specifies the target. -If the second optional argument, a 2-character string, is given, use it to -determine the source and the target buffers instead of the command keys." +If optional argument KEYS, a 2-character string, is given, use it +to determine the source and the target buffers instead of the +command keys." (interactive "P") (ediff-barf-if-not-control-buffer) (or keys (setq keys (this-command-keys))) @@ -2137,8 +2142,9 @@ ARG is a prefix argument. If nil, copy the current difference region." (defun ediff-restore-diff (arg &optional key) "Restore ARGth diff from `ediff-killed-diffs-alist'. ARG is a prefix argument. If ARG is nil, restore the current-difference. -If the second optional argument, a character, is given, use it to -determine the target buffer instead of `ediff-last-command-char'." +If the second optional argument KEY, a character, is given, use +it to determine the target buffer instead of +`ediff-last-command-char'." (interactive "P") (ediff-barf-if-not-control-buffer) (if (numberp arg) @@ -2157,8 +2163,8 @@ ARG is a prefix argument. If nil, restore the current diff." (defun ediff-toggle-regexp-match () - "Toggle between focusing and hiding of difference regions that match -a regular expression typed in by the user." + "Toggle between focusing and hiding difference regions matching a regexp. +Prompt the user for regular expression." (interactive) (ediff-barf-if-not-control-buffer) (let ((regexp-A "") @@ -2358,9 +2364,11 @@ flags of the compared file buffers, kills Ediff buffers for this session \(but not buffers A, B, C). If `ediff-keep-variants' is nil, the user will be asked whether the buffers -containing the variants should be removed \(if they haven't been modified). -If it is t, they will be preserved unconditionally. A prefix argument, -temporarily reverses the meaning of this variable." +containing the variants should be removed (if they haven't been modified). +If it is t, they will be preserved unconditionally. + +With prefix argument REVERSE-DEFAULT-KEEP-VARIANTS, temporarily +reverse the meaning of this variable." (interactive "P") (ediff-barf-if-not-control-buffer) (let ((ctl-buf (current-buffer)) @@ -3269,7 +3277,7 @@ Hit \\[ediff-recenter] to reset the windows afterward." `wa' saves buffer A, `wb' saves buffer B, `wc' saves buffer C, and `wd' saves the diff output. -With prefix argument, `wd' saves plain diff output. +With prefix argument ARG, `wd' saves plain diff output. Without an argument, it saves customized diff argument, if available \(and plain output, if customized output was not generated)." (interactive "P") diff --git a/lisp/vc/ediff-wind.el b/lisp/vc/ediff-wind.el index 7c90348b5d..bc6aa28850 100644 --- a/lisp/vc/ediff-wind.el +++ b/lisp/vc/ediff-wind.el @@ -89,25 +89,25 @@ provided functions are written." (function :tag "Other function")) :version "24.3") -;; indicates if we are in a multiframe setup -(ediff-defvar-local ediff-multiframe nil "") - -;; Share of the frame occupied by the merge window (buffer C) -(ediff-defvar-local ediff-merge-window-share 0.45 "") - -;; The control window. -(ediff-defvar-local ediff-control-window nil "") -;; Official window for buffer A -(ediff-defvar-local ediff-window-A nil "") -;; Official window for buffer B -(ediff-defvar-local ediff-window-B nil "") -;; Official window for buffer C -(ediff-defvar-local ediff-window-C nil "") -;; Official window for buffer Ancestor -(ediff-defvar-local ediff-window-Ancestor nil "") -;; Ediff's window configuration. -;; Used to minimize the need to rearrange windows. -(ediff-defvar-local ediff-window-config-saved "" "") +(ediff-defvar-local ediff-multiframe nil + "Indicates if we are in a multiframe setup.") + +(ediff-defvar-local ediff-merge-window-share 0.45 + "Share of the frame occupied by the merge window (buffer C).") + +(ediff-defvar-local ediff-control-window nil + "The control window.") +(ediff-defvar-local ediff-window-A nil + "Official window for buffer A.") +(ediff-defvar-local ediff-window-B nil + "Official window for buffer B.") +(ediff-defvar-local ediff-window-C nil + "Official window for buffer C.") +(ediff-defvar-local ediff-window-Ancestor nil + "Official window for buffer Ancestor.") +(ediff-defvar-local ediff-window-config-saved "" + "Ediff's window configuration. +Used to minimize the need to rearrange windows.") ;; Association between buff-type and ediff-window-* (defconst ediff-window-alist @@ -176,9 +176,9 @@ In this case, Ediff will use those frames to display these buffers." "Frame parameters for displaying Ediff Control Panel. Used internally---not a user option.") -;; position of the mouse; used to decide whether to warp the mouse into ctl -;; frame -(ediff-defvar-local ediff-mouse-pixel-position nil "") +(ediff-defvar-local ediff-mouse-pixel-position nil + "Position of the mouse. +Used to decide whether to warp the mouse into control frame.") ;; not used for now (defvar ediff-mouse-pixel-threshold 30 @@ -227,12 +227,10 @@ customization of the default." ;; Wide frame display -;; t means Ediff is using wide display -(ediff-defvar-local ediff-wide-display-p nil "") -;; keeps frame config for toggling wide display +(ediff-defvar-local ediff-wide-display-p nil + "If t, Ediff is using wide display.") (ediff-defvar-local ediff-wide-display-orig-parameters nil - "Frame parameters to be restored when the user wants to toggle the wide -display off.") + "Frame parameters to restore when toggling the wide display off.") (ediff-defvar-local ediff-wide-display-frame nil "Frame to be used for wide display.") (ediff-defvar-local ediff-make-wide-display-function #'ediff-make-wide-display @@ -243,8 +241,8 @@ frame parameters in `ediff-wide-display-orig-parameters'. The variable `ediff-wide-display-frame' should be set to contain the frame used for the wide display.") -;; Frame used for the control panel in a windowing system. -(ediff-defvar-local ediff-control-frame nil "") +(ediff-defvar-local ediff-control-frame nil + "Frame used for the control panel in a windowing system.") (defcustom ediff-prefer-iconified-control-frame nil "If t, keep control panel iconified when help message is off. @@ -844,7 +842,7 @@ keyboard input to go into icons." (defun ediff-skip-unsuitable-frames (&optional ok-unsplittable) "Skip unsplittable frames and frames that have dedicated windows. -create a new splittable frame if none is found." +Create a new splittable frame if none is found." (if (ediff-window-display-p) (let ((wind-frame (window-frame)) seen-windows) diff --git a/lisp/vc/ediff.el b/lisp/vc/ediff.el index e884ed8c51..74ed1bd0ef 100644 --- a/lisp/vc/ediff.el +++ b/lisp/vc/ediff.el @@ -551,9 +551,11 @@ symbol describing the Ediff job type; it defaults to ;;;###autoload (defun ediff-directories (dir1 dir2 regexp) - "Run Ediff on a pair of directories, DIR1 and DIR2, comparing files that have -the same name in both. The third argument, REGEXP, is nil or a regular -expression; only file names that match the regexp are considered." + "Run Ediff on directories DIR1 and DIR2, comparing files. +Consider only files that have the same name in both directories. + +REGEXP is nil or a regular expression; only file names that match +the regexp are considered." (interactive (let ((dir-A (ediff-get-default-directory-name)) (default-regexp (eval ediff-default-filtering-regexp t)) @@ -608,10 +610,11 @@ names. Only the files that are under revision control are taken into account." ;;;###autoload (defun ediff-directories3 (dir1 dir2 dir3 regexp) - "Run Ediff on three directories, DIR1, DIR2, and DIR3, comparing files that -have the same name in all three. The last argument, REGEXP, is nil or a -regular expression; only file names that match the regexp are considered." + "Run Ediff on directories DIR1, DIR2, and DIR3, comparing files. +Consider only files that have the same name in all three directories. +REGEXP is nil or a regular expression; only file names that match +the regexp are considered." (interactive (let ((dir-A (ediff-get-default-directory-name)) (default-regexp (eval ediff-default-filtering-regexp t)) diff --git a/lisp/vc/emerge.el b/lisp/vc/emerge.el index b363fa256b..25de2f0e9e 100644 --- a/lisp/vc/emerge.el +++ b/lisp/vc/emerge.el @@ -26,15 +26,17 @@ ;;; Macros -(defmacro emerge-defvar-local (var value doc) +(defmacro emerge-defvar-local (symbol value doc) "Define SYMBOL as an advertised buffer-local variable. -Performs a defvar, then executes `make-variable-buffer-local' on -the variable. Also sets the `permanent-local' property, so that -`kill-all-local-variables' (called by major-mode setting commands) -won't destroy Emerge control variables." +Run `defvar-local', setting the value of the variable to VALUE +and its docstring to DOC. + +Then set the `permanent-local' property, so that +`kill-all-local-variables' (called by major-mode setting +commands) won't destroy Emerge control variables." `(progn - (defvar-local ,var ,value ,doc) - (put ',var 'permanent-local t))) + (defvar-local ,symbol ,value ,doc) + (put ',symbol 'permanent-local t))) ;; We need to define this function so describe-mode can describe Emerge mode. (define-minor-mode emerge-mode @@ -217,8 +219,7 @@ depend on the flags." (emerge-new-flags) (defcustom emerge-min-visible-lines 3 - "Number of lines that we want to show above and below the flags when we are -displaying a difference." + "Number of lines to show above and below the flags when displaying a difference." :type 'integer) (defcustom emerge-temp-file-prefix @@ -434,8 +435,7 @@ or nil if there is none.") '((buffer-modified-p set-buffer-modified-p) buffer-read-only buffer-auto-save-file-name) - "Variables and properties of a buffer which are saved, modified and restored -during a merge.") + "Variables and properties of a buffer to save, modify and restore during a merge.") (defconst emerge-merging-values '(nil t nil) "Values to be assigned to emerge-saved-variables during a merge.") @@ -825,7 +825,7 @@ This is *not* a user option, since Emerge uses it for its own processing.") ;;;###autoload (defun emerge-files (_arg file-A file-B file-out &optional startup-hooks quit-hooks) - "Run Emerge on two files." + "Run Emerge on two files FILE-A and FILE-B." (interactive (let (f) (list current-prefix-arg @@ -874,7 +874,7 @@ This is *not* a user option, since Emerge uses it for its own processing.") ;;;###autoload (defun emerge-buffers (buffer-A buffer-B &optional startup-hooks quit-hooks) - "Run Emerge on two buffers." + "Run Emerge on two buffers BUFFER-A and BUFFER-B." (interactive "bBuffer A to merge: \nbBuffer B to merge: ") (let ((emerge-file-A (emerge-make-temp-file "A")) (emerge-file-B (emerge-make-temp-file "B"))) @@ -1773,15 +1773,15 @@ BEG must be at the beginning of a line." (emerge-unselect-and-select-difference n))) (error "At beginning"))) -(defun emerge-jump-to-difference (difference-number) - "Go to the N-th difference." +(defun emerge-jump-to-difference (n) + "Go to difference number N." (interactive "p") (let ((inhibit-read-only t)) - (setq difference-number (1- difference-number)) - (if (and (>= difference-number -1) - (< difference-number (1+ emerge-number-of-differences))) - (emerge-unselect-and-select-difference difference-number) - (error "Bad difference number")))) + (setq n (1- n)) + (if (and (>= n -1) + (< n (1+ emerge-number-of-differences))) + (emerge-unselect-and-select-difference n) + (error "Bad difference number: %s" n)))) (defun emerge-abort () "Abort the Emerge session." @@ -1790,7 +1790,7 @@ BEG must be at the beginning of a line." (defun emerge-quit (arg) "Finish the Emerge session and exit Emerge. -Prefix argument means to abort rather than successfully finish. +Prefix argument ARG means to abort rather than successfully finish. The difference depends on how the merge was started, but usually means to not write over one of the original files, or to signal to some process which invoked Emerge a failure code. @@ -1849,7 +1849,7 @@ buffer after this will cause serious problems." "Select the A variant of this difference. Refuses to function if this difference has been edited, i.e., if it is neither the A nor the B variant. -A prefix argument forces the variant to be selected +With prefix argument FORCE, force the variant to be selected even if the difference has been edited." (interactive "P") (let ((operate #'emerge-select-A-edit) @@ -1876,7 +1876,7 @@ even if the difference has been edited." "Select the B variant of this difference. Refuses to function if this difference has been edited, i.e., if it is neither the A nor the B variant. -A prefix argument forces the variant to be selected +With prefix argument FORCE, force the variant to be selected even if the difference has been edited." (interactive "P") (let ((operate #'emerge-select-B-edit) @@ -1973,8 +1973,8 @@ must be prefixed with \\\\[emerge-basic-keymap]." "Toggle Auto-Advance mode, for Emerge. This mode causes `emerge-select-A' and `emerge-select-B' to automatically advance to the next difference. -With a positive argument, turn on Auto-Advance mode. -With a negative argument, turn off Auto-Advance mode." +With a positive argument ARG, turn on Auto-Advance mode. +With a negative argument ARG, turn off Auto-Advance mode." (interactive "P") (setq emerge-auto-advance (if (null arg) (not emerge-auto-advance) @@ -1988,8 +1988,8 @@ With a negative argument, turn off Auto-Advance mode." "Toggle Skip-Prefers mode, for Emerge. This mode causes `emerge-next-difference' and `emerge-previous-difference' to automatically skip over differences for which there is a preference. -With a positive argument, turn on Skip-Prefers mode. -With a negative argument, turn off Skip-Prefers mode." +With a positive argument ARG, turn on Skip-Prefers mode. +With a negative argument ARG, turn off Skip-Prefers mode." (interactive "P") (setq emerge-skip-prefers (if (null arg) (not emerge-skip-prefers) @@ -2028,7 +2028,7 @@ With a negative argument, turn off Skip-Prefers mode." (defun emerge-insert-A (arg) "Insert the A variant of this difference at the point. Leaves point after text, mark before. -With prefix argument, puts point before, mark after." +With prefix argument ARG, puts point before, mark after." (interactive "P") (emerge-validate-difference) (let* ((diff-vector @@ -2046,7 +2046,7 @@ With prefix argument, puts point before, mark after." (defun emerge-insert-B (arg) "Insert the B variant of this difference at the point. Leaves point after text, mark before. -With prefix argument, puts point before, mark after." +With prefix argument ARG, puts point before, mark after." (interactive "P") (emerge-validate-difference) (let* ((diff-vector @@ -2063,7 +2063,7 @@ With prefix argument, puts point before, mark after." (defun emerge-mark-difference (arg) "Leave the point before this difference and the mark after it. -With prefix argument, puts mark before, point after." +With prefix argument ARG, put mark before, point after." (interactive "P") (emerge-validate-difference) (let* ((diff-vector @@ -2079,7 +2079,7 @@ With prefix argument, puts mark before, point after." (defun emerge-file-names () "Show the names of the buffers or files being operated on by Emerge. -Use C-u l to reset the windows afterward." +Use \\[universal-argument] l to reset the windows afterward." (interactive) (delete-other-windows) (let ((temp-buffer-show-function @@ -2122,7 +2122,7 @@ Use C-u l to reset the windows afterward." (defun emerge-join-differences (arg) "Join the selected difference with the following one. -With a prefix argument, join with the preceding one." +With a prefix argument ARG, join with the preceding one." (interactive "P") (let ((n emerge-current-difference)) ;; adjust n to be first difference to join @@ -2332,9 +2332,9 @@ ancestor version does not share.)" ;; to have it ask for a buffer. (defun emerge-find-difference (arg) "Find the difference containing the current position of the point. -If there is no containing difference and the prefix argument is positive, -it finds the nearest following difference. A negative prefix argument finds -the nearest previous difference." +If there is no containing difference and the prefix argument ARG +is positive, find the nearest following difference. With +negative prefix argument, find the nearest previous difference." (interactive "P") (cond ((eq (current-buffer) emerge-A-buffer) (emerge-find-difference-A arg)) @@ -2344,9 +2344,9 @@ the nearest previous difference." (defun emerge-find-difference-merge (arg) "Find the difference containing point, in the merge buffer. -If there is no containing difference and the prefix argument is positive, -it finds the nearest following difference. A negative prefix argument finds -the nearest previous difference." +If there is no containing difference and the prefix argument ARG +is positive, find the nearest following difference. With +negative prefix argument, find the nearest previous difference." (interactive "P") ;; search for the point in the merge buffer, using the markers ;; for the beginning and end of the differences in the merge buffer @@ -2355,9 +2355,9 @@ the nearest previous difference." (defun emerge-find-difference-A (arg) "Find the difference containing point, in the A buffer. This command must be executed in the merge buffer. -If there is no containing difference and the prefix argument is positive, -it finds the nearest following difference. A negative prefix argument finds -the nearest previous difference." +If there is no containing difference and the prefix argument ARG +is positive, find the nearest following difference. With +negative prefix argument, find the nearest previous difference." (interactive "P") ;; search for the point in the A buffer, using the markers ;; for the beginning and end of the differences in the A buffer @@ -2368,9 +2368,9 @@ the nearest previous difference." (defun emerge-find-difference-B (arg) "Find the difference containing point, in the B buffer. This command must be executed in the merge buffer. -If there is no containing difference and the prefix argument is positive, -it finds the nearest following difference. A negative prefix argument finds -the nearest previous difference." +If there is no containing difference and the prefix argument ARG +is positive, find the nearest following difference. With +negative prefix argument, find the nearest previous difference." (interactive "P") ;; search for the point in the B buffer, using the markers ;; for the beginning and end of the differences in the B buffer @@ -2450,8 +2450,10 @@ merge buffers." (defun emerge-set-combine-template (string &optional localize) "Set `emerge-combine-versions-template' to STRING. This value controls how `emerge-combine-versions' combines the two versions. -With prefix argument, `emerge-combine-versions-template' is made local to this -merge buffer. Localization is permanent for any particular merge buffer." + +With prefix argument LOCALIZE, `emerge-combine-versions-template' +is made local to this merge buffer. Localization is permanent +for any particular merge buffer." (interactive "s\nP") (if localize (make-local-variable 'emerge-combine-versions-template)) @@ -2464,8 +2466,10 @@ merge buffer. Localization is permanent for any particular merge buffer." (defun emerge-set-combine-versions-template (start end &optional localize) "Copy region into `emerge-combine-versions-template'. This controls how `emerge-combine-versions' will combine the two versions. -With prefix argument, `emerge-combine-versions-template' is made local to this -merge buffer. Localization is permanent for any particular merge buffer." + +With prefix argument LOCALIZE, `emerge-combine-versions-template' +is made local to this merge buffer. Localization is permanent +for any particular merge buffer." (interactive "r\nP") (if localize (make-local-variable 'emerge-combine-versions-template)) @@ -2479,8 +2483,9 @@ merge buffer. Localization is permanent for any particular merge buffer." "Combine versions using the template in `emerge-combine-versions-template'. Refuses to function if this difference has been edited, i.e., if it is neither the A nor the B variant. -An argument forces the variant to be selected even if the difference has -been edited." + +With prefix argument FORCE, force the variant to be selected even +if the difference has been edited." (interactive "P") (emerge-combine-versions-internal emerge-combine-versions-template force)) @@ -2490,8 +2495,9 @@ See documentation of the variable `emerge-combine-versions-template' for how the template is interpreted. Refuses to function if this difference has been edited, i.e., if it is neither the A nor the B variant. -An argument forces the variant to be selected even if the difference has -been edited. + +With prefix argument CHAR, force the variant to be selected even +if the difference has been edited. Interactively, reads the register using `register-read-with-preview'." (interactive (list @@ -2539,9 +2545,9 @@ Interactively, reads the register using `register-read-with-preview'." (if emerge-auto-advance (emerge-next-difference)))) (defun emerge-set-merge-mode (mode) - "Set the major mode in a merge buffer. -Overrides any change that the mode might make to the mode line or local -keymap. Leaves merge in fast mode." + "Set the major mode to MODE in a merge buffer. +Override any change that the mode might make to the mode line or +local keymap. Leave merge in fast mode." (interactive (list (intern (completing-read "New major mode for merge buffer: " obarray 'commandp t nil)))) @@ -2678,8 +2684,8 @@ keymap. Leaves merge in fast mode." (emerge-refresh-mode-line)))) (defun emerge-select-version (force a-version b-version neither-version) - "Perform tests to see whether user should be allowed to select a version -of this difference: + "Test if user should be allowed to select a version of this difference. +This is the case if: a valid difference has been selected; and the difference text in the merge buffer is: the A version (execute a-version), or @@ -2847,7 +2853,9 @@ Otherwise, signal an error." ;; When the pointless option emerge-temp-file-prefix goes, ;; make this function obsolete too, and just use make-temp-file. (defun emerge-make-temp-file (prefix) - "Make a private temporary file based on `emerge-temp-file-prefix'." + "Make a private temporary file based on PREFIX. +This is named by concatenating `emerge-temp-file-prefix' with +PREFIX." (make-temp-file (concat emerge-temp-file-prefix prefix))) ;;; Functions that query the user before he can write out the current buffer. diff --git a/lisp/vc/log-view.el b/lisp/vc/log-view.el index bc66191f33..c2f008fc47 100644 --- a/lisp/vc/log-view.el +++ b/lisp/vc/log-view.el @@ -50,7 +50,7 @@ ;; ------------------------------------------------------------------------ ;; r4622 | ckuethe | 2007-12-23 18:18:01 -0500 (Sun, 23 Dec 2007) | 2 lines ;; -;; uBlox AEK-4T in binary mode. Added to unstable because it breaks gpsfake +;; uBlox AEK-4T in binary mode. Added to unstable because it breaks gpsfake ;; ;; ------------------------------------------------------------------------ ;; r4621 | ckuethe | 2007-12-23 16:48:11 -0500 (Sun, 23 Dec 2007) | 3 lines diff --git a/lisp/vc/pcvs.el b/lisp/vc/pcvs.el index 23f0902b38..726fe4e283 100644 --- a/lisp/vc/pcvs.el +++ b/lisp/vc/pcvs.el @@ -672,7 +672,7 @@ it is finished." (when cvs-postproc (if (null procbuf) ;;(set-process-buffer proc nil) - (error "cvs' process buffer was killed") + (error "CVS process buffer was killed") (with-current-buffer procbuf ;; Do the postprocessing like parsing and such. (save-excursion @@ -1503,7 +1503,7 @@ The POSTPROC specified there (typically `log-edit') is then called, (defvar cvs-edit-log-revision) (defvar cvs-edit-log-files) (put 'cvs-edit-log-files 'permanent-local t) (defun cvs-mode-edit-log (file rev &optional text) - "Edit the log message at point. + "Edit log message at point. This is best called from a `log-view-mode' buffer." (interactive (list @@ -1661,7 +1661,7 @@ See `cvs-mode-diff' for more info." This command can be used on files that are marked with \"Merged\" or \"Conflict\" in the *cvs* buffer." (interactive (list (cvs-flags-query 'cvs-diff-flags "diff flags"))) - (unless (listp flags) (error "flags should be a list of strings")) + (unless (listp flags) (error "Flags should be a list of strings")) (save-some-buffers) (let* ((marked (cvs-get-marked (cvs-ignore-marks-p "diff"))) (fis (car (cvs-partition 'cvs-fileinfo->backup-file marked)))) @@ -1862,7 +1862,7 @@ POSTPROC is a function of no argument to be evaluated at the very end (after (let ((def-dir default-directory)) ;; Save the relevant buffers (save-some-buffers nil (lambda () (cvs-is-within-p fis def-dir)))) - (unless (listp flags) (error "flags should be a list of strings")) + (unless (listp flags) (error "Flags should be a list of strings")) ;; Some w32 versions of CVS don't like an explicit . too much. (when (and (car fis) (null (cdr fis)) (eq (cvs-fileinfo->type (car fis)) 'DIRCHANGE) @@ -2259,7 +2259,7 @@ With prefix argument, prompt for cvs flags." ;;;; (defun cvs-dir-member-p (fileinfo dir) - "Return true if FILEINFO represents a file in directory DIR." + "Return non-nil if FILEINFO represents a file in directory DIR." (and (not (eq (cvs-fileinfo->type fileinfo) 'DIRCHANGE)) (string-prefix-p dir (cvs-fileinfo->dir fileinfo)))) @@ -2316,7 +2316,7 @@ this file, or a list of arguments to send to the program." (defun cvs-change-cvsroot (newroot) - "Change the CVSROOT." + "Change the CVSROOT to NEWROOT." (interactive "DNew repository: ") (if (or (file-directory-p (expand-file-name "CVSROOT" newroot)) (y-or-n-p (concat "Warning: no CVSROOT found inside repository." diff --git a/lisp/vc/smerge-mode.el b/lisp/vc/smerge-mode.el index 956d9b3801..b2a875c81f 100644 --- a/lisp/vc/smerge-mode.el +++ b/lisp/vc/smerge-mode.el @@ -961,7 +961,7 @@ It has the following disadvantages: (defvar smerge--refine-long-words) (defun smerge--refine-chopup-region (beg end file &optional preproc) - "Chopup the region into small elements, one per line. + "Chopup the region from BEG to END into small elements, one per line. Save the result into FILE. If non-nil, PREPROC is called with no argument in a buffer that contains a copy of the text, just before chopping it up. It can be used to replace diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index ebecdff62e..f8b87170af 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -374,7 +374,7 @@ See `run-hooks'." "Keymap for directory buffer.") (defmacro vc-dir-at-event (event &rest body) - "Evaluate BODY with point located at event-start of EVENT. + "Evaluate BODY with point located at `event-start' of EVENT. If BODY uses EVENT, it should be a variable, otherwise it will be evaluated twice." (let ((posn (make-symbol "vc-dir-at-event-posn"))) @@ -567,7 +567,7 @@ If NOINSERT, ignore elements on ENTRIES which are not in the ewoc." (defun vc-dir-next-line (arg) "Go to the next line. -If a prefix argument is given, move by that many lines." +With prefix argument ARG, move that many lines." (interactive "p") (with-no-warnings (ewoc-goto-next vc-ewoc arg) @@ -575,7 +575,7 @@ If a prefix argument is given, move by that many lines." (defun vc-dir-previous-line (arg) "Go to the previous line. -If a prefix argument is given, move by that many lines." +With prefix argument ARG, move that many lines." (interactive "p") (ewoc-goto-prev vc-ewoc arg) (vc-dir-move-to-goal-column)) @@ -703,7 +703,7 @@ line." (defun vc-dir-mark-all-files (arg) "Mark all files with the same state as the current one. -With a prefix argument mark all files (not directories). +With prefix argument ARG, mark all files (not directories). If the current entry is a directory, mark all child files. The commands operate on files that are on the same state. @@ -813,7 +813,7 @@ line." (defun vc-dir-unmark-all-files (arg) "Unmark all files with the same state as the current one. -With a prefix argument unmark all files. +With prefix argument ARG, unmark all files. If the current entry is a directory, unmark all the child files. The commands operate on files that are on the same state. @@ -1181,7 +1181,7 @@ specific headers." "\n")) (defun vc-dir-refresh-files (files) - "Refresh some files in the *VC-dir* buffer." + "Refresh some FILES in the *VC-dir* buffer." (let ((def-dir default-directory) (backend vc-dir-backend)) (vc-set-mode-line-busy-indicator) diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index ec572e96a5..8332600c69 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -897,8 +897,7 @@ The car of the list is the current branch." (declare-function log-edit--toggle-amend "log-edit" (last-msg-fn)) (defun vc-git-log-edit-toggle-signoff () - "Toggle whether to add the \"Signed-off-by\" line at the end of -the commit message." + "Toggle whether to add the \"Signed-off-by\" line at the end of commit message." (interactive) (log-edit-toggle-header "Sign-Off" "yes")) @@ -1613,8 +1612,8 @@ before it is executed. With two \\[universal-argument] prefixes, directly edit and run `grep-command'. Collect output in a buffer. While git grep runs asynchronously, you -can use \\[next-error] (M-x next-error), or \\\\[compile-goto-error] \ -in the grep output buffer, +can use \\[next-error] (`next-error'), or \\\ +\\[compile-goto-error] in the grep output buffer, to go to the lines where grep found matches. This command shares argument histories with \\[rgrep] and \\[grep]." diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el index 1e8d673852..0ed9f7c31f 100644 --- a/lisp/vc/vc-hg.el +++ b/lisp/vc/vc-hg.el @@ -137,8 +137,7 @@ switches." :version "25.1") (defcustom vc-hg-revert-switches nil - "String or list of strings specifying switches for hg revert -under VC." + "String or list of strings specifying switches for hg revert under VC." :type '(choice (const :tag "None" nil) (string :tag "Argument String") (repeat :tag "Argument List" :value ("") string)) @@ -643,8 +642,8 @@ Variable `vc-hg-create-bookmark' controls what kind of branch will be created." ;;; Native data structure reading (defcustom vc-hg-parse-hg-data-structures t - "If true, try directly parsing Mercurial data structures -directly instead of always running Mercurial. We try to be safe + "If true, try parsing Mercurial data structures directly. +This is done instead of always running Mercurial. We try to be safe against Mercurial data structure format changes and always fall back to running Mercurial directly." :type 'boolean @@ -1017,9 +1016,9 @@ FILENAME must be the file's true absolute name." "remotefilelog" "revlogv1" "store") - "List of Mercurial repository requirements we understand; if a -repository requires features not present in this list, we avoid -attempting to parse Mercurial data structures.") + "List of Mercurial repository requirements we understand. +If a repository requires features not present in this list, we +avoid attempting to parse Mercurial data structures.") (defun vc-hg--requirements-understood-p (repo) "Check that we understand the format of the given repository. commit 3e13433ea97b988919a0599c19099b303ee4a4b6 Author: Eli Zaretskii Date: Sat Sep 18 09:40:55 2021 +0300 ; Improve the last change in NEWS. diff --git a/etc/NEWS b/etc/NEWS index b93e87642b..cfa0c33e45 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -294,11 +294,15 @@ personalize the uniquified buffer name. --- ** 'remove-hook' is now an interactive command. +--- ** 'expand-file-name' now checks for null bytes in filenames. The function will now check for null bytes in both NAME and DEFAULT-DIRECTORY arguments, as well as in the 'default-directory' -buffer-local variable, assuming its value is used. If null bytes are +buffer-local variable, when its value is used. If null bytes are found, 'expand-file-name' will signal an error. +This means that practically all file-related operations will now check +file names for null bytes, thus avoiding subtle bugs with silently +using only the part of file name up to the first null byte. --- ** Frames @@ -4155,12 +4159,6 @@ Emacs constructs the nondirectory part of the auto-save file name by applying that 'secure-hash' to the buffer file name. This avoids any risk of excessively long file names. ---- -** File names checked for null bytes. -Functions operating on local file names now check that the file names -don't contain any NUL bytes. This avoids subtle bugs caused by -silently using only the part of the file name until the first NUL byte. - +++ ** New user option 'process-file-return-signal-string'. It controls, whether 'process-file' returns a string when a remote commit 4e21c5f451a18f96172e63dbe8a3ceef780758bb Author: Federico Tedin Date: Wed Sep 15 00:15:16 2021 +0200 Check for null bytes in filenames in 'expand-file-name' (bug#49723) * src/fileio.c (expand-file-name): Check for null bytes for both NAME and DEFAULT-DIRECTORY arguments. Also check for null bytes in buffer-local default-directory, assuming it is used. * src/coding.c (encode_file_name): Use CHECK_STRING_NULL_BYTES. * src/lisp.h (CHECK_STRING_NULL_BYTES): Add function for checking for null bytes in Lisp strings. * test/src/fileio-tests.el (fileio-test--expand-file-name-null-bytes): Add test for new changes to expand-file-name. * etc/NEWS: Announce changes. diff --git a/etc/NEWS b/etc/NEWS index 515f8bac56..b93e87642b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -294,6 +294,13 @@ personalize the uniquified buffer name. --- ** 'remove-hook' is now an interactive command. +** 'expand-file-name' now checks for null bytes in filenames. +The function will now check for null bytes in both NAME and +DEFAULT-DIRECTORY arguments, as well as in the 'default-directory' +buffer-local variable, assuming its value is used. If null bytes are +found, 'expand-file-name' will signal an error. + +--- ** Frames +++ diff --git a/src/coding.c b/src/coding.c index d027c7d539..7030a53869 100644 --- a/src/coding.c +++ b/src/coding.c @@ -10430,8 +10430,7 @@ encode_file_name (Lisp_Object fname) cause subtle bugs because the system would silently use a different filename than expected. Perform this check after encoding to not miss NUL bytes introduced through encoding. */ - CHECK_TYPE (memchr (SSDATA (encoded), '\0', SBYTES (encoded)) == NULL, - Qfilenamep, fname); + CHECK_STRING_NULL_BYTES (encoded); return encoded; } diff --git a/src/fileio.c b/src/fileio.c index 0db8ed793b..3c13d3fe41 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -945,6 +945,7 @@ the root directory. */) USE_SAFE_ALLOCA; CHECK_STRING (name); + CHECK_STRING_NULL_BYTES (name); /* If the file name has special constructs in it, call the corresponding file name handler. */ @@ -993,7 +994,10 @@ the root directory. */) if (STRINGP (dir)) { if (file_name_absolute_no_tilde_p (dir)) - default_directory = dir; + { + CHECK_STRING_NULL_BYTES (dir); + default_directory = dir; + } else { Lisp_Object absdir diff --git a/src/lisp.h b/src/lisp.h index 7bfc69b647..9716b34bae 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1615,6 +1615,13 @@ STRING_SET_CHARS (Lisp_Object string, ptrdiff_t newsize) XSTRING (string)->u.s.size = newsize; } +INLINE void +CHECK_STRING_NULL_BYTES (Lisp_Object string) +{ + CHECK_TYPE (memchr (SSDATA (string), '\0', SBYTES (string)) == NULL, + Qfilenamep, string); +} + /* A regular vector is just a header plus an array of Lisp_Objects. */ struct Lisp_Vector diff --git a/test/src/fileio-tests.el b/test/src/fileio-tests.el index f4d123b426..438ebebb76 100644 --- a/test/src/fileio-tests.el +++ b/test/src/fileio-tests.el @@ -136,6 +136,15 @@ Also check that an encoding error can appear in a symlink." (should (and (file-name-absolute-p name) (not (eq (aref name 0) ?~)))))) +(ert-deftest fileio-test--expand-file-name-null-bytes () + "Test that expand-file-name checks for null bytes in filenames." + (should-error (expand-file-name (concat "file" (char-to-string ?\0) ".txt")) + :type 'wrong-type-argument) + (should-error (expand-file-name "file.txt" (concat "dir" (char-to-string ?\0))) + :type 'wrong-type-argument) + (let ((default-directory (concat "dir" (char-to-string ?\0)))) + (should-error (expand-file-name "file.txt") :type 'wrong-type-argument))) + (ert-deftest fileio-tests--file-name-absolute-p () "Test file-name-absolute-p." (dolist (suffix '("" "/" "//" "/foo" "/foo/" "/foo//" "/foo/bar")) commit 62e870691d2192e7848e047734556dec21797a7b Author: Amin Bandali Date: Fri Sep 17 21:54:15 2021 -0400 * lisp/erc/erc.el: Add Package-Requires and URL headers. diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index d08796a78d..1f39644f75 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -3,6 +3,7 @@ ;; Copyright (C) 1997-2021 Free Software Foundation, Inc. ;; Author: Alexander L. Belikoff (alexander@belikoff.net) +;; Maintainer: Amin Bandali ;; Contributors: Sergey Berezin (sergey.berezin@cs.cmu.edu), ;; Mario Lang (mlang@delysid.org), ;; Alex Schroeder (alex@gnu.org) @@ -11,10 +12,10 @@ ;; David Edmondson (dme@dme.org) ;; Michael Olson (mwolson@gnu.org) ;; Kelvin White (kwhite@gnu.org) -;; Maintainer: Amin Bandali -;; Keywords: IRC, chat, client, Internet - ;; Version: 5.3 +;; Package-Requires: ((emacs "27.1")) +;; Keywords: IRC, chat, client, Internet +;; URL: https://www.gnu.org/software/emacs/erc.html ;; This file is part of GNU Emacs. commit 931a898776065bf8f286c4d6491aebb782863c99 Author: Amin Bandali Date: Fri Sep 17 21:25:18 2021 -0400 * etc/NEWS: Announce update of IRC-related references to point to Libera.Chat. Also remove the note about freenode subdomain change, as it's not relevant anymore. diff --git a/etc/NEWS b/etc/NEWS index 2644349aba..515f8bac56 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -807,11 +807,28 @@ leak information from the reporting user. *** Rudimentary support for the 'st' terminal emulator. Emacs now supports 256 color display on the 'st' terminal emulator. ---- -*** Prefer "chat.freenode.net" to "irc.freenode.net". -"chat.freenode.net" has been the preferred address for connecting to the -Freenode IRC network for years now. Occurrences of "irc.freenode.net" -have been replaced with "chat.freenode.net" throughout Emacs. ++++ +*** Update IRC-related references to point to Libera.Chat. +In June 2021, the Free Software Foundation and the GNU Project moved +their official IRC channels from the Freenode network to Libera.Chat +in the aftermath of the changes in Freenode's governance structure and +policies in May and June 2021. The decision-making process took into +account the feedback received from the community against a set of +criteria devised by a working group drawn from both GNU and the FSF +to gauge a chat network's acceptability to software freedom activists. + +For the original announcement and the follow-up update, including more +details, see: + +https://lists.gnu.org/archive/html/info-gnu/2021-06/msg00005.html +https://lists.gnu.org/archive/html/info-gnu/2021-06/msg00007.html + +Given the relocation of GNU and FSF's official IRC channels, as well +as #emacs and various other Emacs-themed channels (see the link below) +to Libera.Chat, IRC-related references in the Emacs repository have +now been updated to point to Libera.Chat. + +https://lists.gnu.org/archive/html/info-gnu-emacs/2021-06/msg00000.html * Editing Changes in Emacs 28.1 commit 93731cdae0ff11d9f67e06ed3ea75b1320ce5034 Author: Stefan Kangas Date: Sat Sep 18 01:17:50 2021 +0200 ; * etc/NEWS: Fix typos. diff --git a/etc/NEWS b/etc/NEWS index 634d3d86f9..2644349aba 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -240,7 +240,7 @@ the user for whether that file should be deleted. (Note that result in deletion of auto-save files when killing a buffer without unsaved changes, but this has apparently not worked for several decades, so the documented semantics of this variable has been changed -to match the behaviour.) +to match the behavior.) +++ ** New user option 'next-error-message-highlight'. @@ -686,7 +686,7 @@ Applies to buttons that indicate a face. +++ *** New face 'font-lock-doc-markup-face'. Intended for documentation mark-up syntax and tags inside text that -uses 'font-lock-doc-face', with which it should harmonise. It would +uses 'font-lock-doc-face', with which it should harmonize. It would typically be used in structured documentation comments in program source code by language-specific modes, for mark-up conventions like Haddock, Javadoc or Doxygen. By default this face inherits from @@ -810,7 +810,7 @@ Emacs now supports 256 color display on the 'st' terminal emulator. --- *** Prefer "chat.freenode.net" to "irc.freenode.net". "chat.freenode.net" has been the preferred address for connecting to the -freenode IRC network for years now. Occurrences of "irc.freenode.net" +Freenode IRC network for years now. Occurrences of "irc.freenode.net" have been replaced with "chat.freenode.net" throughout Emacs. @@ -1217,7 +1217,7 @@ Clicking the dictionary name changes the current dictionary. ** Package *** The new NonGNU ELPA archive is enabled by default alongside GNU ELPA. -Thus, packages on nonGNU ELPA will appear by default in the list shown +Thus, packages on NonGNU ELPA will appear by default in the list shown by 'list-packages'. --- commit fe22e3b52c3d3617f965d4f176bf4bd8a893acc8 Author: Stefan Kangas Date: Fri Sep 17 22:57:33 2021 +0200 Update refcard to mention iconify before suspend * etc/refcards/refcard.tex (section{Leaving Emacs}): Put iconify Emacs ahead of suspend. diff --git a/etc/refcards/refcard.tex b/etc/refcards/refcard.tex index ae39a4e9f7..f066dc93ea 100644 --- a/etc/refcards/refcard.tex +++ b/etc/refcards/refcard.tex @@ -279,7 +279,7 @@ \section{Starting Emacs} \section{Leaving Emacs} -\key{suspend Emacs (or iconify it under X)}{C-z} +\key{iconify Emacs (or suspend it in terminal)}{C-z} \key{exit Emacs permanently}{C-x C-c} \section{Files} commit b6bff3ba7971daad737690d88a3921f1dd190476 Author: Stefan Kangas Date: Thu Sep 16 19:13:56 2021 +0200 checkdoc: 'y-or-n-p' no longer needs space * lisp/emacs-lisp/checkdoc.el (checkdoc-message-text-engine): Change 'y-or-n-p' check to accept prompt ending with both "? " or "?", that is, it no longer needs the space. (Bug#50621) (checkdoc--fix-y-or-n-p): New helper function. * test/lisp/emacs-lisp/checkdoc-tests.el (checkdoc-tests-fix-y-or-n-p) (checkdoc-tests-fix-y-or-n-p/no-change) (checkdoc-tests-fix-y-or-n-p/with-space): New tests. diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el index 01f2c0d95f..f8df223ce9 100644 --- a/lisp/emacs-lisp/checkdoc.el +++ b/lisp/emacs-lisp/checkdoc.el @@ -2475,6 +2475,31 @@ Argument END is the maximum bounds to search in." (setq return type)))) return)) +(defun checkdoc--fix-y-or-n-p () + "Fix `y-or-n-p' prompt to end with \"?\" or \"? \". +The space is technically redundant, but also more compatible with +Emacs versions before Emacs 24.1. In the future, we might treat +a space as a style error." + (when (and (save-excursion (forward-sexp 1) + (forward-char -3) + (not (looking-at "\\? "))) + (save-excursion (forward-sexp 1) + (forward-char -2) + (not (looking-at "\\?")))) + (if (and + (save-excursion (forward-sexp 1) + (forward-char -1) + (looking-at "\"")) + (checkdoc-autofix-ask-replace + (match-beginning 0) (match-end 0) + (format-message + "`y-or-n-p' argument should end with \"? \". Fix?") + "?\"" t)) + nil + (checkdoc-create-error + "`y-or-n-p' argument should end with \"?\"" + (match-beginning 0) (match-end 0))))) + (defun checkdoc-message-text-engine (&optional type) "Return or fix errors found in strings passed to a message display function. According to the documentation for the function `error', the error list @@ -2530,63 +2555,20 @@ Argument TYPE specifies the type of question, such as `error' or `y-or-n-p'." "Error messages should *not* end with a period" (match-beginning 0) (match-end 0)) nil) - ;; `y-or-n-p' documentation explicitly says: - ;; It should end in a space; `y-or-n-p' adds `(y or n) ' to it. - ;; I added the ? requirement. Without it, it is unclear that we - ;; ask a question and it appears to be an undocumented style. - (if (eq type 'y-or-n-p) - (if (not (save-excursion (forward-sexp 1) - (forward-char -3) - (not (looking-at "\\? ")))) - nil - (if (save-excursion (forward-sexp 1) - (forward-char -2) - (looking-at "\\?")) - ;; If we see a ?, then replace with "? ". - (if (checkdoc-autofix-ask-replace - (match-beginning 0) (match-end 0) - (format-message - "`y-or-n-p' argument should end with \"? \". Fix? ") - "? " t) - nil - (checkdoc-create-error - "`y-or-n-p' argument should end with \"? \"" - (match-beginning 0) (match-end 0))) - (if (save-excursion (forward-sexp 1) - (forward-char -2) - (looking-at " ")) - (if (checkdoc-autofix-ask-replace - (match-beginning 0) (match-end 0) - (format-message - "`y-or-n-p' argument should end with \"? \". Fix? ") - "? " t) - nil - (checkdoc-create-error - "`y-or-n-p' argument should end with \"? \"" - (match-beginning 0) (match-end 0))) - (if (and ;; if this isn't true, we have a problem. - (save-excursion (forward-sexp 1) - (forward-char -1) - (looking-at "\"")) - (checkdoc-autofix-ask-replace - (match-beginning 0) (match-end 0) - (format-message - "`y-or-n-p' argument should end with \"? \". Fix? ") - "? \"" t)) - nil - (checkdoc-create-error - "`y-or-n-p' argument should end with \"? \"" - (match-beginning 0) (match-end 0))))))) + ;; From `(elisp) Programming Tips': "A question asked in the + ;; minibuffer with `yes-or-no-p' or `y-or-n-p' should start with + ;; a capital letter and end with '?'." + (when (eq type 'y-or-n-p) + (checkdoc--fix-y-or-n-p)) ;; Now, let's just run the spell checker on this guy. (checkdoc-ispell-docstring-engine (save-excursion (forward-sexp 1) - (point))) - ))) + (point)))))) ;;; Auto-fix helper functions ;; (defun checkdoc-y-or-n-p (question) "Like `y-or-n-p', but pays attention to `checkdoc-autofix-flag'. -Argument QUESTION is the prompt passed to `y-or-n-p'." + Argument QUESTION is the prompt passed to `y-or-n-p'." (prog1 (if (or (not checkdoc-autofix-flag) (eq checkdoc-autofix-flag 'never)) diff --git a/test/lisp/emacs-lisp/checkdoc-tests.el b/test/lisp/emacs-lisp/checkdoc-tests.el index a4b252031f..3eb7da3d4a 100644 --- a/test/lisp/emacs-lisp/checkdoc-tests.el +++ b/test/lisp/emacs-lisp/checkdoc-tests.el @@ -146,4 +146,34 @@ See the comments in Bug#24998." (re-search-forward "e.g") (should (checkdoc-in-abbreviation-p (point))))) +(ert-deftest checkdoc-tests-fix-y-or-n-p () + (with-temp-buffer + (emacs-lisp-mode) + (let ((standard-output (current-buffer)) + (checkdoc-autofix-flag 'automatic)) + (prin1 '(y-or-n-p "foo")) ; "foo" + (goto-char (length "(y-or-n-p ")) + (checkdoc--fix-y-or-n-p) + (should (equal (buffer-string) "(y-or-n-p \"foo?\")"))))) + +(ert-deftest checkdoc-tests-fix-y-or-n-p/no-change () + (with-temp-buffer + (emacs-lisp-mode) + (let ((standard-output (current-buffer)) + (checkdoc-autofix-flag 'automatic)) + (prin1 '(y-or-n-p "foo?")) ; "foo?" + (goto-char (length "(y-or-n-p ")) + (checkdoc--fix-y-or-n-p) + (should (equal (buffer-string) "(y-or-n-p \"foo?\")"))))) + +(ert-deftest checkdoc-tests-fix-y-or-n-p/with-space () + (with-temp-buffer + (emacs-lisp-mode) + (let ((standard-output (current-buffer)) + (checkdoc-autofix-flag 'automatic)) + (prin1 '(y-or-n-p "foo? ")) ; "foo? " + (goto-char (length "(y-or-n-p ")) + (checkdoc--fix-y-or-n-p) + (should (equal (buffer-string) "(y-or-n-p \"foo? \")"))))) + ;;; checkdoc-tests.el ends here commit 174430e35186b1554eafe6ab1227ab9697224a56 Author: Robert Pluim Date: Fri Sep 17 20:56:09 2021 +0200 ; Fix etc/NEWS merge error * etc/NEWS: fix merge error diff --git a/etc/NEWS b/etc/NEWS index 2201dd7a3b..634d3d86f9 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -392,9 +392,6 @@ When customized to nil, it uses 'minibuffer-restore-windows' in 'minibuffer-exit-hook' to remove only the window showing the "*Completions*" buffer. - -* Editing Changes in Emacs 28.1 - --- *** New variable 'redisplay-adhoc-scroll-in-resize-mini-windows'. Customizing it to nil will disable the ad-hoc auto-scrolling of commit 45989b01722c86465f6f7689471394d66d687281 Author: Robert Pluim Date: Fri Sep 17 19:40:48 2021 +0200 Move emoji fontset addition later * lisp/international/fontset.el (setup-default-fontset): Move the fontset addition for emoji script after that for various graphic-like characters, since they overlap, and we want the emoji setting to win. diff --git a/lisp/international/fontset.el b/lisp/international/fontset.el index 13c998a41a..4ec641dca8 100644 --- a/lisp/international/fontset.el +++ b/lisp/international/fontset.el @@ -896,9 +896,6 @@ (#x1FA00 . #x1FA6F))) ;; Chess Symbols (set-fontset-font "fontset-default" symbol-subgroup '("Symbola" . "iso10646-1") nil 'prepend)) - ;; This sets up the Emoji codepoints to use prettier fonts. - (set-fontset-font "fontset-default" 'emoji - '("Noto Color Emoji" . "iso10646-1") nil 'prepend) ;; Box Drawing and Block Elements (set-fontset-font "fontset-default" '(#x2500 . #x259F) '("FreeMono" . "iso10646-1") nil 'prepend) @@ -927,6 +924,9 @@ (set-fontset-font "fontset-default" symbol-subgroup "-*-fixed-medium-*-*-*-*-*-*-*-*-*-iso10646-1" nil 'prepend)) + ;; This sets up the Emoji codepoints to use prettier fonts. + (set-fontset-font "fontset-default" 'emoji + '("Noto Color Emoji" . "iso10646-1") nil 'prepend) ;; Append CJK fonts for characters other than han, kana, cjk-misc. ;; Append fonts for scripts whose name is also a charset name. commit a55be2fa3233b99472a6cf3e0e4103bc748d8dbb Author: Martin Joerg Date: Fri Sep 17 19:54:00 2021 +0200 * lisp/net/tramp-sh.el (tramp-methods) : Separate "%c" marker. Copyright-paperwork-exempt: yes diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 0416d15f52..fbb122e721 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -202,7 +202,7 @@ The string is used in `tramp-methods'.") (tramp-copy-program "rsync") (tramp-copy-args (("-t" "%k") ("-p") ("-r") ("-s") ("-c"))) - (tramp-copy-env (("RSYNC_RSH") ("ssh" "%c"))) + (tramp-copy-env (("RSYNC_RSH") ("ssh") ("%c"))) (tramp-copy-keep-date t) (tramp-copy-keep-tmpfile t) (tramp-copy-recursive t))) commit 6f2068fcb16961d345d5288bb26ed456c4369b51 Author: Robert Pluim Date: Fri Sep 17 19:35:27 2021 +0200 Fix emoji-induced build breakage * admin/unidata/blocks.awk: Cater for out-of-tree builds, match the name of the file using regexp rather than exact match. diff --git a/admin/unidata/blocks.awk b/admin/unidata/blocks.awk index 72a808ab61..575f7142f4 100755 --- a/admin/unidata/blocks.awk +++ b/admin/unidata/blocks.awk @@ -131,7 +131,7 @@ function name2alias(name , w, w2) { return name } -FILENAME == "Blocks.txt" && /^[0-9A-F]/ { +FILENAME ~ "Blocks.txt" && /^[0-9A-F]/ { sep = index($1, "..") len = length($1) s = substr($1,1,sep-1) @@ -204,10 +204,10 @@ FILENAME == "Blocks.txt" && /^[0-9A-F]/ { # The space after 'Emoji' is significant in the next two rules. # This purposely and deliberately excludes codepoints <= 00FF -FILENAME == "emoji-data.txt" && /^00[0-9A-F]{2}.*; Emoji / { +FILENAME ~ "emoji-data.txt" && /^00[0-9A-F]{2}.*; Emoji / { next } -FILENAME == "emoji-data.txt" && /^[0-9A-F].*; Emoji / { +FILENAME ~ "emoji-data.txt" && /^[0-9A-F].*; Emoji / { sep = index($1, "..") len = length($1) if (sep > 0) { commit aa59d38c598f77cf1afbcb664e1ad73ed42ada52 Author: Uwe Brauer Date: Fri Sep 17 19:01:51 2021 +0200 Replace hex representation by its literal form in pretty tex symbols * lisp/textmodes/tex-mode.el (tex--prettify-symbols-alist): Correct error \Bbb{T}, replace hex representation by its literal form (bug#50645). diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el index 0c7ab049d7..c8748e3740 100644 --- a/lisp/textmodes/tex-mode.el +++ b/lisp/textmodes/tex-mode.el @@ -3469,98 +3469,97 @@ There might be text before point." ("\\Bbb{P}" . ?ℙ) ; Also sometimes \mathbb. ("\\Bbb{Q}" . ?ℚ) ("\\Bbb{R}" . ?ℝ) - ("\\Bbb{T}" . ?ℝ) - ("\\Bbb{T}" . #x1D54B) + ("\\Bbb{T}" . ?𝕋) ("\\Bbb{Z}" . ?ℤ) ("\\mathbb{N}" . ?ℕ) ; AMS commands for blackboard bold ("\\mathbb{P}" . ?ℙ) ; Also sometimes \mathbb. ("\\mathbb{Q}" . ?ℚ) ("\\mathbb{R}" . ?ℝ) - ("\\mathbb{T}" . #x1D54B) + ("\\mathbb{T}" . ?𝕋) ("\\mathbb{Z}" . ?ℤ) - ("\\pm" . ?\u00B1) - ("\\|" . ?\u2016) - ("\\varkappa" . ?\u03F0) + ("\\pm" . ?±) + ("\\|" . ?‖) + ("\\varkappa" . ?ϰ) ;; caligraphic - ("\\mathcal{A}" . #x1D49C) - ("\\mathcal{B}" . #x0212C) - ("\\mathcal{C}" . #x1D49E) - ("\\mathcal{D}" . #x1D49F) - ("\\mathcal{E}" . #x02130) - ("\\mathcal{F}" . #x02131) - ("\\mathcal{G}" . #x1D4A2) - ("\\mathcal{H}" . #x0210B) - ("\\mathcal{I}" . #x02110) - ("\\mathcal{J}" . #x1D4A5) - ("\\mathcal{K}" . #x1D4A6) - ("\\mathcal{L}" . #x02112) - ("\\mathcal{M}" . #x02133) - ("\\mathcal{N}" . #x1D4A9) - ("\\mathcal{O}" . #x1D4AA) - ("\\mathcal{P}" . #x1D4AB) - ("\\mathcal{Q}" . #x1D4AC) - ("\\mathcal{R}" . #x0211B) - ("\\mathcal{S}" . #x1D4AE) - ("\\mathcal{T}" . #x1D4AF) - ("\\mathcal{U}" . #x1D4B0) - ("\\mathcal{V}" . #x1D4B1) - ("\\mathcal{W}" . #x1D4B2) - ("\\mathcal{X}" . #x1D4B3) - ("\\mathcal{Y}" . #x1D4B4) - ("\\mathcal{Z}" . #x1D4B5) + ("\\mathcal{A}" . ?𝒜) + ("\\mathcal{B}" . ?ℬ) + ("\\mathcal{C}" . ?𝒞) + ("\\mathcal{D}" . ?𝒟) + ("\\mathcal{E}" . ?ℰ) + ("\\mathcal{F}" . ?ℱ) + ("\\mathcal{G}" . ?𝒢) + ("\\mathcal{H}" . ?ℋ) + ("\\mathcal{I}" . ?ℐ) + ("\\mathcal{J}" . ?𝒥) + ("\\mathcal{K}" . ?𝒦) + ("\\mathcal{L}" . ?ℒ) + ("\\mathcal{M}" . ?ℳ) + ("\\mathcal{N}" . ?𝒩) + ("\\mathcal{O}" . ?𝒪) + ("\\mathcal{P}" . ?𝒫) + ("\\mathcal{Q}" . ?𝒬) + ("\\mathcal{R}" . ?ℛ) + ("\\mathcal{S}" . ?𝒮) + ("\\mathcal{T}" . ?𝒯) + ("\\mathcal{U}" . ?𝒰) + ("\\mathcal{V}" . ?𝒱) + ("\\mathcal{W}" . ?𝒲) + ("\\mathcal{X}" . ?𝒳) + ("\\mathcal{Y}" . ?𝒴) + ("\\mathcal{Z}" . ?𝒵) ;; fractur - ("\\mathfrak{A}" . #x1D504) - ("\\mathfrak{B}" . #x1D505) - ("\\mathfrak{C}" . #x0212D) - ("\\mathfrak{D}" . #x1D507) - ("\\mathfrak{E}" . #x1D508) - ("\\mathfrak{F}" . #x1D509) - ("\\mathfrak{G}" . #x1D50A) - ("\\mathfrak{H}" . #x0210C) - ("\\mathfrak{I}" . #x02111) - ("\\mathfrak{J}" . #x1D50D) - ("\\mathfrak{K}" . #x1D50E) - ("\\mathfrak{L}" . #x1D50F) - ("\\mathfrak{M}" . #x1D510) - ("\\mathfrak{N}" . #x1D511) - ("\\mathfrak{O}" . #x1D512) - ("\\mathfrak{P}" . #x1D513) - ("\\mathfrak{Q}" . #x1D514) - ("\\mathfrak{R}" . #x0211C) - ("\\mathfrak{S}" . #x1D516) - ("\\mathfrak{T}" . #x1D517) - ("\\mathfrak{U}" . #x1D518) - ("\\mathfrak{V}" . #x1D519) - ("\\mathfrak{W}" . #x1D51A) - ("\\mathfrak{X}" . #x1D51B) - ("\\mathfrak{Y}" . #x1D51C) - ("\\mathfrak{Z}" . #x02128) - ("\\mathfrak{a}" . #x1D51E) - ("\\mathfrak{b}" . #x1D51F) - ("\\mathfrak{c}" . #x1D520) - ("\\mathfrak{d}" . #x1D521) - ("\\mathfrak{e}" . #x1D522) - ("\\mathfrak{f}" . #x1D523) - ("\\mathfrak{g}" . #x1D524) - ("\\mathfrak{h}" . #x1D525) - ("\\mathfrak{i}" . #x1D526) - ("\\mathfrak{j}" . #x1D527) - ("\\mathfrak{k}" . #x1D528) - ("\\mathfrak{l}" . #x1D529) - ("\\mathfrak{m}" . #x1D52A) - ("\\mathfrak{n}" . #x1D52B) - ("\\mathfrak{o}" . #x1D52C) - ("\\mathfrak{p}" . #x1D52D) - ("\\mathfrak{q}" . #x1D52E) - ("\\mathfrak{r}" . #x1D52F) - ("\\mathfrak{s}" . #x1D530) - ("\\mathfrak{t}" . #x1D531) - ("\\mathfrak{u}" . #x1D532) - ("\\mathfrak{v}" . #x1D533) - ("\\mathfrak{w}" . #x1D534) - ("\\mathfrak{x}" . #x1D535) - ("\\mathfrak{y}" . #x1D536) - ("\\mathfrak{z}" . #x1D537) + ("\\mathfrak{A}" . ?𝔄) + ("\\mathfrak{B}" . ?𝔅) + ("\\mathfrak{C}" . ?ℭ) + ("\\mathfrak{D}" . ?𝔇) + ("\\mathfrak{E}" . ?𝔈) + ("\\mathfrak{F}" . ?𝔉) + ("\\mathfrak{G}" . ?𝔊) + ("\\mathfrak{H}" . ?ℌ) + ("\\mathfrak{I}" . ?ℑ) + ("\\mathfrak{J}" . ?𝔍) + ("\\mathfrak{K}" . ?𝔎) + ("\\mathfrak{L}" . ?𝔏) + ("\\mathfrak{M}" . ?𝔐) + ("\\mathfrak{N}" . ?𝔑) + ("\\mathfrak{O}" . ?𝔒) + ("\\mathfrak{P}" . ?𝔓) + ("\\mathfrak{Q}" . ?𝔔) + ("\\mathfrak{R}" . ?ℜ) + ("\\mathfrak{S}" . ?𝔖) + ("\\mathfrak{T}" . ?𝔗) + ("\\mathfrak{U}" . ?𝔘) + ("\\mathfrak{V}" . ?𝔙) + ("\\mathfrak{W}" . ?𝔚) + ("\\mathfrak{X}" . ?𝔛) + ("\\mathfrak{Y}" . ?𝔜) + ("\\mathfrak{Z}" . ?ℨ) + ("\\mathfrak{a}" . ?𝔞) + ("\\mathfrak{b}" . ?𝔟) + ("\\mathfrak{c}" . ?𝔠) + ("\\mathfrak{d}" . ?𝔡) + ("\\mathfrak{e}" . ?𝔢) + ("\\mathfrak{f}" . ?𝔣) + ("\\mathfrak{g}" . ?𝔤) + ("\\mathfrak{h}" . ?𝔥) + ("\\mathfrak{i}" . ?𝔦) + ("\\mathfrak{j}" . ?𝔧) + ("\\mathfrak{k}" . ?𝔨) + ("\\mathfrak{l}" . ?𝔩) + ("\\mathfrak{m}" . ?𝔪) + ("\\mathfrak{n}" . ?𝔫) + ("\\mathfrak{o}" . ?𝔬) + ("\\mathfrak{p}" . ?𝔭) + ("\\mathfrak{q}" . ?𝔮) + ("\\mathfrak{r}" . ?𝔯) + ("\\mathfrak{s}" . ?𝔰) + ("\\mathfrak{t}" . ?𝔱) + ("\\mathfrak{u}" . ?𝔲) + ("\\mathfrak{v}" . ?𝔳) + ("\\mathfrak{w}" . ?𝔴) + ("\\mathfrak{x}" . ?𝔵) + ("\\mathfrak{y}" . ?𝔶) + ("\\mathfrak{z}" . ?𝔷) ("--" . ?–) ("---" . ?—) ("\\ordfeminine" . ?ª) commit 338af9213d6cb47da9c1835d20d8db27b915b3d1 Author: Lars Ingebrigtsen Date: Fri Sep 17 18:37:51 2021 +0200 Tweak how term-emulate-terminal selects windows * lisp/term.el (term-emulate-terminal): Don't record the selection of the window here, because we're not doing a user-level window selection, but just selecting the window for internal purposes (bug#41984). diff --git a/lisp/term.el b/lisp/term.el index caa3b39be4..42b2e5a248 100644 --- a/lisp/term.el +++ b/lisp/term.el @@ -3126,7 +3126,7 @@ See `term-prompt-regexp'." (setq win (next-window win nil t)) (when (eq (window-buffer win) (process-buffer proc)) (let ((scroll term-scroll-to-bottom-on-output)) - (select-window win) + (select-window win t) (when (or (= (point) save-marker) (eq scroll t) (eq scroll 'all) ;; Maybe user wants point to jump to the end. commit 0ac58e89d71024177b791dc9c3d16a0f82d62aac Author: Juri Linkov Date: Fri Sep 17 19:02:48 2021 +0300 * lisp/progmodes/elisp-mode.el (elisp-context-menu): Improve menu items. diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index d40ae476a6..04311985c1 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -159,19 +159,26 @@ All commands in `lisp-mode-shared-map' are inherited by this map.") (define-key-after menu [elisp-separator] menu-bar-separator 'middle-separator) (define-key-after menu [info-lookup-symbol] - '(menu-item "Look up Symbol" + '(menu-item "Look up in Manual" (lambda (click) (interactive "e") (info-lookup-symbol (intern (thing-at-mouse click 'symbol t)))) :help "Display definition in relevant manual") 'elisp-separator) - (define-key-after menu [describe-symbol] - '(menu-item "Describe Symbol" - (lambda (click) (interactive "e") - (describe-symbol - (intern (thing-at-mouse click 'symbol t)))) - :help "Display the full documentation of symbol") - 'elisp-separator)) + (let* ((string (thing-at-mouse click 'symbol t)) + (symbol (when (stringp string) (intern string))) + (title (cond + ((not (symbolp symbol)) nil) + ((fboundp symbol) "Function") + ((and (boundp symbol) (not (keywordp symbol))) "Variable") + ((facep symbol) "Face")))) + (when title + (define-key-after menu [describe-symbol] + `(menu-item (format "Describe %s" ,title) + (lambda (_click) (interactive "e") + (describe-symbol ',symbol)) + :help "Display the full documentation of symbol") + 'elisp-separator)))) menu) (defun emacs-lisp-byte-compile () commit de0b5227e08ce250b60226f9b2413dda50456c60 Author: Juri Linkov Date: Fri Sep 17 19:00:03 2021 +0300 * lisp/repeat.el (repeat-echo-message): Clear only own added part of message. (describe-repeat-maps, repeat-mode): Refer to each other in docstrings. diff --git a/lisp/repeat.el b/lisp/repeat.el index 6c3ffec18f..0b761fff1e 100644 --- a/lisp/repeat.el +++ b/lisp/repeat.el @@ -386,7 +386,8 @@ the map can't be set on the command symbol property `repeat-map'.") (define-minor-mode repeat-mode "Toggle Repeat mode. When Repeat mode is enabled, and the command symbol has the property named -`repeat-map', this map is activated temporarily for the next command." +`repeat-map', this map is activated temporarily for the next command. +See `describe-repeat-maps' for a list of all repeatable command." :global t :group 'convenience (if (not repeat-mode) (remove-hook 'post-command-hook 'repeat-post-hook) @@ -470,13 +471,18 @@ When Repeat mode is enabled, and the command symbol has the property named (defun repeat-echo-message (keymap) "Display available repeating keys in the echo area." (if keymap - (let ((mess (repeat-echo-message-string keymap))) + (let ((message (repeat-echo-message-string keymap))) (if (current-message) - (message "%s [%s]" (current-message) mess) - (message mess))) - (and (current-message) - (string-search "Repeat with " (current-message)) - (message nil)))) + (message "%s [%s]" (current-message) message) + (message "%s" message))) + (let ((message (current-message))) + (when message + (cond + ((string-prefix-p "Repeat with " message) + (message nil)) + ((string-search " [Repeat with " message) + (message "%s" (replace-regexp-in-string + " \\[Repeat with .*\\'" "" message)))))))) (defvar repeat-echo-mode-line-string (propertize "[Repeating...] " 'face 'mode-line-emphasis) @@ -491,7 +497,8 @@ When Repeat mode is enabled, and the command symbol has the property named (force-mode-line-update t))) (defun describe-repeat-maps () - "Describe mappings of commands repeatable by symbol property `repeat-map'." + "Describe mappings of commands repeatable by symbol property `repeat-map'. +Used in `repeat-mode'." (interactive) (help-setup-xref (list #'describe-repeat-maps) (called-interactively-p 'interactive)) commit a8103cf9e08cdc159c4824d2b3b08cc5882fae76 Author: Lars Ingebrigtsen Date: Fri Sep 17 17:54:21 2021 +0200 Stop imenu indexing after a certain number of seconds * doc/emacs/programs.texi (Imenu): Document it. * lisp/imenu.el (imenu-max-index-time): New user option. (imenu-default-create-index-function, imenu--generic-function): Use it (bug#18696). diff --git a/doc/emacs/programs.texi b/doc/emacs/programs.texi index 37a15b6d5f..ec11b0c00f 100644 --- a/doc/emacs/programs.texi +++ b/doc/emacs/programs.texi @@ -275,8 +275,10 @@ a non-@code{nil} value. There is no need to rescan because of small changes in the text. @vindex imenu-auto-rescan-maxout +@vindex imenu-max-index-time @code{imenu-auto-rescan} will be disabled in buffers that are larger -than @code{imenu-auto-rescan-maxout} in bytes. +than @code{imenu-auto-rescan-maxout} in bytes, and scanning is +stopped if it takes more than @code{imenu-max-index-time} seconds. @vindex imenu-sort-function You can customize the way the menus are sorted by setting the diff --git a/etc/NEWS b/etc/NEWS index 9606eded50..2201dd7a3b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2929,6 +2929,13 @@ This previously used to align subsequent lines with the last sibling, but it now aligns with the first sibling (which is the preferred style in Ruby). +** Imenu + ++++ +*** New user option 'imenu-max-index-time'. +If creating the imenu index takes longer than specified by this +variable (default 5 seconds), imenu indexing is stopped. + * New Modes and Packages in Emacs 28.1 diff --git a/lisp/imenu.el b/lisp/imenu.el index 2024bb1e06..788755a2d7 100644 --- a/lisp/imenu.el +++ b/lisp/imenu.el @@ -85,7 +85,8 @@ This might not yet be honored by all index-building functions." :type 'boolean) (defcustom imenu-auto-rescan-maxout 600000 - "Imenu auto-rescan is disabled in buffers larger than this size (in bytes)." + "Imenu auto-rescan is disabled in buffers larger than this size (in bytes). +Also see `imenu-max-index-time'." :type 'integer :version "26.2") @@ -153,6 +154,11 @@ uses `imenu--generic-function')." :type 'boolean :version "24.4") +(defcustom imenu-max-index-time 5 + "Max time to use when creating imenu indices." + :type 'number + :version "28.1") + ;;;###autoload (defvar-local imenu-generic-expression nil "List of definition matchers for creating an Imenu index. @@ -520,10 +526,13 @@ The alternate method, which is the one most often used, is to call (cond ((and imenu-prev-index-position-function imenu-extract-index-name-function) (let ((index-alist '()) (pos (point-max)) + (start (float-time)) name) (goto-char pos) ;; Search for the function - (while (funcall imenu-prev-index-position-function) + (while (and (funcall imenu-prev-index-position-function) + ;; Don't use an excessive amount of time. + (< (- (float-time) start) imenu-max-index-time)) (unless (< (point) pos) (error "Infinite loop at %s:%d: imenu-prev-index-position-function does not move point" (buffer-name) pos)) (setq pos (point)) @@ -576,6 +585,7 @@ depending on PATTERNS." (not (local-variable-p 'font-lock-defaults))) imenu-case-fold-search (nth 2 font-lock-defaults))) + (start-time (float-time)) (old-table (syntax-table)) (table (copy-syntax-table (syntax-table))) (slist imenu-syntax-alist)) @@ -618,7 +628,13 @@ depending on PATTERNS." (not invis)))))) ;; Exit the loop if we get an empty match, ;; because it means a bad regexp was specified. - (not (= (match-beginning 0) (match-end 0)))) + (not (= (match-beginning 0) (match-end 0))) + ;; Don't take an excessive amount of time. + (or (< (- (float-time) start-time) + imenu-max-index-time) + (progn + (message "`imenu-max-index-time' exceeded") + nil))) (setq start (point)) ;; Record the start of the line in which the match starts. ;; That's the official position of this definition. commit f29abc3db6abf6a9ef54106990b749a12fc53211 Author: Manuel Giraud Date: Fri Sep 17 16:34:05 2021 +0200 Fix typo in idlwave * lisp/progmodes/idlwave.el (idlwave-keyword-abbrev): Fix typo (bug#50638). diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el index 374876d5b4..e95abd863e 100644 --- a/lisp/progmodes/idlwave.el +++ b/lisp/progmodes/idlwave.el @@ -1365,7 +1365,7 @@ Normally a space.") (defun idlwave-keyword-abbrev (&rest args) "Create a function for abbrev hooks to call `idlwave-modify-abbrev' with args." - (lambda () (append #'idlwave-modify-abbrev args))) + (lambda () (apply #'idlwave-modify-abbrev args))) (autoload 'idlwave-shell "idlw-shell" "Run an inferior IDL, with I/O through buffer `(idlwave-shell-buffer)'." t) commit 894ea5f66f89a3a2301a8461194a700ade748efc Author: Uwe Brauer Date: Fri Sep 17 16:32:48 2021 +0200 Add more symbols to tex--prettify-symbols-alist * lisp/textmodes/tex-mode.el (tex--prettify-symbols-alist): Add mathbb, caligraphic letters, fractur, varkappa and \|. (bug#50639). diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el index 697c0de598..0c7ab049d7 100644 --- a/lisp/textmodes/tex-mode.el +++ b/lisp/textmodes/tex-mode.el @@ -3469,7 +3469,98 @@ There might be text before point." ("\\Bbb{P}" . ?ℙ) ; Also sometimes \mathbb. ("\\Bbb{Q}" . ?ℚ) ("\\Bbb{R}" . ?ℝ) + ("\\Bbb{T}" . ?ℝ) + ("\\Bbb{T}" . #x1D54B) ("\\Bbb{Z}" . ?ℤ) + ("\\mathbb{N}" . ?ℕ) ; AMS commands for blackboard bold + ("\\mathbb{P}" . ?ℙ) ; Also sometimes \mathbb. + ("\\mathbb{Q}" . ?ℚ) + ("\\mathbb{R}" . ?ℝ) + ("\\mathbb{T}" . #x1D54B) + ("\\mathbb{Z}" . ?ℤ) + ("\\pm" . ?\u00B1) + ("\\|" . ?\u2016) + ("\\varkappa" . ?\u03F0) + ;; caligraphic + ("\\mathcal{A}" . #x1D49C) + ("\\mathcal{B}" . #x0212C) + ("\\mathcal{C}" . #x1D49E) + ("\\mathcal{D}" . #x1D49F) + ("\\mathcal{E}" . #x02130) + ("\\mathcal{F}" . #x02131) + ("\\mathcal{G}" . #x1D4A2) + ("\\mathcal{H}" . #x0210B) + ("\\mathcal{I}" . #x02110) + ("\\mathcal{J}" . #x1D4A5) + ("\\mathcal{K}" . #x1D4A6) + ("\\mathcal{L}" . #x02112) + ("\\mathcal{M}" . #x02133) + ("\\mathcal{N}" . #x1D4A9) + ("\\mathcal{O}" . #x1D4AA) + ("\\mathcal{P}" . #x1D4AB) + ("\\mathcal{Q}" . #x1D4AC) + ("\\mathcal{R}" . #x0211B) + ("\\mathcal{S}" . #x1D4AE) + ("\\mathcal{T}" . #x1D4AF) + ("\\mathcal{U}" . #x1D4B0) + ("\\mathcal{V}" . #x1D4B1) + ("\\mathcal{W}" . #x1D4B2) + ("\\mathcal{X}" . #x1D4B3) + ("\\mathcal{Y}" . #x1D4B4) + ("\\mathcal{Z}" . #x1D4B5) + ;; fractur + ("\\mathfrak{A}" . #x1D504) + ("\\mathfrak{B}" . #x1D505) + ("\\mathfrak{C}" . #x0212D) + ("\\mathfrak{D}" . #x1D507) + ("\\mathfrak{E}" . #x1D508) + ("\\mathfrak{F}" . #x1D509) + ("\\mathfrak{G}" . #x1D50A) + ("\\mathfrak{H}" . #x0210C) + ("\\mathfrak{I}" . #x02111) + ("\\mathfrak{J}" . #x1D50D) + ("\\mathfrak{K}" . #x1D50E) + ("\\mathfrak{L}" . #x1D50F) + ("\\mathfrak{M}" . #x1D510) + ("\\mathfrak{N}" . #x1D511) + ("\\mathfrak{O}" . #x1D512) + ("\\mathfrak{P}" . #x1D513) + ("\\mathfrak{Q}" . #x1D514) + ("\\mathfrak{R}" . #x0211C) + ("\\mathfrak{S}" . #x1D516) + ("\\mathfrak{T}" . #x1D517) + ("\\mathfrak{U}" . #x1D518) + ("\\mathfrak{V}" . #x1D519) + ("\\mathfrak{W}" . #x1D51A) + ("\\mathfrak{X}" . #x1D51B) + ("\\mathfrak{Y}" . #x1D51C) + ("\\mathfrak{Z}" . #x02128) + ("\\mathfrak{a}" . #x1D51E) + ("\\mathfrak{b}" . #x1D51F) + ("\\mathfrak{c}" . #x1D520) + ("\\mathfrak{d}" . #x1D521) + ("\\mathfrak{e}" . #x1D522) + ("\\mathfrak{f}" . #x1D523) + ("\\mathfrak{g}" . #x1D524) + ("\\mathfrak{h}" . #x1D525) + ("\\mathfrak{i}" . #x1D526) + ("\\mathfrak{j}" . #x1D527) + ("\\mathfrak{k}" . #x1D528) + ("\\mathfrak{l}" . #x1D529) + ("\\mathfrak{m}" . #x1D52A) + ("\\mathfrak{n}" . #x1D52B) + ("\\mathfrak{o}" . #x1D52C) + ("\\mathfrak{p}" . #x1D52D) + ("\\mathfrak{q}" . #x1D52E) + ("\\mathfrak{r}" . #x1D52F) + ("\\mathfrak{s}" . #x1D530) + ("\\mathfrak{t}" . #x1D531) + ("\\mathfrak{u}" . #x1D532) + ("\\mathfrak{v}" . #x1D533) + ("\\mathfrak{w}" . #x1D534) + ("\\mathfrak{x}" . #x1D535) + ("\\mathfrak{y}" . #x1D536) + ("\\mathfrak{z}" . #x1D537) ("--" . ?–) ("---" . ?—) ("\\ordfeminine" . ?ª) commit 928c1626732256a234014ed1b9d44853a85bc7f1 Author: Lars Ingebrigtsen Date: Thu Sep 16 17:13:11 2021 +0200 Mention that the garbage collection is convervative * doc/lispref/internals.texi (Garbage Collection): Mention that we're using a conservative gc (bug#42013). diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi index 0e250d0f59..d3edd63317 100644 --- a/doc/lispref/internals.texi +++ b/doc/lispref/internals.texi @@ -337,18 +337,22 @@ by the vector allocation code while iterating over the vector blocks. It is quite common to use some storage for a while, then release it by (for example) killing a buffer or deleting the last pointer to an object. Emacs provides a @dfn{garbage collector} to reclaim this -abandoned storage. The garbage collector operates by finding and -marking all Lisp objects that are still accessible to Lisp programs. -To begin with, it assumes all the symbols, their values and associated -function definitions, and any data presently on the stack, are -accessible. Any objects that can be reached indirectly through other -accessible objects are also accessible. +abandoned storage. The garbage collector operates, in essence, by +finding and marking all Lisp objects that are still accessible to Lisp +programs. To begin with, it assumes all the symbols, their values and +associated function definitions, and any data presently on the stack, +are accessible. Any objects that can be reached indirectly through +other accessible objects are also accessible, but this calculation is +done ``conservatively'', so it may slightly overestimate how many +objects that are accessible. When marking is finished, all objects still unmarked are garbage. No matter what the Lisp program or the user does, it is impossible to refer to them, since there is no longer a way to reach them. Their space might as well be reused, since no one will miss them. The second -(sweep) phase of the garbage collector arranges to reuse them. +(sweep) phase of the garbage collector arranges to reuse them. (But +since the marking was done ``conservatively'', not all unused objects +are guaranteed to be garbage-collected by any one sweep.) @c ??? Maybe add something describing weak hash tables here? commit 2598b8874edc266667108411c9c3c728b7eda609 Author: Stephen Gildea Date: Fri Sep 17 07:01:40 2021 -0700 MH-E: fix check for nmh or Mailutils installation * lisp/mh-e/mh-e.el (mh-variant-gnu-mh-info, mh-variant-nmh-info): Run install-mh, not mhparam, to check whether an MH variant is installed on the system. mhparam fails if no user profile is found, so it is not a reliable check of the state of the system as a whole. Tested with: nmh 1.4, nmh 1.7.1, GNU Mailutils 2.2, GNU Mailutils 3.7, GNU Mailutils 3.13 diff --git a/lisp/mh-e/mh-e.el b/lisp/mh-e/mh-e.el index 52fb11be6f..9cbc8cfb73 100644 --- a/lisp/mh-e/mh-e.el +++ b/lisp/mh-e/mh-e.el @@ -785,14 +785,16 @@ is described by the variable `mh-variants'." (defun mh-variant-gnu-mh-info (dir) "Return info for GNU mailutils MH variant in DIR. This assumes that a temporary buffer is set up." - ;; 'mhparam -version' output: + ;; Sample '-version' outputs: ;; mhparam (GNU mailutils 0.3.2) - (let ((mhparam (expand-file-name "mhparam" dir))) - (when (mh-file-command-p mhparam) + ;; install-mh (GNU Mailutils 2.2) + ;; install-mh (GNU Mailutils 3.7) + (let ((install-mh (expand-file-name "install-mh" dir))) + (when (mh-file-command-p install-mh) (erase-buffer) - (call-process mhparam nil '(t nil) nil "-version") + (call-process install-mh nil '(t nil) nil "-version") (goto-char (point-min)) - (when (search-forward-regexp "mhparam (\\(GNU [Mm]ailutils \\S +\\))" + (when (search-forward-regexp "install-mh (\\(GNU [Mm]ailutils \\S +\\))" nil t) (let ((version (match-string 1)) (mh-progs dir)) @@ -806,14 +808,15 @@ This assumes that a temporary buffer is set up." (defun mh-variant-nmh-info (dir) "Return info for nmh variant in DIR assuming a temporary buffer is set up." - ;; `mhparam -version' outputs: + ;; Sample '-version' outputs: ;; mhparam -- nmh-1.1-RC1 [compiled on chaak at Fri Jun 20 11:03:28 PDT 2003] - (let ((mhparam (expand-file-name "mhparam" dir))) - (when (mh-file-command-p mhparam) + ;; install-mh -- nmh-1.7.1 built October 26, 2019 on build-server-000 + (let ((install-mh (expand-file-name "install-mh" dir))) + (when (mh-file-command-p install-mh) (erase-buffer) - (call-process mhparam nil '(t nil) nil "-version") + (call-process install-mh nil '(t nil) nil "-version") (goto-char (point-min)) - (when (search-forward-regexp "mhparam -- nmh-\\(\\S +\\)" nil t) + (when (search-forward-regexp "install-mh -- nmh-\\(\\S +\\)" nil t) (let ((version (format "nmh %s" (match-string 1))) (mh-progs dir)) `(,version commit 6397faaaf9b9e47f73d56f330e4964517d646968 Author: Eli Zaretskii Date: Fri Sep 17 17:07:32 2021 +0300 Fix display of stretch glyphs * src/xterm.c (x_draw_stretch_glyph_string): * src/w32term.c (w32_draw_stretch_glyph_string): Fix drawing stretch glyphs when the window is hscrolled. (The original pre-Jan-2021 code was almost correct, except that it used 'window_box_left_offset' instead of 'window_box_left', and didn't restrict the background_width fixup to text-area.) (Bug#50564) diff --git a/src/w32term.c b/src/w32term.c index 70e5501db1..9cf250cd73 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -2423,29 +2423,15 @@ w32_draw_stretch_glyph_string (struct glyph_string *s) else if (!s->background_filled_p) { int background_width = s->background_width; - int x = s->x, text_left_x = window_box_left_offset (s->w, TEXT_AREA); + int x = s->x, text_left_x = window_box_left (s->w, TEXT_AREA); /* Don't draw into left fringe or scrollbar area except for header line and mode line. */ - if (x < text_left_x && !s->row->mode_line_p) + if (s->area == TEXT_AREA + && x < text_left_x && !s->row->mode_line_p) { - int left_x = WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (s->w); - int right_x = text_left_x; - - if (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (s->w)) - left_x += WINDOW_LEFT_FRINGE_WIDTH (s->w); - else - right_x -= WINDOW_LEFT_FRINGE_WIDTH (s->w); - - /* Adjust X and BACKGROUND_WIDTH to fit inside the space - between LEFT_X and RIGHT_X. */ - if (x < left_x) - { - background_width -= left_x - x; - x = left_x; - } - if (x + background_width > right_x) - background_width = right_x - x; + background_width -= text_left_x - x; + x = text_left_x; } if (background_width > 0) w32_draw_glyph_string_bg_rect (s, x, s->y, background_width, s->height); diff --git a/src/xterm.c b/src/xterm.c index 2c56c73068..ae3af598da 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -3588,29 +3588,15 @@ x_draw_stretch_glyph_string (struct glyph_string *s) else if (!s->background_filled_p) { int background_width = s->background_width; - int x = s->x, text_left_x = window_box_left_offset (s->w, TEXT_AREA); + int x = s->x, text_left_x = window_box_left (s->w, TEXT_AREA); /* Don't draw into left fringe or scrollbar area except for header line and mode line. */ - if (x < text_left_x && !s->row->mode_line_p) + if (s->area == TEXT_AREA + && x < text_left_x && !s->row->mode_line_p) { - int left_x = WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (s->w); - int right_x = text_left_x; - - if (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (s->w)) - left_x += WINDOW_LEFT_FRINGE_WIDTH (s->w); - else - right_x -= WINDOW_LEFT_FRINGE_WIDTH (s->w); - - /* Adjust X and BACKGROUND_WIDTH to fit inside the space - between LEFT_X and RIGHT_X. */ - if (x < left_x) - { - background_width -= left_x - x; - x = left_x; - } - if (x + background_width > right_x) - background_width = right_x - x; + background_width -= text_left_x - x; + x = text_left_x; } if (background_width > 0) x_draw_glyph_string_bg_rect (s, x, s->y, background_width, s->height); commit 12d2fb58c416b557924174f57bfb1c9b9e7cf999 Author: Robert Pluim Date: Tue Sep 14 19:07:03 2021 +0200 Split Unicode emoji into their own script * admin/notes/unicode: Describe how to update emoji for new Unicode release. * admin/unidata/Makefile.in: Pass emoji-data.txt to blocks.awk script. * admin/unidata/README: Add pointer to emoji-data.txt file. * admin/unidata/blocks.awk: Parse emoji-data.txt, add emoji codepoints to the 'emoji' script (except for the ASCII ones). * admin/unidata/emoji-data.txt: New file. * etc/NEWS: Describe new 'emoji' script. * etc/TODO: Update item about 'emoji' script. * lisp/international/fontset.el (script-representative-chars): Add 'emoji' script. (setup-default-fontset): Add 'emoji' script. Use "Noto Color Emoji" as default font for it. diff --git a/admin/notes/unicode b/admin/notes/unicode index 87ced07bd9..9dc6f3bdca 100644 --- a/admin/notes/unicode +++ b/admin/notes/unicode @@ -16,13 +16,14 @@ Emacs uses the following files from the Unicode Character Database . IVD_Sequences.txt . NormalizationTest.txt . SpecialCasing.txt + . emoji-data.txt . BidiCharacterTest.txt -First, the first 7 files need to be copied into admin/unidata/, and +First, the first 8 files need to be copied into admin/unidata/, and the file https://www.unicode.org/copyright.html should be copied over -copyright.html in admin/unidata (that file might need trailing -whitespace removed before it can be committed to the Emacs -repository). +copyright.html in admin/unidata (that file and emoji-data.txt might +need trailing whitespace removed before they can be committed to the +Emacs repository). Then Emacs should be rebuilt for them to take effect. Rebuilding Emacs updates several derived files elsewhere in the Emacs source @@ -85,8 +86,34 @@ modified to follow suit. If there's trailing whitespace in BidiCharacterTest.txt, it should be removed before committing the new version. -etc/NEWS should be updated to announce the support for the new Unicode -version. +Visit "emoji-data.txt" with the rebuilt Emacs, and check that an +appropriate font is being used for the emoji (by default Emacs uses +"Noto Color Emoji"). Running the following command in that buffer +will give you an idea of which codepoints are not supported by +whichever font Emacs is using. + +(defun check-emoji-coverage (font-name-regexp) +"Display a buffer containing emoji codepoints for which FONT-NAME is not used. +This must be run from a buffer in the format of emoji-data.txt. +FONT-NAME-REGEXP is checked using `string-match'." +(interactive "MFont Name: ") +(save-excursion +(goto-char (point-min)) +(let (res char name ifont) + (while (re-search-forward "; Emoji [^(]+(\\(.\\)[).\uFE0F]" nil t) + (setq char (aref (match-string 1) 0)) + (setq ifont (car (internal-char-font nil char))) + (when ifont + (setq name (font-xlfd-name ifont))) + (if (or (not ifont) (not (string-match font-name-regexp name))) + (setq res (concat (string char) res)))) + (when res + (with-output-to-temp-buffer "*Check-Emoji-Coverage*" + (princ (format "Font not matching '%s' was used for the following characters:\n%s" + font-name-regexp (reverse res)))))))) + +Finally, etc/NEWS should be updated to announce the support for the +new Unicode version. Problems, fixmes and other unicode-related issues ------------------------------------------------------------- diff --git a/admin/unidata/Makefile.in b/admin/unidata/Makefile.in index 357b812678..c57803e922 100644 --- a/admin/unidata/Makefile.in +++ b/admin/unidata/Makefile.in @@ -81,8 +81,10 @@ charscript.el: ${unidir}/charscript.el blocks = ${srcdir}/blocks.awk -${unidir}/charscript.el: ${srcdir}/Blocks.txt ${blocks} - $(AM_V_GEN)$(AWK) -f ${blocks} < $< > $@ +${unidir}/charscript.el: ${blocks} + +${unidir}/charscript.el: ${srcdir}/Blocks.txt ${srcdir}/emoji-data.txt + $(AM_V_GEN)$(AWK) -f ${blocks} $^ > $@ .PHONY: clean bootstrap-clean distclean maintainer-clean gen-clean diff --git a/admin/unidata/README b/admin/unidata/README index f5881a1a14..e1129e1866 100644 --- a/admin/unidata/README +++ b/admin/unidata/README @@ -32,3 +32,7 @@ http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt SpecialCasing.txt http://unicode.org/Public/UNIDATA/SpecialCasing.txt 2017-04-20 + +emoji-data.txt +https://www.unicode.org/Public/14.0.0/ucd/emoji/emoji-data.txt +2021-08-26 diff --git a/admin/unidata/blocks.awk b/admin/unidata/blocks.awk index 4ecb233fe7..72a808ab61 100755 --- a/admin/unidata/blocks.awk +++ b/admin/unidata/blocks.awk @@ -131,7 +131,7 @@ function name2alias(name , w, w2) { return name } -/^[0-9A-F]/ { +FILENAME == "Blocks.txt" && /^[0-9A-F]/ { sep = index($1, "..") len = length($1) s = substr($1,1,sep-1) @@ -202,6 +202,29 @@ function name2alias(name , w, w2) { } } +# The space after 'Emoji' is significant in the next two rules. +# This purposely and deliberately excludes codepoints <= 00FF +FILENAME == "emoji-data.txt" && /^00[0-9A-F]{2}.*; Emoji / { + next +} +FILENAME == "emoji-data.txt" && /^[0-9A-F].*; Emoji / { + sep = index($1, "..") + len = length($1) + if (sep > 0) { + s = substr($1,1,sep-1) + e = substr($1,sep+2,len-sep-1) + } else { + s = $1 + e = $1 + } + $1 = "" + i++ + start[i] = s + end[i] = e + alt[i] = "emoji" + name[i] = "Autogenerated emoji" +} + END { print ";;; charscript.el --- character script table -*- lexical-binding:t -*-" print ";;; Automatically generated from admin/unidata/Blocks.txt" @@ -223,6 +246,6 @@ END { print " (or (memq (nth 2 elt) script-list)" print " (setq script-list (cons (nth 2 elt) script-list))))" print " (set-char-table-extra-slot char-script-table 0 (nreverse script-list)))" - print "" + print "\n" print "(provide 'charscript)" } diff --git a/admin/unidata/emoji-data.txt b/admin/unidata/emoji-data.txt new file mode 100644 index 0000000000..2e9cf75ad4 --- /dev/null +++ b/admin/unidata/emoji-data.txt @@ -0,0 +1,1297 @@ +# emoji-data-14.0.0.txt +# Date: 2021-08-26, 17:22:22 GMT +# © 2021 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Emoji Data for UTS #51 +# Used with Emoji Version 14.0 and subsequent minor revisions (if any) +# +# For documentation and usage, see http://www.unicode.org/reports/tr51 +# +# Format: +# ; # +# Note: there is no guarantee as to the structure of whitespace or comments +# +# Characters and sequences are listed in code point order. Users should be shown a more natural order. +# See the CLDR collation order for Emoji. + + +# ================================================ + +# All omitted code points have Emoji=No +# @missing: 0000..10FFFF ; Emoji ; No + +0023 ; Emoji # E0.0 [1] (#️) hash sign +002A ; Emoji # E0.0 [1] (*️) asterisk +0030..0039 ; Emoji # E0.0 [10] (0️..9️) digit zero..digit nine +00A9 ; Emoji # E0.6 [1] (©️) copyright +00AE ; Emoji # E0.6 [1] (®️) registered +203C ; Emoji # E0.6 [1] (‼️) double exclamation mark +2049 ; Emoji # E0.6 [1] (⁉️) exclamation question mark +2122 ; Emoji # E0.6 [1] (™️) trade mark +2139 ; Emoji # E0.6 [1] (ℹ️) information +2194..2199 ; Emoji # E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow +21A9..21AA ; Emoji # E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right +231A..231B ; Emoji # E0.6 [2] (⌚..⌛) watch..hourglass done +2328 ; Emoji # E1.0 [1] (⌨️) keyboard +23CF ; Emoji # E1.0 [1] (⏏️) eject button +23E9..23EC ; Emoji # E0.6 [4] (⏩..⏬) fast-forward button..fast down button +23ED..23EE ; Emoji # E0.7 [2] (⏭️..⏮️) next track button..last track button +23EF ; Emoji # E1.0 [1] (⏯️) play or pause button +23F0 ; Emoji # E0.6 [1] (⏰) alarm clock +23F1..23F2 ; Emoji # E1.0 [2] (⏱️..⏲️) stopwatch..timer clock +23F3 ; Emoji # E0.6 [1] (⏳) hourglass not done +23F8..23FA ; Emoji # E0.7 [3] (⏸️..⏺️) pause button..record button +24C2 ; Emoji # E0.6 [1] (Ⓜ️) circled M +25AA..25AB ; Emoji # E0.6 [2] (▪️..▫️) black small square..white small square +25B6 ; Emoji # E0.6 [1] (▶️) play button +25C0 ; Emoji # E0.6 [1] (◀️) reverse button +25FB..25FE ; Emoji # E0.6 [4] (◻️..◾) white medium square..black medium-small square +2600..2601 ; Emoji # E0.6 [2] (☀️..☁️) sun..cloud +2602..2603 ; Emoji # E0.7 [2] (☂️..☃️) umbrella..snowman +2604 ; Emoji # E1.0 [1] (☄️) comet +260E ; Emoji # E0.6 [1] (☎️) telephone +2611 ; Emoji # E0.6 [1] (☑️) check box with check +2614..2615 ; Emoji # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage +2618 ; Emoji # E1.0 [1] (☘️) shamrock +261D ; Emoji # E0.6 [1] (☝️) index pointing up +2620 ; Emoji # E1.0 [1] (☠️) skull and crossbones +2622..2623 ; Emoji # E1.0 [2] (☢️..☣️) radioactive..biohazard +2626 ; Emoji # E1.0 [1] (☦️) orthodox cross +262A ; Emoji # E0.7 [1] (☪️) star and crescent +262E ; Emoji # E1.0 [1] (☮️) peace symbol +262F ; Emoji # E0.7 [1] (☯️) yin yang +2638..2639 ; Emoji # E0.7 [2] (☸️..☹️) wheel of dharma..frowning face +263A ; Emoji # E0.6 [1] (☺️) smiling face +2640 ; Emoji # E4.0 [1] (♀️) female sign +2642 ; Emoji # E4.0 [1] (♂️) male sign +2648..2653 ; Emoji # E0.6 [12] (♈..♓) Aries..Pisces +265F ; Emoji # E11.0 [1] (♟️) chess pawn +2660 ; Emoji # E0.6 [1] (♠️) spade suit +2663 ; Emoji # E0.6 [1] (♣️) club suit +2665..2666 ; Emoji # E0.6 [2] (♥️..♦️) heart suit..diamond suit +2668 ; Emoji # E0.6 [1] (♨️) hot springs +267B ; Emoji # E0.6 [1] (♻️) recycling symbol +267E ; Emoji # E11.0 [1] (♾️) infinity +267F ; Emoji # E0.6 [1] (♿) wheelchair symbol +2692 ; Emoji # E1.0 [1] (⚒️) hammer and pick +2693 ; Emoji # E0.6 [1] (⚓) anchor +2694 ; Emoji # E1.0 [1] (⚔️) crossed swords +2695 ; Emoji # E4.0 [1] (⚕️) medical symbol +2696..2697 ; Emoji # E1.0 [2] (⚖️..⚗️) balance scale..alembic +2699 ; Emoji # E1.0 [1] (⚙️) gear +269B..269C ; Emoji # E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis +26A0..26A1 ; Emoji # E0.6 [2] (⚠️..⚡) warning..high voltage +26A7 ; Emoji # E13.0 [1] (⚧️) transgender symbol +26AA..26AB ; Emoji # E0.6 [2] (⚪..⚫) white circle..black circle +26B0..26B1 ; Emoji # E1.0 [2] (⚰️..⚱️) coffin..funeral urn +26BD..26BE ; Emoji # E0.6 [2] (⚽..⚾) soccer ball..baseball +26C4..26C5 ; Emoji # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud +26C8 ; Emoji # E0.7 [1] (⛈️) cloud with lightning and rain +26CE ; Emoji # E0.6 [1] (⛎) Ophiuchus +26CF ; Emoji # E0.7 [1] (⛏️) pick +26D1 ; Emoji # E0.7 [1] (⛑️) rescue worker’s helmet +26D3 ; Emoji # E0.7 [1] (⛓️) chains +26D4 ; Emoji # E0.6 [1] (⛔) no entry +26E9 ; Emoji # E0.7 [1] (⛩️) shinto shrine +26EA ; Emoji # E0.6 [1] (⛪) church +26F0..26F1 ; Emoji # E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground +26F2..26F3 ; Emoji # E0.6 [2] (⛲..⛳) fountain..flag in hole +26F4 ; Emoji # E0.7 [1] (⛴️) ferry +26F5 ; Emoji # E0.6 [1] (⛵) sailboat +26F7..26F9 ; Emoji # E0.7 [3] (⛷️..⛹️) skier..person bouncing ball +26FA ; Emoji # E0.6 [1] (⛺) tent +26FD ; Emoji # E0.6 [1] (⛽) fuel pump +2702 ; Emoji # E0.6 [1] (✂️) scissors +2705 ; Emoji # E0.6 [1] (✅) check mark button +2708..270C ; Emoji # E0.6 [5] (✈️..✌️) airplane..victory hand +270D ; Emoji # E0.7 [1] (✍️) writing hand +270F ; Emoji # E0.6 [1] (✏️) pencil +2712 ; Emoji # E0.6 [1] (✒️) black nib +2714 ; Emoji # E0.6 [1] (✔️) check mark +2716 ; Emoji # E0.6 [1] (✖️) multiply +271D ; Emoji # E0.7 [1] (✝️) latin cross +2721 ; Emoji # E0.7 [1] (✡️) star of David +2728 ; Emoji # E0.6 [1] (✨) sparkles +2733..2734 ; Emoji # E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star +2744 ; Emoji # E0.6 [1] (❄️) snowflake +2747 ; Emoji # E0.6 [1] (❇️) sparkle +274C ; Emoji # E0.6 [1] (❌) cross mark +274E ; Emoji # E0.6 [1] (❎) cross mark button +2753..2755 ; Emoji # E0.6 [3] (❓..❕) red question mark..white exclamation mark +2757 ; Emoji # E0.6 [1] (❗) red exclamation mark +2763 ; Emoji # E1.0 [1] (❣️) heart exclamation +2764 ; Emoji # E0.6 [1] (❤️) red heart +2795..2797 ; Emoji # E0.6 [3] (➕..➗) plus..divide +27A1 ; Emoji # E0.6 [1] (➡️) right arrow +27B0 ; Emoji # E0.6 [1] (➰) curly loop +27BF ; Emoji # E1.0 [1] (➿) double curly loop +2934..2935 ; Emoji # E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down +2B05..2B07 ; Emoji # E0.6 [3] (⬅️..⬇️) left arrow..down arrow +2B1B..2B1C ; Emoji # E0.6 [2] (⬛..⬜) black large square..white large square +2B50 ; Emoji # E0.6 [1] (⭐) star +2B55 ; Emoji # E0.6 [1] (⭕) hollow red circle +3030 ; Emoji # E0.6 [1] (〰️) wavy dash +303D ; Emoji # E0.6 [1] (〽️) part alternation mark +3297 ; Emoji # E0.6 [1] (㊗️) Japanese “congratulations” button +3299 ; Emoji # E0.6 [1] (㊙️) Japanese “secret” button +1F004 ; Emoji # E0.6 [1] (🀄) mahjong red dragon +1F0CF ; Emoji # E0.6 [1] (🃏) joker +1F170..1F171 ; Emoji # E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) +1F17E..1F17F ; Emoji # E0.6 [2] (🅾️..🅿️) O button (blood type)..P button +1F18E ; Emoji # E0.6 [1] (🆎) AB button (blood type) +1F191..1F19A ; Emoji # E0.6 [10] (🆑..🆚) CL button..VS button +1F1E6..1F1FF ; Emoji # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z +1F201..1F202 ; Emoji # E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button +1F21A ; Emoji # E0.6 [1] (🈚) Japanese “free of charge” button +1F22F ; Emoji # E0.6 [1] (🈯) Japanese “reserved” button +1F232..1F23A ; Emoji # E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button +1F250..1F251 ; Emoji # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button +1F300..1F30C ; Emoji # E0.6 [13] (🌀..🌌) cyclone..milky way +1F30D..1F30E ; Emoji # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas +1F30F ; Emoji # E0.6 [1] (🌏) globe showing Asia-Australia +1F310 ; Emoji # E1.0 [1] (🌐) globe with meridians +1F311 ; Emoji # E0.6 [1] (🌑) new moon +1F312 ; Emoji # E1.0 [1] (🌒) waxing crescent moon +1F313..1F315 ; Emoji # E0.6 [3] (🌓..🌕) first quarter moon..full moon +1F316..1F318 ; Emoji # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon +1F319 ; Emoji # E0.6 [1] (🌙) crescent moon +1F31A ; Emoji # E1.0 [1] (🌚) new moon face +1F31B ; Emoji # E0.6 [1] (🌛) first quarter moon face +1F31C ; Emoji # E0.7 [1] (🌜) last quarter moon face +1F31D..1F31E ; Emoji # E1.0 [2] (🌝..🌞) full moon face..sun with face +1F31F..1F320 ; Emoji # E0.6 [2] (🌟..🌠) glowing star..shooting star +1F321 ; Emoji # E0.7 [1] (🌡️) thermometer +1F324..1F32C ; Emoji # E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face +1F32D..1F32F ; Emoji # E1.0 [3] (🌭..🌯) hot dog..burrito +1F330..1F331 ; Emoji # E0.6 [2] (🌰..🌱) chestnut..seedling +1F332..1F333 ; Emoji # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree +1F334..1F335 ; Emoji # E0.6 [2] (🌴..🌵) palm tree..cactus +1F336 ; Emoji # E0.7 [1] (🌶️) hot pepper +1F337..1F34A ; Emoji # E0.6 [20] (🌷..🍊) tulip..tangerine +1F34B ; Emoji # E1.0 [1] (🍋) lemon +1F34C..1F34F ; Emoji # E0.6 [4] (🍌..🍏) banana..green apple +1F350 ; Emoji # E1.0 [1] (🍐) pear +1F351..1F37B ; Emoji # E0.6 [43] (🍑..🍻) peach..clinking beer mugs +1F37C ; Emoji # E1.0 [1] (🍼) baby bottle +1F37D ; Emoji # E0.7 [1] (🍽️) fork and knife with plate +1F37E..1F37F ; Emoji # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn +1F380..1F393 ; Emoji # E0.6 [20] (🎀..🎓) ribbon..graduation cap +1F396..1F397 ; Emoji # E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon +1F399..1F39B ; Emoji # E0.7 [3] (🎙️..🎛️) studio microphone..control knobs +1F39E..1F39F ; Emoji # E0.7 [2] (🎞️..🎟️) film frames..admission tickets +1F3A0..1F3C4 ; Emoji # E0.6 [37] (🎠..🏄) carousel horse..person surfing +1F3C5 ; Emoji # E1.0 [1] (🏅) sports medal +1F3C6 ; Emoji # E0.6 [1] (🏆) trophy +1F3C7 ; Emoji # E1.0 [1] (🏇) horse racing +1F3C8 ; Emoji # E0.6 [1] (🏈) american football +1F3C9 ; Emoji # E1.0 [1] (🏉) rugby football +1F3CA ; Emoji # E0.6 [1] (🏊) person swimming +1F3CB..1F3CE ; Emoji # E0.7 [4] (🏋️..🏎️) person lifting weights..racing car +1F3CF..1F3D3 ; Emoji # E1.0 [5] (🏏..🏓) cricket game..ping pong +1F3D4..1F3DF ; Emoji # E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium +1F3E0..1F3E3 ; Emoji # E0.6 [4] (🏠..🏣) house..Japanese post office +1F3E4 ; Emoji # E1.0 [1] (🏤) post office +1F3E5..1F3F0 ; Emoji # E0.6 [12] (🏥..🏰) hospital..castle +1F3F3 ; Emoji # E0.7 [1] (🏳️) white flag +1F3F4 ; Emoji # E1.0 [1] (🏴) black flag +1F3F5 ; Emoji # E0.7 [1] (🏵️) rosette +1F3F7 ; Emoji # E0.7 [1] (🏷️) label +1F3F8..1F407 ; Emoji # E1.0 [16] (🏸..🐇) badminton..rabbit +1F408 ; Emoji # E0.7 [1] (🐈) cat +1F409..1F40B ; Emoji # E1.0 [3] (🐉..🐋) dragon..whale +1F40C..1F40E ; Emoji # E0.6 [3] (🐌..🐎) snail..horse +1F40F..1F410 ; Emoji # E1.0 [2] (🐏..🐐) ram..goat +1F411..1F412 ; Emoji # E0.6 [2] (🐑..🐒) ewe..monkey +1F413 ; Emoji # E1.0 [1] (🐓) rooster +1F414 ; Emoji # E0.6 [1] (🐔) chicken +1F415 ; Emoji # E0.7 [1] (🐕) dog +1F416 ; Emoji # E1.0 [1] (🐖) pig +1F417..1F429 ; Emoji # E0.6 [19] (🐗..🐩) boar..poodle +1F42A ; Emoji # E1.0 [1] (🐪) camel +1F42B..1F43E ; Emoji # E0.6 [20] (🐫..🐾) two-hump camel..paw prints +1F43F ; Emoji # E0.7 [1] (🐿️) chipmunk +1F440 ; Emoji # E0.6 [1] (👀) eyes +1F441 ; Emoji # E0.7 [1] (👁️) eye +1F442..1F464 ; Emoji # E0.6 [35] (👂..👤) ear..bust in silhouette +1F465 ; Emoji # E1.0 [1] (👥) busts in silhouette +1F466..1F46B ; Emoji # E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Emoji # E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F4AC ; Emoji # E0.6 [63] (👮..💬) police officer..speech balloon +1F4AD ; Emoji # E1.0 [1] (💭) thought balloon +1F4AE..1F4B5 ; Emoji # E0.6 [8] (💮..💵) white flower..dollar banknote +1F4B6..1F4B7 ; Emoji # E1.0 [2] (💶..💷) euro banknote..pound banknote +1F4B8..1F4EB ; Emoji # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag +1F4EC..1F4ED ; Emoji # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag +1F4EE ; Emoji # E0.6 [1] (📮) postbox +1F4EF ; Emoji # E1.0 [1] (📯) postal horn +1F4F0..1F4F4 ; Emoji # E0.6 [5] (📰..📴) newspaper..mobile phone off +1F4F5 ; Emoji # E1.0 [1] (📵) no mobile phones +1F4F6..1F4F7 ; Emoji # E0.6 [2] (📶..📷) antenna bars..camera +1F4F8 ; Emoji # E1.0 [1] (📸) camera with flash +1F4F9..1F4FC ; Emoji # E0.6 [4] (📹..📼) video camera..videocassette +1F4FD ; Emoji # E0.7 [1] (📽️) film projector +1F4FF..1F502 ; Emoji # E1.0 [4] (📿..🔂) prayer beads..repeat single button +1F503 ; Emoji # E0.6 [1] (🔃) clockwise vertical arrows +1F504..1F507 ; Emoji # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker +1F508 ; Emoji # E0.7 [1] (🔈) speaker low volume +1F509 ; Emoji # E1.0 [1] (🔉) speaker medium volume +1F50A..1F514 ; Emoji # E0.6 [11] (🔊..🔔) speaker high volume..bell +1F515 ; Emoji # E1.0 [1] (🔕) bell with slash +1F516..1F52B ; Emoji # E0.6 [22] (🔖..🔫) bookmark..water pistol +1F52C..1F52D ; Emoji # E1.0 [2] (🔬..🔭) microscope..telescope +1F52E..1F53D ; Emoji # E0.6 [16] (🔮..🔽) crystal ball..downwards button +1F549..1F54A ; Emoji # E0.7 [2] (🕉️..🕊️) om..dove +1F54B..1F54E ; Emoji # E1.0 [4] (🕋..🕎) kaaba..menorah +1F550..1F55B ; Emoji # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock +1F55C..1F567 ; Emoji # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty +1F56F..1F570 ; Emoji # E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock +1F573..1F579 ; Emoji # E0.7 [7] (🕳️..🕹️) hole..joystick +1F57A ; Emoji # E3.0 [1] (🕺) man dancing +1F587 ; Emoji # E0.7 [1] (🖇️) linked paperclips +1F58A..1F58D ; Emoji # E0.7 [4] (🖊️..🖍️) pen..crayon +1F590 ; Emoji # E0.7 [1] (🖐️) hand with fingers splayed +1F595..1F596 ; Emoji # E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F5A4 ; Emoji # E3.0 [1] (🖤) black heart +1F5A5 ; Emoji # E0.7 [1] (🖥️) desktop computer +1F5A8 ; Emoji # E0.7 [1] (🖨️) printer +1F5B1..1F5B2 ; Emoji # E0.7 [2] (🖱️..🖲️) computer mouse..trackball +1F5BC ; Emoji # E0.7 [1] (🖼️) framed picture +1F5C2..1F5C4 ; Emoji # E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet +1F5D1..1F5D3 ; Emoji # E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar +1F5DC..1F5DE ; Emoji # E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper +1F5E1 ; Emoji # E0.7 [1] (🗡️) dagger +1F5E3 ; Emoji # E0.7 [1] (🗣️) speaking head +1F5E8 ; Emoji # E2.0 [1] (🗨️) left speech bubble +1F5EF ; Emoji # E0.7 [1] (🗯️) right anger bubble +1F5F3 ; Emoji # E0.7 [1] (🗳️) ballot box with ballot +1F5FA ; Emoji # E0.7 [1] (🗺️) world map +1F5FB..1F5FF ; Emoji # E0.6 [5] (🗻..🗿) mount fuji..moai +1F600 ; Emoji # E1.0 [1] (😀) grinning face +1F601..1F606 ; Emoji # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face +1F607..1F608 ; Emoji # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns +1F609..1F60D ; Emoji # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes +1F60E ; Emoji # E1.0 [1] (😎) smiling face with sunglasses +1F60F ; Emoji # E0.6 [1] (😏) smirking face +1F610 ; Emoji # E0.7 [1] (😐) neutral face +1F611 ; Emoji # E1.0 [1] (😑) expressionless face +1F612..1F614 ; Emoji # E0.6 [3] (😒..😔) unamused face..pensive face +1F615 ; Emoji # E1.0 [1] (😕) confused face +1F616 ; Emoji # E0.6 [1] (😖) confounded face +1F617 ; Emoji # E1.0 [1] (😗) kissing face +1F618 ; Emoji # E0.6 [1] (😘) face blowing a kiss +1F619 ; Emoji # E1.0 [1] (😙) kissing face with smiling eyes +1F61A ; Emoji # E0.6 [1] (😚) kissing face with closed eyes +1F61B ; Emoji # E1.0 [1] (😛) face with tongue +1F61C..1F61E ; Emoji # E0.6 [3] (😜..😞) winking face with tongue..disappointed face +1F61F ; Emoji # E1.0 [1] (😟) worried face +1F620..1F625 ; Emoji # E0.6 [6] (😠..😥) angry face..sad but relieved face +1F626..1F627 ; Emoji # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face +1F628..1F62B ; Emoji # E0.6 [4] (😨..😫) fearful face..tired face +1F62C ; Emoji # E1.0 [1] (😬) grimacing face +1F62D ; Emoji # E0.6 [1] (😭) loudly crying face +1F62E..1F62F ; Emoji # E1.0 [2] (😮..😯) face with open mouth..hushed face +1F630..1F633 ; Emoji # E0.6 [4] (😰..😳) anxious face with sweat..flushed face +1F634 ; Emoji # E1.0 [1] (😴) sleeping face +1F635 ; Emoji # E0.6 [1] (😵) face with crossed-out eyes +1F636 ; Emoji # E1.0 [1] (😶) face without mouth +1F637..1F640 ; Emoji # E0.6 [10] (😷..🙀) face with medical mask..weary cat +1F641..1F644 ; Emoji # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes +1F645..1F64F ; Emoji # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands +1F680 ; Emoji # E0.6 [1] (🚀) rocket +1F681..1F682 ; Emoji # E1.0 [2] (🚁..🚂) helicopter..locomotive +1F683..1F685 ; Emoji # E0.6 [3] (🚃..🚅) railway car..bullet train +1F686 ; Emoji # E1.0 [1] (🚆) train +1F687 ; Emoji # E0.6 [1] (🚇) metro +1F688 ; Emoji # E1.0 [1] (🚈) light rail +1F689 ; Emoji # E0.6 [1] (🚉) station +1F68A..1F68B ; Emoji # E1.0 [2] (🚊..🚋) tram..tram car +1F68C ; Emoji # E0.6 [1] (🚌) bus +1F68D ; Emoji # E0.7 [1] (🚍) oncoming bus +1F68E ; Emoji # E1.0 [1] (🚎) trolleybus +1F68F ; Emoji # E0.6 [1] (🚏) bus stop +1F690 ; Emoji # E1.0 [1] (🚐) minibus +1F691..1F693 ; Emoji # E0.6 [3] (🚑..🚓) ambulance..police car +1F694 ; Emoji # E0.7 [1] (🚔) oncoming police car +1F695 ; Emoji # E0.6 [1] (🚕) taxi +1F696 ; Emoji # E1.0 [1] (🚖) oncoming taxi +1F697 ; Emoji # E0.6 [1] (🚗) automobile +1F698 ; Emoji # E0.7 [1] (🚘) oncoming automobile +1F699..1F69A ; Emoji # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck +1F69B..1F6A1 ; Emoji # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway +1F6A2 ; Emoji # E0.6 [1] (🚢) ship +1F6A3 ; Emoji # E1.0 [1] (🚣) person rowing boat +1F6A4..1F6A5 ; Emoji # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light +1F6A6 ; Emoji # E1.0 [1] (🚦) vertical traffic light +1F6A7..1F6AD ; Emoji # E0.6 [7] (🚧..🚭) construction..no smoking +1F6AE..1F6B1 ; Emoji # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water +1F6B2 ; Emoji # E0.6 [1] (🚲) bicycle +1F6B3..1F6B5 ; Emoji # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking +1F6B6 ; Emoji # E0.6 [1] (🚶) person walking +1F6B7..1F6B8 ; Emoji # E1.0 [2] (🚷..🚸) no pedestrians..children crossing +1F6B9..1F6BE ; Emoji # E0.6 [6] (🚹..🚾) men’s room..water closet +1F6BF ; Emoji # E1.0 [1] (🚿) shower +1F6C0 ; Emoji # E0.6 [1] (🛀) person taking bath +1F6C1..1F6C5 ; Emoji # E1.0 [5] (🛁..🛅) bathtub..left luggage +1F6CB ; Emoji # E0.7 [1] (🛋️) couch and lamp +1F6CC ; Emoji # E1.0 [1] (🛌) person in bed +1F6CD..1F6CF ; Emoji # E0.7 [3] (🛍️..🛏️) shopping bags..bed +1F6D0 ; Emoji # E1.0 [1] (🛐) place of worship +1F6D1..1F6D2 ; Emoji # E3.0 [2] (🛑..🛒) stop sign..shopping cart +1F6D5 ; Emoji # E12.0 [1] (🛕) hindu temple +1F6D6..1F6D7 ; Emoji # E13.0 [2] (🛖..🛗) hut..elevator +1F6DD..1F6DF ; Emoji # E14.0 [3] (🛝..🛟) playground slide..ring buoy +1F6E0..1F6E5 ; Emoji # E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat +1F6E9 ; Emoji # E0.7 [1] (🛩️) small airplane +1F6EB..1F6EC ; Emoji # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival +1F6F0 ; Emoji # E0.7 [1] (🛰️) satellite +1F6F3 ; Emoji # E0.7 [1] (🛳️) passenger ship +1F6F4..1F6F6 ; Emoji # E3.0 [3] (🛴..🛶) kick scooter..canoe +1F6F7..1F6F8 ; Emoji # E5.0 [2] (🛷..🛸) sled..flying saucer +1F6F9 ; Emoji # E11.0 [1] (🛹) skateboard +1F6FA ; Emoji # E12.0 [1] (🛺) auto rickshaw +1F6FB..1F6FC ; Emoji # E13.0 [2] (🛻..🛼) pickup truck..roller skate +1F7E0..1F7EB ; Emoji # E12.0 [12] (🟠..🟫) orange circle..brown square +1F7F0 ; Emoji # E14.0 [1] (🟰) heavy equals sign +1F90C ; Emoji # E13.0 [1] (🤌) pinched fingers +1F90D..1F90F ; Emoji # E12.0 [3] (🤍..🤏) white heart..pinching hand +1F910..1F918 ; Emoji # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns +1F919..1F91E ; Emoji # E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Emoji # E5.0 [1] (🤟) love-you gesture +1F920..1F927 ; Emoji # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face +1F928..1F92F ; Emoji # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head +1F930 ; Emoji # E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Emoji # E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F93A ; Emoji # E3.0 [8] (🤳..🤺) selfie..person fencing +1F93C..1F93E ; Emoji # E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F93F ; Emoji # E12.0 [1] (🤿) diving mask +1F940..1F945 ; Emoji # E3.0 [6] (🥀..🥅) wilted flower..goal net +1F947..1F94B ; Emoji # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform +1F94C ; Emoji # E5.0 [1] (🥌) curling stone +1F94D..1F94F ; Emoji # E11.0 [3] (🥍..🥏) lacrosse..flying disc +1F950..1F95E ; Emoji # E3.0 [15] (🥐..🥞) croissant..pancakes +1F95F..1F96B ; Emoji # E5.0 [13] (🥟..🥫) dumpling..canned food +1F96C..1F970 ; Emoji # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts +1F971 ; Emoji # E12.0 [1] (🥱) yawning face +1F972 ; Emoji # E13.0 [1] (🥲) smiling face with tear +1F973..1F976 ; Emoji # E11.0 [4] (🥳..🥶) partying face..cold face +1F977..1F978 ; Emoji # E13.0 [2] (🥷..🥸) ninja..disguised face +1F979 ; Emoji # E14.0 [1] (🥹) face holding back tears +1F97A ; Emoji # E11.0 [1] (🥺) pleading face +1F97B ; Emoji # E12.0 [1] (🥻) sari +1F97C..1F97F ; Emoji # E11.0 [4] (🥼..🥿) lab coat..flat shoe +1F980..1F984 ; Emoji # E1.0 [5] (🦀..🦄) crab..unicorn +1F985..1F991 ; Emoji # E3.0 [13] (🦅..🦑) eagle..squid +1F992..1F997 ; Emoji # E5.0 [6] (🦒..🦗) giraffe..cricket +1F998..1F9A2 ; Emoji # E11.0 [11] (🦘..🦢) kangaroo..swan +1F9A3..1F9A4 ; Emoji # E13.0 [2] (🦣..🦤) mammoth..dodo +1F9A5..1F9AA ; Emoji # E12.0 [6] (🦥..🦪) sloth..oyster +1F9AB..1F9AD ; Emoji # E13.0 [3] (🦫..🦭) beaver..seal +1F9AE..1F9AF ; Emoji # E12.0 [2] (🦮..🦯) guide dog..white cane +1F9B0..1F9B9 ; Emoji # E11.0 [10] (🦰..🦹) red hair..supervillain +1F9BA..1F9BF ; Emoji # E12.0 [6] (🦺..🦿) safety vest..mechanical leg +1F9C0 ; Emoji # E1.0 [1] (🧀) cheese wedge +1F9C1..1F9C2 ; Emoji # E11.0 [2] (🧁..🧂) cupcake..salt +1F9C3..1F9CA ; Emoji # E12.0 [8] (🧃..🧊) beverage box..ice +1F9CB ; Emoji # E13.0 [1] (🧋) bubble tea +1F9CC ; Emoji # E14.0 [1] (🧌) troll +1F9CD..1F9CF ; Emoji # E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D0..1F9E6 ; Emoji # E5.0 [23] (🧐..🧦) face with monocle..socks +1F9E7..1F9FF ; Emoji # E11.0 [25] (🧧..🧿) red envelope..nazar amulet +1FA70..1FA73 ; Emoji # E12.0 [4] (🩰..🩳) ballet shoes..shorts +1FA74 ; Emoji # E13.0 [1] (🩴) thong sandal +1FA78..1FA7A ; Emoji # E12.0 [3] (🩸..🩺) drop of blood..stethoscope +1FA7B..1FA7C ; Emoji # E14.0 [2] (🩻..🩼) x-ray..crutch +1FA80..1FA82 ; Emoji # E12.0 [3] (🪀..🪂) yo-yo..parachute +1FA83..1FA86 ; Emoji # E13.0 [4] (🪃..🪆) boomerang..nesting dolls +1FA90..1FA95 ; Emoji # E12.0 [6] (🪐..🪕) ringed planet..banjo +1FA96..1FAA8 ; Emoji # E13.0 [19] (🪖..🪨) military helmet..rock +1FAA9..1FAAC ; Emoji # E14.0 [4] (🪩..🪬) mirror ball..hamsa +1FAB0..1FAB6 ; Emoji # E13.0 [7] (🪰..🪶) fly..feather +1FAB7..1FABA ; Emoji # E14.0 [4] (🪷..🪺) lotus..nest with eggs +1FAC0..1FAC2 ; Emoji # E13.0 [3] (🫀..🫂) anatomical heart..people hugging +1FAC3..1FAC5 ; Emoji # E14.0 [3] (🫃..🫅) pregnant man..person with crown +1FAD0..1FAD6 ; Emoji # E13.0 [7] (🫐..🫖) blueberries..teapot +1FAD7..1FAD9 ; Emoji # E14.0 [3] (🫗..🫙) pouring liquid..jar +1FAE0..1FAE7 ; Emoji # E14.0 [8] (🫠..🫧) melting face..bubbles +1FAF0..1FAF6 ; Emoji # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands + +# Total elements: 1404 + +# ================================================ + +# All omitted code points have Emoji_Presentation=No +# @missing: 0000..10FFFF ; Emoji_Presentation ; No + +231A..231B ; Emoji_Presentation # E0.6 [2] (⌚..⌛) watch..hourglass done +23E9..23EC ; Emoji_Presentation # E0.6 [4] (⏩..⏬) fast-forward button..fast down button +23F0 ; Emoji_Presentation # E0.6 [1] (⏰) alarm clock +23F3 ; Emoji_Presentation # E0.6 [1] (⏳) hourglass not done +25FD..25FE ; Emoji_Presentation # E0.6 [2] (◽..◾) white medium-small square..black medium-small square +2614..2615 ; Emoji_Presentation # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage +2648..2653 ; Emoji_Presentation # E0.6 [12] (♈..♓) Aries..Pisces +267F ; Emoji_Presentation # E0.6 [1] (♿) wheelchair symbol +2693 ; Emoji_Presentation # E0.6 [1] (⚓) anchor +26A1 ; Emoji_Presentation # E0.6 [1] (⚡) high voltage +26AA..26AB ; Emoji_Presentation # E0.6 [2] (⚪..⚫) white circle..black circle +26BD..26BE ; Emoji_Presentation # E0.6 [2] (⚽..⚾) soccer ball..baseball +26C4..26C5 ; Emoji_Presentation # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud +26CE ; Emoji_Presentation # E0.6 [1] (⛎) Ophiuchus +26D4 ; Emoji_Presentation # E0.6 [1] (⛔) no entry +26EA ; Emoji_Presentation # E0.6 [1] (⛪) church +26F2..26F3 ; Emoji_Presentation # E0.6 [2] (⛲..⛳) fountain..flag in hole +26F5 ; Emoji_Presentation # E0.6 [1] (⛵) sailboat +26FA ; Emoji_Presentation # E0.6 [1] (⛺) tent +26FD ; Emoji_Presentation # E0.6 [1] (⛽) fuel pump +2705 ; Emoji_Presentation # E0.6 [1] (✅) check mark button +270A..270B ; Emoji_Presentation # E0.6 [2] (✊..✋) raised fist..raised hand +2728 ; Emoji_Presentation # E0.6 [1] (✨) sparkles +274C ; Emoji_Presentation # E0.6 [1] (❌) cross mark +274E ; Emoji_Presentation # E0.6 [1] (❎) cross mark button +2753..2755 ; Emoji_Presentation # E0.6 [3] (❓..❕) red question mark..white exclamation mark +2757 ; Emoji_Presentation # E0.6 [1] (❗) red exclamation mark +2795..2797 ; Emoji_Presentation # E0.6 [3] (➕..➗) plus..divide +27B0 ; Emoji_Presentation # E0.6 [1] (➰) curly loop +27BF ; Emoji_Presentation # E1.0 [1] (➿) double curly loop +2B1B..2B1C ; Emoji_Presentation # E0.6 [2] (⬛..⬜) black large square..white large square +2B50 ; Emoji_Presentation # E0.6 [1] (⭐) star +2B55 ; Emoji_Presentation # E0.6 [1] (⭕) hollow red circle +1F004 ; Emoji_Presentation # E0.6 [1] (🀄) mahjong red dragon +1F0CF ; Emoji_Presentation # E0.6 [1] (🃏) joker +1F18E ; Emoji_Presentation # E0.6 [1] (🆎) AB button (blood type) +1F191..1F19A ; Emoji_Presentation # E0.6 [10] (🆑..🆚) CL button..VS button +1F1E6..1F1FF ; Emoji_Presentation # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z +1F201 ; Emoji_Presentation # E0.6 [1] (🈁) Japanese “here” button +1F21A ; Emoji_Presentation # E0.6 [1] (🈚) Japanese “free of charge” button +1F22F ; Emoji_Presentation # E0.6 [1] (🈯) Japanese “reserved” button +1F232..1F236 ; Emoji_Presentation # E0.6 [5] (🈲..🈶) Japanese “prohibited” button..Japanese “not free of charge” button +1F238..1F23A ; Emoji_Presentation # E0.6 [3] (🈸..🈺) Japanese “application” button..Japanese “open for business” button +1F250..1F251 ; Emoji_Presentation # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button +1F300..1F30C ; Emoji_Presentation # E0.6 [13] (🌀..🌌) cyclone..milky way +1F30D..1F30E ; Emoji_Presentation # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas +1F30F ; Emoji_Presentation # E0.6 [1] (🌏) globe showing Asia-Australia +1F310 ; Emoji_Presentation # E1.0 [1] (🌐) globe with meridians +1F311 ; Emoji_Presentation # E0.6 [1] (🌑) new moon +1F312 ; Emoji_Presentation # E1.0 [1] (🌒) waxing crescent moon +1F313..1F315 ; Emoji_Presentation # E0.6 [3] (🌓..🌕) first quarter moon..full moon +1F316..1F318 ; Emoji_Presentation # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon +1F319 ; Emoji_Presentation # E0.6 [1] (🌙) crescent moon +1F31A ; Emoji_Presentation # E1.0 [1] (🌚) new moon face +1F31B ; Emoji_Presentation # E0.6 [1] (🌛) first quarter moon face +1F31C ; Emoji_Presentation # E0.7 [1] (🌜) last quarter moon face +1F31D..1F31E ; Emoji_Presentation # E1.0 [2] (🌝..🌞) full moon face..sun with face +1F31F..1F320 ; Emoji_Presentation # E0.6 [2] (🌟..🌠) glowing star..shooting star +1F32D..1F32F ; Emoji_Presentation # E1.0 [3] (🌭..🌯) hot dog..burrito +1F330..1F331 ; Emoji_Presentation # E0.6 [2] (🌰..🌱) chestnut..seedling +1F332..1F333 ; Emoji_Presentation # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree +1F334..1F335 ; Emoji_Presentation # E0.6 [2] (🌴..🌵) palm tree..cactus +1F337..1F34A ; Emoji_Presentation # E0.6 [20] (🌷..🍊) tulip..tangerine +1F34B ; Emoji_Presentation # E1.0 [1] (🍋) lemon +1F34C..1F34F ; Emoji_Presentation # E0.6 [4] (🍌..🍏) banana..green apple +1F350 ; Emoji_Presentation # E1.0 [1] (🍐) pear +1F351..1F37B ; Emoji_Presentation # E0.6 [43] (🍑..🍻) peach..clinking beer mugs +1F37C ; Emoji_Presentation # E1.0 [1] (🍼) baby bottle +1F37E..1F37F ; Emoji_Presentation # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn +1F380..1F393 ; Emoji_Presentation # E0.6 [20] (🎀..🎓) ribbon..graduation cap +1F3A0..1F3C4 ; Emoji_Presentation # E0.6 [37] (🎠..🏄) carousel horse..person surfing +1F3C5 ; Emoji_Presentation # E1.0 [1] (🏅) sports medal +1F3C6 ; Emoji_Presentation # E0.6 [1] (🏆) trophy +1F3C7 ; Emoji_Presentation # E1.0 [1] (🏇) horse racing +1F3C8 ; Emoji_Presentation # E0.6 [1] (🏈) american football +1F3C9 ; Emoji_Presentation # E1.0 [1] (🏉) rugby football +1F3CA ; Emoji_Presentation # E0.6 [1] (🏊) person swimming +1F3CF..1F3D3 ; Emoji_Presentation # E1.0 [5] (🏏..🏓) cricket game..ping pong +1F3E0..1F3E3 ; Emoji_Presentation # E0.6 [4] (🏠..🏣) house..Japanese post office +1F3E4 ; Emoji_Presentation # E1.0 [1] (🏤) post office +1F3E5..1F3F0 ; Emoji_Presentation # E0.6 [12] (🏥..🏰) hospital..castle +1F3F4 ; Emoji_Presentation # E1.0 [1] (🏴) black flag +1F3F8..1F407 ; Emoji_Presentation # E1.0 [16] (🏸..🐇) badminton..rabbit +1F408 ; Emoji_Presentation # E0.7 [1] (🐈) cat +1F409..1F40B ; Emoji_Presentation # E1.0 [3] (🐉..🐋) dragon..whale +1F40C..1F40E ; Emoji_Presentation # E0.6 [3] (🐌..🐎) snail..horse +1F40F..1F410 ; Emoji_Presentation # E1.0 [2] (🐏..🐐) ram..goat +1F411..1F412 ; Emoji_Presentation # E0.6 [2] (🐑..🐒) ewe..monkey +1F413 ; Emoji_Presentation # E1.0 [1] (🐓) rooster +1F414 ; Emoji_Presentation # E0.6 [1] (🐔) chicken +1F415 ; Emoji_Presentation # E0.7 [1] (🐕) dog +1F416 ; Emoji_Presentation # E1.0 [1] (🐖) pig +1F417..1F429 ; Emoji_Presentation # E0.6 [19] (🐗..🐩) boar..poodle +1F42A ; Emoji_Presentation # E1.0 [1] (🐪) camel +1F42B..1F43E ; Emoji_Presentation # E0.6 [20] (🐫..🐾) two-hump camel..paw prints +1F440 ; Emoji_Presentation # E0.6 [1] (👀) eyes +1F442..1F464 ; Emoji_Presentation # E0.6 [35] (👂..👤) ear..bust in silhouette +1F465 ; Emoji_Presentation # E1.0 [1] (👥) busts in silhouette +1F466..1F46B ; Emoji_Presentation # E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Emoji_Presentation # E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F4AC ; Emoji_Presentation # E0.6 [63] (👮..💬) police officer..speech balloon +1F4AD ; Emoji_Presentation # E1.0 [1] (💭) thought balloon +1F4AE..1F4B5 ; Emoji_Presentation # E0.6 [8] (💮..💵) white flower..dollar banknote +1F4B6..1F4B7 ; Emoji_Presentation # E1.0 [2] (💶..💷) euro banknote..pound banknote +1F4B8..1F4EB ; Emoji_Presentation # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag +1F4EC..1F4ED ; Emoji_Presentation # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag +1F4EE ; Emoji_Presentation # E0.6 [1] (📮) postbox +1F4EF ; Emoji_Presentation # E1.0 [1] (📯) postal horn +1F4F0..1F4F4 ; Emoji_Presentation # E0.6 [5] (📰..📴) newspaper..mobile phone off +1F4F5 ; Emoji_Presentation # E1.0 [1] (📵) no mobile phones +1F4F6..1F4F7 ; Emoji_Presentation # E0.6 [2] (📶..📷) antenna bars..camera +1F4F8 ; Emoji_Presentation # E1.0 [1] (📸) camera with flash +1F4F9..1F4FC ; Emoji_Presentation # E0.6 [4] (📹..📼) video camera..videocassette +1F4FF..1F502 ; Emoji_Presentation # E1.0 [4] (📿..🔂) prayer beads..repeat single button +1F503 ; Emoji_Presentation # E0.6 [1] (🔃) clockwise vertical arrows +1F504..1F507 ; Emoji_Presentation # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker +1F508 ; Emoji_Presentation # E0.7 [1] (🔈) speaker low volume +1F509 ; Emoji_Presentation # E1.0 [1] (🔉) speaker medium volume +1F50A..1F514 ; Emoji_Presentation # E0.6 [11] (🔊..🔔) speaker high volume..bell +1F515 ; Emoji_Presentation # E1.0 [1] (🔕) bell with slash +1F516..1F52B ; Emoji_Presentation # E0.6 [22] (🔖..🔫) bookmark..water pistol +1F52C..1F52D ; Emoji_Presentation # E1.0 [2] (🔬..🔭) microscope..telescope +1F52E..1F53D ; Emoji_Presentation # E0.6 [16] (🔮..🔽) crystal ball..downwards button +1F54B..1F54E ; Emoji_Presentation # E1.0 [4] (🕋..🕎) kaaba..menorah +1F550..1F55B ; Emoji_Presentation # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock +1F55C..1F567 ; Emoji_Presentation # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty +1F57A ; Emoji_Presentation # E3.0 [1] (🕺) man dancing +1F595..1F596 ; Emoji_Presentation # E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F5A4 ; Emoji_Presentation # E3.0 [1] (🖤) black heart +1F5FB..1F5FF ; Emoji_Presentation # E0.6 [5] (🗻..🗿) mount fuji..moai +1F600 ; Emoji_Presentation # E1.0 [1] (😀) grinning face +1F601..1F606 ; Emoji_Presentation # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face +1F607..1F608 ; Emoji_Presentation # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns +1F609..1F60D ; Emoji_Presentation # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes +1F60E ; Emoji_Presentation # E1.0 [1] (😎) smiling face with sunglasses +1F60F ; Emoji_Presentation # E0.6 [1] (😏) smirking face +1F610 ; Emoji_Presentation # E0.7 [1] (😐) neutral face +1F611 ; Emoji_Presentation # E1.0 [1] (😑) expressionless face +1F612..1F614 ; Emoji_Presentation # E0.6 [3] (😒..😔) unamused face..pensive face +1F615 ; Emoji_Presentation # E1.0 [1] (😕) confused face +1F616 ; Emoji_Presentation # E0.6 [1] (😖) confounded face +1F617 ; Emoji_Presentation # E1.0 [1] (😗) kissing face +1F618 ; Emoji_Presentation # E0.6 [1] (😘) face blowing a kiss +1F619 ; Emoji_Presentation # E1.0 [1] (😙) kissing face with smiling eyes +1F61A ; Emoji_Presentation # E0.6 [1] (😚) kissing face with closed eyes +1F61B ; Emoji_Presentation # E1.0 [1] (😛) face with tongue +1F61C..1F61E ; Emoji_Presentation # E0.6 [3] (😜..😞) winking face with tongue..disappointed face +1F61F ; Emoji_Presentation # E1.0 [1] (😟) worried face +1F620..1F625 ; Emoji_Presentation # E0.6 [6] (😠..😥) angry face..sad but relieved face +1F626..1F627 ; Emoji_Presentation # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face +1F628..1F62B ; Emoji_Presentation # E0.6 [4] (😨..😫) fearful face..tired face +1F62C ; Emoji_Presentation # E1.0 [1] (😬) grimacing face +1F62D ; Emoji_Presentation # E0.6 [1] (😭) loudly crying face +1F62E..1F62F ; Emoji_Presentation # E1.0 [2] (😮..😯) face with open mouth..hushed face +1F630..1F633 ; Emoji_Presentation # E0.6 [4] (😰..😳) anxious face with sweat..flushed face +1F634 ; Emoji_Presentation # E1.0 [1] (😴) sleeping face +1F635 ; Emoji_Presentation # E0.6 [1] (😵) face with crossed-out eyes +1F636 ; Emoji_Presentation # E1.0 [1] (😶) face without mouth +1F637..1F640 ; Emoji_Presentation # E0.6 [10] (😷..🙀) face with medical mask..weary cat +1F641..1F644 ; Emoji_Presentation # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes +1F645..1F64F ; Emoji_Presentation # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands +1F680 ; Emoji_Presentation # E0.6 [1] (🚀) rocket +1F681..1F682 ; Emoji_Presentation # E1.0 [2] (🚁..🚂) helicopter..locomotive +1F683..1F685 ; Emoji_Presentation # E0.6 [3] (🚃..🚅) railway car..bullet train +1F686 ; Emoji_Presentation # E1.0 [1] (🚆) train +1F687 ; Emoji_Presentation # E0.6 [1] (🚇) metro +1F688 ; Emoji_Presentation # E1.0 [1] (🚈) light rail +1F689 ; Emoji_Presentation # E0.6 [1] (🚉) station +1F68A..1F68B ; Emoji_Presentation # E1.0 [2] (🚊..🚋) tram..tram car +1F68C ; Emoji_Presentation # E0.6 [1] (🚌) bus +1F68D ; Emoji_Presentation # E0.7 [1] (🚍) oncoming bus +1F68E ; Emoji_Presentation # E1.0 [1] (🚎) trolleybus +1F68F ; Emoji_Presentation # E0.6 [1] (🚏) bus stop +1F690 ; Emoji_Presentation # E1.0 [1] (🚐) minibus +1F691..1F693 ; Emoji_Presentation # E0.6 [3] (🚑..🚓) ambulance..police car +1F694 ; Emoji_Presentation # E0.7 [1] (🚔) oncoming police car +1F695 ; Emoji_Presentation # E0.6 [1] (🚕) taxi +1F696 ; Emoji_Presentation # E1.0 [1] (🚖) oncoming taxi +1F697 ; Emoji_Presentation # E0.6 [1] (🚗) automobile +1F698 ; Emoji_Presentation # E0.7 [1] (🚘) oncoming automobile +1F699..1F69A ; Emoji_Presentation # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck +1F69B..1F6A1 ; Emoji_Presentation # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway +1F6A2 ; Emoji_Presentation # E0.6 [1] (🚢) ship +1F6A3 ; Emoji_Presentation # E1.0 [1] (🚣) person rowing boat +1F6A4..1F6A5 ; Emoji_Presentation # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light +1F6A6 ; Emoji_Presentation # E1.0 [1] (🚦) vertical traffic light +1F6A7..1F6AD ; Emoji_Presentation # E0.6 [7] (🚧..🚭) construction..no smoking +1F6AE..1F6B1 ; Emoji_Presentation # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water +1F6B2 ; Emoji_Presentation # E0.6 [1] (🚲) bicycle +1F6B3..1F6B5 ; Emoji_Presentation # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking +1F6B6 ; Emoji_Presentation # E0.6 [1] (🚶) person walking +1F6B7..1F6B8 ; Emoji_Presentation # E1.0 [2] (🚷..🚸) no pedestrians..children crossing +1F6B9..1F6BE ; Emoji_Presentation # E0.6 [6] (🚹..🚾) men’s room..water closet +1F6BF ; Emoji_Presentation # E1.0 [1] (🚿) shower +1F6C0 ; Emoji_Presentation # E0.6 [1] (🛀) person taking bath +1F6C1..1F6C5 ; Emoji_Presentation # E1.0 [5] (🛁..🛅) bathtub..left luggage +1F6CC ; Emoji_Presentation # E1.0 [1] (🛌) person in bed +1F6D0 ; Emoji_Presentation # E1.0 [1] (🛐) place of worship +1F6D1..1F6D2 ; Emoji_Presentation # E3.0 [2] (🛑..🛒) stop sign..shopping cart +1F6D5 ; Emoji_Presentation # E12.0 [1] (🛕) hindu temple +1F6D6..1F6D7 ; Emoji_Presentation # E13.0 [2] (🛖..🛗) hut..elevator +1F6DD..1F6DF ; Emoji_Presentation # E14.0 [3] (🛝..🛟) playground slide..ring buoy +1F6EB..1F6EC ; Emoji_Presentation # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival +1F6F4..1F6F6 ; Emoji_Presentation # E3.0 [3] (🛴..🛶) kick scooter..canoe +1F6F7..1F6F8 ; Emoji_Presentation # E5.0 [2] (🛷..🛸) sled..flying saucer +1F6F9 ; Emoji_Presentation # E11.0 [1] (🛹) skateboard +1F6FA ; Emoji_Presentation # E12.0 [1] (🛺) auto rickshaw +1F6FB..1F6FC ; Emoji_Presentation # E13.0 [2] (🛻..🛼) pickup truck..roller skate +1F7E0..1F7EB ; Emoji_Presentation # E12.0 [12] (🟠..🟫) orange circle..brown square +1F7F0 ; Emoji_Presentation # E14.0 [1] (🟰) heavy equals sign +1F90C ; Emoji_Presentation # E13.0 [1] (🤌) pinched fingers +1F90D..1F90F ; Emoji_Presentation # E12.0 [3] (🤍..🤏) white heart..pinching hand +1F910..1F918 ; Emoji_Presentation # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns +1F919..1F91E ; Emoji_Presentation # E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Emoji_Presentation # E5.0 [1] (🤟) love-you gesture +1F920..1F927 ; Emoji_Presentation # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face +1F928..1F92F ; Emoji_Presentation # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head +1F930 ; Emoji_Presentation # E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Emoji_Presentation # E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F93A ; Emoji_Presentation # E3.0 [8] (🤳..🤺) selfie..person fencing +1F93C..1F93E ; Emoji_Presentation # E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F93F ; Emoji_Presentation # E12.0 [1] (🤿) diving mask +1F940..1F945 ; Emoji_Presentation # E3.0 [6] (🥀..🥅) wilted flower..goal net +1F947..1F94B ; Emoji_Presentation # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform +1F94C ; Emoji_Presentation # E5.0 [1] (🥌) curling stone +1F94D..1F94F ; Emoji_Presentation # E11.0 [3] (🥍..🥏) lacrosse..flying disc +1F950..1F95E ; Emoji_Presentation # E3.0 [15] (🥐..🥞) croissant..pancakes +1F95F..1F96B ; Emoji_Presentation # E5.0 [13] (🥟..🥫) dumpling..canned food +1F96C..1F970 ; Emoji_Presentation # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts +1F971 ; Emoji_Presentation # E12.0 [1] (🥱) yawning face +1F972 ; Emoji_Presentation # E13.0 [1] (🥲) smiling face with tear +1F973..1F976 ; Emoji_Presentation # E11.0 [4] (🥳..🥶) partying face..cold face +1F977..1F978 ; Emoji_Presentation # E13.0 [2] (🥷..🥸) ninja..disguised face +1F979 ; Emoji_Presentation # E14.0 [1] (🥹) face holding back tears +1F97A ; Emoji_Presentation # E11.0 [1] (🥺) pleading face +1F97B ; Emoji_Presentation # E12.0 [1] (🥻) sari +1F97C..1F97F ; Emoji_Presentation # E11.0 [4] (🥼..🥿) lab coat..flat shoe +1F980..1F984 ; Emoji_Presentation # E1.0 [5] (🦀..🦄) crab..unicorn +1F985..1F991 ; Emoji_Presentation # E3.0 [13] (🦅..🦑) eagle..squid +1F992..1F997 ; Emoji_Presentation # E5.0 [6] (🦒..🦗) giraffe..cricket +1F998..1F9A2 ; Emoji_Presentation # E11.0 [11] (🦘..🦢) kangaroo..swan +1F9A3..1F9A4 ; Emoji_Presentation # E13.0 [2] (🦣..🦤) mammoth..dodo +1F9A5..1F9AA ; Emoji_Presentation # E12.0 [6] (🦥..🦪) sloth..oyster +1F9AB..1F9AD ; Emoji_Presentation # E13.0 [3] (🦫..🦭) beaver..seal +1F9AE..1F9AF ; Emoji_Presentation # E12.0 [2] (🦮..🦯) guide dog..white cane +1F9B0..1F9B9 ; Emoji_Presentation # E11.0 [10] (🦰..🦹) red hair..supervillain +1F9BA..1F9BF ; Emoji_Presentation # E12.0 [6] (🦺..🦿) safety vest..mechanical leg +1F9C0 ; Emoji_Presentation # E1.0 [1] (🧀) cheese wedge +1F9C1..1F9C2 ; Emoji_Presentation # E11.0 [2] (🧁..🧂) cupcake..salt +1F9C3..1F9CA ; Emoji_Presentation # E12.0 [8] (🧃..🧊) beverage box..ice +1F9CB ; Emoji_Presentation # E13.0 [1] (🧋) bubble tea +1F9CC ; Emoji_Presentation # E14.0 [1] (🧌) troll +1F9CD..1F9CF ; Emoji_Presentation # E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D0..1F9E6 ; Emoji_Presentation # E5.0 [23] (🧐..🧦) face with monocle..socks +1F9E7..1F9FF ; Emoji_Presentation # E11.0 [25] (🧧..🧿) red envelope..nazar amulet +1FA70..1FA73 ; Emoji_Presentation # E12.0 [4] (🩰..🩳) ballet shoes..shorts +1FA74 ; Emoji_Presentation # E13.0 [1] (🩴) thong sandal +1FA78..1FA7A ; Emoji_Presentation # E12.0 [3] (🩸..🩺) drop of blood..stethoscope +1FA7B..1FA7C ; Emoji_Presentation # E14.0 [2] (🩻..🩼) x-ray..crutch +1FA80..1FA82 ; Emoji_Presentation # E12.0 [3] (🪀..🪂) yo-yo..parachute +1FA83..1FA86 ; Emoji_Presentation # E13.0 [4] (🪃..🪆) boomerang..nesting dolls +1FA90..1FA95 ; Emoji_Presentation # E12.0 [6] (🪐..🪕) ringed planet..banjo +1FA96..1FAA8 ; Emoji_Presentation # E13.0 [19] (🪖..🪨) military helmet..rock +1FAA9..1FAAC ; Emoji_Presentation # E14.0 [4] (🪩..🪬) mirror ball..hamsa +1FAB0..1FAB6 ; Emoji_Presentation # E13.0 [7] (🪰..🪶) fly..feather +1FAB7..1FABA ; Emoji_Presentation # E14.0 [4] (🪷..🪺) lotus..nest with eggs +1FAC0..1FAC2 ; Emoji_Presentation # E13.0 [3] (🫀..🫂) anatomical heart..people hugging +1FAC3..1FAC5 ; Emoji_Presentation # E14.0 [3] (🫃..🫅) pregnant man..person with crown +1FAD0..1FAD6 ; Emoji_Presentation # E13.0 [7] (🫐..🫖) blueberries..teapot +1FAD7..1FAD9 ; Emoji_Presentation # E14.0 [3] (🫗..🫙) pouring liquid..jar +1FAE0..1FAE7 ; Emoji_Presentation # E14.0 [8] (🫠..🫧) melting face..bubbles +1FAF0..1FAF6 ; Emoji_Presentation # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands + +# Total elements: 1185 + +# ================================================ + +# All omitted code points have Emoji_Modifier=No +# @missing: 0000..10FFFF ; Emoji_Modifier ; No + +1F3FB..1F3FF ; Emoji_Modifier # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone + +# Total elements: 5 + +# ================================================ + +# All omitted code points have Emoji_Modifier_Base=No +# @missing: 0000..10FFFF ; Emoji_Modifier_Base ; No + +261D ; Emoji_Modifier_Base # E0.6 [1] (☝️) index pointing up +26F9 ; Emoji_Modifier_Base # E0.7 [1] (⛹️) person bouncing ball +270A..270C ; Emoji_Modifier_Base # E0.6 [3] (✊..✌️) raised fist..victory hand +270D ; Emoji_Modifier_Base # E0.7 [1] (✍️) writing hand +1F385 ; Emoji_Modifier_Base # E0.6 [1] (🎅) Santa Claus +1F3C2..1F3C4 ; Emoji_Modifier_Base # E0.6 [3] (🏂..🏄) snowboarder..person surfing +1F3C7 ; Emoji_Modifier_Base # E1.0 [1] (🏇) horse racing +1F3CA ; Emoji_Modifier_Base # E0.6 [1] (🏊) person swimming +1F3CB..1F3CC ; Emoji_Modifier_Base # E0.7 [2] (🏋️..🏌️) person lifting weights..person golfing +1F442..1F443 ; Emoji_Modifier_Base # E0.6 [2] (👂..👃) ear..nose +1F446..1F450 ; Emoji_Modifier_Base # E0.6 [11] (👆..👐) backhand index pointing up..open hands +1F466..1F46B ; Emoji_Modifier_Base # E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Emoji_Modifier_Base # E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F478 ; Emoji_Modifier_Base # E0.6 [11] (👮..👸) police officer..princess +1F47C ; Emoji_Modifier_Base # E0.6 [1] (👼) baby angel +1F481..1F483 ; Emoji_Modifier_Base # E0.6 [3] (💁..💃) person tipping hand..woman dancing +1F485..1F487 ; Emoji_Modifier_Base # E0.6 [3] (💅..💇) nail polish..person getting haircut +1F48F ; Emoji_Modifier_Base # E0.6 [1] (💏) kiss +1F491 ; Emoji_Modifier_Base # E0.6 [1] (💑) couple with heart +1F4AA ; Emoji_Modifier_Base # E0.6 [1] (💪) flexed biceps +1F574..1F575 ; Emoji_Modifier_Base # E0.7 [2] (🕴️..🕵️) person in suit levitating..detective +1F57A ; Emoji_Modifier_Base # E3.0 [1] (🕺) man dancing +1F590 ; Emoji_Modifier_Base # E0.7 [1] (🖐️) hand with fingers splayed +1F595..1F596 ; Emoji_Modifier_Base # E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F645..1F647 ; Emoji_Modifier_Base # E0.6 [3] (🙅..🙇) person gesturing NO..person bowing +1F64B..1F64F ; Emoji_Modifier_Base # E0.6 [5] (🙋..🙏) person raising hand..folded hands +1F6A3 ; Emoji_Modifier_Base # E1.0 [1] (🚣) person rowing boat +1F6B4..1F6B5 ; Emoji_Modifier_Base # E1.0 [2] (🚴..🚵) person biking..person mountain biking +1F6B6 ; Emoji_Modifier_Base # E0.6 [1] (🚶) person walking +1F6C0 ; Emoji_Modifier_Base # E0.6 [1] (🛀) person taking bath +1F6CC ; Emoji_Modifier_Base # E1.0 [1] (🛌) person in bed +1F90C ; Emoji_Modifier_Base # E13.0 [1] (🤌) pinched fingers +1F90F ; Emoji_Modifier_Base # E12.0 [1] (🤏) pinching hand +1F918 ; Emoji_Modifier_Base # E1.0 [1] (🤘) sign of the horns +1F919..1F91E ; Emoji_Modifier_Base # E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Emoji_Modifier_Base # E5.0 [1] (🤟) love-you gesture +1F926 ; Emoji_Modifier_Base # E3.0 [1] (🤦) person facepalming +1F930 ; Emoji_Modifier_Base # E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Emoji_Modifier_Base # E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F939 ; Emoji_Modifier_Base # E3.0 [7] (🤳..🤹) selfie..person juggling +1F93C..1F93E ; Emoji_Modifier_Base # E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F977 ; Emoji_Modifier_Base # E13.0 [1] (🥷) ninja +1F9B5..1F9B6 ; Emoji_Modifier_Base # E11.0 [2] (🦵..🦶) leg..foot +1F9B8..1F9B9 ; Emoji_Modifier_Base # E11.0 [2] (🦸..🦹) superhero..supervillain +1F9BB ; Emoji_Modifier_Base # E12.0 [1] (🦻) ear with hearing aid +1F9CD..1F9CF ; Emoji_Modifier_Base # E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D1..1F9DD ; Emoji_Modifier_Base # E5.0 [13] (🧑..🧝) person..elf +1FAC3..1FAC5 ; Emoji_Modifier_Base # E14.0 [3] (🫃..🫅) pregnant man..person with crown +1FAF0..1FAF6 ; Emoji_Modifier_Base # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands + +# Total elements: 132 + +# ================================================ + +# All omitted code points have Emoji_Component=No +# @missing: 0000..10FFFF ; Emoji_Component ; No + +0023 ; Emoji_Component # E0.0 [1] (#️) hash sign +002A ; Emoji_Component # E0.0 [1] (*️) asterisk +0030..0039 ; Emoji_Component # E0.0 [10] (0️..9️) digit zero..digit nine +200D ; Emoji_Component # E0.0 [1] (‍) zero width joiner +20E3 ; Emoji_Component # E0.0 [1] (⃣) combining enclosing keycap +FE0F ; Emoji_Component # E0.0 [1] () VARIATION SELECTOR-16 +1F1E6..1F1FF ; Emoji_Component # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z +1F3FB..1F3FF ; Emoji_Component # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone +1F9B0..1F9B3 ; Emoji_Component # E11.0 [4] (🦰..🦳) red hair..white hair +E0020..E007F ; Emoji_Component # E0.0 [96] (󠀠..󠁿) tag space..cancel tag + +# Total elements: 146 + +# ================================================ + +# All omitted code points have Extended_Pictographic=No +# @missing: 0000..10FFFF ; Extended_Pictographic ; No + +00A9 ; Extended_Pictographic# E0.6 [1] (©️) copyright +00AE ; Extended_Pictographic# E0.6 [1] (®️) registered +203C ; Extended_Pictographic# E0.6 [1] (‼️) double exclamation mark +2049 ; Extended_Pictographic# E0.6 [1] (⁉️) exclamation question mark +2122 ; Extended_Pictographic# E0.6 [1] (™️) trade mark +2139 ; Extended_Pictographic# E0.6 [1] (ℹ️) information +2194..2199 ; Extended_Pictographic# E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow +21A9..21AA ; Extended_Pictographic# E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right +231A..231B ; Extended_Pictographic# E0.6 [2] (⌚..⌛) watch..hourglass done +2328 ; Extended_Pictographic# E1.0 [1] (⌨️) keyboard +2388 ; Extended_Pictographic# E0.0 [1] (⎈) HELM SYMBOL +23CF ; Extended_Pictographic# E1.0 [1] (⏏️) eject button +23E9..23EC ; Extended_Pictographic# E0.6 [4] (⏩..⏬) fast-forward button..fast down button +23ED..23EE ; Extended_Pictographic# E0.7 [2] (⏭️..⏮️) next track button..last track button +23EF ; Extended_Pictographic# E1.0 [1] (⏯️) play or pause button +23F0 ; Extended_Pictographic# E0.6 [1] (⏰) alarm clock +23F1..23F2 ; Extended_Pictographic# E1.0 [2] (⏱️..⏲️) stopwatch..timer clock +23F3 ; Extended_Pictographic# E0.6 [1] (⏳) hourglass not done +23F8..23FA ; Extended_Pictographic# E0.7 [3] (⏸️..⏺️) pause button..record button +24C2 ; Extended_Pictographic# E0.6 [1] (Ⓜ️) circled M +25AA..25AB ; Extended_Pictographic# E0.6 [2] (▪️..▫️) black small square..white small square +25B6 ; Extended_Pictographic# E0.6 [1] (▶️) play button +25C0 ; Extended_Pictographic# E0.6 [1] (◀️) reverse button +25FB..25FE ; Extended_Pictographic# E0.6 [4] (◻️..◾) white medium square..black medium-small square +2600..2601 ; Extended_Pictographic# E0.6 [2] (☀️..☁️) sun..cloud +2602..2603 ; Extended_Pictographic# E0.7 [2] (☂️..☃️) umbrella..snowman +2604 ; Extended_Pictographic# E1.0 [1] (☄️) comet +2605 ; Extended_Pictographic# E0.0 [1] (★) BLACK STAR +2607..260D ; Extended_Pictographic# E0.0 [7] (☇..☍) LIGHTNING..OPPOSITION +260E ; Extended_Pictographic# E0.6 [1] (☎️) telephone +260F..2610 ; Extended_Pictographic# E0.0 [2] (☏..☐) WHITE TELEPHONE..BALLOT BOX +2611 ; Extended_Pictographic# E0.6 [1] (☑️) check box with check +2612 ; Extended_Pictographic# E0.0 [1] (☒) BALLOT BOX WITH X +2614..2615 ; Extended_Pictographic# E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage +2616..2617 ; Extended_Pictographic# E0.0 [2] (☖..☗) WHITE SHOGI PIECE..BLACK SHOGI PIECE +2618 ; Extended_Pictographic# E1.0 [1] (☘️) shamrock +2619..261C ; Extended_Pictographic# E0.0 [4] (☙..☜) REVERSED ROTATED FLORAL HEART BULLET..WHITE LEFT POINTING INDEX +261D ; Extended_Pictographic# E0.6 [1] (☝️) index pointing up +261E..261F ; Extended_Pictographic# E0.0 [2] (☞..☟) WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX +2620 ; Extended_Pictographic# E1.0 [1] (☠️) skull and crossbones +2621 ; Extended_Pictographic# E0.0 [1] (☡) CAUTION SIGN +2622..2623 ; Extended_Pictographic# E1.0 [2] (☢️..☣️) radioactive..biohazard +2624..2625 ; Extended_Pictographic# E0.0 [2] (☤..☥) CADUCEUS..ANKH +2626 ; Extended_Pictographic# E1.0 [1] (☦️) orthodox cross +2627..2629 ; Extended_Pictographic# E0.0 [3] (☧..☩) CHI RHO..CROSS OF JERUSALEM +262A ; Extended_Pictographic# E0.7 [1] (☪️) star and crescent +262B..262D ; Extended_Pictographic# E0.0 [3] (☫..☭) FARSI SYMBOL..HAMMER AND SICKLE +262E ; Extended_Pictographic# E1.0 [1] (☮️) peace symbol +262F ; Extended_Pictographic# E0.7 [1] (☯️) yin yang +2630..2637 ; Extended_Pictographic# E0.0 [8] (☰..☷) TRIGRAM FOR HEAVEN..TRIGRAM FOR EARTH +2638..2639 ; Extended_Pictographic# E0.7 [2] (☸️..☹️) wheel of dharma..frowning face +263A ; Extended_Pictographic# E0.6 [1] (☺️) smiling face +263B..263F ; Extended_Pictographic# E0.0 [5] (☻..☿) BLACK SMILING FACE..MERCURY +2640 ; Extended_Pictographic# E4.0 [1] (♀️) female sign +2641 ; Extended_Pictographic# E0.0 [1] (♁) EARTH +2642 ; Extended_Pictographic# E4.0 [1] (♂️) male sign +2643..2647 ; Extended_Pictographic# E0.0 [5] (♃..♇) JUPITER..PLUTO +2648..2653 ; Extended_Pictographic# E0.6 [12] (♈..♓) Aries..Pisces +2654..265E ; Extended_Pictographic# E0.0 [11] (♔..♞) WHITE CHESS KING..BLACK CHESS KNIGHT +265F ; Extended_Pictographic# E11.0 [1] (♟️) chess pawn +2660 ; Extended_Pictographic# E0.6 [1] (♠️) spade suit +2661..2662 ; Extended_Pictographic# E0.0 [2] (♡..♢) WHITE HEART SUIT..WHITE DIAMOND SUIT +2663 ; Extended_Pictographic# E0.6 [1] (♣️) club suit +2664 ; Extended_Pictographic# E0.0 [1] (♤) WHITE SPADE SUIT +2665..2666 ; Extended_Pictographic# E0.6 [2] (♥️..♦️) heart suit..diamond suit +2667 ; Extended_Pictographic# E0.0 [1] (♧) WHITE CLUB SUIT +2668 ; Extended_Pictographic# E0.6 [1] (♨️) hot springs +2669..267A ; Extended_Pictographic# E0.0 [18] (♩..♺) QUARTER NOTE..RECYCLING SYMBOL FOR GENERIC MATERIALS +267B ; Extended_Pictographic# E0.6 [1] (♻️) recycling symbol +267C..267D ; Extended_Pictographic# E0.0 [2] (♼..♽) RECYCLED PAPER SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL +267E ; Extended_Pictographic# E11.0 [1] (♾️) infinity +267F ; Extended_Pictographic# E0.6 [1] (♿) wheelchair symbol +2680..2685 ; Extended_Pictographic# E0.0 [6] (⚀..⚅) DIE FACE-1..DIE FACE-6 +2690..2691 ; Extended_Pictographic# E0.0 [2] (⚐..⚑) WHITE FLAG..BLACK FLAG +2692 ; Extended_Pictographic# E1.0 [1] (⚒️) hammer and pick +2693 ; Extended_Pictographic# E0.6 [1] (⚓) anchor +2694 ; Extended_Pictographic# E1.0 [1] (⚔️) crossed swords +2695 ; Extended_Pictographic# E4.0 [1] (⚕️) medical symbol +2696..2697 ; Extended_Pictographic# E1.0 [2] (⚖️..⚗️) balance scale..alembic +2698 ; Extended_Pictographic# E0.0 [1] (⚘) FLOWER +2699 ; Extended_Pictographic# E1.0 [1] (⚙️) gear +269A ; Extended_Pictographic# E0.0 [1] (⚚) STAFF OF HERMES +269B..269C ; Extended_Pictographic# E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis +269D..269F ; Extended_Pictographic# E0.0 [3] (⚝..⚟) OUTLINED WHITE STAR..THREE LINES CONVERGING LEFT +26A0..26A1 ; Extended_Pictographic# E0.6 [2] (⚠️..⚡) warning..high voltage +26A2..26A6 ; Extended_Pictographic# E0.0 [5] (⚢..⚦) DOUBLED FEMALE SIGN..MALE WITH STROKE SIGN +26A7 ; Extended_Pictographic# E13.0 [1] (⚧️) transgender symbol +26A8..26A9 ; Extended_Pictographic# E0.0 [2] (⚨..⚩) VERTICAL MALE WITH STROKE SIGN..HORIZONTAL MALE WITH STROKE SIGN +26AA..26AB ; Extended_Pictographic# E0.6 [2] (⚪..⚫) white circle..black circle +26AC..26AF ; Extended_Pictographic# E0.0 [4] (⚬..⚯) MEDIUM SMALL WHITE CIRCLE..UNMARRIED PARTNERSHIP SYMBOL +26B0..26B1 ; Extended_Pictographic# E1.0 [2] (⚰️..⚱️) coffin..funeral urn +26B2..26BC ; Extended_Pictographic# E0.0 [11] (⚲..⚼) NEUTER..SESQUIQUADRATE +26BD..26BE ; Extended_Pictographic# E0.6 [2] (⚽..⚾) soccer ball..baseball +26BF..26C3 ; Extended_Pictographic# E0.0 [5] (⚿..⛃) SQUARED KEY..BLACK DRAUGHTS KING +26C4..26C5 ; Extended_Pictographic# E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud +26C6..26C7 ; Extended_Pictographic# E0.0 [2] (⛆..⛇) RAIN..BLACK SNOWMAN +26C8 ; Extended_Pictographic# E0.7 [1] (⛈️) cloud with lightning and rain +26C9..26CD ; Extended_Pictographic# E0.0 [5] (⛉..⛍) TURNED WHITE SHOGI PIECE..DISABLED CAR +26CE ; Extended_Pictographic# E0.6 [1] (⛎) Ophiuchus +26CF ; Extended_Pictographic# E0.7 [1] (⛏️) pick +26D0 ; Extended_Pictographic# E0.0 [1] (⛐) CAR SLIDING +26D1 ; Extended_Pictographic# E0.7 [1] (⛑️) rescue worker’s helmet +26D2 ; Extended_Pictographic# E0.0 [1] (⛒) CIRCLED CROSSING LANES +26D3 ; Extended_Pictographic# E0.7 [1] (⛓️) chains +26D4 ; Extended_Pictographic# E0.6 [1] (⛔) no entry +26D5..26E8 ; Extended_Pictographic# E0.0 [20] (⛕..⛨) ALTERNATE ONE-WAY LEFT WAY TRAFFIC..BLACK CROSS ON SHIELD +26E9 ; Extended_Pictographic# E0.7 [1] (⛩️) shinto shrine +26EA ; Extended_Pictographic# E0.6 [1] (⛪) church +26EB..26EF ; Extended_Pictographic# E0.0 [5] (⛫..⛯) CASTLE..MAP SYMBOL FOR LIGHTHOUSE +26F0..26F1 ; Extended_Pictographic# E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground +26F2..26F3 ; Extended_Pictographic# E0.6 [2] (⛲..⛳) fountain..flag in hole +26F4 ; Extended_Pictographic# E0.7 [1] (⛴️) ferry +26F5 ; Extended_Pictographic# E0.6 [1] (⛵) sailboat +26F6 ; Extended_Pictographic# E0.0 [1] (⛶) SQUARE FOUR CORNERS +26F7..26F9 ; Extended_Pictographic# E0.7 [3] (⛷️..⛹️) skier..person bouncing ball +26FA ; Extended_Pictographic# E0.6 [1] (⛺) tent +26FB..26FC ; Extended_Pictographic# E0.0 [2] (⛻..⛼) JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL +26FD ; Extended_Pictographic# E0.6 [1] (⛽) fuel pump +26FE..2701 ; Extended_Pictographic# E0.0 [4] (⛾..✁) CUP ON BLACK SQUARE..UPPER BLADE SCISSORS +2702 ; Extended_Pictographic# E0.6 [1] (✂️) scissors +2703..2704 ; Extended_Pictographic# E0.0 [2] (✃..✄) LOWER BLADE SCISSORS..WHITE SCISSORS +2705 ; Extended_Pictographic# E0.6 [1] (✅) check mark button +2708..270C ; Extended_Pictographic# E0.6 [5] (✈️..✌️) airplane..victory hand +270D ; Extended_Pictographic# E0.7 [1] (✍️) writing hand +270E ; Extended_Pictographic# E0.0 [1] (✎) LOWER RIGHT PENCIL +270F ; Extended_Pictographic# E0.6 [1] (✏️) pencil +2710..2711 ; Extended_Pictographic# E0.0 [2] (✐..✑) UPPER RIGHT PENCIL..WHITE NIB +2712 ; Extended_Pictographic# E0.6 [1] (✒️) black nib +2714 ; Extended_Pictographic# E0.6 [1] (✔️) check mark +2716 ; Extended_Pictographic# E0.6 [1] (✖️) multiply +271D ; Extended_Pictographic# E0.7 [1] (✝️) latin cross +2721 ; Extended_Pictographic# E0.7 [1] (✡️) star of David +2728 ; Extended_Pictographic# E0.6 [1] (✨) sparkles +2733..2734 ; Extended_Pictographic# E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star +2744 ; Extended_Pictographic# E0.6 [1] (❄️) snowflake +2747 ; Extended_Pictographic# E0.6 [1] (❇️) sparkle +274C ; Extended_Pictographic# E0.6 [1] (❌) cross mark +274E ; Extended_Pictographic# E0.6 [1] (❎) cross mark button +2753..2755 ; Extended_Pictographic# E0.6 [3] (❓..❕) red question mark..white exclamation mark +2757 ; Extended_Pictographic# E0.6 [1] (❗) red exclamation mark +2763 ; Extended_Pictographic# E1.0 [1] (❣️) heart exclamation +2764 ; Extended_Pictographic# E0.6 [1] (❤️) red heart +2765..2767 ; Extended_Pictographic# E0.0 [3] (❥..❧) ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET +2795..2797 ; Extended_Pictographic# E0.6 [3] (➕..➗) plus..divide +27A1 ; Extended_Pictographic# E0.6 [1] (➡️) right arrow +27B0 ; Extended_Pictographic# E0.6 [1] (➰) curly loop +27BF ; Extended_Pictographic# E1.0 [1] (➿) double curly loop +2934..2935 ; Extended_Pictographic# E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down +2B05..2B07 ; Extended_Pictographic# E0.6 [3] (⬅️..⬇️) left arrow..down arrow +2B1B..2B1C ; Extended_Pictographic# E0.6 [2] (⬛..⬜) black large square..white large square +2B50 ; Extended_Pictographic# E0.6 [1] (⭐) star +2B55 ; Extended_Pictographic# E0.6 [1] (⭕) hollow red circle +3030 ; Extended_Pictographic# E0.6 [1] (〰️) wavy dash +303D ; Extended_Pictographic# E0.6 [1] (〽️) part alternation mark +3297 ; Extended_Pictographic# E0.6 [1] (㊗️) Japanese “congratulations” button +3299 ; Extended_Pictographic# E0.6 [1] (㊙️) Japanese “secret” button +1F000..1F003 ; Extended_Pictographic# E0.0 [4] (🀀..🀃) MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND +1F004 ; Extended_Pictographic# E0.6 [1] (🀄) mahjong red dragon +1F005..1F0CE ; Extended_Pictographic# E0.0 [202] (🀅..🃎) MAHJONG TILE GREEN DRAGON..PLAYING CARD KING OF DIAMONDS +1F0CF ; Extended_Pictographic# E0.6 [1] (🃏) joker +1F0D0..1F0FF ; Extended_Pictographic# E0.0 [48] (🃐..🃿) .. +1F10D..1F10F ; Extended_Pictographic# E0.0 [3] (🄍..🄏) CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH +1F12F ; Extended_Pictographic# E0.0 [1] (🄯) COPYLEFT SYMBOL +1F16C..1F16F ; Extended_Pictographic# E0.0 [4] (🅬..🅯) RAISED MR SIGN..CIRCLED HUMAN FIGURE +1F170..1F171 ; Extended_Pictographic# E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) +1F17E..1F17F ; Extended_Pictographic# E0.6 [2] (🅾️..🅿️) O button (blood type)..P button +1F18E ; Extended_Pictographic# E0.6 [1] (🆎) AB button (blood type) +1F191..1F19A ; Extended_Pictographic# E0.6 [10] (🆑..🆚) CL button..VS button +1F1AD..1F1E5 ; Extended_Pictographic# E0.0 [57] (🆭..🇥) MASK WORK SYMBOL.. +1F201..1F202 ; Extended_Pictographic# E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button +1F203..1F20F ; Extended_Pictographic# E0.0 [13] (🈃..🈏) .. +1F21A ; Extended_Pictographic# E0.6 [1] (🈚) Japanese “free of charge” button +1F22F ; Extended_Pictographic# E0.6 [1] (🈯) Japanese “reserved” button +1F232..1F23A ; Extended_Pictographic# E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button +1F23C..1F23F ; Extended_Pictographic# E0.0 [4] (🈼..🈿) .. +1F249..1F24F ; Extended_Pictographic# E0.0 [7] (🉉..🉏) .. +1F250..1F251 ; Extended_Pictographic# E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button +1F252..1F2FF ; Extended_Pictographic# E0.0 [174] (🉒..🋿) .. +1F300..1F30C ; Extended_Pictographic# E0.6 [13] (🌀..🌌) cyclone..milky way +1F30D..1F30E ; Extended_Pictographic# E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas +1F30F ; Extended_Pictographic# E0.6 [1] (🌏) globe showing Asia-Australia +1F310 ; Extended_Pictographic# E1.0 [1] (🌐) globe with meridians +1F311 ; Extended_Pictographic# E0.6 [1] (🌑) new moon +1F312 ; Extended_Pictographic# E1.0 [1] (🌒) waxing crescent moon +1F313..1F315 ; Extended_Pictographic# E0.6 [3] (🌓..🌕) first quarter moon..full moon +1F316..1F318 ; Extended_Pictographic# E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon +1F319 ; Extended_Pictographic# E0.6 [1] (🌙) crescent moon +1F31A ; Extended_Pictographic# E1.0 [1] (🌚) new moon face +1F31B ; Extended_Pictographic# E0.6 [1] (🌛) first quarter moon face +1F31C ; Extended_Pictographic# E0.7 [1] (🌜) last quarter moon face +1F31D..1F31E ; Extended_Pictographic# E1.0 [2] (🌝..🌞) full moon face..sun with face +1F31F..1F320 ; Extended_Pictographic# E0.6 [2] (🌟..🌠) glowing star..shooting star +1F321 ; Extended_Pictographic# E0.7 [1] (🌡️) thermometer +1F322..1F323 ; Extended_Pictographic# E0.0 [2] (🌢..🌣) BLACK DROPLET..WHITE SUN +1F324..1F32C ; Extended_Pictographic# E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face +1F32D..1F32F ; Extended_Pictographic# E1.0 [3] (🌭..🌯) hot dog..burrito +1F330..1F331 ; Extended_Pictographic# E0.6 [2] (🌰..🌱) chestnut..seedling +1F332..1F333 ; Extended_Pictographic# E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree +1F334..1F335 ; Extended_Pictographic# E0.6 [2] (🌴..🌵) palm tree..cactus +1F336 ; Extended_Pictographic# E0.7 [1] (🌶️) hot pepper +1F337..1F34A ; Extended_Pictographic# E0.6 [20] (🌷..🍊) tulip..tangerine +1F34B ; Extended_Pictographic# E1.0 [1] (🍋) lemon +1F34C..1F34F ; Extended_Pictographic# E0.6 [4] (🍌..🍏) banana..green apple +1F350 ; Extended_Pictographic# E1.0 [1] (🍐) pear +1F351..1F37B ; Extended_Pictographic# E0.6 [43] (🍑..🍻) peach..clinking beer mugs +1F37C ; Extended_Pictographic# E1.0 [1] (🍼) baby bottle +1F37D ; Extended_Pictographic# E0.7 [1] (🍽️) fork and knife with plate +1F37E..1F37F ; Extended_Pictographic# E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn +1F380..1F393 ; Extended_Pictographic# E0.6 [20] (🎀..🎓) ribbon..graduation cap +1F394..1F395 ; Extended_Pictographic# E0.0 [2] (🎔..🎕) HEART WITH TIP ON THE LEFT..BOUQUET OF FLOWERS +1F396..1F397 ; Extended_Pictographic# E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon +1F398 ; Extended_Pictographic# E0.0 [1] (🎘) MUSICAL KEYBOARD WITH JACKS +1F399..1F39B ; Extended_Pictographic# E0.7 [3] (🎙️..🎛️) studio microphone..control knobs +1F39C..1F39D ; Extended_Pictographic# E0.0 [2] (🎜..🎝) BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES +1F39E..1F39F ; Extended_Pictographic# E0.7 [2] (🎞️..🎟️) film frames..admission tickets +1F3A0..1F3C4 ; Extended_Pictographic# E0.6 [37] (🎠..🏄) carousel horse..person surfing +1F3C5 ; Extended_Pictographic# E1.0 [1] (🏅) sports medal +1F3C6 ; Extended_Pictographic# E0.6 [1] (🏆) trophy +1F3C7 ; Extended_Pictographic# E1.0 [1] (🏇) horse racing +1F3C8 ; Extended_Pictographic# E0.6 [1] (🏈) american football +1F3C9 ; Extended_Pictographic# E1.0 [1] (🏉) rugby football +1F3CA ; Extended_Pictographic# E0.6 [1] (🏊) person swimming +1F3CB..1F3CE ; Extended_Pictographic# E0.7 [4] (🏋️..🏎️) person lifting weights..racing car +1F3CF..1F3D3 ; Extended_Pictographic# E1.0 [5] (🏏..🏓) cricket game..ping pong +1F3D4..1F3DF ; Extended_Pictographic# E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium +1F3E0..1F3E3 ; Extended_Pictographic# E0.6 [4] (🏠..🏣) house..Japanese post office +1F3E4 ; Extended_Pictographic# E1.0 [1] (🏤) post office +1F3E5..1F3F0 ; Extended_Pictographic# E0.6 [12] (🏥..🏰) hospital..castle +1F3F1..1F3F2 ; Extended_Pictographic# E0.0 [2] (🏱..🏲) WHITE PENNANT..BLACK PENNANT +1F3F3 ; Extended_Pictographic# E0.7 [1] (🏳️) white flag +1F3F4 ; Extended_Pictographic# E1.0 [1] (🏴) black flag +1F3F5 ; Extended_Pictographic# E0.7 [1] (🏵️) rosette +1F3F6 ; Extended_Pictographic# E0.0 [1] (🏶) BLACK ROSETTE +1F3F7 ; Extended_Pictographic# E0.7 [1] (🏷️) label +1F3F8..1F3FA ; Extended_Pictographic# E1.0 [3] (🏸..🏺) badminton..amphora +1F400..1F407 ; Extended_Pictographic# E1.0 [8] (🐀..🐇) rat..rabbit +1F408 ; Extended_Pictographic# E0.7 [1] (🐈) cat +1F409..1F40B ; Extended_Pictographic# E1.0 [3] (🐉..🐋) dragon..whale +1F40C..1F40E ; Extended_Pictographic# E0.6 [3] (🐌..🐎) snail..horse +1F40F..1F410 ; Extended_Pictographic# E1.0 [2] (🐏..🐐) ram..goat +1F411..1F412 ; Extended_Pictographic# E0.6 [2] (🐑..🐒) ewe..monkey +1F413 ; Extended_Pictographic# E1.0 [1] (🐓) rooster +1F414 ; Extended_Pictographic# E0.6 [1] (🐔) chicken +1F415 ; Extended_Pictographic# E0.7 [1] (🐕) dog +1F416 ; Extended_Pictographic# E1.0 [1] (🐖) pig +1F417..1F429 ; Extended_Pictographic# E0.6 [19] (🐗..🐩) boar..poodle +1F42A ; Extended_Pictographic# E1.0 [1] (🐪) camel +1F42B..1F43E ; Extended_Pictographic# E0.6 [20] (🐫..🐾) two-hump camel..paw prints +1F43F ; Extended_Pictographic# E0.7 [1] (🐿️) chipmunk +1F440 ; Extended_Pictographic# E0.6 [1] (👀) eyes +1F441 ; Extended_Pictographic# E0.7 [1] (👁️) eye +1F442..1F464 ; Extended_Pictographic# E0.6 [35] (👂..👤) ear..bust in silhouette +1F465 ; Extended_Pictographic# E1.0 [1] (👥) busts in silhouette +1F466..1F46B ; Extended_Pictographic# E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Extended_Pictographic# E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F4AC ; Extended_Pictographic# E0.6 [63] (👮..💬) police officer..speech balloon +1F4AD ; Extended_Pictographic# E1.0 [1] (💭) thought balloon +1F4AE..1F4B5 ; Extended_Pictographic# E0.6 [8] (💮..💵) white flower..dollar banknote +1F4B6..1F4B7 ; Extended_Pictographic# E1.0 [2] (💶..💷) euro banknote..pound banknote +1F4B8..1F4EB ; Extended_Pictographic# E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag +1F4EC..1F4ED ; Extended_Pictographic# E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag +1F4EE ; Extended_Pictographic# E0.6 [1] (📮) postbox +1F4EF ; Extended_Pictographic# E1.0 [1] (📯) postal horn +1F4F0..1F4F4 ; Extended_Pictographic# E0.6 [5] (📰..📴) newspaper..mobile phone off +1F4F5 ; Extended_Pictographic# E1.0 [1] (📵) no mobile phones +1F4F6..1F4F7 ; Extended_Pictographic# E0.6 [2] (📶..📷) antenna bars..camera +1F4F8 ; Extended_Pictographic# E1.0 [1] (📸) camera with flash +1F4F9..1F4FC ; Extended_Pictographic# E0.6 [4] (📹..📼) video camera..videocassette +1F4FD ; Extended_Pictographic# E0.7 [1] (📽️) film projector +1F4FE ; Extended_Pictographic# E0.0 [1] (📾) PORTABLE STEREO +1F4FF..1F502 ; Extended_Pictographic# E1.0 [4] (📿..🔂) prayer beads..repeat single button +1F503 ; Extended_Pictographic# E0.6 [1] (🔃) clockwise vertical arrows +1F504..1F507 ; Extended_Pictographic# E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker +1F508 ; Extended_Pictographic# E0.7 [1] (🔈) speaker low volume +1F509 ; Extended_Pictographic# E1.0 [1] (🔉) speaker medium volume +1F50A..1F514 ; Extended_Pictographic# E0.6 [11] (🔊..🔔) speaker high volume..bell +1F515 ; Extended_Pictographic# E1.0 [1] (🔕) bell with slash +1F516..1F52B ; Extended_Pictographic# E0.6 [22] (🔖..🔫) bookmark..water pistol +1F52C..1F52D ; Extended_Pictographic# E1.0 [2] (🔬..🔭) microscope..telescope +1F52E..1F53D ; Extended_Pictographic# E0.6 [16] (🔮..🔽) crystal ball..downwards button +1F546..1F548 ; Extended_Pictographic# E0.0 [3] (🕆..🕈) WHITE LATIN CROSS..CELTIC CROSS +1F549..1F54A ; Extended_Pictographic# E0.7 [2] (🕉️..🕊️) om..dove +1F54B..1F54E ; Extended_Pictographic# E1.0 [4] (🕋..🕎) kaaba..menorah +1F54F ; Extended_Pictographic# E0.0 [1] (🕏) BOWL OF HYGIEIA +1F550..1F55B ; Extended_Pictographic# E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock +1F55C..1F567 ; Extended_Pictographic# E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty +1F568..1F56E ; Extended_Pictographic# E0.0 [7] (🕨..🕮) RIGHT SPEAKER..BOOK +1F56F..1F570 ; Extended_Pictographic# E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock +1F571..1F572 ; Extended_Pictographic# E0.0 [2] (🕱..🕲) BLACK SKULL AND CROSSBONES..NO PIRACY +1F573..1F579 ; Extended_Pictographic# E0.7 [7] (🕳️..🕹️) hole..joystick +1F57A ; Extended_Pictographic# E3.0 [1] (🕺) man dancing +1F57B..1F586 ; Extended_Pictographic# E0.0 [12] (🕻..🖆) LEFT HAND TELEPHONE RECEIVER..PEN OVER STAMPED ENVELOPE +1F587 ; Extended_Pictographic# E0.7 [1] (🖇️) linked paperclips +1F588..1F589 ; Extended_Pictographic# E0.0 [2] (🖈..🖉) BLACK PUSHPIN..LOWER LEFT PENCIL +1F58A..1F58D ; Extended_Pictographic# E0.7 [4] (🖊️..🖍️) pen..crayon +1F58E..1F58F ; Extended_Pictographic# E0.0 [2] (🖎..🖏) LEFT WRITING HAND..TURNED OK HAND SIGN +1F590 ; Extended_Pictographic# E0.7 [1] (🖐️) hand with fingers splayed +1F591..1F594 ; Extended_Pictographic# E0.0 [4] (🖑..🖔) REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND +1F595..1F596 ; Extended_Pictographic# E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F597..1F5A3 ; Extended_Pictographic# E0.0 [13] (🖗..🖣) WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX +1F5A4 ; Extended_Pictographic# E3.0 [1] (🖤) black heart +1F5A5 ; Extended_Pictographic# E0.7 [1] (🖥️) desktop computer +1F5A6..1F5A7 ; Extended_Pictographic# E0.0 [2] (🖦..🖧) KEYBOARD AND MOUSE..THREE NETWORKED COMPUTERS +1F5A8 ; Extended_Pictographic# E0.7 [1] (🖨️) printer +1F5A9..1F5B0 ; Extended_Pictographic# E0.0 [8] (🖩..🖰) POCKET CALCULATOR..TWO BUTTON MOUSE +1F5B1..1F5B2 ; Extended_Pictographic# E0.7 [2] (🖱️..🖲️) computer mouse..trackball +1F5B3..1F5BB ; Extended_Pictographic# E0.0 [9] (🖳..🖻) OLD PERSONAL COMPUTER..DOCUMENT WITH PICTURE +1F5BC ; Extended_Pictographic# E0.7 [1] (🖼️) framed picture +1F5BD..1F5C1 ; Extended_Pictographic# E0.0 [5] (🖽..🗁) FRAME WITH TILES..OPEN FOLDER +1F5C2..1F5C4 ; Extended_Pictographic# E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet +1F5C5..1F5D0 ; Extended_Pictographic# E0.0 [12] (🗅..🗐) EMPTY NOTE..PAGES +1F5D1..1F5D3 ; Extended_Pictographic# E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar +1F5D4..1F5DB ; Extended_Pictographic# E0.0 [8] (🗔..🗛) DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL +1F5DC..1F5DE ; Extended_Pictographic# E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper +1F5DF..1F5E0 ; Extended_Pictographic# E0.0 [2] (🗟..🗠) PAGE WITH CIRCLED TEXT..STOCK CHART +1F5E1 ; Extended_Pictographic# E0.7 [1] (🗡️) dagger +1F5E2 ; Extended_Pictographic# E0.0 [1] (🗢) LIPS +1F5E3 ; Extended_Pictographic# E0.7 [1] (🗣️) speaking head +1F5E4..1F5E7 ; Extended_Pictographic# E0.0 [4] (🗤..🗧) THREE RAYS ABOVE..THREE RAYS RIGHT +1F5E8 ; Extended_Pictographic# E2.0 [1] (🗨️) left speech bubble +1F5E9..1F5EE ; Extended_Pictographic# E0.0 [6] (🗩..🗮) RIGHT SPEECH BUBBLE..LEFT ANGER BUBBLE +1F5EF ; Extended_Pictographic# E0.7 [1] (🗯️) right anger bubble +1F5F0..1F5F2 ; Extended_Pictographic# E0.0 [3] (🗰..🗲) MOOD BUBBLE..LIGHTNING MOOD +1F5F3 ; Extended_Pictographic# E0.7 [1] (🗳️) ballot box with ballot +1F5F4..1F5F9 ; Extended_Pictographic# E0.0 [6] (🗴..🗹) BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK +1F5FA ; Extended_Pictographic# E0.7 [1] (🗺️) world map +1F5FB..1F5FF ; Extended_Pictographic# E0.6 [5] (🗻..🗿) mount fuji..moai +1F600 ; Extended_Pictographic# E1.0 [1] (😀) grinning face +1F601..1F606 ; Extended_Pictographic# E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face +1F607..1F608 ; Extended_Pictographic# E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns +1F609..1F60D ; Extended_Pictographic# E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes +1F60E ; Extended_Pictographic# E1.0 [1] (😎) smiling face with sunglasses +1F60F ; Extended_Pictographic# E0.6 [1] (😏) smirking face +1F610 ; Extended_Pictographic# E0.7 [1] (😐) neutral face +1F611 ; Extended_Pictographic# E1.0 [1] (😑) expressionless face +1F612..1F614 ; Extended_Pictographic# E0.6 [3] (😒..😔) unamused face..pensive face +1F615 ; Extended_Pictographic# E1.0 [1] (😕) confused face +1F616 ; Extended_Pictographic# E0.6 [1] (😖) confounded face +1F617 ; Extended_Pictographic# E1.0 [1] (😗) kissing face +1F618 ; Extended_Pictographic# E0.6 [1] (😘) face blowing a kiss +1F619 ; Extended_Pictographic# E1.0 [1] (😙) kissing face with smiling eyes +1F61A ; Extended_Pictographic# E0.6 [1] (😚) kissing face with closed eyes +1F61B ; Extended_Pictographic# E1.0 [1] (😛) face with tongue +1F61C..1F61E ; Extended_Pictographic# E0.6 [3] (😜..😞) winking face with tongue..disappointed face +1F61F ; Extended_Pictographic# E1.0 [1] (😟) worried face +1F620..1F625 ; Extended_Pictographic# E0.6 [6] (😠..😥) angry face..sad but relieved face +1F626..1F627 ; Extended_Pictographic# E1.0 [2] (😦..😧) frowning face with open mouth..anguished face +1F628..1F62B ; Extended_Pictographic# E0.6 [4] (😨..😫) fearful face..tired face +1F62C ; Extended_Pictographic# E1.0 [1] (😬) grimacing face +1F62D ; Extended_Pictographic# E0.6 [1] (😭) loudly crying face +1F62E..1F62F ; Extended_Pictographic# E1.0 [2] (😮..😯) face with open mouth..hushed face +1F630..1F633 ; Extended_Pictographic# E0.6 [4] (😰..😳) anxious face with sweat..flushed face +1F634 ; Extended_Pictographic# E1.0 [1] (😴) sleeping face +1F635 ; Extended_Pictographic# E0.6 [1] (😵) face with crossed-out eyes +1F636 ; Extended_Pictographic# E1.0 [1] (😶) face without mouth +1F637..1F640 ; Extended_Pictographic# E0.6 [10] (😷..🙀) face with medical mask..weary cat +1F641..1F644 ; Extended_Pictographic# E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes +1F645..1F64F ; Extended_Pictographic# E0.6 [11] (🙅..🙏) person gesturing NO..folded hands +1F680 ; Extended_Pictographic# E0.6 [1] (🚀) rocket +1F681..1F682 ; Extended_Pictographic# E1.0 [2] (🚁..🚂) helicopter..locomotive +1F683..1F685 ; Extended_Pictographic# E0.6 [3] (🚃..🚅) railway car..bullet train +1F686 ; Extended_Pictographic# E1.0 [1] (🚆) train +1F687 ; Extended_Pictographic# E0.6 [1] (🚇) metro +1F688 ; Extended_Pictographic# E1.0 [1] (🚈) light rail +1F689 ; Extended_Pictographic# E0.6 [1] (🚉) station +1F68A..1F68B ; Extended_Pictographic# E1.0 [2] (🚊..🚋) tram..tram car +1F68C ; Extended_Pictographic# E0.6 [1] (🚌) bus +1F68D ; Extended_Pictographic# E0.7 [1] (🚍) oncoming bus +1F68E ; Extended_Pictographic# E1.0 [1] (🚎) trolleybus +1F68F ; Extended_Pictographic# E0.6 [1] (🚏) bus stop +1F690 ; Extended_Pictographic# E1.0 [1] (🚐) minibus +1F691..1F693 ; Extended_Pictographic# E0.6 [3] (🚑..🚓) ambulance..police car +1F694 ; Extended_Pictographic# E0.7 [1] (🚔) oncoming police car +1F695 ; Extended_Pictographic# E0.6 [1] (🚕) taxi +1F696 ; Extended_Pictographic# E1.0 [1] (🚖) oncoming taxi +1F697 ; Extended_Pictographic# E0.6 [1] (🚗) automobile +1F698 ; Extended_Pictographic# E0.7 [1] (🚘) oncoming automobile +1F699..1F69A ; Extended_Pictographic# E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck +1F69B..1F6A1 ; Extended_Pictographic# E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway +1F6A2 ; Extended_Pictographic# E0.6 [1] (🚢) ship +1F6A3 ; Extended_Pictographic# E1.0 [1] (🚣) person rowing boat +1F6A4..1F6A5 ; Extended_Pictographic# E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light +1F6A6 ; Extended_Pictographic# E1.0 [1] (🚦) vertical traffic light +1F6A7..1F6AD ; Extended_Pictographic# E0.6 [7] (🚧..🚭) construction..no smoking +1F6AE..1F6B1 ; Extended_Pictographic# E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water +1F6B2 ; Extended_Pictographic# E0.6 [1] (🚲) bicycle +1F6B3..1F6B5 ; Extended_Pictographic# E1.0 [3] (🚳..🚵) no bicycles..person mountain biking +1F6B6 ; Extended_Pictographic# E0.6 [1] (🚶) person walking +1F6B7..1F6B8 ; Extended_Pictographic# E1.0 [2] (🚷..🚸) no pedestrians..children crossing +1F6B9..1F6BE ; Extended_Pictographic# E0.6 [6] (🚹..🚾) men’s room..water closet +1F6BF ; Extended_Pictographic# E1.0 [1] (🚿) shower +1F6C0 ; Extended_Pictographic# E0.6 [1] (🛀) person taking bath +1F6C1..1F6C5 ; Extended_Pictographic# E1.0 [5] (🛁..🛅) bathtub..left luggage +1F6C6..1F6CA ; Extended_Pictographic# E0.0 [5] (🛆..🛊) TRIANGLE WITH ROUNDED CORNERS..GIRLS SYMBOL +1F6CB ; Extended_Pictographic# E0.7 [1] (🛋️) couch and lamp +1F6CC ; Extended_Pictographic# E1.0 [1] (🛌) person in bed +1F6CD..1F6CF ; Extended_Pictographic# E0.7 [3] (🛍️..🛏️) shopping bags..bed +1F6D0 ; Extended_Pictographic# E1.0 [1] (🛐) place of worship +1F6D1..1F6D2 ; Extended_Pictographic# E3.0 [2] (🛑..🛒) stop sign..shopping cart +1F6D3..1F6D4 ; Extended_Pictographic# E0.0 [2] (🛓..🛔) STUPA..PAGODA +1F6D5 ; Extended_Pictographic# E12.0 [1] (🛕) hindu temple +1F6D6..1F6D7 ; Extended_Pictographic# E13.0 [2] (🛖..🛗) hut..elevator +1F6D8..1F6DC ; Extended_Pictographic# E0.0 [5] (🛘..🛜) .. +1F6DD..1F6DF ; Extended_Pictographic# E14.0 [3] (🛝..🛟) playground slide..ring buoy +1F6E0..1F6E5 ; Extended_Pictographic# E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat +1F6E6..1F6E8 ; Extended_Pictographic# E0.0 [3] (🛦..🛨) UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE +1F6E9 ; Extended_Pictographic# E0.7 [1] (🛩️) small airplane +1F6EA ; Extended_Pictographic# E0.0 [1] (🛪) NORTHEAST-POINTING AIRPLANE +1F6EB..1F6EC ; Extended_Pictographic# E1.0 [2] (🛫..🛬) airplane departure..airplane arrival +1F6ED..1F6EF ; Extended_Pictographic# E0.0 [3] (🛭..🛯) .. +1F6F0 ; Extended_Pictographic# E0.7 [1] (🛰️) satellite +1F6F1..1F6F2 ; Extended_Pictographic# E0.0 [2] (🛱..🛲) ONCOMING FIRE ENGINE..DIESEL LOCOMOTIVE +1F6F3 ; Extended_Pictographic# E0.7 [1] (🛳️) passenger ship +1F6F4..1F6F6 ; Extended_Pictographic# E3.0 [3] (🛴..🛶) kick scooter..canoe +1F6F7..1F6F8 ; Extended_Pictographic# E5.0 [2] (🛷..🛸) sled..flying saucer +1F6F9 ; Extended_Pictographic# E11.0 [1] (🛹) skateboard +1F6FA ; Extended_Pictographic# E12.0 [1] (🛺) auto rickshaw +1F6FB..1F6FC ; Extended_Pictographic# E13.0 [2] (🛻..🛼) pickup truck..roller skate +1F6FD..1F6FF ; Extended_Pictographic# E0.0 [3] (🛽..🛿) .. +1F774..1F77F ; Extended_Pictographic# E0.0 [12] (🝴..🝿) .. +1F7D5..1F7DF ; Extended_Pictographic# E0.0 [11] (🟕..🟟) CIRCLED TRIANGLE.. +1F7E0..1F7EB ; Extended_Pictographic# E12.0 [12] (🟠..🟫) orange circle..brown square +1F7EC..1F7EF ; Extended_Pictographic# E0.0 [4] (🟬..🟯) .. +1F7F0 ; Extended_Pictographic# E14.0 [1] (🟰) heavy equals sign +1F7F1..1F7FF ; Extended_Pictographic# E0.0 [15] (🟱..🟿) .. +1F80C..1F80F ; Extended_Pictographic# E0.0 [4] (🠌..🠏) .. +1F848..1F84F ; Extended_Pictographic# E0.0 [8] (🡈..🡏) .. +1F85A..1F85F ; Extended_Pictographic# E0.0 [6] (🡚..🡟) .. +1F888..1F88F ; Extended_Pictographic# E0.0 [8] (🢈..🢏) .. +1F8AE..1F8FF ; Extended_Pictographic# E0.0 [82] (🢮..🣿) .. +1F90C ; Extended_Pictographic# E13.0 [1] (🤌) pinched fingers +1F90D..1F90F ; Extended_Pictographic# E12.0 [3] (🤍..🤏) white heart..pinching hand +1F910..1F918 ; Extended_Pictographic# E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns +1F919..1F91E ; Extended_Pictographic# E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Extended_Pictographic# E5.0 [1] (🤟) love-you gesture +1F920..1F927 ; Extended_Pictographic# E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face +1F928..1F92F ; Extended_Pictographic# E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head +1F930 ; Extended_Pictographic# E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Extended_Pictographic# E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F93A ; Extended_Pictographic# E3.0 [8] (🤳..🤺) selfie..person fencing +1F93C..1F93E ; Extended_Pictographic# E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F93F ; Extended_Pictographic# E12.0 [1] (🤿) diving mask +1F940..1F945 ; Extended_Pictographic# E3.0 [6] (🥀..🥅) wilted flower..goal net +1F947..1F94B ; Extended_Pictographic# E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform +1F94C ; Extended_Pictographic# E5.0 [1] (🥌) curling stone +1F94D..1F94F ; Extended_Pictographic# E11.0 [3] (🥍..🥏) lacrosse..flying disc +1F950..1F95E ; Extended_Pictographic# E3.0 [15] (🥐..🥞) croissant..pancakes +1F95F..1F96B ; Extended_Pictographic# E5.0 [13] (🥟..🥫) dumpling..canned food +1F96C..1F970 ; Extended_Pictographic# E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts +1F971 ; Extended_Pictographic# E12.0 [1] (🥱) yawning face +1F972 ; Extended_Pictographic# E13.0 [1] (🥲) smiling face with tear +1F973..1F976 ; Extended_Pictographic# E11.0 [4] (🥳..🥶) partying face..cold face +1F977..1F978 ; Extended_Pictographic# E13.0 [2] (🥷..🥸) ninja..disguised face +1F979 ; Extended_Pictographic# E14.0 [1] (🥹) face holding back tears +1F97A ; Extended_Pictographic# E11.0 [1] (🥺) pleading face +1F97B ; Extended_Pictographic# E12.0 [1] (🥻) sari +1F97C..1F97F ; Extended_Pictographic# E11.0 [4] (🥼..🥿) lab coat..flat shoe +1F980..1F984 ; Extended_Pictographic# E1.0 [5] (🦀..🦄) crab..unicorn +1F985..1F991 ; Extended_Pictographic# E3.0 [13] (🦅..🦑) eagle..squid +1F992..1F997 ; Extended_Pictographic# E5.0 [6] (🦒..🦗) giraffe..cricket +1F998..1F9A2 ; Extended_Pictographic# E11.0 [11] (🦘..🦢) kangaroo..swan +1F9A3..1F9A4 ; Extended_Pictographic# E13.0 [2] (🦣..🦤) mammoth..dodo +1F9A5..1F9AA ; Extended_Pictographic# E12.0 [6] (🦥..🦪) sloth..oyster +1F9AB..1F9AD ; Extended_Pictographic# E13.0 [3] (🦫..🦭) beaver..seal +1F9AE..1F9AF ; Extended_Pictographic# E12.0 [2] (🦮..🦯) guide dog..white cane +1F9B0..1F9B9 ; Extended_Pictographic# E11.0 [10] (🦰..🦹) red hair..supervillain +1F9BA..1F9BF ; Extended_Pictographic# E12.0 [6] (🦺..🦿) safety vest..mechanical leg +1F9C0 ; Extended_Pictographic# E1.0 [1] (🧀) cheese wedge +1F9C1..1F9C2 ; Extended_Pictographic# E11.0 [2] (🧁..🧂) cupcake..salt +1F9C3..1F9CA ; Extended_Pictographic# E12.0 [8] (🧃..🧊) beverage box..ice +1F9CB ; Extended_Pictographic# E13.0 [1] (🧋) bubble tea +1F9CC ; Extended_Pictographic# E14.0 [1] (🧌) troll +1F9CD..1F9CF ; Extended_Pictographic# E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D0..1F9E6 ; Extended_Pictographic# E5.0 [23] (🧐..🧦) face with monocle..socks +1F9E7..1F9FF ; Extended_Pictographic# E11.0 [25] (🧧..🧿) red envelope..nazar amulet +1FA00..1FA6F ; Extended_Pictographic# E0.0 [112] (🨀..🩯) NEUTRAL CHESS KING.. +1FA70..1FA73 ; Extended_Pictographic# E12.0 [4] (🩰..🩳) ballet shoes..shorts +1FA74 ; Extended_Pictographic# E13.0 [1] (🩴) thong sandal +1FA75..1FA77 ; Extended_Pictographic# E0.0 [3] (🩵..🩷) .. +1FA78..1FA7A ; Extended_Pictographic# E12.0 [3] (🩸..🩺) drop of blood..stethoscope +1FA7B..1FA7C ; Extended_Pictographic# E14.0 [2] (🩻..🩼) x-ray..crutch +1FA7D..1FA7F ; Extended_Pictographic# E0.0 [3] (🩽..🩿) .. +1FA80..1FA82 ; Extended_Pictographic# E12.0 [3] (🪀..🪂) yo-yo..parachute +1FA83..1FA86 ; Extended_Pictographic# E13.0 [4] (🪃..🪆) boomerang..nesting dolls +1FA87..1FA8F ; Extended_Pictographic# E0.0 [9] (🪇..🪏) .. +1FA90..1FA95 ; Extended_Pictographic# E12.0 [6] (🪐..🪕) ringed planet..banjo +1FA96..1FAA8 ; Extended_Pictographic# E13.0 [19] (🪖..🪨) military helmet..rock +1FAA9..1FAAC ; Extended_Pictographic# E14.0 [4] (🪩..🪬) mirror ball..hamsa +1FAAD..1FAAF ; Extended_Pictographic# E0.0 [3] (🪭..🪯) .. +1FAB0..1FAB6 ; Extended_Pictographic# E13.0 [7] (🪰..🪶) fly..feather +1FAB7..1FABA ; Extended_Pictographic# E14.0 [4] (🪷..🪺) lotus..nest with eggs +1FABB..1FABF ; Extended_Pictographic# E0.0 [5] (🪻..🪿) .. +1FAC0..1FAC2 ; Extended_Pictographic# E13.0 [3] (🫀..🫂) anatomical heart..people hugging +1FAC3..1FAC5 ; Extended_Pictographic# E14.0 [3] (🫃..🫅) pregnant man..person with crown +1FAC6..1FACF ; Extended_Pictographic# E0.0 [10] (🫆..🫏) .. +1FAD0..1FAD6 ; Extended_Pictographic# E13.0 [7] (🫐..🫖) blueberries..teapot +1FAD7..1FAD9 ; Extended_Pictographic# E14.0 [3] (🫗..🫙) pouring liquid..jar +1FADA..1FADF ; Extended_Pictographic# E0.0 [6] (🫚..🫟) .. +1FAE0..1FAE7 ; Extended_Pictographic# E14.0 [8] (🫠..🫧) melting face..bubbles +1FAE8..1FAEF ; Extended_Pictographic# E0.0 [8] (🫨..🫯) .. +1FAF0..1FAF6 ; Extended_Pictographic# E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands +1FAF7..1FAFF ; Extended_Pictographic# E0.0 [9] (🫷..🫿) .. +1FC00..1FFFD ; Extended_Pictographic# E0.0[1022] (🰀..🿽) .. + +# Total elements: 3537 + +#EOF diff --git a/etc/NEWS b/etc/NEWS index b10aa3b5a7..9606eded50 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -131,6 +131,19 @@ of files visited via 'C-x C-f' and other commands. --- ** Emacs now supports Unicode Standard version 14.0. ++++ +** New character script 'emoji' has been created. +Various blocks of codepoints have been split out of the 'symbol' +script into their own 'emoji' script to allow easier specification of +their treatment. Which codepoints are treated as emoji is derived +from the Unicode specifications. Also, Emacs will now use "Noto Color +Emoji" by default for that script. Use: + +(set-fontset-font t 'emoji + '("My New Emoji Font" . "iso10646-1") nil 'prepend) + +to change the font used. + +++ ** New command 'execute-extended-command-for-buffer'. This new command, bound to 'M-S-x', works like @@ -379,6 +392,9 @@ When customized to nil, it uses 'minibuffer-restore-windows' in 'minibuffer-exit-hook' to remove only the window showing the "*Completions*" buffer. + +* Editing Changes in Emacs 28.1 + --- *** New variable 'redisplay-adhoc-scroll-in-resize-mini-windows'. Customizing it to nil will disable the ad-hoc auto-scrolling of diff --git a/etc/TODO b/etc/TODO index 8fe698b0c1..e2d1c19a00 100644 --- a/etc/TODO +++ b/etc/TODO @@ -405,7 +405,8 @@ punctuation characters, disregarding the fontsets, should be modified to exempt Emoji from this rule (since Emoji characters belong to the 'symbol' script in Emacs), so that use-default-font-for-symbols would not have to be tweaked to have Emoji display by default with a capable -font. +font. (This has now been implemented, but only one font is currently +considered, please augment the list). *** Consider changing the default display of Variation Selectors Emacs by default displays the Variation Selector (VS) codepoints not diff --git a/lisp/international/fontset.el b/lisp/international/fontset.el index 4ef118badf..13c998a41a 100644 --- a/lisp/international/fontset.el +++ b/lisp/international/fontset.el @@ -278,7 +278,8 @@ (indic-siyaq-number #x1ec71) (ottoman-siyaq-number #x1ed01) (mahjong-tile #x1F000) - (domino-tile #x1F030))) + (domino-tile #x1F030) + (emoji #x1F300 #x1F600 #xFE0F))) (defvar otf-script-alist) @@ -781,7 +782,8 @@ toto adlam mahjong-tile - domino-tile)) + domino-tile + emoji)) (set-fontset-font "fontset-default" script (font-spec :registry "iso10646-1" :script script) nil 'append)) @@ -894,6 +896,9 @@ (#x1FA00 . #x1FA6F))) ;; Chess Symbols (set-fontset-font "fontset-default" symbol-subgroup '("Symbola" . "iso10646-1") nil 'prepend)) + ;; This sets up the Emoji codepoints to use prettier fonts. + (set-fontset-font "fontset-default" 'emoji + '("Noto Color Emoji" . "iso10646-1") nil 'prepend) ;; Box Drawing and Block Elements (set-fontset-font "fontset-default" '(#x2500 . #x259F) '("FreeMono" . "iso10646-1") nil 'prepend) commit 9ca737c4198c5e7faef7a74de7b1e84b11e1dbeb Author: Dmitry Gutov Date: Fri Sep 17 15:39:23 2021 +0300 xref-matches-in-files: Move sorting to Lisp For better compatibility with different systems. Performance is unaffected, except in very pathological cases (~100000 matches), and even then the overhead of 'sort' is comparable. * lisp/progmodes/xref.el (xref-search-program-alist): Drop the piping through 'sort'. (xref-matches-in-files): Sort here instead. Do that to both searchers' output as well now. diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index ab7e8f6e29..69cabd0b5a 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -1625,13 +1625,8 @@ IGNORES is a list of glob patterns for files to ignore." "xargs -0 grep -snHE -e ") (ripgrep . - ;; Note: by default, ripgrep's output order is non-deterministic - ;; (https://github.com/BurntSushi/ripgrep/issues/152) - ;; because it does the search in parallel. You can use the template - ;; without the '| sort ...' part if GNU sort is not available on - ;; your system and/or stable ordering is not important to you. - ;; Note#2: '!*/' is there to filter out dirs (e.g. submodules). - "xargs -0 rg -nH --no-messages -g '!*/' -e | sort -t: -k1,1 -k2n,2" + ;; '!*/' is there to filter out dirs (e.g. submodules). + "xargs -0 rg -nH --no-messages -g '!*/' -e " )) "Associative list mapping program identifiers to command templates. @@ -1723,7 +1718,16 @@ FILES must be a list of absolute file names." (match-string file-group) (buffer-substring-no-properties (point) (line-end-position))) hits))) - (xref--convert-hits (nreverse hits) regexp))) + ;; By default, ripgrep's output order is non-deterministic + ;; (https://github.com/BurntSushi/ripgrep/issues/152) + ;; because it does the search in parallel. + ;; Grep's output also comes out in seemingly arbitrary order, + ;; though stable one. Let's sort both for better UI. + (setq hits + (sort (nreverse hits) + (lambda (h1 h2) + (string< (cadr h1) (cadr h2))))) + (xref--convert-hits hits regexp))) (defun xref--process-file-region ( start end program &optional buffer display commit 8220df9355e105459e91623dd63f7a08a08cfe09 Author: Stefan Kangas Date: Fri Sep 17 14:06:18 2021 +0200 ; * test/lisp/emacs-lisp/seq-tests.el: Remove duplicate test. diff --git a/test/lisp/emacs-lisp/seq-tests.el b/test/lisp/emacs-lisp/seq-tests.el index bf79dd922b..8dc0b93b5a 100644 --- a/test/lisp/emacs-lisp/seq-tests.el +++ b/test/lisp/emacs-lisp/seq-tests.el @@ -347,11 +347,6 @@ Evaluate BODY for each created sequence. (should (same-contents-p (seq-union v1 v2) '(1 2 3 4 5 6 7 8 9)))) - (let ((v1 '(1 2 3 4 5 6)) - (v2 '(4 5 6 7 8 9))) - (should (same-contents-p (seq-union v1 v2) - '(1 2 3 4 5 6 7 8 9)))) - (let ((v1 [1 2 3 4 5]) (v2 [4 5 6 "a"])) (should (same-contents-p (seq-union v1 v2) commit 3848e2727edab4a2bcb6bca52abae883e33ac90b Author: Eli Zaretskii Date: Fri Sep 17 15:03:53 2021 +0300 Improve the documentation of a recent change * etc/NEWS: * doc/lispref/sequences.texi (Sequence Functions): Improve documentation of 'seq-union'. diff --git a/doc/lispref/sequences.texi b/doc/lispref/sequences.texi index 53d37199bf..4a48d62f6d 100644 --- a/doc/lispref/sequences.texi +++ b/doc/lispref/sequences.texi @@ -957,9 +957,11 @@ contain less elements than @var{n}. @var{n} must be an integer. If @cindex sequences, union of @cindex union of sequences This function returns a list of the elements that appear either in -@var{sequence1} or @var{sequence2}. If the optional argument -@var{function} is non-@code{nil}, it is a function of two arguments to -use to compare elements instead of the default @code{equal}. +@var{sequence1} or @var{sequence2}. The elements of the returned list +are all unique, in the sense that no two elements there will compare +equal. If the optional argument @var{function} is non-@code{nil}, it +should be a function of two arguments to use to compare elements, +instead of the default @code{equal}. @example @group diff --git a/etc/NEWS b/etc/NEWS index b1ad4dd126..b10aa3b5a7 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -3858,7 +3858,8 @@ supporting Lisp files when 'require' is unsuitable. +++ ** New function 'seq-union'. This function takes two sequences and returns a list of all elements -that appear in either of them. +that appear in either of them, with no two elements that compare equal +appearing in the result. +++ ** New function 'syntax-class-to-char'. commit 3e5298fc96c98d2296432d31ee1d3de86a4c466c Author: Stefan Kangas Date: Fri Sep 17 14:01:20 2021 +0200 Improve performance of seq-union * lisp/emacs-lisp/seq.el (seq-union): Improve performance by using nreverse instead of seq-reverse. diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el index 87aba66daa..ae5988296d 100644 --- a/lisp/emacs-lisp/seq.el +++ b/lisp/emacs-lisp/seq.el @@ -471,13 +471,13 @@ negative integer or 0, nil is returned." (cl-defgeneric seq-union (sequence1 sequence2 &optional testfn) "Return a list of all elements that appear in either SEQUENCE1 or SEQUENCE2. Equality is defined by TESTFN if non-nil or by `equal' if nil." - (let ((accum (lambda (acc elt) - (if (seq-contains-p acc elt testfn) - acc - (cons elt acc))))) - (seq-reverse - (seq-reduce accum sequence2 - (seq-reduce accum sequence1 '()))))) + (let* ((accum (lambda (acc elt) + (if (seq-contains-p acc elt testfn) + acc + (cons elt acc)))) + (result (seq-reduce accum sequence2 + (seq-reduce accum sequence1 '())))) + (nreverse result))) ;;;###autoload (cl-defgeneric seq-intersection (sequence1 sequence2 &optional testfn) commit 0bdd6488fc63e9df406fdcf12874a9d12b728208 Author: Stefan Kangas Date: Fri Sep 17 12:32:59 2021 +0200 ; Make change that was accidentally left out in my last commit diff --git a/lisp/emulation/viper-macs.el b/lisp/emulation/viper-macs.el index 7400154281..fb60f6a545 100644 --- a/lisp/emulation/viper-macs.el +++ b/lisp/emulation/viper-macs.el @@ -166,7 +166,7 @@ a key is a symbol, e.g., `a', `\\1', `f2', etc., or a list, e.g., (if (member key '(?\b ?\d '^? '^H (control h) (control \?) backspace delete)) - (setq key-seq (viper-subseq key-seq 0 (- (length key-seq) 2)))) + (setq key-seq (seq-subseq key-seq 0 (- (length key-seq) 2)))) (setq message (format ":map%s %s" commit a1b2ec6e06690ac51e9cf0f13338c345674594e1 Author: Stefan Kangas Date: Fri Sep 17 11:39:47 2021 +0200 Make viper-subseq into obsolete alias for cl-subseq * lisp/emulation/viper-util.el (viper-subseq): Make into obsolete function alias for 'cl-subseq'. Update callers. diff --git a/lisp/emulation/viper-macs.el b/lisp/emulation/viper-macs.el index 94ab817892..7400154281 100644 --- a/lisp/emulation/viper-macs.el +++ b/lisp/emulation/viper-macs.el @@ -230,9 +230,9 @@ a key is a symbol, e.g., `a', `\\1', `f2', etc., or a list, e.g., (cond ((member key '(?\b ?\d '^? '^H (control h) (control \?) backspace delete)) - (setq key-seq (viper-subseq key-seq 0 (- (length key-seq) 2)))) + (setq key-seq (cl-subseq key-seq 0 (- (length key-seq) 2)))) ((member key '(tab (control i) ?\t)) - (setq key-seq (viper-subseq key-seq 0 (1- (length key-seq)))) + (setq key-seq (cl-subseq key-seq 0 (1- (length key-seq)))) (setq message (format ":unmap%s %s" @@ -611,7 +611,7 @@ mistakes in macro names to be passed to this function is to use (if (null macro-alist-elt) (setq macro-alist-elt (car next-best-match) - unmatched-suffix (viper-subseq event-seq (cdr next-best-match)))) + unmatched-suffix (cl-subseq event-seq (cdr next-best-match)))) (cond ((null macro-alist-elt)) ((setq macro-body (viper-kbd-buf-definition macro-alist-elt))) @@ -693,7 +693,7 @@ mistakes in macro names to be passed to this function is to use (let ((len1 (length seq1)) (len2 (length seq2))) (if (<= len1 len2) - (equal seq1 (viper-subseq seq2 0 len1))))) + (equal seq1 (cl-subseq seq2 0 len1))))) ;; find the longest common prefix (defun viper-common-seq-prefix (&rest seqs) @@ -757,7 +757,7 @@ mistakes in macro names to be passed to this function is to use (setq macro-def (car lis) def-len (length (car macro-def))) (if (and (>= str-len def-len) - (equal (car macro-def) (viper-subseq str 0 def-len))) + (equal (car macro-def) (cl-subseq str 0 def-len))) (if (or (viper-kbd-buf-definition macro-def) (viper-kbd-mode-definition macro-def) (viper-kbd-global-definition macro-def)) diff --git a/lisp/emulation/viper-util.el b/lisp/emulation/viper-util.el index 51f7406ad2..8ff1cf91c0 100644 --- a/lisp/emulation/viper-util.el +++ b/lisp/emulation/viper-util.el @@ -927,7 +927,7 @@ Otherwise return the normal value." (t key))) ((listp key) - (setq modifiers (viper-subseq key 0 (1- (length key))) + (setq modifiers (cl-subseq key 0 (1- (length key))) base-key (viper-seq-last-elt key) base-key-name (symbol-name base-key) char-p (= (length base-key-name) 1)) @@ -1345,32 +1345,7 @@ This option is appropriate if you like Emacs-style words." (not (eq (get-char-property (point) 'field) (get-char-property (1- (point)) 'field))))) - -;; this is copied from cl-extra.el -;; Return the subsequence of SEQ from START to END. -;; If END is omitted, it defaults to the length of the sequence. -;; If START or END is negative, it counts from the end. -(defun viper-subseq (seq start &optional end) - (if (stringp seq) (substring seq start end) - (let (len) - (and end (< end 0) (setq end (+ end (setq len (length seq))))) - (if (< start 0) (setq start (+ start (or len (setq len (length seq)))))) - (cond ((listp seq) - (if (> start 0) (setq seq (nthcdr start seq))) - (if end - (let ((res nil)) - (while (>= (setq end (1- end)) start) - (push (pop seq) res)) - (nreverse res)) - (copy-sequence seq))) - (t - (or end (setq end (or len (length seq)))) - (let ((res (make-vector (max (- end start) 0) nil)) - (i 0)) - (while (< start end) - (aset res i (aref seq start)) - (setq i (1+ i) start (1+ start))) - res)))))) +(define-obsolete-function-alias 'viper-subseq #'cl-subseq "28.1") (provide 'viper-util) ;;; viper-util.el ends here commit cfa1e0a11b227205e8ba1306e330f9f2e35180c6 Author: Stefan Kangas Date: Fri Sep 17 11:01:54 2021 +0200 * lisp/vc/ediff-util.el (ediff-member): Make obsolete. diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el index a6f96b6e84..74c6aba1e4 100644 --- a/lisp/vc/ediff-util.el +++ b/lisp/vc/ediff-util.el @@ -4137,6 +4137,7 @@ Mail anyway? (y or n) ") ;; this uses comparison-func to decide who is a member (defun ediff-member (elt lis comparison-func) + (declare (obsolete seq-contains-p "28.1")) (while (and lis (not (funcall comparison-func (car lis) elt))) (setq lis (cdr lis))) lis) commit 24bd7025618048edef688b812514b921413c49f4 Author: Stefan Kangas Date: Fri Sep 17 11:02:38 2021 +0200 Make ediff-set-difference into obsolete alias for seq-difference * lisp/vc/ediff-util.el (ediff-set-difference): Make into obsolete function alias for 'seq-difference'. * lisp/vc/ediff-mult.el (ediff-intersect-directories): Update single caller. diff --git a/lisp/vc/ediff-mult.el b/lisp/vc/ediff-mult.el index 3ad1c30c01..cfb58349eb 100644 --- a/lisp/vc/ediff-mult.el +++ b/lisp/vc/ediff-mult.el @@ -622,7 +622,7 @@ behavior." (setq common (sort (copy-sequence common) #'string-lessp)) ;; compute difference list - (setq difflist (ediff-set-difference + (setq difflist (seq-difference (seq-union (seq-union lis1 lis2 #'string=) lis3 #'string=) diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el index 7aae70fab4..a6f96b6e84 100644 --- a/lisp/vc/ediff-util.el +++ b/lisp/vc/ediff-util.el @@ -4151,20 +4151,11 @@ Mail anyway? (y or n) ") (key-description desc) (format "M-x %s" func-def)))) -;; eliminates duplicates using comparison-func -(defun ediff-set-difference (lis1 lis2 comparison-func) - (let ((result (list 'a))) - (while lis1 - (or (ediff-member (car lis1) (cdr result) comparison-func) - (ediff-member (car lis1) lis2 comparison-func) - (nconc result (list (car lis1)))) - (setq lis1 (cdr lis1))) - (cdr result))) - (define-obsolete-function-alias 'ediff-add-to-history #'add-to-history "27.1") (define-obsolete-function-alias 'ediff-copy-list #'copy-sequence "28.1") (define-obsolete-function-alias 'ediff-union #'seq-union "28.1") (define-obsolete-function-alias 'ediff-intersection #'seq-intersection "28.1") +(define-obsolete-function-alias 'ediff-set-difference #'seq-difference "28.1") (run-hooks 'ediff-load-hook) commit 403010f2fda1a35f6ac40484646bb6708f4319ad Author: Stefan Kangas Date: Fri Sep 17 11:00:06 2021 +0200 Make ediff-intersection into obsolete alias for seq-intersection * lisp/vc/ediff-util.el (ediff-intersection): Make into obsolete function alias for 'seq-intersection'. * lisp/vc/ediff-mult.el (ediff-intersect-directories): Update single caller. diff --git a/lisp/vc/ediff-mult.el b/lisp/vc/ediff-mult.el index 0a168621df..3ad1c30c01 100644 --- a/lisp/vc/ediff-mult.el +++ b/lisp/vc/ediff-mult.el @@ -610,13 +610,13 @@ behavior." (if (ediff-nonempty-string-p merge-autostore-dir) (setq merge-autostore-dir (file-name-as-directory merge-autostore-dir))) - (setq common (ediff-intersection lis1 lis2 #'string=)) + (setq common (seq-intersection lis1 lis2 #'string=)) ;; In merge with ancestor jobs, we don't intersect with lis3. ;; If there is no ancestor, we'll offer to merge without the ancestor. ;; So, we intersect with lis3 only when we are doing 3-way file comparison (if (and lis3 (ediff-comparison-metajob3 jobname)) - (setq common (ediff-intersection common lis3 #'string=))) + (setq common (seq-intersection common lis3 #'string=))) ;; copying is needed because sort sorts via side effects (setq common (sort (copy-sequence common) #'string-lessp)) diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el index 0ae2f09ccd..7aae70fab4 100644 --- a/lisp/vc/ediff-util.el +++ b/lisp/vc/ediff-util.el @@ -4151,16 +4151,6 @@ Mail anyway? (y or n) ") (key-description desc) (format "M-x %s" func-def)))) -;; this uses comparison-func to decide who is a member, and this determines how -;; intersection looks like -(defun ediff-intersection (lis1 lis2 comparison-func) - (let ((result (list 'a))) - (while lis1 - (if (ediff-member (car lis1) lis2 comparison-func) - (nconc result (list (car lis1)))) - (setq lis1 (cdr lis1))) - (cdr result))) - ;; eliminates duplicates using comparison-func (defun ediff-set-difference (lis1 lis2 comparison-func) (let ((result (list 'a))) @@ -4174,6 +4164,7 @@ Mail anyway? (y or n) ") (define-obsolete-function-alias 'ediff-add-to-history #'add-to-history "27.1") (define-obsolete-function-alias 'ediff-copy-list #'copy-sequence "28.1") (define-obsolete-function-alias 'ediff-union #'seq-union "28.1") +(define-obsolete-function-alias 'ediff-intersection #'seq-intersection "28.1") (run-hooks 'ediff-load-hook) commit fb9df9b8834b795c8dd387e61df0a9dfded11dfc Author: Stefan Kangas Date: Fri Sep 17 10:41:15 2021 +0200 Make ediff-union into obsolete alias for seq-union * lisp/emacs-lisp/seq.el (seq-union): Autoload. * lisp/vc/ediff-util.el (ediff-union): Make into obsolete function alias for 'seq-union'. * lisp/vc/ediff-mult.el (ediff-intersect-directories): Update single caller. diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el index b7dcde87f4..87aba66daa 100644 --- a/lisp/emacs-lisp/seq.el +++ b/lisp/emacs-lisp/seq.el @@ -467,6 +467,7 @@ negative integer or 0, nil is returned." (setq sequence (seq-drop sequence n))) (nreverse result)))) +;;;###autoload (cl-defgeneric seq-union (sequence1 sequence2 &optional testfn) "Return a list of all elements that appear in either SEQUENCE1 or SEQUENCE2. Equality is defined by TESTFN if non-nil or by `equal' if nil." diff --git a/lisp/vc/ediff-mult.el b/lisp/vc/ediff-mult.el index 20ff8f9f04..0a168621df 100644 --- a/lisp/vc/ediff-mult.el +++ b/lisp/vc/ediff-mult.el @@ -623,9 +623,9 @@ behavior." ;; compute difference list (setq difflist (ediff-set-difference - (ediff-union (ediff-union lis1 lis2 #'string=) - lis3 - #'string=) + (seq-union (seq-union lis1 lis2 #'string=) + lis3 + #'string=) common #'string=) difflist (delete "." difflist) diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el index 0404380943..0ae2f09ccd 100644 --- a/lisp/vc/ediff-util.el +++ b/lisp/vc/ediff-util.el @@ -4161,20 +4161,6 @@ Mail anyway? (y or n) ") (setq lis1 (cdr lis1))) (cdr result))) - -;; eliminates duplicates using comparison-func -(defun ediff-union (lis1 lis2 comparison-func) - (let ((result (list 'a))) - (while lis1 - (or (ediff-member (car lis1) (cdr result) comparison-func) - (nconc result (list (car lis1)))) - (setq lis1 (cdr lis1))) - (while lis2 - (or (ediff-member (car lis2) (cdr result) comparison-func) - (nconc result (list (car lis2)))) - (setq lis2 (cdr lis2))) - (cdr result))) - ;; eliminates duplicates using comparison-func (defun ediff-set-difference (lis1 lis2 comparison-func) (let ((result (list 'a))) @@ -4187,6 +4173,7 @@ Mail anyway? (y or n) ") (define-obsolete-function-alias 'ediff-add-to-history #'add-to-history "27.1") (define-obsolete-function-alias 'ediff-copy-list #'copy-sequence "28.1") +(define-obsolete-function-alias 'ediff-union #'seq-union "28.1") (run-hooks 'ediff-load-hook) commit 0cf0a2b98671671bb7639a17639ef2552b772cbe Author: Stefan Kangas Date: Fri Sep 17 10:35:13 2021 +0200 Add new sequence function 'seq-union' * lisp/emacs-lisp/seq.el (seq-union): New function. * doc/lispref/sequences.texi (Sequence Functions): * lisp/emacs-lisp/shortdoc.el (sequence): Document above new function. * test/lisp/emacs-lisp/seq-tests.el (test-seq-union): New test. diff --git a/doc/lispref/sequences.texi b/doc/lispref/sequences.texi index 20816ce8ca..53d37199bf 100644 --- a/doc/lispref/sequences.texi +++ b/doc/lispref/sequences.texi @@ -953,6 +953,22 @@ contain less elements than @var{n}. @var{n} must be an integer. If @end example @end defun +@defun seq-union sequence1 sequence2 &optional function +@cindex sequences, union of +@cindex union of sequences + This function returns a list of the elements that appear either in +@var{sequence1} or @var{sequence2}. If the optional argument +@var{function} is non-@code{nil}, it is a function of two arguments to +use to compare elements instead of the default @code{equal}. + +@example +@group +(seq-union [1 2 3] [3 5]) +@result{} (1 2 3 5) +@end group +@end example +@end defun + @defun seq-intersection sequence1 sequence2 &optional function @cindex sequences, intersection of @cindex intersection of sequences diff --git a/etc/NEWS b/etc/NEWS index eee6d2592b..b1ad4dd126 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -3855,6 +3855,11 @@ This function is like 'require', but searches 'custom-theme-load-path' instead of 'load-path'. It can be used by Custom themes to load supporting Lisp files when 'require' is unsuitable. ++++ +** New function 'seq-union'. +This function takes two sequences and returns a list of all elements +that appear in either of them. + +++ ** New function 'syntax-class-to-char'. This does almost the opposite of 'string-to-syntax' -- it returns the diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el index f0dc283f57..b7dcde87f4 100644 --- a/lisp/emacs-lisp/seq.el +++ b/lisp/emacs-lisp/seq.el @@ -467,6 +467,17 @@ negative integer or 0, nil is returned." (setq sequence (seq-drop sequence n))) (nreverse result)))) +(cl-defgeneric seq-union (sequence1 sequence2 &optional testfn) + "Return a list of all elements that appear in either SEQUENCE1 or SEQUENCE2. +Equality is defined by TESTFN if non-nil or by `equal' if nil." + (let ((accum (lambda (acc elt) + (if (seq-contains-p acc elt testfn) + acc + (cons elt acc))))) + (seq-reverse + (seq-reduce accum sequence2 + (seq-reduce accum sequence1 '()))))) + ;;;###autoload (cl-defgeneric seq-intersection (sequence1 sequence2 &optional testfn) "Return a list of the elements that appear in both SEQUENCE1 and SEQUENCE2. diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el index adee6be379..3e0d5aef02 100644 --- a/lisp/emacs-lisp/shortdoc.el +++ b/lisp/emacs-lisp/shortdoc.el @@ -809,6 +809,8 @@ There can be any number of :example/:result elements." :eval (seq-remove #'numberp '(1 2 c d 5))) (seq-group-by :eval (seq-group-by #'cl-plusp '(-1 2 3 -4 -5 6))) + (seq-union + :eval (seq-union '(1 2 3) '(3 5))) (seq-difference :eval (seq-difference '(1 2 3) '(2 3 4))) (seq-intersection diff --git a/test/lisp/emacs-lisp/seq-tests.el b/test/lisp/emacs-lisp/seq-tests.el index 44e855e2cf..bf79dd922b 100644 --- a/test/lisp/emacs-lisp/seq-tests.el +++ b/test/lisp/emacs-lisp/seq-tests.el @@ -336,6 +336,38 @@ Evaluate BODY for each created sequence. (should (same-contents-p list vector)) (should (vectorp vector)))) +(ert-deftest test-seq-union () + (let ((v1 '(1 2 3)) + (v2 '(3 5))) + (should (same-contents-p (seq-union v1 v2) + '(1 2 3 5)))) + + (let ((v1 '(1 2 3 4 5 6)) + (v2 '(4 5 6 7 8 9))) + (should (same-contents-p (seq-union v1 v2) + '(1 2 3 4 5 6 7 8 9)))) + + (let ((v1 '(1 2 3 4 5 6)) + (v2 '(4 5 6 7 8 9))) + (should (same-contents-p (seq-union v1 v2) + '(1 2 3 4 5 6 7 8 9)))) + + (let ((v1 [1 2 3 4 5]) + (v2 [4 5 6 "a"])) + (should (same-contents-p (seq-union v1 v2) + '(1 2 3 4 5 6 "a")))) + + (let ((v1 '("a" "b" "c")) + (v2 '("f" "c" "e" "a"))) + (should (same-contents-p (seq-union v1 v2) + '("a" "b" "c" "f" "e")))) + + (let ((v1 '("a")) + (v2 '("a")) + (testfn #'eq)) + (should (same-contents-p (seq-union v1 v2 testfn) + '("a" "a"))))) + (ert-deftest test-seq-intersection () (let ((v1 [2 3 4 5]) (v2 [1 3 5 6 7]))