From d8601684934e8c4b72002c7d84036ca48048187f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sun, 1 Nov 2020 15:01:31 +0100 Subject: [PATCH 01/12] * lisp/emacs-lisp/byte-opt.el (pure-fns): Fix typos. --- lisp/emacs-lisp/byte-opt.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index 1dc83dd3958..56b957384f9 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -1262,7 +1262,7 @@ '(concat regexp-opt regexp-quote string-to-char string-to-syntax symbol-name eq eql - = /= < <= => > min max + = /= < <= >= > min max + - * / % mod abs ash 1+ 1- sqrt logand logior lognot logxor logcount copysign isnan ldexp float logb @@ -1270,7 +1270,7 @@ ffloor fceiling fround ftruncate string= string-equal string< string-lessp string-search - consp atom listp nlistp propert-list-p + consp atom listp nlistp proper-list-p sequencep arrayp vectorp stringp bool-vector-p hash-table-p null not numberp integerp floatp natnump characterp From d85e0df7adaa21e20d44e7bbca62fa91272506bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sun, 1 Nov 2020 15:57:12 +0100 Subject: [PATCH 02/12] Add missing side-effect-free and error-free properties Any function that is pure is also side-effect-free and some are also error-free. Right now these have to be declared separately. * lisp/emacs-lisp/byte-opt.el (side-effect-free-fns): Add bool-vector-count-consecutive, bool-vector-count-population, bool-vector-subsetp, copysign, isnan, lax-plist-get, ldexp, memql, regexp-opt and string-to-syntax. (side-effect-and-error-free-fns): Add type-of. * lisp/subr.el (kbd, string-replace): Declare side-effect-free. --- lisp/emacs-lisp/byte-opt.el | 18 ++++++++++-------- lisp/subr.el | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index 56b957384f9..530a086b14b 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -1147,12 +1147,14 @@ (let ((side-effect-free-fns '(% * + - / /= 1+ 1- < <= = > >= abs acos append aref ash asin atan assq + bool-vector-count-consecutive bool-vector-count-population + bool-vector-subsetp boundp buffer-file-name buffer-local-variables buffer-modified-p buffer-substring byte-code-function-p capitalize car-less-than-car car cdr ceiling char-after char-before char-equal char-to-string char-width compare-strings compare-window-configurations concat coordinates-in-window-p - copy-alist copy-sequence copy-marker cos count-lines + copy-alist copy-sequence copy-marker copysign cos count-lines current-time-string current-time-zone decode-char decode-time default-boundp default-value documentation downcase @@ -1165,22 +1167,22 @@ frame-visible-p fround ftruncate get gethash get-buffer get-buffer-window getenv get-file-buffer hash-table-count - int-to-string intern-soft + int-to-string intern-soft isnan keymap-parent - length line-beginning-position line-end-position + lax-plist-get ldexp length line-beginning-position line-end-position local-variable-if-set-p local-variable-p locale-info log log10 logand logb logcount logior lognot logxor lsh make-byte-code make-list make-string make-symbol marker-buffer max - member memq min minibuffer-selected-window minibuffer-window + member memq memql min minibuffer-selected-window minibuffer-window mod multibyte-char-to-unibyte next-window nth nthcdr number-to-string parse-colon-path plist-get plist-member prefix-numeric-value previous-window prin1-to-string propertize degrees-to-radians - radians-to-degrees rassq rassoc read-from-string regexp-quote - region-beginning region-end reverse round + radians-to-degrees rassq rassoc read-from-string regexp-opt + regexp-quote region-beginning region-end reverse round sin sqrt string string< string= string-equal string-lessp string-search string-to-char - string-to-number substring + string-to-number string-to-syntax substring sxhash sxhash-equal sxhash-eq sxhash-eql symbol-function symbol-name symbol-plist symbol-value string-make-unibyte string-make-multibyte string-as-multibyte string-as-unibyte @@ -1230,7 +1232,7 @@ standard-case-table standard-syntax-table stringp subrp symbolp syntax-table syntax-table-p this-command-keys this-command-keys-vector this-single-command-keys - this-single-command-raw-keys + this-single-command-raw-keys type-of user-real-login-name user-real-uid user-uid vector vectorp visible-frame-list wholenump window-configuration-p window-live-p diff --git a/lisp/subr.el b/lisp/subr.el index b7a746f2db0..286851dfc83 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -896,7 +896,7 @@ This is the same format used for saving keyboard macros (see For an approximate inverse of this, see `key-description'." ;; Don't use a defalias, since the `pure' property is true only for ;; the calling convention of `kbd'. - (declare (pure t)) + (declare (pure t) (side-effect-free t)) ;; A pure function is expected to preserve the match data. (save-match-data (read-kbd-macro keys))) @@ -4446,7 +4446,7 @@ Unless optional argument INPLACE is non-nil, return a new string." (defun string-replace (fromstring tostring instring) "Replace FROMSTRING with TOSTRING in INSTRING each time it occurs." - (declare (pure t)) + (declare (pure t) (side-effect-free t)) (when (equal fromstring "") (signal 'wrong-length-argument fromstring)) (let ((start 0) From 8761c155e43c08428054677c75781e312a728667 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Sun, 1 Nov 2020 09:39:44 -0800 Subject: [PATCH 03/12] * lisp/emacs-lisp/easy-mmode.el (easy-mmode--arg-docstring): Doc typo. --- lisp/emacs-lisp/easy-mmode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el index a5a971a6981..77f10e61c6c 100644 --- a/lisp/emacs-lisp/easy-mmode.el +++ b/lisp/emacs-lisp/easy-mmode.el @@ -88,7 +88,7 @@ If called interactively, toggle `%s'. If the prefix argument is positive, enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if if ARG is `toggle'. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the mode if ARG is nil, omitted, or is a positive number. All other values will disable the mode. From 8ad9932f1163506370ee05a0d7a2f2d5d57c0fd1 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 1 Nov 2020 16:31:12 +0100 Subject: [PATCH 04/12] Don't bind standard-output in substitute-command-keys This fixes a regression with regards to the old C version of substitute-command-keys. * lisp/help.el (substitute-command-keys): Don't bind standard-output. See Bug#39149. * test/lisp/help-tests.el (help-tests--was-in-buffer): New variable. (help-substitute-command-keys/menu-filter-in-correct-buffer): New test. --- lisp/help.el | 3 +-- test/lisp/help-tests.el | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lisp/help.el b/lisp/help.el index 795f7e74d8b..df055d602fe 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -1013,8 +1013,7 @@ Otherwise, return a new string (without any text properties)." (insert string) (goto-char (point-min)) (while (< (point) (point-max)) - (let ((standard-output (current-buffer)) - (orig-point (point)) + (let ((orig-point (point)) end-point active-maps close generate-summary) (cond diff --git a/test/lisp/help-tests.el b/test/lisp/help-tests.el index 079b1114a81..b6dffb2a405 100644 --- a/test/lisp/help-tests.el +++ b/test/lisp/help-tests.el @@ -361,6 +361,26 @@ C-b undefined "))))) +(defvar help-tests--was-in-buffer nil) + +(ert-deftest help-substitute-command-keys/menu-filter-in-correct-buffer () + "Evaluate menu-filter in the original buffer. See Bug#39149." + (unwind-protect + (progn + (define-key global-map (kbd "C-c C-l r") + `(menu-item "2" identity + :filter ,(lambda (cmd) + (setq help-tests--was-in-buffer + (current-buffer)) + cmd))) + (with-temp-buffer + (substitute-command-keys "\\[identity]") + (should (eq help-tests--was-in-buffer + (current-buffer))))) + (setq help-tests--was-in-buffer nil) + (define-key global-map (kbd "C-c C-l r") nil) + (define-key global-map (kbd "C-c C-l") nil))) + (provide 'help-tests) ;;; help-tests.el ends here From 7baf8cae0f54502fc2b21c01e133308b746cd7a0 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 1 Nov 2020 18:52:23 +0100 Subject: [PATCH 05/12] Don't auto-insert "@c file ends here" in .texi files * lisp/autoinsert.el (auto-insert-alist): Don't insert "@c file ends here" at the end of new .texi files. --- lisp/autoinsert.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lisp/autoinsert.el b/lisp/autoinsert.el index 4af3d631a2c..97986683256 100644 --- a/lisp/autoinsert.el +++ b/lisp/autoinsert.el @@ -315,8 +315,7 @@ The document was typeset with @printindex cp @bye - -@c " (file-name-nondirectory (buffer-file-name)) " ends here\n")) +")) "A list specifying text to insert by default into a new file. Elements look like (CONDITION . ACTION) or ((CONDITION . DESCRIPTION) . ACTION). CONDITION may be a regexp that must match the new file's name, or it may be From 43d5b79a6931b169557b5d78f9a7f9be0ab72e77 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 1 Nov 2020 23:20:53 +0200 Subject: [PATCH 06/12] Show nobreak-space face for more blank characters in describe-char. * lisp/descr-text.el (describe-char): Handle more non-ASCII whitespace characters added in f018cffca0098ad1b82c51730a6d6cf146e3c488 (bug#44236) --- lisp/descr-text.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/descr-text.el b/lisp/descr-text.el index ec9a9680137..075cb21c21a 100644 --- a/lisp/descr-text.el +++ b/lisp/descr-text.el @@ -687,7 +687,8 @@ The character information includes: (save-excursion (goto-char pos) (looking-at-p "[ \t]+$"))) 'trailing-whitespace) - ((and nobreak-char-display char (eq char '#xa0)) + ((and nobreak-char-display char + (eq (get-char-code-property char 'general-category) 'Zs)) 'nobreak-space) ((and nobreak-char-display char (memq char '(#xad #x2010 #x2011))) From 1a1019f99fce48c372f8a43c2a9758f5dac9153e Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 1 Nov 2020 23:25:10 +0200 Subject: [PATCH 07/12] * lisp/leim/quail/compose.el: New input method (bug#44267). --- etc/NEWS | 3 + lisp/leim/quail/compose.el | 2926 ++++++++++++++++++++++++++++++++++++ 2 files changed, 2929 insertions(+) create mode 100644 lisp/leim/quail/compose.el diff --git a/etc/NEWS b/etc/NEWS index 59a0f26f269..7bf212dd134 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -132,6 +132,9 @@ Emacs to break lines after more characters than just whitespace characters. In particular, this significantly improves word-wrapping for CJK text mixed with Latin text. +--- +** New input method 'compose' based on X Multi_key sequences. + --- ** Improved language transliteration in Malayalam input methods. Added a new Mozhi scheme. The inapplicable ITRANS scheme is now diff --git a/lisp/leim/quail/compose.el b/lisp/leim/quail/compose.el new file mode 100644 index 00000000000..eb37a42199b --- /dev/null +++ b/lisp/leim/quail/compose.el @@ -0,0 +1,2926 @@ +;;; compose.el --- Quail package for Multi_key character composition -*-coding: utf-8;-*- + +;; Copyright (C) 2020 Free Software Foundation, Inc. + +;; Author: Juri Linkov +;; Keywords: multilingual, input method, i18n + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; This input method supports the same key sequences as defined by the +;; standard X Multi_key: https://en.wikipedia.org/wiki/Compose_key + +;; You can enable this input method transiently with `C-u C-x \ compose RET'. +;; Then typing `C-x \' will enable this input method temporarily, and +;; after typing a key sequence it will be disabled. So typing +;; e.g. `C-x \ E =' will insert the Euro sign character, and disable +;; this input method automatically afterwards. + +;;; Code: + +(require 'quail) + +(quail-define-package + "compose" "UTF-8" "+" t + "Compose-like input method with the same key sequences as X Multi_key. +Examples: + E = -> € 1 2 -> ½ ^ 3 -> ³" + '(("\t" . quail-completion)) + t nil nil nil nil nil nil nil nil t) + +(quail-define-rules + ("''" ?´) + ("-^" ?¯) + ("^-" ?¯) + ("__" ?¯) + ("_^" ?¯) + (" (" ?˘) + ("( " ?˘) + ("\"\"" ?¨) + (" <" ?ˇ) + ("< " ?ˇ) + ("-- " ?­) + ("++" ?#) + ("' " ?\') + (" '" ?\') + ("AT" ?@) + ("((" ?\[) + ("//" ["\\\\"]) + ("/<" ["\\\\"]) + (" " ?^) + (" >" ?^) + ("` " ?`) + (" `" ?`) + (", " ?¸) + (" ," ?¸) + (",," ?¸) + ("(-" ?\{) + ("-(" ?\{) + ("/^" ?|) + ("^/" ?|) + ("VL" ?|) + ("LV" ?|) + ("vl" ?|) + ("lv" ?|) + (")-" ?\}) + ("-)" ?\}) + ("~ " ?~) + (" ~" ?~) + ("- " ?~) + (" -" ?~) + (" " ? ) + (" ." ? ) + ("oc" ?©) + ("oC" ?©) + ("Oc" ?©) + ("OC" ?©) + ("Co" ?©) + ("CO" ?©) + ("or" ?®) + ("oR" ?®) + ("Or" ?®) + ("OR" ?®) + ("Ro" ?®) + ("RO" ?®) + (".>" ?›) + (".<" ?‹) + (".." ?…) + (".-" ?·) + (".^" ?·) + ("^." ?·) + (".=" ?•) + ("!^" ?¦) + ("!!" ?¡) + ("p!" ?¶) + ("P!" ?¶) + ("+-" ?±) + ("-+" ?±) + ("??" ?¿) + ("ss" ?ß) + ("SS" ?ẞ) + ("oe" ?œ) + ("OE" ?Œ) + ("ae" ?æ) + ("AE" ?Æ) + ("ff" ?ff) + ("fi" ?fi) + ("fl" ?fl) + ("Fi" ?ffi) + ("Fl" ?ffl) + ("IJ" ?IJ) + ("Ij" ?IJ) + ("ij" ?ij) + ("oo" ?°) + ("*0" ?°) + ("0*" ?°) + ("<<" ?«) + (">>" ?») + ("<'" ?‘) + ("'<" ?‘) + (">'" ?’) + ("'>" ?’) + (",'" ?‚) + ("'," ?‚) + ("<\"" ?“) + ("\"<" ?“) + (">\"" ?”) + ("\">" ?”) + (",\"" ?„) + ("\"," ?„) + ("%o" ?‰) + ("CE" ?₠) + ("C/" ?₡) + ("/C" ?₡) + ("Cr" ?₢) + ("Fr" ?₣) + ("L=" ?₤) + ("=L" ?₤) + ("m/" ?₥) + ("/m" ?₥) + ("N=" ?₦) + ("=N" ?₦) + ("Pt" ?₧) + ("Rs" ?₨) + ("W=" ?₩) + ("=W" ?₩) + ("d=" ?₫) + ("=d" ?₫) + ("C=" ?€) + ("=C" ?€) + ("c=" ?€) + ("=c" ?€) + ("E=" ?€) + ("=E" ?€) + ("e=" ?€) + ("=e" ?€) + ("С=" ?€) + ("=С" ?€) + ("Е=" ?€) + ("=Е" ?€) + ("P=" ?₽) + ("p=" ?₽) + ("=P" ?₽) + ("=p" ?₽) + ("З=" ?₽) + ("з=" ?₽) + ("=З" ?₽) + ("=з" ?₽) + ("R=" ?₹) + ("=R" ?₹) + ("r=" ?₹) + ("=r" ?₹) + ("C|" ?¢) + ("|C" ?¢) + ("c|" ?¢) + ("|c" ?¢) + ("c/" ?¢) + ("/c" ?¢) + ("L-" ?£) + ("-L" ?£) + ("l-" ?£) + ("-l" ?£) + ("Y=" ?¥) + ("=Y" ?¥) + ("y=" ?¥) + ("=y" ?¥) + ("Y-" ?¥) + ("-Y" ?¥) + ("y-" ?¥) + ("-y" ?¥) + ("fs" ?ſ) + ("fS" ?ſ) + ("--." ?–) + ("---" ?—) + ("#q" ?♩) + ("#e" ?♪) + ("#E" ?♫) + ("#S" ?♬) + ("#b" ?♭) + ("#f" ?♮) + ("##" ?♯) + ("so" ?§) + ("os" ?§) + ("SO" ?§) + ("OS" ?§) + ("s!" ?§) + ("S!" ?§) + ("па" ?§) + ("ox" ?¤) + ("xo" ?¤) + ("oX" ?¤) + ("Xo" ?¤) + ("OX" ?¤) + ("XO" ?¤) + ("Ox" ?¤) + ("xO" ?¤) + ("PP" ?¶) + ("No" ?№) + ("NO" ?№) + ("Но" ?№) + ("НО" ?№) + ("?!" ?⸘) + ("!?" ?‽) + ("CCCP" ?☭) + ("OA" ?Ⓐ) + ("<3" ?♥) + (":)" ?☺) + (":(" ?☹) + ("\\o/" ?🙌) + ("poo" ?💩) + ("FU" ?🖕) + ("LLAP" ?🖖) + ("ᄀᄀ" ?ᄁ) + ("ᄃᄃ" ?ᄄ) + ("ᄇᄇ" ?ᄈ) + ("ᄉᄉ" ?ᄊ) + ("ᄌᄌ" ?ᄍ) + ("ᄂᄀ" ?ᄓ) + ("ᄂᄂ" ?ᄔ) + ("ᄂᄃ" ?ᄕ) + ("ᄂᄇ" ?ᄖ) + ("ᄃᄀ" ?ᄗ) + ("ᄅᄂ" ?ᄘ) + ("ᄅᄅ" ?ᄙ) + ("ᄅᄒ" ?ᄚ) + ("ᄅᄋ" ?ᄛ) + ("ᄆᄇ" ?ᄜ) + ("ᄆᄋ" ?ᄝ) + ("ᄇᄀ" ?ᄞ) + ("ᄇᄂ" ?ᄟ) + ("ᄇᄃ" ?ᄠ) + ("ᄇᄉ" ?ᄡ) + ("ᄇᄌ" ?ᄧ) + ("ᄇᄎ" ?ᄨ) + ("ᄇᄐ" ?ᄩ) + ("ᄇᄑ" ?ᄪ) + ("ᄇᄋ" ?ᄫ) + ("ᄉᄀ" ?ᄭ) + ("ᄉᄂ" ?ᄮ) + ("ᄉᄃ" ?ᄯ) + ("ᄉᄅ" ?ᄰ) + ("ᄉᄆ" ?ᄱ) + ("ᄉᄇ" ?ᄲ) + ("ᄉᄋ" ?ᄵ) + ("ᄉᄌ" ?ᄶ) + ("ᄉᄎ" ?ᄷ) + ("ᄉᄏ" ?ᄸ) + ("ᄉᄐ" ?ᄹ) + ("ᄉᄑ" ?ᄺ) + ("ᄉᄒ" ?ᄻ) + ("ᄼᄼ" ?ᄽ) + ("ᄾᄾ" ?ᄿ) + ("ᄋᄀ" ?ᅁ) + ("ᄋᄃ" ?ᅂ) + ("ᄋᄆ" ?ᅃ) + ("ᄋᄇ" ?ᅄ) + ("ᄋᄉ" ?ᅅ) + ("ᄋᅀ" ?ᅆ) + ("ᄋᄋ" ?ᅇ) + ("ᄋᄌ" ?ᅈ) + ("ᄋᄎ" ?ᅉ) + ("ᄋᄐ" ?ᅊ) + ("ᄋᄑ" ?ᅋ) + ("ᄌᄋ" ?ᅍ) + ("ᅎᅎ" ?ᅏ) + ("ᅐᅐ" ?ᅑ) + ("ᄎᄏ" ?ᅒ) + ("ᄎᄒ" ?ᅓ) + ("ᄑᄇ" ?ᅖ) + ("ᄑᄋ" ?ᅗ) + ("ᄒᄒ" ?ᅘ) + ("ᅡᅵ" ?ᅢ) + ("ᅣᅵ" ?ᅤ) + ("ᅥᅵ" ?ᅦ) + ("ᅧᅵ" ?ᅨ) + ("ᅩᅡ" ?ᅪ) + ("ᅩᅵ" ?ᅬ) + ("ᅮᅥ" ?ᅯ) + ("ᅮᅵ" ?ᅱ) + ("ᅳᅵ" ?ᅴ) + ("ᅡᅩ" ?ᅶ) + ("ᅡᅮ" ?ᅷ) + ("ᅣᅩ" ?ᅸ) + ("ᅣᅭ" ?ᅹ) + ("ᅥᅩ" ?ᅺ) + ("ᅥᅮ" ?ᅻ) + ("ᅥᅳ" ?ᅼ) + ("ᅧᅩ" ?ᅽ) + ("ᅧᅮ" ?ᅾ) + ("ᅩᅥ" ?ᅿ) + ("ᅩᅦ" ?ᆀ) + ("ᅩᅨ" ?ᆁ) + ("ᅩᅩ" ?ᆂ) + ("ᅩᅮ" ?ᆃ) + ("ᅭᅣ" ?ᆄ) + ("ᅭᅤ" ?ᆅ) + ("ᅭᅧ" ?ᆆ) + ("ᅭᅩ" ?ᆇ) + ("ᅭᅵ" ?ᆈ) + ("ᅮᅡ" ?ᆉ) + ("ᅮᅢ" ?ᆊ) + ("ᅮᅨ" ?ᆌ) + ("ᅮᅮ" ?ᆍ) + ("ᅲᅡ" ?ᆎ) + ("ᅲᅥ" ?ᆏ) + ("ᅲᅦ" ?ᆐ) + ("ᅲᅧ" ?ᆑ) + ("ᅲᅨ" ?ᆒ) + ("ᅲᅮ" ?ᆓ) + ("ᅲᅵ" ?ᆔ) + ("ᅳᅮ" ?ᆕ) + ("ᅳᅳ" ?ᆖ) + ("ᅴᅮ" ?ᆗ) + ("ᅵᅡ" ?ᆘ) + ("ᅵᅣ" ?ᆙ) + ("ᅵᅩ" ?ᆚ) + ("ᅵᅮ" ?ᆛ) + ("ᅵᅳ" ?ᆜ) + ("ᅵᆞ" ?ᆝ) + ("ᆞᅥ" ?ᆟ) + ("ᆞᅮ" ?ᆠ) + ("ᆞᅵ" ?ᆡ) + ("ᆞᆞ" ?ᆢ) + ("ᆨᆨ" ?ᆩ) + ("ᆨᆺ" ?ᆪ) + ("ᆫᆽ" ?ᆬ) + ("ᆫᇂ" ?ᆭ) + ("ᆯᆨ" ?ᆰ) + ("ᆯᆷ" ?ᆱ) + ("ᆯᆸ" ?ᆲ) + ("ᆯᆺ" ?ᆳ) + ("ᆯᇀ" ?ᆴ) + ("ᆯᇁ" ?ᆵ) + ("ᆯᇂ" ?ᆶ) + ("ᆸᆺ" ?ᆹ) + ("ᆺᆺ" ?ᆻ) + ("ᆨᆯ" ?ᇃ) + ("ᆫᆨ" ?ᇅ) + ("ᆫᆮ" ?ᇆ) + ("ᆫᆺ" ?ᇇ) + ("ᆫᇫ" ?ᇈ) + ("ᆫᇀ" ?ᇉ) + ("ᆮᆨ" ?ᇊ) + ("ᆮᆯ" ?ᇋ) + ("ᆯᆫ" ?ᇍ) + ("ᆯᆮ" ?ᇎ) + ("ᆯᆯ" ?ᇐ) + ("ᆯᇫ" ?ᇗ) + ("ᆯᆿ" ?ᇘ) + ("ᆯᇹ" ?ᇙ) + ("ᆷᆨ" ?ᇚ) + ("ᆷᆯ" ?ᇛ) + ("ᆷᆸ" ?ᇜ) + ("ᆷᆺ" ?ᇝ) + ("ᆷᇫ" ?ᇟ) + ("ᆷᆾ" ?ᇠ) + ("ᆷᇂ" ?ᇡ) + ("ᆷᆼ" ?ᇢ) + ("ᆸᆯ" ?ᇣ) + ("ᆸᇁ" ?ᇤ) + ("ᆸᇂ" ?ᇥ) + ("ᆸᆼ" ?ᇦ) + ("ᆺᆨ" ?ᇧ) + ("ᆺᆮ" ?ᇨ) + ("ᆺᆯ" ?ᇩ) + ("ᆺᆸ" ?ᇪ) + ("ᆼᆨ" ?ᇬ) + ("ᆼᆼ" ?ᇮ) + ("ᆼᆿ" ?ᇯ) + ("ᇰᆺ" ?ᇱ) + ("ᇰᇫ" ?ᇲ) + ("ᇁᆸ" ?ᇳ) + ("ᇁᆼ" ?ᇴ) + ("ᇂᆫ" ?ᇵ) + ("ᇂᆯ" ?ᇶ) + ("ᇂᆷ" ?ᇷ) + ("ᇂᆸ" ?ᇸ) + ("ᄡᄀ" ?ᄢ) + ("ᄡᄃ" ?ᄣ) + ("ᄡᄇ" ?ᄤ) + ("ᄡᄉ" ?ᄥ) + ("ᄡᄌ" ?ᄦ) + ("ᄈᄋ" ?ᄬ) + ("ᄲᄀ" ?ᄳ) + ("ᄊᄉ" ?ᄴ) + ("ᅪᅵ" ?ᅫ) + ("ᅯᅵ" ?ᅰ) + ("ᅯᅳ" ?ᆋ) + ("ᆪᆨ" ?ᇄ) + ("ᆰᆺ" ?ᇌ) + ("ᇎᇂ" ?ᇏ) + ("ᆱᆨ" ?ᇑ) + ("ᆱᆺ" ?ᇒ) + ("ᆲᆺ" ?ᇓ) + ("ᆲᇂ" ?ᇔ) + ("ᆲᆼ" ?ᇕ) + ("ᆳᆺ" ?ᇖ) + ("ᇝᆺ" ?ᇞ) + ("ᇬᆨ" ?ᇭ) + ("ᄇᄭ" ?ᄢ) + ("ᄇᄯ" ?ᄣ) + ("ᄇᄲ" ?ᄤ) + ("ᄇᄊ" ?ᄥ) + ("ᄇᄶ" ?ᄦ) + ("ᄇᄫ" ?ᄬ) + ("ᄉᄞ" ?ᄳ) + ("ᄉᄊ" ?ᄴ) + ("ᅩᅢ" ?ᅫ) + ("ᅮᅦ" ?ᅰ) + ("ᅮᅼ" ?ᆋ) + ("ᆨᇧ" ?ᇄ) + ("ᆯᆪ" ?ᇌ) + ("ᆯᇚ" ?ᇑ) + ("ᆯᇝ" ?ᇒ) + ("ᆯᆹ" ?ᇓ) + ("ᆯᇥ" ?ᇔ) + ("ᆯᇦ" ?ᇕ) + ("ᆯᆻ" ?ᇖ) + ("ᆷᆻ" ?ᇞ) + ("ᆼᆩ" ?ᇭ) + (",-" ?¬) + ("-," ?¬) + ("^_a" ?ª) + ("^_a" ?ª) + ("^2" ?²) + ("2^" ?²) + ("^3" ?³) + ("3^" ?³) + ("mu" ?µ) + ("/u" ?µ) + ("u/" ?µ) + ("^1" ?¹) + ("1^" ?¹) + ("^_o" ?º) + ("^_o" ?º) + ("14" ?¼) + ("12" ?½) + ("34" ?¾) + ("`A" ?À) + ("A`" ?À) + ("´A" ?Á) + ("A´" ?Á) + ("'A" ?Á) + ("A'" ?Á) + ("^A" ?Â) + ("A^" ?Â) + (">A" ?Â) + ("A>" ?Â) + ("~A" ?Ã) + ("A~" ?Ã) + ("\"A" ?Ä) + ("A\"" ?Ä) + ("¨A" ?Ä) + ("A¨" ?Ä) + ("oA" ?Å) + ("*A" ?Å) + ("A*" ?Å) + ("AA" ?Å) + (",C" ?Ç) + ("C," ?Ç) + ("¸C" ?Ç) + ("`E" ?È) + ("E`" ?È) + ("´E" ?É) + ("E´" ?É) + ("'E" ?É) + ("E'" ?É) + ("^E" ?Ê) + ("E^" ?Ê) + (">E" ?Ê) + ("E>" ?Ê) + ("\"E" ?Ë) + ("E\"" ?Ë) + ("¨E" ?Ë) + ("E¨" ?Ë) + ("`I" ?Ì) + ("I`" ?Ì) + ("´I" ?Í) + ("I´" ?Í) + ("'I" ?Í) + ("I'" ?Í) + ("^I" ?Î) + ("I^" ?Î) + (">I" ?Î) + ("I>" ?Î) + ("\"I" ?Ï) + ("I\"" ?Ï) + ("¨I" ?Ï) + ("I¨" ?Ï) + ("'J" ["J́"]) + ("J'" ["J́"]) + ("´J" ["J́"]) + ("J´" ["J́"]) + ("DH" ?Ð) + ("~N" ?Ñ) + ("N~" ?Ñ) + ("`O" ?Ò) + ("O`" ?Ò) + ("´O" ?Ó) + ("O´" ?Ó) + ("'O" ?Ó) + ("O'" ?Ó) + ("^O" ?Ô) + ("O^" ?Ô) + (">O" ?Ô) + ("O>" ?Ô) + ("~O" ?Õ) + ("O~" ?Õ) + ("\"O" ?Ö) + ("O\"" ?Ö) + ("¨O" ?Ö) + ("O¨" ?Ö) + ("xx" ?×) + ("/O" ?Ø) + ("O/" ?Ø) + ("`U" ?Ù) + ("U`" ?Ù) + ("´U" ?Ú) + ("U´" ?Ú) + ("'U" ?Ú) + ("U'" ?Ú) + ("^U" ?Û) + ("U^" ?Û) + (">U" ?Û) + ("U>" ?Û) + ("\"U" ?Ü) + ("U\"" ?Ü) + ("¨U" ?Ü) + ("U¨" ?Ü) + ("´Y" ?Ý) + ("Y´" ?Ý) + ("'Y" ?Ý) + ("Y'" ?Ý) + ("TH" ?Þ) + ("`a" ?à) + ("a`" ?à) + ("´a" ?á) + ("a´" ?á) + ("'a" ?á) + ("a'" ?á) + ("^a" ?â) + ("a^" ?â) + (">a" ?â) + ("a>" ?â) + ("~a" ?ã) + ("a~" ?ã) + ("\"a" ?ä) + ("a\"" ?ä) + ("¨a" ?ä) + ("a¨" ?ä) + ("oa" ?å) + ("*a" ?å) + ("a*" ?å) + ("aa" ?å) + (",c" ?ç) + ("c," ?ç) + ("¸c" ?ç) + ("`e" ?è) + ("e`" ?è) + ("´e" ?é) + ("e´" ?é) + ("'e" ?é) + ("e'" ?é) + ("^e" ?ê) + ("e^" ?ê) + (">e" ?ê) + ("e>" ?ê) + ("\"e" ?ë) + ("e\"" ?ë) + ("¨e" ?ë) + ("e¨" ?ë) + ("`i" ?ì) + ("i`" ?ì) + ("´i" ?í) + ("i´" ?í) + ("'i" ?í) + ("i'" ?í) + ("^i" ?î) + ("i^" ?î) + (">i" ?î) + ("i>" ?î) + ("\"i" ?ï) + ("i\"" ?ï) + ("¨i" ?ï) + ("i¨" ?ï) + ("'j" ["j́"]) + ("j'" ["j́"]) + ("´j" ["j́"]) + ("j´" ["j́"]) + ("dh" ?ð) + ("~n" ?ñ) + ("n~" ?ñ) + ("`o" ?ò) + ("o`" ?ò) + ("´o" ?ó) + ("o´" ?ó) + ("'o" ?ó) + ("o'" ?ó) + ("^o" ?ô) + ("o^" ?ô) + (">o" ?ô) + ("o>" ?ô) + ("~o" ?õ) + ("o~" ?õ) + ("o¨" ?ö) + ("¨o" ?ö) + ("\"o" ?ö) + ("o\"" ?ö) + (":-" ?÷) + ("-:" ?÷) + ("/o" ?ø) + ("o/" ?ø) + ("`u" ?ù) + ("u`" ?ù) + ("´u" ?ú) + ("u´" ?ú) + ("'u" ?ú) + ("u'" ?ú) + ("^u" ?û) + ("u^" ?û) + (">u" ?û) + ("u>" ?û) + ("\"u" ?ü) + ("u\"" ?ü) + ("¨u" ?ü) + ("u¨" ?ü) + ("´y" ?ý) + ("y´" ?ý) + ("'y" ?ý) + ("y'" ?ý) + ("th" ?þ) + ("\"y" ?ÿ) + ("y\"" ?ÿ) + ("¨y" ?ÿ) + ("y¨" ?ÿ) + ("¯A" ?Ā) + ("_A" ?Ā) + ("A_" ?Ā) + ("-A" ?Ā) + ("A-" ?Ā) + ("¯a" ?ā) + ("_a" ?ā) + ("a_" ?ā) + ("-a" ?ā) + ("a-" ?ā) + ("UA" ?Ă) + ("uA" ?Ă) + ("bA" ?Ă) + ("A(" ?Ă) + ("Ua" ?ă) + ("ua" ?ă) + ("ba" ?ă) + ("a(" ?ă) + (";A" ?Ą) + ("A;" ?Ą) + (",A" ?Ą) + ("A," ?Ą) + (";a" ?ą) + ("a;" ?ą) + (",a" ?ą) + ("a," ?ą) + ("´C" ?Ć) + ("'C" ?Ć) + ("C'" ?Ć) + ("´c" ?ć) + ("'c" ?ć) + ("c'" ?ć) + ("^C" ?Ĉ) + ("^c" ?ĉ) + (".C" ?Ċ) + ("C." ?Ċ) + (".c" ?ċ) + ("c." ?ċ) + ("cC" ?Č) + ("" ?→) + ("=>" ?⇒) + ("∄" ?∄) + ("{}" ?∅) + ("∉" ?∉) + ("∌" ?∌) + ("∤" ?∤) + ("∦" ?∦) + ("≁" ?≁) + ("≄" ?≄) + ("≁" ?≇) + ("≉" ?≉) + ("/=" ?≠) + ("=/" ?≠) + ("≠" ?≠) + ("≢" ?≢) + ("<=" ?≤) + (">=" ?≥) + ("≭" ?≭) + ("≮" ?≮) + ("≮" ?≮) + ("≯" ?≯) + ("≯" ?≯) + ("≰" ?≰) + ("≱" ?≱) + ("≴" ?≴) + ("≵" ?≵) + ("≸" ?≸) + ("≹" ?≹) + ("⊀" ?⊀) + ("⊁" ?⊁) + ("⊄" ?⊄) + ("⊄" ?⊄) + ("⊅" ?⊅) + ("⊅" ?⊅) + ("⊈" ?⊈) + ("⊉" ?⊉) + ("⊬" ?⊬) + ("⊭" ?⊭) + ("⊮" ?⊮) + ("⊯" ?⊯) + ("⋠" ?⋠) + ("⋡" ?⋡) + ("⋢" ?⋢) + ("⋣" ?⋣) + ("⋪" ?⋪) + ("⋫" ?⋫) + ("⋬" ?⋬) + ("⋭" ?⋭) + ("di" ?⌀) + ("(1)" ?①) + ("(2)" ?②) + ("(3)" ?③) + ("(4)" ?④) + ("(5)" ?⑤) + ("(6)" ?⑥) + ("(7)" ?⑦) + ("(8)" ?⑧) + ("(9)" ?⑨) + ("(10)" ?⑩) + ("(11)" ?⑪) + ("(12)" ?⑫) + ("(13)" ?⑬) + ("(14)" ?⑭) + ("(15)" ?⑮) + ("(16)" ?⑯) + ("(17)" ?⑰) + ("(18)" ?⑱) + ("(19)" ?⑲) + ("(20)" ?⑳) + ("(A)" ?Ⓐ) + ("(B)" ?Ⓑ) + ("(C)" ?Ⓒ) + ("(D)" ?Ⓓ) + ("(E)" ?Ⓔ) + ("(F)" ?Ⓕ) + ("(G)" ?Ⓖ) + ("(H)" ?Ⓗ) + ("(I)" ?Ⓘ) + ("(J)" ?Ⓙ) + ("(K)" ?Ⓚ) + ("(L)" ?Ⓛ) + ("(M)" ?Ⓜ) + ("(N)" ?Ⓝ) + ("(O)" ?Ⓞ) + ("(P)" ?Ⓟ) + ("(Q)" ?Ⓠ) + ("(R)" ?Ⓡ) + ("(S)" ?Ⓢ) + ("(T)" ?Ⓣ) + ("(U)" ?Ⓤ) + ("(V)" ?Ⓥ) + ("(W)" ?Ⓦ) + ("(X)" ?Ⓧ) + ("(Y)" ?Ⓨ) + ("(Z)" ?Ⓩ) + ("(a)" ?ⓐ) + ("(b)" ?ⓑ) + ("(c)" ?ⓒ) + ("(d)" ?ⓓ) + ("(e)" ?ⓔ) + ("(f)" ?ⓕ) + ("(g)" ?ⓖ) + ("(h)" ?ⓗ) + ("(i)" ?ⓘ) + ("(j)" ?ⓙ) + ("(k)" ?ⓚ) + ("(l)" ?ⓛ) + ("(m)" ?ⓜ) + ("(n)" ?ⓝ) + ("(o)" ?ⓞ) + ("(p)" ?ⓟ) + ("(q)" ?ⓠ) + ("(r)" ?ⓡ) + ("(s)" ?ⓢ) + ("(t)" ?ⓣ) + ("(u)" ?ⓤ) + ("(v)" ?ⓥ) + ("(w)" ?ⓦ) + ("(x)" ?ⓧ) + ("(y)" ?ⓨ) + ("(z)" ?ⓩ) + ("(0)" ?⓪) + ("⫝̸" ?⫝̸) + ("^一" ?㆒) + ("^二" ?㆓) + ("^三" ?㆔) + ("^四" ?㆕) + ("^上" ?㆖) + ("^中" ?㆗) + ("^下" ?㆘) + ("^甲" ?㆙) + ("^乙" ?㆚) + ("^丙" ?㆛) + ("^丁" ?㆜) + ("^天" ?㆝) + ("^地" ?㆞) + ("^人" ?㆟) + ("(21)" ?㉑) + ("(22)" ?㉒) + ("(23)" ?㉓) + ("(24)" ?㉔) + ("(25)" ?㉕) + ("(26)" ?㉖) + ("(27)" ?㉗) + ("(28)" ?㉘) + ("(29)" ?㉙) + ("(30)" ?㉚) + ("(31)" ?㉛) + ("(32)" ?㉜) + ("(33)" ?㉝) + ("(34)" ?㉞) + ("(35)" ?㉟) + ("(ᄀ)" ?㉠) + ("(ᄂ)" ?㉡) + ("(ᄃ)" ?㉢) + ("(ᄅ)" ?㉣) + ("(ᄆ)" ?㉤) + ("(ᄇ)" ?㉥) + ("(ᄉ)" ?㉦) + ("(ᄋ)" ?㉧) + ("(ᄌ)" ?㉨) + ("(ᄎ)" ?㉩) + ("(ᄏ)" ?㉪) + ("(ᄐ)" ?㉫) + ("(ᄑ)" ?㉬) + ("(ᄒ)" ?㉭) + ("(가)" ?㉮) + ("(나)" ?㉯) + ("(다)" ?㉰) + ("(라)" ?㉱) + ("(마)" ?㉲) + ("(바)" ?㉳) + ("(사)" ?㉴) + ("(아)" ?㉵) + ("(자)" ?㉶) + ("(차)" ?㉷) + ("(카)" ?㉸) + ("(타)" ?㉹) + ("(파)" ?㉺) + ("(하)" ?㉻) + ("(一)" ?㊀) + ("(二)" ?㊁) + ("(三)" ?㊂) + ("(四)" ?㊃) + ("(五)" ?㊄) + ("(六)" ?㊅) + ("(七)" ?㊆) + ("(八)" ?㊇) + ("(九)" ?㊈) + ("(十)" ?㊉) + ("(月)" ?㊊) + ("(火)" ?㊋) + ("(水)" ?㊌) + ("(木)" ?㊍) + ("(金)" ?㊎) + ("(土)" ?㊏) + ("(日)" ?㊐) + ("(株)" ?㊑) + ("(有)" ?㊒) + ("(社)" ?㊓) + ("(名)" ?㊔) + ("(特)" ?㊕) + ("(財)" ?㊖) + ("(祝)" ?㊗) + ("(労)" ?㊘) + ("(秘)" ?㊙) + ("(男)" ?㊚) + ("(女)" ?㊛) + ("(適)" ?㊜) + ("(優)" ?㊝) + ("(印)" ?㊞) + ("(注)" ?㊟) + ("(項)" ?㊠) + ("(休)" ?㊡) + ("(写)" ?㊢) + ("(正)" ?㊣) + ("(上)" ?㊤) + ("(中)" ?㊥) + ("(下)" ?㊦) + ("(左)" ?㊧) + ("(右)" ?㊨) + ("(医)" ?㊩) + ("(宗)" ?㊪) + ("(学)" ?㊫) + ("(監)" ?㊬) + ("(企)" ?㊭) + ("(資)" ?㊮) + ("(協)" ?㊯) + ("(夜)" ?㊰) + ("(36)" ?㊱) + ("(37)" ?㊲) + ("(38)" ?㊳) + ("(39)" ?㊴) + ("(40)" ?㊵) + ("(41)" ?㊶) + ("(42)" ?㊷) + ("(43)" ?㊸) + ("(44)" ?㊹) + ("(45)" ?㊺) + ("(46)" ?㊻) + ("(47)" ?㊼) + ("(48)" ?㊽) + ("(49)" ?㊾) + ("(50)" ?㊿) + ("(ア)" ?㋐) + ("(イ)" ?㋑) + ("(ウ)" ?㋒) + ("(エ)" ?㋓) + ("(オ)" ?㋔) + ("(カ)" ?㋕) + ("(キ)" ?㋖) + ("(ク)" ?㋗) + ("(ケ)" ?㋘) + ("(コ)" ?㋙) + ("(サ)" ?㋚) + ("(シ)" ?㋛) + ("(ス)" ?㋜) + ("(セ)" ?㋝) + ("(ソ)" ?㋞) + ("(タ)" ?㋟) + ("(チ)" ?㋠) + ("(ツ)" ?㋡) + ("(テ)" ?㋢) + ("(ト)" ?㋣) + ("(ナ)" ?㋤) + ("(ニ)" ?㋥) + ("(ヌ)" ?㋦) + ("(ネ)" ?㋧) + ("(ノ)" ?㋨) + ("(ハ)" ?㋩) + ("(ヒ)" ?㋪) + ("(フ)" ?㋫) + ("(ヘ)" ?㋬) + ("(ホ)" ?㋭) + ("(マ)" ?㋮) + ("(ミ)" ?㋯) + ("(ム)" ?㋰) + ("(メ)" ?㋱) + ("(モ)" ?㋲) + ("(ヤ)" ?㋳) + ("(ユ)" ?㋴) + ("(ヨ)" ?㋵) + ("(ラ)" ?㋶) + ("(リ)" ?㋷) + ("(ル)" ?㋸) + ("(レ)" ?㋹) + ("(ロ)" ?㋺) + ("(ワ)" ?㋻) + ("(ヰ)" ?㋼) + ("(ヱ)" ?㋽) + ("(ヲ)" ?㋾) + ("ִי" ?יִ) + ("ַײ" ?ײַ) + ("ׁש" ?שׁ) + ("ׂש" ?שׂ) + ("ׁשּ" ?שּׁ) + ("ּׁש" ?שּׁ) + ("ׂשּ" ?שּׂ) + ("ּׂש" ?שּׂ) + ("ַא" ?אַ) + ("ָא" ?אָ) + ("ּא" ?אּ) + ("ּב" ?בּ) + ("ּג" ?גּ) + ("ּד" ?דּ) + ("ּה" ?הּ) + ("ּו" ?וּ) + ("ּז" ?זּ) + ("ּט" ?טּ) + ("ּי" ?יּ) + ("ּך" ?ךּ) + ("ּכ" ?כּ) + ("ּל" ?לּ) + ("ּמ" ?מּ) + ("ּנ" ?נּ) + ("ּס" ?סּ) + ("ּף" ?ףּ) + ("ּפ" ?פּ) + ("ּצ" ?צּ) + ("ּק" ?קּ) + ("ּר" ?רּ) + ("ּש" ?שּ) + ("ּת" ?תּ) + ("ֹו" ?וֹ) + ("ֿב" ?בֿ) + ("ֿכ" ?כֿ) + ("ֿפ" ?פֿ) + ("𝅗𝅥" ?𝅗𝅥) + ("𝅘𝅥" ?𝅘𝅥) + ("𝅘𝅥𝅮" ?𝅘𝅥𝅮) + ("𝅘𝅥𝅯" ?𝅘𝅥𝅯) + ("𝅘𝅥𝅰" ?𝅘𝅥𝅰) + ("𝅘𝅥𝅱" ?𝅘𝅥𝅱) + ("𝅘𝅥𝅲" ?𝅘𝅥𝅲) + ("𝆹𝅥" ?𝆹𝅥) + ("𝆺𝅥" ?𝆺𝅥) + ("𝆹𝅥𝅮" ?𝆹𝅥𝅮) + ("𝆺𝅥𝅮" ?𝆺𝅥𝅮) + ("𝆹𝅥𝅯" ?𝆹𝅥𝅯) + ("𝆺𝅥𝅯" ?𝆺𝅥𝅯) + (";S" ?Ș) + ("S;" ?Ș) + (";s" ?ș) + ("s;" ?ș) + (";T" ?Ț) + ("T;" ?Ț) + (";t" ?ț) + ("t;" ?ț) + ("``а" ["а̏"]) + ("`а" ["а̀"]) + ("´а" ["а́"]) + ("'а" ["а́"]) + ("¯а" ["а̄"]) + ("_а" ["а̄"]) + ("^а" ["а̂"]) + ("``А" ["А̏"]) + ("`А" ["А̀"]) + ("´А" ["А́"]) + ("'А" ["А́"]) + ("¯А" ["А̄"]) + ("_А" ["А̄"]) + ("^А" ["А̂"]) + ("``е" ["е̏"]) + ("´е" ["е́"]) + ("'е" ["е́"]) + ("¯е" ["е̄"]) + ("_е" ["е̄"]) + ("^е" ["е̂"]) + ("``Е" ["Е̏"]) + ("´Е" ["Е́"]) + ("'Е" ["Е́"]) + ("¯Е" ["Е̄"]) + ("_Е" ["Е̄"]) + ("^Е" ["Е̂"]) + ("``и" ["и̏"]) + ("´и" ["и́"]) + ("'и" ["и́"]) + ("^и" ["и̂"]) + ("``И" ["И̏"]) + ("´И" ["И́"]) + ("'И" ["И́"]) + ("^И" ["И̂"]) + ("``о" ["о̏"]) + ("`о" ["о̀"]) + ("´о" ["о́"]) + ("'о" ["о́"]) + ("¯о" ["о̄"]) + ("_о" ["о̄"]) + ("^о" ["о̂"]) + ("``О" ["О̏"]) + ("`О" ["О̀"]) + ("´О" ["О́"]) + ("'О" ["О́"]) + ("¯О" ["О̄"]) + ("_О" ["О̄"]) + ("^О" ["О̂"]) + ("``у" ["у̏"]) + ("`у" ["у̀"]) + ("´у" ["у́"]) + ("'у" ["у́"]) + ("^у" ["у̂"]) + ("``У" ["У̏"]) + ("`У" ["У̀"]) + ("´У" ["У́"]) + ("'У" ["У́"]) + ("^У" ["У̂"]) + ("``р" ["р̏"]) + ("`р" ["р̀"]) + ("´р" ["р́"]) + ("'р" ["р́"]) + ("¯р" ["р̄"]) + ("_р" ["р̄"]) + ("^р" ["р̂"]) + ("``Р" ["Р̏"]) + ("`Р" ["Р̀"]) + ("´Р" ["Р́"]) + ("'Р" ["Р́"]) + ("¯Р" ["Р̄"]) + ("_Р" ["Р̄"]) + ("^Р" ["Р̂"]) + ("v/" ?√) + ("/v" ?√) + ("88" ?∞) + ("=_" ?≡) + ("_≠" ?≢) + ("≠_" ?≢) + ("<_" ?≤) + ("_<" ?≤) + (">_" ?≥) + ("_>" ?≥) + ("_⊂" ?⊆) + ("⊂_" ?⊆) + ("_⊃" ?⊇) + ("⊃_" ?⊇) + ("○-" ?⊖) + ("-○" ?⊖) + ("○." ?⊙) + (".○" ?⊙) + ("<>" ?⋄) + ("><" ?⋄) + ("∧∨" ?⋄) + ("∨∧" ?⋄) + (":." ?∴) + (".:" ?∵) + ("⊥⊤" ?⌶) + ("⊤⊥" ?⌶) + ("[]" ?⌷) + ("][" ?⌷) + ("⎕=" ?⌸) + ("=⎕" ?⌸) + ("⎕÷" ?⌹) + ("÷⎕" ?⌹) + ("⎕⋄" ?⌺) + ("⋄⎕" ?⌺) + ("⎕∘" ?⌻) + ("∘⎕" ?⌻) + ("⎕○" ?⌼) + ("○⎕" ?⌼) + ("○|" ?⌽) + ("|○" ?⌽) + ("○∘" ?⌾) + ("∘○" ?⌾) + ("/-" ?⌿) + ("-/" ?⌿) + ("\\-" ?⍀) + ("-\\" ?⍀) + ("/⎕" ?⍁) + ("⎕/" ?⍁) + ("\\⎕" ?⍂) + ("⎕\\" ?⍂) + ("<⎕" ?⍃) + ("⎕<" ?⍃) + (">⎕" ?⍄) + ("⎕>" ?⍄) + ("←|" ?⍅) + ("|←" ?⍅) + ("→|" ?⍆) + ("|→" ?⍆) + ("←⎕" ?⍇) + ("⎕←" ?⍇) + ("→⎕" ?⍈) + ("⎕→" ?⍈) + ("○\\" ?⍉) + ("\\○" ?⍉) + ("_⊥" ?⍊) + ("⊥_" ?⍊) + ("∆|" ?⍋) + ("|∆" ?⍋) + ("∨⎕" ?⍌) + ("⎕∨" ?⍌) + ("∆⎕" ?⍍) + ("⎕∆" ?⍍) + ("∘⊥" ?⍎) + ("⊥∘" ?⍎) + ("↑-" ?⍏) + ("-↑" ?⍏) + ("↑⎕" ?⍐) + ("⎕↑" ?⍐) + ("¯⊤" ?⍑) + ("⊤¯" ?⍑) + ("∇|" ?⍒) + ("|∇" ?⍒) + ("∧⎕" ?⍓) + ("⎕∧" ?⍓) + ("∇⎕" ?⍔) + ("⎕∇" ?⍔) + ("∘⊤" ?⍕) + ("⊤∘" ?⍕) + ("↓-" ?⍖) + ("-↓" ?⍖) + ("↓⎕" ?⍗) + ("⎕↓" ?⍗) + ("_'" ?⍘) + ("∆_" ?⍙) + ("_∆" ?⍙) + ("⋄_" ?⍚) + ("_⋄" ?⍚) + ("∘_" ?⍛) + ("_∘" ?⍛) + ("○_" ?⍜) + ("_○" ?⍜) + ("∘∩" ?⍝) + ("∩∘" ?⍝) + ("⎕'" ?⍞) + ("'⎕" ?⍞) + ("○*" ?⍟) + ("*○" ?⍟) + (":⎕" ?⍠) + ("⎕:" ?⍠) + ("¨⊤" ?⍡) + ("⊤¨" ?⍡) + ("¨∇" ?⍢) + ("∇¨" ?⍢) + ("*¨" ?⍣) + ("¨*" ?⍣) + ("∘¨" ?⍤) + ("¨∘" ?⍤) + ("○¨" ?⍥) + ("¨○" ?⍥) + ("∪|" ?⍦) + ("|∪" ?⍦) + ("⊂|" ?⍧) + ("|⊂" ?⍧) + ("~¨" ?⍨) + ("¨>" ?⍩) + (">¨" ?⍩) + ("∇~" ?⍫) + ("~∇" ?⍫) + ("0~" ?⍬) + ("~0" ?⍬) + ("|~" ?⍭) + ("~|" ?⍭) + (";_" ?⍮) + ("≠⎕" ?⍯) + ("⎕≠" ?⍯) + ("?⎕" ?⍰) + ("⎕?" ?⍰) + ("∨~" ?⍱) + ("~∨" ?⍱) + ("∧~" ?⍲) + ("~∧" ?⍲) + ("⍺_" ?⍶) + ("_⍺" ?⍶) + ("∊_" ?⍷) + ("_∊" ?⍷) + ("⍳_" ?⍸) + ("_⍳" ?⍸) + ("⍵_" ?⍹) + ("_⍵" ?⍹) + ) + +(provide 'compose) +;;; compose.el ends here From 030ab2dad50a448bd5cf3ef06f5d768717cdac70 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 1 Nov 2020 23:35:41 +0200 Subject: [PATCH 08/12] Transient input methods bound to 'C-x \' (bug#44266) * lisp/international/mule-cmds.el (ctl-x-map): Bind 'C-x \' to 'transient-input-method'. (input-method-function): New defcustom. (transient-input-method): New command. * doc/emacs/mule.texi (Select Input Method): Document transient-input-method. --- doc/emacs/mule.texi | 15 +++++++++++++ etc/NEWS | 25 ++++++++++++++------- lisp/international/mule-cmds.el | 40 +++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/doc/emacs/mule.texi b/doc/emacs/mule.texi index b78019020a6..d4ad1d6d5e2 100644 --- a/doc/emacs/mule.texi +++ b/doc/emacs/mule.texi @@ -578,6 +578,11 @@ Enable or disable use of the selected input method (@code{toggle-input-method}). @item C-x @key{RET} C-\ @var{method} @key{RET} Select a new input method for the current buffer (@code{set-input-method}). +@item C-x \ @var{method} @key{RET} +Temporarily enable the selected transient input method, and +automatically disable it after inserting a single character +(@code{transient-input-method}). + @item C-h I @var{method} @key{RET} @itemx C-h C-\ @var{method} @key{RET} @findex describe-input-method @@ -675,6 +680,16 @@ character. input methods. The list gives information about each input method, including the string that stands for it in the mode line. +@findex transient-input-method +@kindex C-x \ + To insert only a single character using a transient input method you +can first select a transient input method by typing @kbd{C-u C-x \}. +Then typing @kbd{C-x \} (@code{transient-input-method}) will +temporarily enable the selected transient input method, and disable it +automatically after using the activated input method to insert +a single character. This is useful to insert a character from input +methods with rare Unicode characters. + @node Coding Systems @section Coding Systems @cindex coding systems diff --git a/etc/NEWS b/etc/NEWS index 7bf212dd134..1061a15cd23 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -132,14 +132,6 @@ Emacs to break lines after more characters than just whitespace characters. In particular, this significantly improves word-wrapping for CJK text mixed with Latin text. ---- -** New input method 'compose' based on X Multi_key sequences. - ---- -** Improved language transliteration in Malayalam input methods. -Added a new Mozhi scheme. The inapplicable ITRANS scheme is now -deprecated. Errors in the Inscript method were corrected. - --- ** Rudimentary support for the 'st' terminal emulator. Emacs now supports 256 color display on the 'st' terminal emulator. @@ -629,6 +621,23 @@ recorded for the purpose of 'view-lossage'. The menu bar "Help" menu now has a "Show Recent Inputs" item under the "Describe" sub-menu. +** Input methods + ++++ +*** 'C-x \' temporarily enables a transient input method. +'C-u C-x \' can be used to select a transient input method, e.g. +'C-u C-x \ compose RET' selects the 'compose' input method. Then typing +'C-x \ 1 2' will insert the character '½', and disable the input method +afterwards. + +--- +*** New input method 'compose' based on X Multi_key sequences. + +--- +*** Improved language transliteration in Malayalam input methods. +Added a new Mozhi scheme. The inapplicable ITRANS scheme is now +deprecated. Errors in the Inscript method were corrected. + ** Ispell +++ diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el index e3155dfc52c..c5a01451637 100644 --- a/lisp/international/mule-cmds.el +++ b/lisp/international/mule-cmds.el @@ -55,6 +55,7 @@ ;; Keep "C-x C-m ..." for mule specific commands. (define-key ctl-x-map "\C-m" mule-keymap) +(define-key ctl-x-map "\\" 'transient-input-method) (defvar describe-language-environment-map (let ((map (make-sparse-keymap "Describe Language Environment"))) @@ -1344,6 +1345,16 @@ This is the input method activated automatically by the command mule-input-method-string) :set-after '(current-language-environment)) +(defcustom transient-input-method nil + "Default transient input method. +This is the input method activated automatically by the command +`transient-input-method' (\\[transient-input-method])." + :link '(custom-manual "(emacs)Input Methods") + :group 'mule + :type '(choice (const nil) + mule-input-method-string) + :set-after '(current-language-environment)) + (put 'input-method-function 'permanent-local t) (defvar input-method-history nil @@ -1519,6 +1530,35 @@ To deactivate it programmatically, use `deactivate-input-method'." (defvar toggle-input-method-active nil "Non-nil inside `toggle-input-method'.") +(defun transient-input-method (&optional arg interactive) + "Enable transient input method for the current buffer." + (interactive "P\np") + (when (or arg (not transient-input-method)) + (let* ((default (or (car input-method-history) default-input-method)) + (input-method + (read-input-method-name + (if default "Transient input method (default %s): " "Transient input method: ") + default t))) + (setq transient-input-method input-method) + (when interactive + (customize-mark-as-set 'transient-input-method)))) + (let* ((previous-input-method current-input-method) + (history input-method-history) + (clearfun (make-symbol "clear-transient-input-method")) + (exitfun + (lambda () + (deactivate-input-method) + (when previous-input-method + (activate-input-method previous-input-method)) + (setq input-method-history history) + (remove-hook 'input-method-after-insert-chunk-hook clearfun)))) + (fset clearfun (lambda () (funcall exitfun))) + (add-hook 'input-method-after-insert-chunk-hook clearfun) + (when previous-input-method + (deactivate-input-method)) + (activate-input-method transient-input-method) + exitfun)) + (defun toggle-input-method (&optional arg interactive) "Enable or disable multilingual text input method for the current buffer. Only one input method can be enabled at any time in a given buffer. From 5ab5504def63ebdfba08169f24a5829353bff137 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 1 Nov 2020 22:49:12 +0100 Subject: [PATCH 09/12] Fix mistake in Lisp conversion of describe-map-tree * lisp/help.el (describe-map-tree): Fix mistake in conversion to Lisp from the C function describe_map_tree; make the condition match the now removed C code. (Bug#44360) --- lisp/help.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/help.el b/lisp/help.el index df055d602fe..466ff21eb2d 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -1189,8 +1189,8 @@ Any inserted text ends in two newlines (used by ;; map. (or (keymapp sub-shadows) (null sub-shadows) - (consp sub-shadows) - (not (keymapp (car sub-shadows))))) + (and (consp sub-shadows) + (keymapp (car sub-shadows))))) ;; Maps we have already listed in this loop shadow this map. (let ((tail orig-maps)) (while (not (equal tail maps)) From 5cea77af41b59ba6f6386264812c36ec31ba2efc Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Mon, 2 Nov 2020 10:17:08 +0100 Subject: [PATCH 10/12] Partially revert previous define-minor-mode change * lisp/emacs-lisp/easy-mmode.el (easy-mmode--arg-docstring): Only document the values we want to support, not the ones we actually support. (define-minor-mode): Partially revert to previous behaviour. --- lisp/emacs-lisp/easy-mmode.el | 10 ++++------ test/lisp/emacs-lisp/easy-mmode-tests.el | 10 ++-------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el index 77f10e61c6c..261f2508af7 100644 --- a/lisp/emacs-lisp/easy-mmode.el +++ b/lisp/emacs-lisp/easy-mmode.el @@ -90,7 +90,7 @@ the mode. If called from Lisp, toggle the mode if ARG is `toggle'. Enable the mode if ARG is nil, omitted, or is a positive number. -All other values will disable the mode. +Disable the mode if ARG is a negative number. The mode's hook is called both when the mode is enabled and when it is disabled.") @@ -312,12 +312,10 @@ or call the function `%s'.")))) (cond ((eq arg 'toggle) (not ,getter)) ((and (numberp arg) - (> arg 0)) - t) - ((eq arg nil) - t) + (< arg 1)) + nil) (t - nil))) + t))) ,@body ;; The on/off hooks are here for backward compatibility only. (run-hooks ',hook (if ,getter ',hook-on ',hook-off)) diff --git a/test/lisp/emacs-lisp/easy-mmode-tests.el b/test/lisp/emacs-lisp/easy-mmode-tests.el index 4a448200a2b..c05379e4415 100644 --- a/test/lisp/emacs-lisp/easy-mmode-tests.el +++ b/test/lisp/emacs-lisp/easy-mmode-tests.el @@ -48,22 +48,16 @@ (with-temp-buffer (define-minor-mode test-mode "A test.") (should (eq test-mode nil)) - (test-mode t) - (should (eq test-mode nil)) (test-mode nil) (should (eq test-mode t)) (test-mode -33) (should (eq test-mode nil)) (test-mode 33) (should (eq test-mode t)) - (test-mode 0) - (should (eq test-mode nil)) - (test-mode 'toggle) - (should (eq test-mode t)) (test-mode 'toggle) (should (eq test-mode nil)) - (test-mode "what") - (should (eq test-mode nil)))) + (test-mode 'toggle) + (should (eq test-mode t)))) (provide 'easy-mmode-tests) From 4e2264b60d1748bfec13486003f526d8c434fda6 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Mon, 2 Nov 2020 16:53:57 +0100 Subject: [PATCH 11/12] Fix mouse-1 on [Show] buttons in the *Help* buffer * lisp/descr-text.el (describe-text-sexp): Add a `follow-link' so that the [Show] buttons work correctly with mouse-1 (bug#44340). --- lisp/descr-text.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lisp/descr-text.el b/lisp/descr-text.el index 075cb21c21a..677db2f68a9 100644 --- a/lisp/descr-text.el +++ b/lisp/descr-text.el @@ -54,10 +54,12 @@ (<= (length pp) (- (window-width) (current-column)))) (insert pp) (insert-text-button - "[Show]" 'action (lambda (&rest _ignore) - (with-output-to-temp-buffer - "*Pp Eval Output*" - (princ pp))) + "[Show]" + 'follow-link t + 'action (lambda (&rest _ignore) + (with-output-to-temp-buffer + "*Pp Eval Output*" + (princ pp))) 'help-echo "mouse-2, RET: pretty print value in another buffer")))) (defun describe-property-list (properties) From 95f7a2835a79c1f12b5dc86230405e8040910c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Mon, 2 Nov 2020 16:24:59 +0000 Subject: [PATCH 12/12] Fix Elisp's elisp--documentation-one-liner (bug#43609) To be backward compatible, this function must return nil when there is a symbol at point but no documentation for it. Before this fixed it returned the string ": nil". * lisp/progmodes/elisp-mode.el (elisp--documentation-one-liner): Check callback actually produced non-nil doc. --- lisp/progmodes/elisp-mode.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index ce2b924d514..12788eacf1b 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -1416,12 +1416,13 @@ which see." (defun elisp--documentation-one-liner () (let* (str (callback (lambda (doc &rest plist) - (setq str - (format "%s: %s" - (propertize (prin1-to-string - (plist-get plist :thing)) - 'face (plist-get plist :face)) - doc))))) + (when doc + (setq str + (format "%s: %s" + (propertize (prin1-to-string + (plist-get plist :thing)) + 'face (plist-get plist :face)) + doc)))))) (or (progn (elisp-eldoc-var-docstring callback) str) (progn (elisp-eldoc-funcall callback) str))))