commit 12a78711c94ccf5c46dd4e9653596c87b6fe0a18 (HEAD, refs/remotes/origin/master) Author: Po Lu Date: Fri Sep 30 14:54:15 2022 +0800 Fix calculation of frame times when X server time overflows * etc/TODO: Add TODO about frame synchronization and animations. * src/xterm.c (x_display_set_last_user_time): Handle cases when the monotonic time is not the server time due to the latter overflowing. diff --git a/etc/TODO b/etc/TODO index fefc586123..d884539037 100644 --- a/etc/TODO +++ b/etc/TODO @@ -1763,6 +1763,26 @@ enough environment under which the fix can be tested. The MPX code has not been tested under X toolkit or GTK+ 2.x builds and is not expected to work there. +** Framework for doing animations +Emacs does animations all over the place, usually "pluse" animations. +These currently animate by waiting for a small but fixed amount of +time between each redisplay, which causes screen tearing by not +synchronizing with the vertical refresh. Frame synchronization works +by causing redisplay to delay until the next time the monitor can +refresh; this works, but can cause substandard frame rate when +redisplay happens less often than the monitor refreshing, as redisplay +will have to continually wait for missed monitor refresh. + +The right remedy for this problem is to define a function that returns +the amount of time remaining before the next vertical blanking period, +and to schedule animation redisplay within that period, using the +information provided by the _NET_WM_FRAME_DRAWN and +_NET_WM_FRAME_TIMINGS compositor messages on X and the +BScreen::GetMonitorInfo function on Haiku. Ideally, all features +performing animations should be modified to use that method of +scheduling redisplay. Examples include xref-pulse-momentarily and +pixel-scroll-precision-start-momentum. + This file is part of GNU Emacs. diff --git a/src/xterm.c b/src/xterm.c index cb5d540dd3..947cf7edb5 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -7607,6 +7607,11 @@ static void x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time, bool send_event) { +#if defined HAVE_XSYNC && !defined USE_GTK && defined HAVE_CLOCK_GETTIME + uint_fast64_t monotonic_time; + uint_fast64_t monotonic_ms; + int_fast64_t diff_ms; +#endif #ifndef USE_GTK struct frame *focus_frame; Time old_time; @@ -7627,9 +7632,8 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time, { /* See if the current CLOCK_MONOTONIC time is reasonably close to the X server time. */ - uint_fast64_t monotonic_time = x_sync_current_monotonic_time (); - uint_fast64_t monotonic_ms = monotonic_time / 1000; - int_fast64_t diff_ms; + monotonic_time = x_sync_current_monotonic_time (); + monotonic_ms = monotonic_time / 1000; dpyinfo->server_time_monotonic_p = (monotonic_time != 0 @@ -7647,6 +7651,27 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time, monotonic_time, &dpyinfo->server_time_offset)) dpyinfo->server_time_offset = 0; + + /* If the server time is reasonably close to the monotonic + time after the latter is truncated to CARD32, simply make + the offset that between the server time in ms and the + actual time in ms. */ + + monotonic_ms = monotonic_ms & 0xffffffff; + if (!INT_SUBTRACT_WRAPV (time, monotonic_ms, &diff_ms) + && -500 < diff_ms && diff_ms < 500) + { + /* The server timestamp overflowed. Make the time + offset exactly how much it overflowed by. */ + + if (INT_SUBTRACT_WRAPV (monotonic_time / 1000, monotonic_ms, + &dpyinfo->server_time_offset) + || INT_MULTIPLY_WRAPV (dpyinfo->server_time_offset, + 1000, &dpyinfo->server_time_offset) + || INT_SUBTRACT_WRAPV (0, dpyinfo->server_time_offset, + &dpyinfo->server_time_offset)) + dpyinfo->server_time_offset = 0; + } } } #endif commit b7a3770ecc5da938c37cfcc50a69902aa57bf2bf Author: Eli Zaretskii Date: Fri Sep 30 09:21:43 2022 +0300 ; Fix documentation of Toto language environment * lisp/leim/quail/indian.el ("toto"): * lisp/language/indian.el ("Toto"): Clarify doc strings. diff --git a/lisp/language/indian.el b/lisp/language/indian.el index 2a1876d708..4994cfdc7a 100644 --- a/lisp/language/indian.el +++ b/lisp/language/indian.el @@ -283,7 +283,7 @@ environment.")) (coding-priority utf-8) (input-method . "toto") (documentation . "\ -Toto language and its script are supported in this language +Toto language using the Toto script is supported in this language environment.")) '("Indian")) diff --git a/lisp/leim/quail/indian.el b/lisp/leim/quail/indian.el index 54c46b168b..048e16e8d8 100644 --- a/lisp/leim/quail/indian.el +++ b/lisp/leim/quail/indian.el @@ -2212,7 +2212,7 @@ is." ("M" ?𞋨)) (quail-define-package - "toto" "Toto" "𞊒𞊪" nil "Toto phonetic input method." + "toto" "Toto" "𞊒𞊪" nil "Toto script phonetic input method." nil t t t t nil nil nil nil nil t) (quail-define-rules commit 681cf21ddc042fa9913f12f78d314d5025307955 Author: समीर सिंह Sameer Singh Date: Fri Sep 30 01:32:56 2022 +0530 Add support for the Toto script (bug#58181) * lisp/language/indian.el ("Toto"): New language environment. Add input method. * lisp/international/fontset.el (script-representative-chars): Support Toto. * lisp/leim/quail/indian.el ("toto"): New input method. * etc/NEWS: Announce the new language environment. diff --git a/etc/NEWS b/etc/NEWS index 76e44965ba..aad1a17ae7 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1271,6 +1271,7 @@ Meetei Mayek script and language environment Adlam script and language environment Mende Kikakui script and language environment Wancho script and language environment +Toto script and language environment --- *** The "Oriya" language environment was renamed to "Odia". diff --git a/lisp/international/fontset.el b/lisp/international/fontset.el index ec505a0903..aa1477e2ae 100644 --- a/lisp/international/fontset.el +++ b/lisp/international/fontset.el @@ -291,7 +291,7 @@ (tai-xuan-jing-symbol #x1D300) (counting-rod-numeral #x1D360) (nyiakeng-puachue-hmong #x1e100) - (toto #x1E290) + (toto #x1E290 #x1E295 #x1E2AD) (wancho #x1E2C0 #x1E2E8 #x1E2EF) (nag-mundari #x1E4D0 #x1E4EB #x1E4F0) (mende-kikakui #x1E810 #x1E8A6) diff --git a/lisp/language/indian.el b/lisp/language/indian.el index bc8f532857..2a1876d708 100644 --- a/lisp/language/indian.el +++ b/lisp/language/indian.el @@ -277,6 +277,16 @@ Wancho language and its script are supported in this language environment.")) '("Indian")) +(set-language-info-alist + "Toto" '((charset unicode) + (coding-system utf-8) + (coding-priority utf-8) + (input-method . "toto") + (documentation . "\ +Toto language and its script are supported in this language +environment.")) + '("Indian")) + ;; Replace mnemonic characters in REGEXP according to TABLE. TABLE is ;; an alist of (MNEMONIC-STRING . REPLACEMENT-STRING). diff --git a/lisp/leim/quail/indian.el b/lisp/leim/quail/indian.el index 443488c18d..54c46b168b 100644 --- a/lisp/leim/quail/indian.el +++ b/lisp/leim/quail/indian.el @@ -2211,5 +2211,42 @@ is." ("m" ?𞋘) ("M" ?𞋨)) +(quail-define-package + "toto" "Toto" "𞊒𞊪" nil "Toto phonetic input method." + nil t t t t nil nil nil nil nil t) + +(quail-define-rules + ("q" ?𞊫) + ("Q" ?𞊬) + ("w" ?𞊜) + ("e" ?𞊦) + ("E" ?𞊧) + ("r" ?𞊟) + ("t" ?𞊒) + ("y" ?𞊛) + ("u" ?𞊥) + ("i" ?𞊡) + ("I" ?𞊢) + ("o" ?𞊪) + ("p" ?𞊐) + ("a" ?𞊭) + ("s" ?𞊙) + ("d" ?𞊓) + ("f" ?𞊮) + ("g" ?𞊕) + ("h" ?𞊞) + ("j" ?𞊝) + ("k" ?𞊔) + ("l" ?𞊠) + ("z" ?𞊣) + ("Z" ?𞊤) + ("x" ?𞊨) + ("X" ?𞊩) + ("c" ?𞊚) + ("b" ?𞊑) + ("n" ?𞊗) + ("N" ?𞊘) + ("m" ?𞊖)) + (provide 'indian) ;;; indian.el ends here commit d5cccca945b4b5aafcd23365e25b6369de7c5a46 Merge: e3748c3233 64e8cc14b5 Author: Stefan Kangas Date: Fri Sep 30 06:30:41 2022 +0200 Merge from origin/emacs-28 64e8cc14b5 ; * lisp/image.el (create-image): Fix last change in doc s... f3e3632394 Update some Gnus documentation in the Emacs manual commit e3748c323320c0bde6ad8f70f0c2ab8f686255a5 Author: Stefan Kangas Date: Thu Sep 29 20:23:11 2022 +0200 ; * etc/NEWS: Move item to correct section. This change belongs in "Changes" rather than "Lisp Changes" as this is not only relevant to Lisp developers. diff --git a/etc/NEWS b/etc/NEWS index 4b2e892f88..76e44965ba 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -380,6 +380,15 @@ the major mode according to 'initial-major-mode', like at Emacs startup. Previously, these functions ignored 'initial-scratch-message' and left "*scratch*" in 'fundamental-mode'. +--- +** Naming of Image-Dired thumbnail files has changed. +Names of thumbnail files generated when 'image-dired-thumbnail-storage' +is 'image-dired' now always end in ".jpg". This fixes various issues +on different platforms, but means that thumbnails generated in Emacs 28 +will not be used in Emacs 29, and vice-versa. If disk space is an +issue, consider deleting the 'image-dired-dir' directory after +upgrading (usually "~/.emacs.d/image-dired/"). + --- ** The 'rlogin' method in the URL library is now obsolete. Emacs will now display a warning if you request a URL like @@ -2672,15 +2681,6 @@ This means that images found through 'find-image' also have auto-scaling applied. (This only makes a difference on HiDPI displays.) ---- -** Naming of thumbnail files has changed. -Names of thumbnail files generated when 'image-dired-thumbnail-storage' -is 'image-dired' now always end in ".jpg". This fixes various issues -on different platforms, but means that thumbnails generated in Emacs 28 -will not be used in Emacs 29, and vice-versa. If disk space is an -issue, consider deleting the directory 'image-dired-dir' after -upgrading (usually "~/.emacs.d/image-dired/"). - +++ ** Changes to "raw" in-memory xbm images are specified. Some years back Emacs gained the ability to scale images, and you commit a577b12d645513830e6c482abd3818f1cfbe20b5 Author: Eli Zaretskii Date: Thu Sep 29 20:03:51 2022 +0300 ; * lisp/image/wallpaper.el (wallpaper--x-monitor-name): Doc fix. diff --git a/lisp/image/wallpaper.el b/lisp/image/wallpaper.el index 3f852f2504..e23b65d616 100644 --- a/lisp/image/wallpaper.el +++ b/lisp/image/wallpaper.el @@ -404,7 +404,9 @@ On a graphical display, try using the same monitor as the current frame. On a non-graphical display, try to get the name by connecting to the display server directly, and run \"xrandr\" if that doesn't -work. Prompt for the monitor name if neither method works." +work. Prompt for the monitor name if neither method works. + +This function is meaningful only on X and is used only there." (if (or (display-graphic-p) noninteractive) (let-alist (car (display-monitor-attributes-list)) commit 696c528379a92274ccdc8688863e2ab1cd5a762c Author: Stefan Kangas Date: Thu Sep 29 18:44:03 2022 +0200 Fix loading wallpaper.el on MS-Windows * lisp/image/wallpaper.el (wallpaper--find-command) (wallpaper--find-command-args): Avoid backtrace when 'wallpaper--find-setter' returns nil, e.g. on MS-Windows. (Bug#58167) diff --git a/lisp/image/wallpaper.el b/lisp/image/wallpaper.el index 80c9862916..3f852f2504 100644 --- a/lisp/image/wallpaper.el +++ b/lisp/image/wallpaper.el @@ -271,11 +271,13 @@ order in which they appear.") (defun wallpaper--find-command () "Return a valid command to set the wallpaper in this environment." - (wallpaper-setter-command (wallpaper--find-setter))) + (when-let ((setter (wallpaper--find-setter))) + (wallpaper-setter-command setter))) (defun wallpaper--find-command-args () "Return command line arguments matching `wallpaper-command'." - (wallpaper-setter-args (wallpaper--find-setter))) + (when-let ((setter (wallpaper--find-setter))) + (wallpaper-setter-args setter))) ;;; Customizable variables commit 0edd7770e0ce70cac59f239134962d10f48dec79 Author: Eli Zaretskii Date: Thu Sep 29 18:55:08 2022 +0300 ; * etc/NEWS: Remove a stray newline. diff --git a/etc/HELLO b/etc/HELLO index 1899b087e0..f0dcb45d38 100644 --- a/etc/HELLO +++ b/etc/HELLO @@ -115,7 +115,6 @@ Tirhuta (𑒞𑒱𑒩𑒯𑒳𑒞𑒰) 𑒣𑓂𑒩𑒢𑒰𑒧 / 𑒮𑒲𑒞 Turkish (Türkçe) Merhaba Ukrainian (українська) Вітаю Vietnamese (tiếng Việt) Chào bạn - Wancho (𞋒𞋀𞋉𞋃𞋕) 𞋂𞋈𞋛 commit a18918df0bd0ddd9c8b05b99c302e26b226af5d3 Author: Alan Mackenzie Date: Thu Sep 29 15:22:42 2022 +0000 CC Mode: Refactor c-forward-delarator and callers c-forward-declarator now moves over a complete declarator, including any arglist expression, but possibly not including certain C++20 constructs. * lisp/progmodes/cc-engine.el (c-forward-decl-arglist): New function, extracted from c-do-declarators. (c-forward-declarator): Extend the result list by one element, denoting whether the function parsed an argument list. Insert special handling for a C++ operator construct. If there is a parenthesis expression, and it is an argument list, move forward over it. (c-do-declarators): Append an optional parameter, cdd-anon-accepted instructing the function to handle declarators without identifiers. Extract c-forward-decl-arglist. * lisp/progmodes/cc-fonts.el (c-font-lock-declarators): New &optional parameter accept-anon, as above. Analyze and use the identifier location returned by c-do-declarators, rather than using c-last-identifier-range. (c-font-lock-single-decl): Determine accept-anon from the context, passing it as argument to c-font-lock-declarators. * lisp/progmodes/cc-langs.el (c-opt-identifier-prefix-key): Make a c-lang-defvar out of this existing c-lang-defconst. * lisp/progmodes/cc-mode.el (c-fl-decl-end): Adapt for the new c-forward-declarator which now moves over arglists. Amend better to handle certain syntactically invalid constructs in C++. diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index e0aef2b2ee..fc00518360 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -9590,14 +9590,71 @@ point unchanged and return nil." (goto-char here) nil))) -(defun c-forward-declarator (&optional limit accept-anon) +(defun c-forward-decl-arglist (not-top id-in-parens &optional limit) + ;; Point is at an open parenthesis, assumed to be the arglist of a function + ;; declaration. Move over this arglist and following syntactic whitespace, + ;; and return non-nil. If the construct isn't such an arglist, leave point + ;; unmoved and return nil. + ;; + ;; Note that point is assumed to be at a place where an arglist is expected. + ;; Only for C++, where there are other possibilities, is any actual + ;; processing done. Otherwise, t is simply returned. + (let ((here (point)) got-type) + (if (or + (not (c-major-mode-is 'c++-mode)) + (and + (or (not not-top) + id-in-parens ; Id is in parens, etc. + (save-excursion + (forward-char) + (c-forward-syntactic-ws limit) + (looking-at "[*&]"))) + (when + (save-excursion + (let (c-last-identifier-range) + (forward-char) + (c-forward-syntactic-ws limit) + (catch 'is-function + (while + ;; Go forward one argument at each iteration. + (progn + (while + (cond + ((looking-at c-decl-hangon-key) + (c-forward-keyword-clause 1)) + ((looking-at + c-noise-macro-with-parens-name-re) + (c-forward-noise-clause)))) + (when (eq (char-after) ?\)) + (forward-char) + (c-forward-syntactic-ws limit) + (throw 'is-function t)) + (setq got-type (c-forward-type)) + (cond + ((null got-type) + (throw 'is-function nil)) + ((not (eq got-type 'maybe)) + (throw 'is-function t))) + (c-forward-declarator limit t t) + (eq (char-after) ?,)) + (forward-char) + (c-forward-syntactic-ws)) + t))) + (and (c-go-list-forward (point) limit) + (progn (c-forward-syntactic-ws limit) t))))) + t + (goto-char here) + nil))) + +(defun c-forward-declarator (&optional limit accept-anon not-top) ;; Assuming point is at the start of a declarator, move forward over it, ;; leaving point at the next token after it (e.g. a ) or a ; or a ,), or at ;; end of buffer if there is no such token. ;; - ;; Return a list (ID-START ID-END BRACKETS-AFTER-ID GOT-INIT DECORATED), - ;; where ID-START and ID-END are the bounds of the declarator's identifier, - ;; and BRACKETS-AFTER-ID is non-nil if a [...] pair is present after the id. + ;; Return a list (ID-START ID-END BRACKETS-AFTER-ID GOT-INIT DECORATED + ;; ARGLIST), where ID-START and ID-END are the bounds of the declarator's + ;; identifier, BRACKETS-AFTER-ID is non-nil if a [...] pair is present after + ;; the id, and ARGLIST is non-nil if an arglist has been moved over. ;; GOT-INIT is non-nil when the declarator is followed by "=" or "(", ;; DECORATED is non-nil when the identifier is embellished by an operator, ;; like "*x", or "(*x)". @@ -9619,7 +9676,8 @@ point unchanged and return nil." ;; array/struct initialization) or "=" or terminating delimiter ;; (e.g. "," or ";" or "}"). (let ((here (point)) - id-start id-end brackets-after-id paren-depth decorated) + id-start id-end brackets-after-id paren-depth decorated + got-init arglist) (or limit (setq limit (point-max))) (if (and (< (point) limit) @@ -9640,6 +9698,18 @@ point unchanged and return nil." ((and c-opt-cpp-prefix (looking-at c-noise-macro-with-parens-name-re)) (c-forward-noise-clause)) + ;; Special handling for operator. + ((and c-opt-op-identifier-prefix + (looking-at c-opt-op-identifier-prefix)) + (goto-char (match-end 1)) + (c-forward-syntactic-ws limit) + (setq id-start (point)) + (if (looking-at c-overloadable-operators-regexp) + (progn + (goto-char (match-end 0)) + (setq got-identifier t) + nil) + t)) ((and (looking-at c-type-decl-prefix-key) (if (and (c-major-mode-is 'c++-mode) (match-beginning 4)) ; Was 3 - 2021-01-01 @@ -9648,17 +9718,17 @@ point unchanged and return nil." ;; prefix only if it specifies a member pointer. (progn (setq id-start (point)) - (c-forward-name) - (if (save-match-data - (looking-at "\\(::\\)")) - ;; We only check for a trailing "::" and - ;; let the "*" that should follow be - ;; matched in the next round. - t - ;; It turned out to be the real identifier, - ;; so flag that and stop. - (setq got-identifier t) - nil)) + (when (c-forward-name) + (if (save-match-data + (looking-at "\\(::\\)")) + ;; We only check for a trailing "::" and + ;; let the "*" that should follow be + ;; matched in the next round. + t + ;; It turned out to be the real identifier, + ;; so flag that and stop. + (setq got-identifier t) + nil))) t)) (if (save-match-data (looking-at c-type-decl-operator-prefix-key)) @@ -9684,7 +9754,7 @@ point unchanged and return nil." (accept-anon (setq id-start nil id-end nil) t) - (t (/= (point) here)))) + (t nil))) ;; Skip out of the parens surrounding the identifier. If closing ;; parens are missing, this form returns nil. @@ -9725,10 +9795,13 @@ point unchanged and return nil." (while (and (< (point) limit) - (setq found - (c-syntactic-re-search-forward - "[;:,]\\|\\s)\\|\\(=\\|\\s(\\)" - limit t t)) + (prog1 + (setq found + (c-syntactic-re-search-forward + "[;:,]\\|\\s)\\|\\(=\\|\\s(\\)" + limit t t)) + (setq got-init + (and found (match-beginning 1)))) (eq (char-before) ?:) (if (looking-at c-:-op-cont-regexp) (progn (goto-char (match-end 0)) t) @@ -9742,18 +9815,30 @@ point unchanged and return nil." (c-simple-skip-symbol-backward)) (looking-at c-paren-stmt-key)))))))) found) - (eq (char-before) ?\[) - (c-go-up-list-forward)) - (setq brackets-after-id t)) - (when found (backward-char)) + (cond ((eq (char-before) ?\[) + (setq brackets-after-id t) + (prog1 (c-go-up-list-forward) + (c-forward-syntactic-ws))) + ((and (not brackets-after-id) + (eq (char-before) ?\()) + (backward-char) + (if (c-forward-decl-arglist not-top decorated limit) + (setq arglist t + got-init nil) + (forward-char)) + nil)))) ; To end the loop. + (when (and found + (memq (char-before) '(?\; ?\: ?, ?= ?\( ?\[ ?{))) + (backward-char)) (<= (point) limit))) - (list id-start id-end brackets-after-id (match-beginning 1) decorated) + (list id-start id-end brackets-after-id got-init decorated arglist) (goto-char here) nil))) (defun c-do-declarators - (cdd-limit cdd-list cdd-not-top cdd-comma-prop cdd-function) + (cdd-limit cdd-list cdd-not-top cdd-comma-prop cdd-function + &optional cdd-accept-anon) "Assuming point is at the start of a comma separated list of declarators, apply CDD-FUNCTION to each declarator (when CDD-LIST is non-nil) or just the first declarator (when CDD-LIST is nil). When CDD-FUNCTION is nil, no @@ -9778,6 +9863,9 @@ Stop at or before CDD-LIMIT (which may NOT be nil). If CDD-NOT-TOP is non-nil, we are not at the top-level (\"top-level\" includes being directly inside a class or namespace, etc.). +If CDD-ACCEPT-ANON is non-nil, we also process declarators without names, +e.g. \"int (*)(int)\" in a function prototype. + Return non-nil if we've reached the token after the last declarator (often a semicolon, or a comma when CDD-LIST is nil); otherwise (when we hit CDD-LIMIT, or fail otherwise) return nil, leaving point at the beginning of the putative @@ -9789,67 +9877,25 @@ This function might do hidden buffer changes." ;; CDD-FUNCTION. (let ((cdd-pos (point)) cdd-next-pos cdd-id-start cdd-id-end - cdd-decl-res cdd-got-func cdd-got-type cdd-got-init + cdd-decl-res cdd-got-func cdd-got-init c-last-identifier-range cdd-exhausted cdd-after-block) ;; The following `while' applies `cdd-function' to a single declarator id ;; each time round. It loops only when CDD-LIST is non-nil. (while (and (not cdd-exhausted) - (setq cdd-decl-res (c-forward-declarator cdd-limit))) + (setq cdd-decl-res (c-forward-declarator + cdd-limit cdd-accept-anon cdd-not-top))) + (setq cdd-next-pos (point) cdd-id-start (car cdd-decl-res) cdd-id-end (cadr cdd-decl-res) - cdd-got-func (and (eq (char-after) ?\() - (or (not (c-major-mode-is 'c++-mode)) - (not cdd-not-top) - (car (cddr (cddr cdd-decl-res))) ; Id is in - ; parens, etc. - (save-excursion - (forward-char) - (c-forward-syntactic-ws) - (looking-at "[*&]"))) - (not (car (cddr cdd-decl-res))) - (or (not (c-major-mode-is 'c++-mode)) - (save-excursion - (let (c-last-identifier-range) - (forward-char) - (c-forward-syntactic-ws) - (catch 'is-function - (while - (progn - (while - (cond - ((looking-at c-decl-hangon-key) - (c-forward-keyword-clause 1)) - ((looking-at c-noise-macro-with-parens-name-re) - (c-forward-noise-clause)))) - (if (eq (char-after) ?\)) - (throw 'is-function t)) - (setq cdd-got-type (c-forward-type)) - (cond - ((null cdd-got-type) - (throw 'is-function nil)) - ((not (eq cdd-got-type 'maybe)) - (throw 'is-function t))) - (c-forward-declarator nil t) - (eq (char-after) ?,)) - (forward-char) - (c-forward-syntactic-ws)) - t))))) - cdd-got-init (and (cadr (cddr cdd-decl-res)) - (char-after))) + cdd-got-func (cadr (cddr (cddr cdd-decl-res))) + cdd-got-init (and (cadr (cddr cdd-decl-res)) (char-after))) ;; Jump past any initializer or function prototype to see if ;; there's a ',' to continue at. - (cond (cdd-got-func - ;; Skip a parenthesized initializer (C++) or a function - ;; prototype. - (if (c-go-list-forward (point) cdd-limit) ; over the parameter list. - (c-forward-syntactic-ws cdd-limit) - (setq cdd-exhausted t))) ; unbalanced parens - - (cdd-got-init ; "=" sign OR opening "(", "[", or "(" + (cond (cdd-got-init ; "=" sign OR opening "(", "[", or "(" ;; Skip an initializer expression in braces, whether or not (in ;; C++ Mode) preceded by an "=". Be careful that the brace list ;; isn't a code block or a struct (etc.) block. @@ -9872,8 +9918,9 @@ This function might do hidden buffer changes." (t (c-forward-syntactic-ws cdd-limit))) (if cdd-function - (funcall cdd-function cdd-id-start cdd-id-end cdd-next-pos - cdd-not-top cdd-got-func cdd-got-init)) + (save-excursion + (funcall cdd-function cdd-id-start cdd-id-end cdd-next-pos + cdd-not-top cdd-got-func cdd-got-init))) ;; If a ',' is found we set cdd-pos to the next declarator and iterate. (if (and cdd-list (< (point) cdd-limit) (looking-at ",")) diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index d2af53e837..8f930c5437 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el @@ -1092,7 +1092,7 @@ casts and declarations are fontified. Used on level 2 and higher." nil) (defun c-font-lock-declarators (limit list types not-top - &optional template-class) + &optional template-class accept-anon) ;; Assuming the point is at the start of a declarator in a declaration, ;; fontify the identifier it declares. (If TYPES is t, it does this via the ;; macro `c-fontify-types-and-refs'.) @@ -1112,6 +1112,8 @@ casts and declarations are fontified. Used on level 2 and higher." ;; a default (introduced by "="), it will be fontified as a type. ;; E.g. "". ;; + ;; ACCEPT-ANON is non-nil when we accept anonymous declarators. + ;; ;; Nil is always returned. The function leaves point at the delimiter after ;; the last declarator it processes. ;; @@ -1124,37 +1126,35 @@ casts and declarations are fontified. Used on level 2 and higher." limit list not-top (cond ((eq types t) 'c-decl-type-start) ((null types) 'c-decl-id-start)) - (lambda (id-start _id-end end-pos _not-top is-function init-char) + (lambda (id-start id-end end-pos _not-top is-function init-char) (if (eq types t) - ;; Register and fontify the identifier as a type. - (let ((c-promote-possible-types t)) - (goto-char id-start) - (c-forward-type)) - ;; The following doesn't work properly (yet, 2018-09-22). - ;; (c-put-font-lock-face id-start id-end - ;; (if is-function - ;; 'font-lock-function-name-face - ;; 'font-lock-variable-name-face)) - (when (and c-last-identifier-range - (not (get-text-property (car c-last-identifier-range) - 'face))) - ;; We use `c-last-identifier-range' rather than `id-start' and - ;; `id-end', since the latter two can be erroneous. E.g. in - ;; "~Foo", `id-start' is at the tilde. This is a bug in - ;; `c-forward-declarator'. - (c-put-font-lock-face (car c-last-identifier-range) - (cdr c-last-identifier-range) - (cond - ((not (memq types '(nil t))) types) - (is-function 'font-lock-function-name-face) - (t 'font-lock-variable-name-face))))) + (when id-start + ;; Register and fontify the identifier as a type. + (let ((c-promote-possible-types t)) + (goto-char id-start) + (c-forward-type))) + (when id-start + (goto-char id-start) + (when c-opt-identifier-prefix-key + (unless (and (looking-at c-opt-identifier-prefix-key) ; For operator~ + (eq (match-end 1) id-end)) + (while (and (< (point) id-end) + (re-search-forward c-opt-identifier-prefix-key id-end t)) + (c-forward-syntactic-ws limit)))) + (when (not (get-text-property (point) 'face)) + (c-put-font-lock-face (point) id-end + (cond + ((not (memq types '(nil t))) types) + (is-function 'font-lock-function-name-face) + (t 'font-lock-variable-name-face)))))) (and template-class (eq init-char ?=) ; C++ ""? (progn (goto-char end-pos) (c-forward-token-2 1 nil limit) ; Over "=" (let ((c-promote-possible-types t)) - (c-forward-type t)))))) + (c-forward-type t))))) + accept-anon) ; Last argument to c-do-declarators. nil)) (defun c-get-fontification-context (match-pos not-front-decl &optional toplev) @@ -1384,9 +1384,12 @@ casts and declarations are fontified. Used on level 2 and higher." 'c-decl-type-start 'c-decl-id-start))))) (c-font-lock-declarators - (min limit (point-max)) decl-list + (min limit (point-max)) + decl-list (not (null (cadr decl-or-cast))) - (not toplev) template-class)) + (not toplev) + template-class + (memq context '(decl <>)))) ;; A declaration has been successfully identified, so do all the ;; fontification of types and refs that've been recorded. diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el index 85f43d6a26..3b008fd6dc 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -934,6 +934,8 @@ This value is by default merged into `c-operators'." t))) (when ops (c-make-keywords-re 'appendable ops)))) +(c-lang-defvar c-opt-identifier-prefix-key + (c-lang-const c-opt-identifier-prefix-key)) (c-lang-defconst c-after-id-concat-ops "Operators that can occur after a binary operator on `c-identifier-ops' diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el index 9dd5ddb465..732b2b1054 100644 --- a/lisp/progmodes/cc-mode.el +++ b/lisp/progmodes/cc-mode.el @@ -2471,38 +2471,43 @@ with // and /*, not more generic line and block comments." (c-backward-syntactic-ws lim)) (when (setq pos1 (c-on-identifier)) (goto-char pos1) - (let ((lim (save-excursion - (and (c-beginning-of-macro) - (progn (c-end-of-macro) (point)))))) - (and (c-forward-declarator lim) - (if (and (eq (char-after) ?\() - (c-go-list-forward nil lim)) + (let* ((lim (save-excursion + (and (c-beginning-of-macro) + (progn (c-end-of-macro) (point))))) + (decl-res (c-forward-declarator lim))) + (if (or (cadr (cddr (cddr decl-res))) ; We scanned an arglist. + (and (eq (char-after) ?\() ; Move over a non arglist (...). + (prog1 (c-go-list-forward nil lim) + (c-forward-syntactic-ws lim)))) + (if (looking-at c-symbol-char-key) + ;; Deal with baz (foo((bar)) type var), where `pos' + ;; was inside foo, but foo((bar)) is not semantically + ;; valid. The result must be after var). (and - (progn (c-forward-syntactic-ws lim) - (not (eobp))) + (goto-char pos) + (setq pos1 (c-on-identifier)) + (goto-char pos1) (progn - (if (looking-at c-symbol-char-key) - ;; Deal with baz (foo((bar)) type var), where - ;; foo((bar)) is not semantically valid. The result - ;; must be after var). - (and - (goto-char pos) - (setq pos1 (c-on-identifier)) - (goto-char pos1) - (progn - (c-backward-syntactic-ws lim) - (eq (char-before) ?\()) - (c-fl-decl-end (1- (point)))) - (c-backward-syntactic-ws lim) - (point)))) - (if (progn (c-forward-syntactic-ws lim) - (not (eobp))) - (c-forward-over-token) - (let ((lit-start (c-literal-start))) - (when lit-start - (goto-char lit-start)) - (c-backward-syntactic-ws))) - (and (>= (point) pos) (point)))))))) + (c-backward-syntactic-ws lim) + (eq (char-before) ?\()) + (c-fl-decl-end (1- (point)))) + (c-backward-syntactic-ws lim) + (point)) + (if (progn (c-forward-syntactic-ws lim) + (not (eobp))) + (progn + (c-forward-over-token) + ;; Cope with having POS withing a syntactically invalid + ;; (...), by moving backward out of the parens and trying + ;; again. + (when (and (eq (char-before) ?\)) + (c-go-list-backward (point) lim)) + (c-fl-decl-end (point)))) + (let ((lit-start (c-literal-start))) + (when lit-start + (goto-char lit-start)) + (c-backward-syntactic-ws))) + (and (>= (point) pos) (point))))))) (defun c-change-expand-fl-region (_beg _end _old-len) ;; Expand the region (c-new-BEG c-new-END) to an after-change font-lock commit 48c9f9d31d3eab756595c05cd2d3aced0fd856ca Author: Stefan Kangas Date: Thu Sep 29 16:27:23 2022 +0200 ; * etc/NEWS: Announce last change. diff --git a/etc/NEWS b/etc/NEWS index 2f96072bfb..4b2e892f88 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2116,6 +2116,12 @@ It removes all marks from all files in the thumbnail and the associated Dired buffer, and is bound to 'U' in the thumbnail and display buffer. +--- +*** New command 'image-dired-do-flagged-delete'. +It deletes all flagged files, and is bound to 'x' in the thumbnail +buffer. It replaces the command 'image-dired-delete-marked', which is +now an obsolete alias. + --- *** New command 'image-dired-copy-filename-as-kill'. It copies the name of the marked or current image to the kill ring, commit 21fc2b04e9a831cbb5ffce71c3e4e4c35be0a8db Author: Peter Münster Date: Thu Sep 29 01:39:30 2022 +0200 New command image-dired-do-flagged-delete * lisp/image/image-dired.el (image-dired-delete-marked): Remove command, because it was too buggy. (image-dired-do-flagged-delete): New command that does almost the same as the above removed command but with flagged images. (image-dired-thumbnail-mode-map): Bind "x" to 'image-dired-do-flagged-delete'. diff --git a/lisp/image/image-dired.el b/lisp/image/image-dired.el index 661fa9dec1..8fb89d4502 100644 --- a/lisp/image/image-dired.el +++ b/lisp/image/image-dired.el @@ -905,6 +905,7 @@ You probably want to use this together with "m" #'image-dired-mark-thumb-original-file "u" #'image-dired-unmark-thumb-original-file "U" #'image-dired-unmark-all-marks + "x" #'image-dired-do-flagged-delete "." #'image-dired-track-original-file "" #'image-dired-jump-original-dired-buffer @@ -960,7 +961,7 @@ You probably want to use this together with ["Unmark image" image-dired-unmark-thumb-original-file] ["Unmark all images" image-dired-unmark-all-marks] ["Flag for deletion" image-dired-flag-thumb-original-file] - ["Delete marked images" image-dired-delete-marked] + ["Delete flagged images" image-dired-do-flagged-delete] "---" ["Rotate original right" image-dired-rotate-original-right] ["Rotate original left" image-dired-rotate-original-left] @@ -1341,18 +1342,22 @@ for deletion instead." "Check if file is flagged for deletion in associated Dired buffer." (image-dired-thumb-file-marked-p t)) -(defun image-dired-delete-marked () - "Delete current or marked thumbnails and associated images." +(defun image-dired-do-flagged-delete () + "Delete flagged thumbnails and associated images." (interactive nil image-dired-thumbnail-mode) (unless (derived-mode-p 'image-dired-thumbnail-mode) (user-error "Not in `image-dired-thumbnail-mode'")) - (image-dired--with-marked - (image-dired-delete-char) - (unless (bobp) - (backward-char))) + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (while (not (eobp)) + (if (image-dired-thumb-file-flagged-p) + (progn + (delete-char 1) + (forward-char)) + (forward-char 2)))) (image-dired--line-up-with-method) (image-dired--on-file-in-dired-buffer - (dired-do-delete))) + (dired-do-flagged-delete))) (defun image-dired--thumb-update-mark-at-point () (with-silent-modifications @@ -1950,6 +1955,8 @@ when using per-directory thumbnail file storage")) #'image-dired--get-create-thumbnail-file "29.1") (define-obsolete-function-alias 'image-dired-display-thumb-properties #'image-dired--update-header-line "29.1") +(define-obsolete-function-alias 'image-dired-delete-marked + #'image-dired-do-flagged-delete "29.1") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; TEST-SECTION ;;;;;;;;;;; commit 1457c231b52ea2c1694b7564f824b3a61d0e0fe1 Author: Peter Münster Date: Thu Sep 29 01:25:10 2022 +0200 image-dired-delete-char: Don't disturb formatting * lisp/image/image-dired.el (image-dired-delete-char): Don't disturb the expected formatting of the thumbnail buffer (always one space/newline after a thumbnail). diff --git a/lisp/image/image-dired.el b/lisp/image/image-dired.el index f4ae6e9bfd..661fa9dec1 100644 --- a/lisp/image/image-dired.el +++ b/lisp/image/image-dired.el @@ -460,7 +460,8 @@ and IMAGE-NUMBER." (defmacro image-dired--with-marked (&rest body) "Eval BODY with point on each marked thumbnail. If no marked file could be found, execute BODY on the current -thumbnail." +thumbnail. It's expected that a thumbnail is always followed +by exactly one space or one newline character." `(with-current-buffer image-dired-thumbnail-buffer (let (found) (save-mark-and-excursion @@ -1113,9 +1114,10 @@ With a negative prefix argument, prompt user for the delay." "Remove current thumbnail from thumbnail buffer and line up." (interactive nil image-dired-thumbnail-mode) (let ((inhibit-read-only t)) - (delete-char 1) - (when (= (following-char) ?\s) - (delete-char 1)))) + (delete-char 1)) + (let ((pos (point))) + (image-dired--line-up-with-method) + (goto-char pos))) (defun image-dired-line-up () "Line up thumbnails according to `image-dired-thumbs-per-row'. @@ -1364,7 +1366,9 @@ for deletion instead." '(face image-dired-thumb-mark)))))) (defun image-dired--thumb-update-marks () - "Update the marks in the thumbnail buffer." + "Update the marks in the thumbnail buffer. +It's expected, that a thumbnail is always followed +by exactly one space or one newline character." (when image-dired-thumb-visible-marks (with-current-buffer image-dired-thumbnail-buffer (save-mark-and-excursion commit 2c331dbb4eabadf9f58097591468658e096ba404 Author: Stefan Kangas Date: Thu Sep 29 16:10:27 2022 +0200 wallpaper-set: Get monitor name on non-graphical display * lisp/image/wallpaper.el (wallpaper--format-arg): Break out function from here... (wallpaper--x-monitor-name): ...to here. Try to get the monitor name non-graphical displays, and prompt if that doesn't work. (wallpaper-default-set-function): Improve debugging output. Ref. https://lists.gnu.org/r/emacs-devel/2022-09/msg01910.html diff --git a/lisp/image/wallpaper.el b/lisp/image/wallpaper.el index 3b32c5a415..80c9862916 100644 --- a/lisp/image/wallpaper.el +++ b/lisp/image/wallpaper.el @@ -396,6 +396,40 @@ See also `wallpaper-default-width'.") ;;; wallpaper-set +(defun wallpaper--x-monitor-name () + "Get the monitor name for `wallpaper-set'. +On a graphical display, try using the same monitor as the current +frame. +On a non-graphical display, try to get the name by connecting to +the display server directly, and run \"xrandr\" if that doesn't +work. Prompt for the monitor name if neither method works." + (if (or (display-graphic-p) + noninteractive) + (let-alist (car (display-monitor-attributes-list)) + (if (and .name (member .source '("XRandr" "XRandR 1.5" "Gdk"))) + .name + "0")) + (if-let ((name + (and (getenv "DISPLAY") + (or + (cdr (assq 'name + (progn + (x-open-connection (getenv "DISPLAY")) + (car (display-monitor-attributes-list + (car (last (terminal-list)))))))) + (and (executable-find "xrandr") + (with-temp-buffer + (call-process "xrandr" nil t nil) + (goto-char (point-min)) + (re-search-forward (rx bol + (group (+ (not (in " \n")))) + " connected") + nil t) + (match-string 1))))))) + ;; Prefer "0" to "default" as that works in XFCE. + (if (equal name "default") "0" name) + (read-string (format-prompt "Monitor name" nil))))) + (defun wallpaper--format-arg (format file) "Format a `wallpaper-command-args' argument ARG. FILE is the image file name." @@ -424,10 +458,7 @@ FILE is the image file name." (match-string 1 display) "0"))) ;; monitor name - (?M . ,(let-alist (car (display-monitor-attributes-list)) - (if (and .name (member .source '("XRandr" "XRandR 1.5" "Gdk"))) - .name - "0"))) + (?M . ,#'wallpaper--x-monitor-name) ;; workspace (?W . ,(or (and (fboundp 'x-window-property) (display-graphic-p) @@ -454,9 +485,7 @@ This is the default function for `wallpaper-set-function'." (unless wallpaper-command (error "Couldn't find a suitable command for setting the wallpaper")) (wallpaper-debug "Using command: \"%s %s\"" - wallpaper-command (string-join args " ")) - (wallpaper-debug (wallpaper--format-arg - "f=%f w=%w h=%h S=%S M=%M W=%W" file)) + wallpaper-command (string-join real-args " ")) (setf (process-sentinel process) (lambda (process status) (unwind-protect commit b71241742ca825c23063c22dcb205e95ac0fd710 Author: Stefan Kangas Date: Tue Sep 27 20:09:01 2022 +0200 Prompt for wallpaper width/height only when needed * lisp/image/wallpaper.el (wallpaper--format-arg): Don't prompt for width and height unless the values are actually used. diff --git a/lisp/image/wallpaper.el b/lisp/image/wallpaper.el index 0a891f9012..3b32c5a415 100644 --- a/lisp/image/wallpaper.el +++ b/lisp/image/wallpaper.el @@ -405,14 +405,16 @@ FILE is the image file name." (?F . ,(mapconcat #'url-hexify-string (file-name-split file) "/")) - (?h . ,(wallpaper--get-height-or-width - "height" - #'display-pixel-height - wallpaper-default-height)) - (?w . ,(wallpaper--get-height-or-width - "width" - #'display-pixel-width - wallpaper-default-width)) + (?h . ,(lambda () + (wallpaper--get-height-or-width + "height" + #'display-pixel-height + wallpaper-default-height))) + (?w . ,(lambda () + (wallpaper--get-height-or-width + "width" + #'display-pixel-width + wallpaper-default-width))) ;; screen number (?S . ,(let ((display (frame-parameter (selected-frame) 'display))) (if (and display commit 5281946fbf6b3cdbec5ce82e0057c71849faf4d2 Author: Stefan Kangas Date: Tue Sep 27 18:16:51 2022 +0200 Make format-spec accept function substitutions * lisp/format-spec.el (format-spec): Accept a function producing the substitution for a character. * doc/lispref/strings.texi (Custom Format Strings): Document the above change. * test/lisp/format-spec-tests.el (format-spec/function): New test. Ref. https://lists.gnu.org/r/emacs-devel/2022-09/msg01875.html diff --git a/doc/lispref/strings.texi b/doc/lispref/strings.texi index 374381e595..ba247a3eda 100644 --- a/doc/lispref/strings.texi +++ b/doc/lispref/strings.texi @@ -1293,6 +1293,11 @@ The order of specifications in @var{template} need not correspond to the order of associations in @var{spec-alist}. @end itemize +REPLACEMENT can also be a function taking no arguments, and returning +a string to be used for the replacement. It will only be called when +the corresponding LETTER is used in the TEMPLATE. This is useful, for +example, to avoid prompting for input unless it is needed. + The optional argument @var{ignore-missing} indicates how to handle specification characters in @var{template} that are not found in @var{spec-alist}. If it is @code{nil} or omitted, the function diff --git a/etc/NEWS b/etc/NEWS index 4bab95da51..2f96072bfb 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -3926,6 +3926,12 @@ the same but works by modifying LIST destructively. --- ** 'string-split' is now an alias for 'split-string'. ++++ +** 'format-spec' now accepts functions in the replacement. +The function is called only when used in the format string. This is +useful to avoid side-effects such as prompting, when the value is not +actually being used for anything. + +++ ** The variable 'max-specpdl-size' has been made obsolete. Now 'max-lisp-eval-depth' alone is used for limiting Lisp recursion diff --git a/lisp/format-spec.el b/lisp/format-spec.el index 45c19aebc8..60ff9f9086 100644 --- a/lisp/format-spec.el +++ b/lisp/format-spec.el @@ -59,6 +59,18 @@ value associated with ?b in SPECIFICATION, either padding it with leading zeros or truncating leading characters until it's ten characters wide\". +the substitution for a specification character can also be a +function, taking no arguments and returning a string to be used +for the replacement. It will only be called if FORMAT uses that +character. For example: + + (format-spec \"%n\" + \\=`((?n . ,(lambda () + (read-number \"Number: \"))))) + +Note that it is best to make sure the function is not quoted, +like above, so that it is compiled by the byte-compiler. + Any text properties of FORMAT are copied to the result, with any text properties of a %-spec itself copied to its substitution. @@ -94,14 +106,15 @@ is returned, where each format spec is its own element." (width (match-string 2)) (trunc (match-string 3)) (char (string-to-char (match-string 4))) - (text (assq char specification))) + (text (let ((res (cdr (assq char specification)))) + (if (functionp res) (funcall res) res)))) (when (and split (not (= (1- beg) split-start))) (push (buffer-substring split-start (1- beg)) split-result)) (cond (text ;; Handle flags. (setq text (format-spec--do-flags - (format "%s" (cdr text)) + (format "%s" text) (format-spec--parse-flags flags) (and width (string-to-number width)) (and trunc (car (read-from-string trunc 1))))) diff --git a/test/lisp/format-spec-tests.el b/test/lisp/format-spec-tests.el index 4a3cc74c33..bd493ae1d7 100644 --- a/test/lisp/format-spec-tests.el +++ b/test/lisp/format-spec-tests.el @@ -148,6 +148,17 @@ (format-spec fmt '((?b . "asd") (?a . "fgh"))) #("fgh%asdasd" 0 3 (a b) 3 4 (c d) 7 10 (e f)))))) +(ert-deftest format-spec/function () + (let* (called + (spec `((?a . "foo") + (?f . ,(lambda () + (setq called t) + "bar"))))) + (should (equal (format-spec "%a" spec) "foo")) + (should-not called) + (should (equal (format-spec "%f" spec) "bar")) + (should called))) + (ert-deftest format-spec-unknown () (should-error (format-spec "foo %b %z zot" '((?b . "bar")))) (should-error (format-spec "foo %b %%%z zot" '((?b . "bar")))) commit 64e8cc14b5e8a94b8e96df386d2fde9b45c9a111 (refs/remotes/origin/emacs-28) Author: Eli Zaretskii Date: Thu Sep 29 16:27:59 2022 +0300 ; * lisp/image.el (create-image): Fix last change in doc string. diff --git a/lisp/image.el b/lisp/image.el index 72b7862c95..186a30f4d9 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -479,11 +479,7 @@ automatically scaled up in proportion to the default font. Value is the image created, or nil if images of type TYPE are not supported. -Images should not be larger than specified by `max-image-size'. - -Image file names that are not absolute are searched for in the -\"images\" sub-directory of `data-directory' and -`x-bitmap-file-path' (in that order)." +Images should not be larger than specified by `max-image-size'." (let ((data-format ;; Pass the image format, if any, if this is data. (and data-p (or (plist-get props :format) t)))) commit 423bdd5f7f273f40f750eac83017074501d52823 Author: Stefan Kangas Date: Thu Sep 29 15:19:01 2022 +0200 ; Fix typos (prefer American spelling) diff --git a/doc/misc/modus-themes.org b/doc/misc/modus-themes.org index 1b4bf88a0c..fdc1dfcaba 100644 --- a/doc/misc/modus-themes.org +++ b/doc/misc/modus-themes.org @@ -5852,7 +5852,7 @@ interface virtually unusable. [[#h:5808be52-361a-4d18-88fd-90129d206f9b][Option for links]]. -Again, one must exercise judgement in order to avoid discrimination, +Again, one must exercise judgment in order to avoid discrimination, where "discrimination" refers to: + The treatment of substantially different magnitudes as if they were of @@ -5868,11 +5868,11 @@ usability beyond matters of color---they would be making a not-so-obvious error of treating different cases as if they were the same. -The Modus themes prioritise "thematic consistency" over abstract harmony +The Modus themes prioritize "thematic consistency" over abstract harmony or regularity among their applicable colors. In concrete terms, we do not claim that, say, our yellows are the best complements for our blues because we generally avoid using complementary colors side-by-side, so -it is wrong to optimise for a decontextualised blue+yellow combination. +it is wrong to optimize for a decontextualised blue+yellow combination. Not to imply that our colors do not work well together because they do, just to clarify that consistency of context is what themes must strive for, and that requires widening the scope of the design beyond the diff --git a/etc/themes/modus-themes.el b/etc/themes/modus-themes.el index 6296bf9025..a6bbdfe0bb 100644 --- a/etc/themes/modus-themes.el +++ b/etc/themes/modus-themes.el @@ -1435,7 +1435,7 @@ By default, customizing a theme-related user option through the Custom interfaces or with `customize-set-variable' will not reload the currently active Modus theme. -Enable this behaviour by setting this variable to nil." +Enable this behavior by setting this variable to nil." :group 'modus-themes :package-version '(modus-themes . "1.5.0") :version "28.1" diff --git a/lisp/comint.el b/lisp/comint.el index b2a04ea55a..e7d2136c84 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -3966,7 +3966,7 @@ an indirect buffer, whose major mode and syntax highlighting are set up according to `comint-indirect-setup-function'. After this setup is done, run this hook with the indirect buffer as the current buffer. This can be used to further customize -fontification and other behaviour of the indirect buffer." +fontification and other behavior of the indirect buffer." :group 'comint :type 'hook :version "29.1") diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index ed6b7b08a4..5ef2d7fe82 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -812,7 +812,7 @@ for speeding up processing.") (defun byte-compile-nilconstp (form) "Return non-nil if FORM always evaluates to a nil value." (setq form (byte-opt--bool-value-form form)) - (or (not form) ; assume (quote nil) always being normalised to nil + (or (not form) ; assume (quote nil) always being normalized to nil (and (consp form) (let ((head (car form))) ;; FIXME: There are many other expressions that are statically nil. @@ -1184,7 +1184,7 @@ See Info node `(elisp) Integer Basics'." (if (equal new-args (cdr form)) ;; Input is unchanged: keep original form, and don't represent ;; a nil result explicitly because that would lead to infinite - ;; growth when the optimiser is iterated. + ;; growth when the optimizer is iterated. (setq nil-result nil) (setq form (cons (car form) new-args))) diff --git a/lisp/ielm.el b/lisp/ielm.el index 4a10c00297..ad41cb1f6b 100644 --- a/lisp/ielm.el +++ b/lisp/ielm.el @@ -491,7 +491,7 @@ and syntax highlighting are set up with `emacs-lisp-mode'. In addition to `comint-indirect-setup-hook', run this hook with the indirect buffer as the current buffer after its setup is done. This can be used to further customize fontification and other -behaviour of the indirect buffer." +behavior of the indirect buffer." :type 'boolean :safe 'booleanp :version "29.1") diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index 753ae48087..d2af53e837 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el @@ -1972,7 +1972,7 @@ casts and declarations are fontified. Used on level 2 and higher." (c-forward-syntactic-ws limit)))) (defun c-font-lock-c++-modules (limit) - ;; Fontify the C++20 module stanzas, characterised by the keywords `module', + ;; Fontify the C++20 module stanzas, characterized by the keywords `module', ;; `export' and `import'. Note that this has to be done by a function (as ;; opposed to regexps) due to the presence of optional C++ attributes. ;; diff --git a/lisp/shell.el b/lisp/shell.el index 87fd36a592..18bb372242 100644 --- a/lisp/shell.el +++ b/lisp/shell.el @@ -324,7 +324,7 @@ enabled, is performed in an indirect buffer, whose indentation and syntax highlighting is set up with `sh-mode'. In addition to `comint-indirect-setup-hook', run this hook with the indirect buffer as the current buffer after its setup is done. This can -be used to further customize fontification and other behaviour of +be used to further customize fontification and other behavior of the indirect buffer." :type 'boolean :group 'shell diff --git a/test/lisp/net/mailcap-tests.el b/test/lisp/net/mailcap-tests.el index 8d047c7ff5..9e60a243b3 100644 --- a/test/lisp/net/mailcap-tests.el +++ b/test/lisp/net/mailcap-tests.el @@ -515,7 +515,7 @@ in ‘mailcap-mime-data’." In its current implementation ‘mailcap-add-mailcap-entry’ loses extra fields of an entry already existing in ‘mailcap-mime-data’. This test does not actually verify a correct result; it merely -checks whether ‘mailcap-add-mailcap-entry’ behaviour is still the +checks whether ‘mailcap-add-mailcap-entry’ behavior is still the incorrect one. As such, it can be satisfied by any other result than the expected and known wrong one, and its success does not help to verify the correct addition and merging of an entry." commit 0f94e62d7ef51c486956caa933f7cd5d21e4881b Author: समीर सिंह Sameer Singh Date: Thu Sep 29 16:33:10 2022 +0530 Add support for the Wancho script (bug#58159) * lisp/language/indian.el ("Wancho"): New language environment. Add sample text and input method. * lisp/international/fontset.el (script-representative-chars) (setup-default-fontset): Support Wancho. * lisp/leim/quail/indian.el ("wancho"): New input method. * etc/HELLO: Add a Wancho greeting. * etc/NEWS: Announce the new language environment. diff --git a/etc/HELLO b/etc/HELLO index 7e0e847521..1899b087e0 100644 --- a/etc/HELLO +++ b/etc/HELLO @@ -116,6 +116,7 @@ Turkish (Türkçe) Merhaba Ukrainian (українська) Вітаю Vietnamese (tiếng Việt) Chào bạn +Wancho (𞋒𞋀𞋉𞋃𞋕) 𞋂𞋈𞋛 japanese-jisx0208Japanese (日本語) こんにちは katakana-jisx0201/ コンニチハ diff --git a/etc/NEWS b/etc/NEWS index 97eac058f1..4bab95da51 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1261,6 +1261,7 @@ Lepcha script and language environment Meetei Mayek script and language environment Adlam script and language environment Mende Kikakui script and language environment +Wancho script and language environment --- *** The "Oriya" language environment was renamed to "Odia". diff --git a/lisp/international/fontset.el b/lisp/international/fontset.el index 0028c454af..ec505a0903 100644 --- a/lisp/international/fontset.el +++ b/lisp/international/fontset.el @@ -292,7 +292,7 @@ (counting-rod-numeral #x1D360) (nyiakeng-puachue-hmong #x1e100) (toto #x1E290) - (wancho #x1e2c0) + (wancho #x1E2C0 #x1E2E8 #x1E2EF) (nag-mundari #x1E4D0 #x1E4EB #x1E4F0) (mende-kikakui #x1E810 #x1E8A6) (adlam #x1E900 #x1E943) @@ -832,6 +832,7 @@ tai-xuan-jing-symbol counting-rod-numeral toto + wancho nag-mundari mende-kikakui adlam diff --git a/lisp/language/indian.el b/lisp/language/indian.el index 81b7cbd99b..bc8f532857 100644 --- a/lisp/language/indian.el +++ b/lisp/language/indian.el @@ -266,6 +266,17 @@ Meetei language and its script Meetei Mayek are supported in this language environment.")) '("Indian")) +(set-language-info-alist + "Wancho" '((charset unicode) + (coding-system utf-8) + (coding-priority utf-8) + (input-method . "wancho") + (sample-text . "Wancho (𞋒𞋀𞋉𞋃𞋕) 𞋂𞋈𞋛") + (documentation . "\ +Wancho language and its script are supported in this language +environment.")) + '("Indian")) + ;; Replace mnemonic characters in REGEXP according to TABLE. TABLE is ;; an alist of (MNEMONIC-STRING . REPLACEMENT-STRING). diff --git a/lisp/leim/quail/indian.el b/lisp/leim/quail/indian.el index 431d8369c1..443488c18d 100644 --- a/lisp/leim/quail/indian.el +++ b/lisp/leim/quail/indian.el @@ -2134,5 +2134,82 @@ is." ("`m" ?ꫲ) ("`?" ?꫱)) +(quail-define-package + "wancho" "Wancho" "𞋒" t "Wancho phonetic input method. + + `\\=`' is used to switch levels instead of Alt-Gr." + nil t t t t nil nil nil nil nil t) + +(quail-define-rules + ("``" ?𞋿) + ("1" ?𞋱) + ("`1" ?1) + ("2" ?𞋲) + ("`2" ?2) + ("3" ?𞋳) + ("`3" ?3) + ("4" ?𞋴) + ("`4" ?4) + ("5" ?𞋵) + ("`5" ?5) + ("6" ?𞋶) + ("`6" ?6) + ("7" ?𞋷) + ("`7" ?7) + ("8" ?𞋸) + ("`8" ?8) + ("9" ?𞋹) + ("`9" ?9) + ("0" ?𞋰) + ("`0" ?0) + ("q" ?𞋠) + ("Q" ?𞋡) + ("w" ?𞋒) + ("e" ?𞋛) + ("E" ?𞋧) + ("r" ?𞋗) + ("t" ?𞋋) + ("T" ?𞋌) + ("y" ?𞋆) + ("Y" ?𞋫) + ("u" ?𞋞) + ("U" ?𞋪) + ("i" ?𞋜) + ("I" ?𞋥) + ("o" ?𞋕) + ("O" ?𞋖) + ("`o" ?𞋢) + ("`O" ?𞋦) + ("p" ?𞋊) + ("P" ?𞋇) + ("a" ?𞋁) + ("A" ?𞋀) + ("`a" ?𞋤) + ("`A" ?𞋣) + ("s" ?𞋎) + ("S" ?𞋏) + ("d" ?𞋄) + ("f" ?𞋍) + ("g" ?𞋅) + ("h" ?𞋚) + ("j" ?𞋐) + ("k" ?𞋔) + ("K" ?𞋙) + ("l" ?𞋈) + ("L" ?𞋟) + ("z" ?𞋑) + ("x" ?𞋩) + ("X" ?𞋝) + ("c" ?𞋃) + ("C" ?𞋬) + ("v" ?𞋓) + ("V" ?𞋭) + ("b" ?𞋂) + ("B" ?𞋮) + ("n" ?𞋉) + ("N" ?𞋯) + ("m" ?𞋘) + ("M" ?𞋨)) + (provide 'indian) ;;; indian.el ends here commit 4577542eea273d4d30e4d987071225f4e19a4c19 Author: Stefan Kangas Date: Thu Sep 29 15:00:25 2022 +0200 Remove Emacs 21 compat code for gnus-user-agent * lisp/gnus/gnus.el (gnus-user-agent): No longer convert old (< 2005-01-10) symbol type values. diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el index 3a7edf9e08..64fc91ccff 100644 --- a/lisp/gnus/gnus.el +++ b/lisp/gnus/gnus.el @@ -2253,25 +2253,6 @@ string, be sure to use a valid format, see RFC 2616." (const :value config :tag "system configuration")))) (string))) -;; Convert old (< 2005-01-10) symbol type values: -(when (symbolp gnus-user-agent) - (setq gnus-user-agent - (cond ((eq gnus-user-agent 'emacs-gnus-config) - '(emacs gnus config)) - ((eq gnus-user-agent 'emacs-gnus-type) - '(emacs gnus type)) - ((eq gnus-user-agent 'emacs-gnus) - '(emacs gnus)) - ((eq gnus-user-agent 'gnus) - '(gnus)) - (t gnus-user-agent))) - (gnus-message 1 "Converted `gnus-user-agent' to `%s'." gnus-user-agent) - (sit-for 1) - (if (get 'gnus-user-agent 'saved-value) - (customize-save-variable 'gnus-user-agent gnus-user-agent) - (gnus-message 1 "Edit your init file to make this change permanent.") - (sit-for 2))) - (defcustom gnus-agent-eagerly-store-articles t "If non-nil, cache articles eagerly. commit f3e363239451514f674a9660b160f08bb77f5244 Author: Lars Ingebrigtsen Date: Thu Sep 29 13:05:36 2022 +0200 Update some Gnus documentation in the Emacs manual * doc/emacs/misc.texi (Gnus Group Buffer, Gnus Summary Buffer): Update documentation (bug#58145). diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi index 1367f26acf..2327411804 100644 --- a/doc/emacs/misc.texi +++ b/doc/emacs/misc.texi @@ -163,12 +163,12 @@ List killed groups (@code{gnus-group-list-killed}). List zombie groups (@code{gnus-group-list-zombies}). @kindex u @r{(Gnus Group mode)} -@findex gnus-group-toggle-subscription +@findex gnus-group-toggle-subscription-at-point @cindex subscribe groups @cindex unsubscribe groups @item u Toggle the subscription status of the group -(@code{gnus-group-toggle-subscription}) on the current line. +(@code{gnus-group-toggle-subscription-at-point}) on the current line. Invoking this on a killed or zombie group turns it into an unsubscribed group. @@ -246,7 +246,7 @@ buffer and typed @kbd{C-s} (@pxref{Incremental Search}). @kindex M-s M-s @r{(Gnus Summary mode)} @findex gnus-summary-search-article-forward -@item M-s @var{regexp} @key{RET} +@item M-s M-s @var{regexp} @key{RET} Search forward for articles containing a match for @var{regexp} (@code{gnus-summary-search-article-forward}). commit 0e72d4793c332f2eaba05130ea08e9809813f599 Author: Lars Ingebrigtsen Date: Thu Sep 29 12:29:36 2022 +0200 Tweak while-let definition * lisp/subr.el (while-let): Use if-let* since we don't need/want the backwards compat of if-let. diff --git a/lisp/subr.el b/lisp/subr.el index 2a8fc46a9f..4f8273d56f 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -2524,7 +2524,7 @@ The variable list SPEC is the same as in `if-let'." (let ((done (gensym "done"))) `(catch ',done (while t - (if-let ,spec + (if-let* ,spec (progn ,@body) (throw ',done nil)))))) commit 4cb9342a3bcc836db0dfcb38db6f11cb4e7bac7c Author: समीर सिंह Sameer Singh Date: Thu Sep 29 02:13:46 2022 +0530 Add support for the Mende Kikakui script (bug#58151) * lisp/language/misc-lang.el ("Mende Kikakui"): New language environment. Add sample text and input method. * lisp/international/fontset.el (script-representative-chars) (setup-default-fontset): Support Mende Kikakui, Indic Siyaq Numbers, Ottoman Siyaq Numbers. * lisp/leim/quail/misc-lang.el ("mende-kikakui"): New input method. * etc/HELLO: Add Mende Kikakui greeting. * etc/NEWS: Announce the new language environment. diff --git a/etc/HELLO b/etc/HELLO index 18c5ee5e54..7e0e847521 100644 --- a/etc/HELLO +++ b/etc/HELLO @@ -85,6 +85,7 @@ Maldivian (ދިވެހި) އައްސަލާމު ޢަލައިކުމް / ކިހިނ Maltese (il-Malti) Bonġu / Saħħa Mathematics ∀ p ∈ world • hello p □ Meetei Mayek (ꯃꯤꯇꯩ ꯃꯌꯦꯛ) ꯈꯨꯔꯨꯝꯖꯔꯤ +Mende Kikakui (𞠀𞠁𞠂) 𞠛𞠉 Modi (𑘦𑘻𑘚𑘲) 𑘡𑘦𑘭𑘿𑘎𑘰𑘨 Mongolian (монгол хэл) Сайн байна уу? Northern Thai (ᨣᩣᩴᨾᩮᩬᩥᨦ / ᨽᩣᩈᩣᩃ᩶ᩣ᩠ᨶᨶᩣ) ᩈ᩠ᩅᩢᩔ᩠ᨯᩦᨣᩕᩢ᩠ᨸ diff --git a/etc/NEWS b/etc/NEWS index 4c0c07b570..97eac058f1 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1260,6 +1260,7 @@ Kharoshthi script and language environment Lepcha script and language environment Meetei Mayek script and language environment Adlam script and language environment +Mende Kikakui script and language environment --- *** The "Oriya" language environment was renamed to "Odia". diff --git a/lisp/international/fontset.el b/lisp/international/fontset.el index 3cd7765ef8..0028c454af 100644 --- a/lisp/international/fontset.el +++ b/lisp/international/fontset.el @@ -294,10 +294,10 @@ (toto #x1E290) (wancho #x1e2c0) (nag-mundari #x1E4D0 #x1E4EB #x1E4F0) - (mende-kikakui #x1E810) + (mende-kikakui #x1E810 #x1E8A6) (adlam #x1E900 #x1E943) - (indic-siyaq-number #x1ec71) - (ottoman-siyaq-number #x1ed01) + (indic-siyaq-number #x1EC71 #x1EC9F) + (ottoman-siyaq-number #x1ED01 #x1ED27) (mahjong-tile #x1F000) (domino-tile #x1F030) (emoji #x1F300 #x1F600) @@ -833,8 +833,11 @@ counting-rod-numeral toto nag-mundari + mende-kikakui adlam tai-tham + indic-siyaq-number + ottoman-siyaq-number mahjong-tile domino-tile emoji diff --git a/lisp/language/misc-lang.el b/lisp/language/misc-lang.el index bd1edb9185..1f85c3973f 100644 --- a/lisp/language/misc-lang.el +++ b/lisp/language/misc-lang.el @@ -291,6 +291,20 @@ in this language environment."))) "[\x1E900-\x1E95F]+" 0 'font-shape-gstring))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Mende Kikakui +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(set-language-info-alist + "Mende Kikakui" '((charset unicode) + (coding-system utf-8) + (coding-priority utf-8) + (input-method . "mende-kikakui") + (sample-text . "Mende Kikakui (𞠀𞠁𞠂) 𞠛𞠉") + (documentation . "\ +Mende language and its script Kikakui are supported +in this language environment."))) + (provide 'misc-lang) ;;; misc-lang.el ends here diff --git a/lisp/leim/quail/misc-lang.el b/lisp/leim/quail/misc-lang.el index 6bafa6b5fb..1bf9de4d8c 100644 --- a/lisp/leim/quail/misc-lang.el +++ b/lisp/leim/quail/misc-lang.el @@ -1277,5 +1277,252 @@ ("`m" ?𞥋) ("`/" ?𞥟)) +(quail-define-package + "mende-kikakui" "Mende Kikakui" "𞠗" nil + "Mende Kikakui input method." nil t t t t nil nil nil nil nil t) + +(quail-define-rules + ("1" ?𞣇) + ("2" ?𞣈) + ("3" ?𞣉) + ("4" ?𞣊) + ("5" ?𞣋) + ("6" ?𞣌) + ("7" ?𞣍) + ("8" ?𞣎) + ("9" ?𞣏) + + (".1" ?𞣐) + (".2" ?𞣑) + (".3" ?𞣒) + (".4" ?𞣓) + (".5" ?𞣔) + (".6" ?𞣕) + (".7" ?𞣖) + + ("ki" ?𞠀) + ("ka" ?𞠁) + ("ku" ?𞠂) + ("kee" ?𞠃) + ("ke" ?𞠄) + ("koo" ?𞠅) + ("ko" ?𞠆) + ("kua" ?𞠇) + + ("wi" ?𞠈) + ("wa" ?𞠉) + ("wu" ?𞠊) + ("wee" ?𞠋) + ("we" ?𞠌) + ("woo" ?𞠍) + ("wo" ?𞠎) + ("wui" ?𞠏) + ("wei" ?𞠐) + + ("wvi" ?𞠑) + ("wua" ?𞠒) + ("wve" ?𞠓) + + ("min" ?𞠔) + ("man" ?𞠕) + ("mun" ?𞠖) + ("men" ?𞠗) + ("mon" ?𞠘) + ("muan" ?𞠙) + ("muen" ?𞠚) + + ("bi" ?𞠛) + ("ba" ?𞠜) + ("bu" ?𞠝) + ("bee" ?𞠞) + ("be" ?𞠟) + ("boo" ?𞠠) + ("bo" ?𞠡) + + ("i" ?𞠢) + ("a" ?𞠣) + ("u" ?𞠤) + ("ee" ?𞠥) + ("e" ?𞠦) + ("oo" ?𞠧) + ("o" ?𞠨) + ("ei" ?𞠩) + ("in" ?𞠪) + ("inn" ?𞠫) + ("an" ?𞠬) + ("en" ?𞠭) + + ("si" ?𞠮) + ("sa" ?𞠯) + ("su" ?𞠰) + ("see" ?𞠱) + ("se" ?𞠲) + ("soo" ?𞠳) + ("so" ?𞠴) + ("sia" ?𞠵) + + ("li" ?𞠶) + ("la" ?𞠷) + ("lu" ?𞠸) + ("lee" ?𞠹) + ("le" ?𞠺) + ("loo" ?𞠻) + ("lo" ?𞠼) + ("lle" ?𞠽) + + ("di" ?𞠾) + ("da" ?𞠿) + ("du" ?𞡀) + ("dee" ?𞡁) + ("doo" ?𞡂) + ("do" ?𞡃) + + ("ti" ?𞡄) + ("ta" ?𞡅) + ("tu" ?𞡆) + ("tee" ?𞡇) + ("te" ?𞡈) + ("too" ?𞡉) + ("to" ?𞡊) + + ("ji" ?𞡋) + ("ja" ?𞡌) + ("ju" ?𞡍) + ("jee" ?𞡎) + ("je" ?𞡏) + ("joo" ?𞡐) + ("jo" ?𞡑) + ("jjo" ?𞡒) + + ("yi" ?𞡓) + ("ya" ?𞡔) + ("yu" ?𞡕) + ("yee" ?𞡖) + ("ye" ?𞡗) + ("yoo" ?𞡘) + ("yo" ?𞡙) + + ("fi" ?𞡚) + ("fa" ?𞡛) + ("fu" ?𞡜) + ("fee" ?𞡝) + ("fe" ?𞡞) + ("foo" ?𞡟) + ("fo" ?𞡠) + ("fua" ?𞡡) + ("fan" ?𞡢) + + ("nin" ?𞡣) + ("nan" ?𞡤) + ("nun" ?𞡥) + ("nen" ?𞡦) + ("non" ?𞡧) + + ("hi" ?𞡨) + ("ha" ?𞡩) + ("hu" ?𞡪) + ("hee" ?𞡫) + ("he" ?𞡬) + ("hoo" ?𞡭) + ("ho" ?𞡮) + ("heei" ?𞡯) + ("hoou" ?𞡰) + ("hin" ?𞡱) + ("han" ?𞡲) + ("hun" ?𞡳) + ("hen" ?𞡴) + ("hon" ?𞡵) + ("huan" ?𞡶) + + ("nggi" ?𞡷) + ("ngga" ?𞡸) + ("nggu" ?𞡹) + ("nggee" ?𞡺) + ("ngge" ?𞡻) + ("nggoo" ?𞡼) + ("nggo" ?𞡽) + ("nggaa" ?𞡾) + ("nggua" ?𞡿) + ("nngge" ?𞢀) + ("nnggoo" ?𞢁) + ("nnggo" ?𞢂) + + ("gi" ?𞢃) + ("ga" ?𞢄) + ("gu" ?𞢅) + ("gee" ?𞢆) + ("guei" ?𞢇) + ("guan" ?𞢈) + + ("ngen" ?𞢉) + ("ngon" ?𞢊) + ("nguan" ?𞢋) + + ("pi" ?𞢌) + ("pa" ?𞢍) + ("pu" ?𞢎) + ("pee" ?𞢏) + ("pe" ?𞢐) + ("poo" ?𞢑) + ("po" ?𞢒) + + ("mbi" ?𞢓) + ("mba" ?𞢔) + ("mbu" ?𞢕) + ("mbee" ?𞢖) + ("mmbee" ?𞢗) + ("mbe" ?𞢘) + ("mboo" ?𞢙) + ("mbo" ?𞢚) + ("mbuu" ?𞢛) + ("mmbe" ?𞢜) + ("mmboo" ?𞢝) + ("mmbo" ?𞢞) + + ("kpi" ?𞢟) + ("kpa" ?𞢠) + ("kpu" ?𞢡) + ("kpee" ?𞢢) + ("kpe" ?𞢣) + ("kpoo" ?𞢤) + ("kpo" ?𞢥) + + ("gbi" ?𞢦) + ("gba" ?𞢧) + ("gbu" ?𞢨) + ("gbee" ?𞢩) + ("gbe" ?𞢪) + ("gboo" ?𞢫) + ("gbo" ?𞢬) + + ("ra" ?𞢭) + + ("ndi" ?𞢮) + ("nda" ?𞢯) + ("ndu" ?𞢰) + ("ndee" ?𞢱) + ("nde" ?𞢲) + ("ndoo" ?𞢳) + ("ndo" ?𞢴) + + ("nja" ?𞢵) + ("nju" ?𞢶) + ("njee" ?𞢷) + ("njoo" ?𞢸) + + ("vi" ?𞢹) + ("va" ?𞢺) + ("vu" ?𞢻) + ("vee" ?𞢼) + ("ve" ?𞢽) + ("voo" ?𞢾) + ("vo" ?𞢿) + + ("nyin" ?𞣀) + ("nyan" ?𞣁) + ("nyun" ?𞣂) + ("nyen" ?𞣃) + ("nyon" ?𞣄)) + (provide 'misc-lang) ;;; misc-lang.el ends here