commit 2973f91fb3de824cd21399dc5cd298d4b8be4022 (HEAD, refs/remotes/origin/master) Author: Stefan Kangas Date: Mon Oct 3 03:53:22 2022 +0200 Improve auto-insert-mode documentation * lisp/autoinsert.el: Improve usage instructions and formatting. (auto-insert-directory): Doc fix; the directory does not have to end in slash. diff --git a/lisp/autoinsert.el b/lisp/autoinsert.el index 29d10bc629..580f6b3ced 100644 --- a/lisp/autoinsert.el +++ b/lisp/autoinsert.el @@ -1,7 +1,6 @@ ;;; autoinsert.el --- automatic mode-dependent insertion of text into new files -*- lexical-binding: t -*- -;; Copyright (C) 1985-1987, 1994-1995, 1998, 2000-2022 Free Software -;; Foundation, Inc. +;; Copyright (C) 1985-2022 Free Software Foundation, Inc. ;; Author: Charlie Martin ;; Adapted-By: Daniel Pfeiffer @@ -25,27 +24,27 @@ ;;; Commentary: -;; The following defines an association list for text to be -;; automatically inserted when a new file is created, and a function -;; which automatically inserts these files; the idea is to insert -;; default text much as the mode is automatically set using -;; auto-mode-alist. +;; The following defines an association list for text to be +;; automatically inserted when a new file is created, and a function +;; which automatically inserts these files; the idea is to insert +;; default text much as the mode is automatically set using +;; auto-mode-alist. +;; +;; To use, add this to your Init file: ;; -;; To use: ;; (auto-insert-mode t) -;; setq auto-insert-directory to an appropriate slash-terminated value +;; (setq auto-insert-directory "~/some-dir") ;; -;; You can also customize the variable `auto-insert-mode' to load the -;; package. Alternatively, add the following to your init file: -;; (auto-insert-mode 1) +;; You can also customize the variable `auto-insert-mode' to load the +;; package. ;; -;; Author: Charlie Martin -;; Department of Computer Science and -;; National Biomedical Simulation Resource -;; Box 3709 -;; Duke University Medical Center -;; Durham, NC 27710 -;; (crm@cs.duke.edu,mcnc!duke!crm) +;; Author: Charlie Martin +;; Department of Computer Science and +;; National Biomedical Simulation Resource +;; Box 3709 +;; Duke University Medical Center +;; Durham, NC 27710 +;; (crm@cs.duke.edu,mcnc!duke!crm) ;;; Code: @@ -348,9 +347,7 @@ described above, e.g. [\"header.insert\" date-and-author-update]." ;; Establish a default value for auto-insert-directory (defcustom auto-insert-directory "~/insert/" - "Directory from which auto-inserted files are taken. -The value must be an absolute directory name; -thus, on a GNU or Unix system, it must end in a slash." + "Directory from which auto-inserted files are taken." :type 'directory) commit 395119998574051e53d466d55136d3e6498e90ef Author: Paul Eggert Date: Sun Oct 2 16:49:20 2022 -0700 Port TZ settings to POSIX * lisp/Makefile.in (.el.elc): * lisp/net/tramp-sh.el (tramp-sh-handle-set-file-times): * lisp/net/tramp-sudoedit.el (tramp-sudoedit-handle-set-file-times): Use the POSIX standard TZ=UTC0 rather than the GNU extension TZ=UTC to set the time zone to UTC. diff --git a/lisp/Makefile.in b/lisp/Makefile.in index e66d80f814..4c26e42370 100644 --- a/lisp/Makefile.in +++ b/lisp/Makefile.in @@ -315,7 +315,7 @@ ifeq ($(ANCIENT),yes) .el.elc: $(AM_V_ELC)$(emacs) $(BYTE_COMPILE_FLAGS) \ -l comp -f batch-byte-compile $< - TZ=UTC touch -t 197001010000 $@ + TZ=UTC0 touch -t 197001010000 $@ else .el.elc: $(AM_V_ELC)$(emacs) $(BYTE_COMPILE_FLAGS) \ diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 1d0d0f8b1b..3240f5352a 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -1528,7 +1528,7 @@ of." time))) (tramp-send-command-and-check v (format - "env TZ=UTC %s %s %s %s" + "env TZ=UTC0 %s %s %s %s" (tramp-get-remote-touch v) (if (tramp-get-connection-property v "touch-t") (format "-t %s" (format-time-string "%Y%m%d%H%M.%S" time t)) diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el index f8b602e34c..dc87c590b3 100644 --- a/lisp/net/tramp-sudoedit.el +++ b/lisp/net/tramp-sudoedit.el @@ -568,7 +568,7 @@ the result will be a local, non-Tramp, file name." nil time))) (tramp-sudoedit-send-command - v "env" "TZ=UTC" "touch" "-t" + v "env" "TZ=UTC0" "touch" "-t" (format-time-string "%Y%m%d%H%M.%S" time t) (if (eq flag 'nofollow) "-h" "") (tramp-compat-file-name-unquote localname))))) commit 0d0d59b32c66f6b0604cb7c89b875d0407fba41c Author: Stefan Kangas Date: Mon Oct 3 00:13:56 2022 +0200 Actually delete markers in dired-do-flagged-delete * lisp/dired.el (dired-do-flagged-delete): Actually delete markers. (Bug#58256) diff --git a/lisp/dired.el b/lisp/dired.el index b9e89292e2..96b580d576 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -3664,16 +3664,16 @@ non-empty directories is allowed." case-fold-search markers) (if (save-excursion (goto-char (point-min)) (re-search-forward regexp nil t)) - (dired-internal-do-deletions - (nreverse - ;; this can't move point since ARG is nil - (dired-map-over-marks (cons (dired-get-filename) - (let ((m (point-marker))) - (push m markers) - m)) - nil)) - nil t) - (dolist (m markers) (set-marker m nil)) + (progn + (dired-internal-do-deletions + (nreverse + (dired-map-over-marks (cons (dired-get-filename) + (let ((m (point-marker))) + (push m markers) + m)) + nil)) + nil t) + (dolist (m markers) (set-marker m nil))) (or nomessage (message "(No deletions requested)"))))) commit 655c92ce4aa9ba2d21622074f74064c86f7f2fad Author: Stefan Kangas Date: Mon Oct 3 00:03:34 2022 +0200 Fix more overly long docstrings in eieio * lisp/emacs-lisp/eieio.el (defclass): Fix more overly long docstrings. (Bug#58252) diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el index a6c900a335..8351d97b13 100644 --- a/lisp/emacs-lisp/eieio.el +++ b/lisp/emacs-lisp/eieio.el @@ -218,10 +218,11 @@ and reference them using the function `class-option'." (when (and eieio-backward-compatibility (eq alloc :class)) ;; FIXME: How could I declare this *method* as obsolete. (push `(cl-defmethod ,acces ((this (subclass ,name))) - ,(format - "Retrieve the class slot `%S' from a class `%S'. -This method is obsolete." - sname name) + ,(concat + (internal--format-docstring-line + "Retrieve the class slot `%S' from a class `%S'." + sname name) + "\nThis method is obsolete.") (if (slot-boundp this ',sname) (eieio-oref-default this ',sname))) accessors))) @@ -230,16 +231,18 @@ This method is obsolete." ;; name whose purpose is to set the value of the slot. (if writer (push `(cl-defmethod ,writer ((this ,name) value) - ,(format "Set the slot `%S' of an object of class `%S'." - sname name) + ,(internal--format-docstring-line + "Set the slot `%S' of an object of class `%S'." + sname name) (setf (slot-value this ',sname) value)) accessors)) ;; If a reader is defined, then create a generic method ;; of that name whose purpose is to access this slot value. (if reader (push `(cl-defmethod ,reader ((this ,name)) - ,(format "Access the slot `%S' from object of class `%S'." - sname name) + ,(internal--format-docstring-line + "Access the slot `%S' from object of class `%S'." + sname name) (slot-value this ',sname)) accessors)) )) commit 190582adf416790e072ec5a605bd43048a82784a Author: Paul Eggert Date: Sun Oct 2 13:47:09 2022 -0700 Donโ€™t truncate seccomp-filter diagnostic * lib-src/seccomp-filter.c (fail): Do not truncate diagnostic arbitrarily to 1000 bytes when ERROR is nonzero. diff --git a/lib-src/seccomp-filter.c b/lib-src/seccomp-filter.c index 061af9dc07..041bf5c749 100644 --- a/lib-src/seccomp-filter.c +++ b/lib-src/seccomp-filter.c @@ -69,19 +69,16 @@ fail (int error, const char *format, ...) { va_list ap; va_start (ap, format); + vfprintf (stderr, format, ap); + va_end (ap); if (error == 0) - { - vfprintf (stderr, format, ap); - fputc ('\n', stderr); - } + fputc ('\n', stderr); else { - char buffer[1000]; - vsnprintf (buffer, sizeof buffer, format, ap); + fputs (": ", stderr); errno = error; - perror (buffer); + perror (NULL); } - va_end (ap); fflush (NULL); exit (EXIT_FAILURE); } commit 5598886adc9f7bc83ba9775151f839d4691128e4 Author: Paul Eggert Date: Sun Oct 2 13:37:39 2022 -0700 Prefer static_assert to verify in seccomp-filter Prefer static_assert in just one file for now; the idea is to do it elsewhere eventually. static_assert is standard (starting with C23) whereas verify is not, and static_assert can be used even in pre-C23 files due to Gnulibโ€™s support for it. * lib-src/seccomp-filter.c: Do not include verify.h. Prefer static_assert to verify. diff --git a/lib-src/seccomp-filter.c b/lib-src/seccomp-filter.c index 4bd2816dfc..061af9dc07 100644 --- a/lib-src/seccomp-filter.c +++ b/lib-src/seccomp-filter.c @@ -59,7 +59,6 @@ variants of those files that can be used to sandbox Emacs before #include #include -#include #ifndef ARCH_CET_STATUS #define ARCH_CET_STATUS 0x3001 @@ -167,12 +166,12 @@ main (int argc, char **argv) set_attribute (SCMP_FLTATR_CTL_NNP, 1); set_attribute (SCMP_FLTATR_CTL_TSYNC, 1); - verify (CHAR_BIT == 8); - verify (sizeof (int) == 4 && INT_MIN == INT32_MIN - && INT_MAX == INT32_MAX); - verify (sizeof (long) == 8 && LONG_MIN == INT64_MIN - && LONG_MAX == INT64_MAX); - verify (sizeof (void *) == 8); + static_assert (CHAR_BIT == 8); + static_assert (sizeof (int) == 4 && INT_MIN == INT32_MIN + && INT_MAX == INT32_MAX); + static_assert (sizeof (long) == 8 && LONG_MIN == INT64_MIN + && LONG_MAX == INT64_MAX); + static_assert (sizeof (void *) == 8); assert ((uintptr_t) NULL == 0); /* Allow a clean exit. */ @@ -182,8 +181,8 @@ main (int argc, char **argv) /* Allow `mmap' and friends. This is necessary for dynamic loading, reading the portable dump file, and thread creation. We don't allow pages to be both writable and executable. */ - verify (MAP_PRIVATE != 0); - verify (MAP_SHARED != 0); + static_assert (MAP_PRIVATE != 0); + static_assert (MAP_SHARED != 0); RULE (SCMP_ACT_ALLOW, SCMP_SYS (mmap), SCMP_A2_32 (SCMP_CMP_MASKED_EQ, ~(PROT_NONE | PROT_READ | PROT_WRITE)), @@ -255,9 +254,9 @@ main (int argc, char **argv) /* Allow opening files, assuming they are only opened for reading. */ - verify (O_WRONLY != 0); - verify (O_RDWR != 0); - verify (O_CREAT != 0); + static_assert (O_WRONLY != 0); + static_assert (O_RDWR != 0); + static_assert (O_CREAT != 0); RULE (SCMP_ACT_ALLOW, SCMP_SYS (open), SCMP_A1_32 (SCMP_CMP_MASKED_EQ, ~(O_RDONLY | O_BINARY | O_CLOEXEC | O_PATH commit 3cc1706c63fde2e5a6313537817db2d32e829b6a Author: Alan Mackenzie Date: Sun Oct 2 20:31:12 2022 +0000 Suppress irritating/misleading message in make bootstrap about old .elc files These are the "compile-first" .elc files, artificially given an old timestamp to cause them later to be native compiled. This fixes bug #58224. * lisp/Makefile.in (compile-first .el.elc): Give these .elc's the UTC epoch. Amend the comment. * src/lread.c (Fload): New variable, epoch_timestamp, initialized to binary zero. Compare with this the timestamp of .elc's being loaded, and if they match, don't output the message about the source file being newer than the file being loaded. diff --git a/lisp/Makefile.in b/lisp/Makefile.in index bcf4a3146d..e66d80f814 100644 --- a/lisp/Makefile.in +++ b/lisp/Makefile.in @@ -304,16 +304,18 @@ endif ifeq ($(HAVE_NATIVE_COMP),yes) ifeq ($(ANCIENT),yes) # The first compilation of compile-first, using an interpreted compiler: -# The resulting .elc files get given a date of 1971-01-01 so that their -# date stamp is earlier than the source files, causing these to be compiled -# into native code at the second recursive invocation of this $(MAKE), -# using these .elc's. This is faster than just compiling the native code -# directly using the interpreted compile-first files. (Note: 1970-01-01 -# fails on some systems.) +# The resulting .elc files get given a timestamp of the Unix epoch, +# 1970-01-01, so that their timestamps are earlier than the source files, +# causing these to be compiled into native code at the second recursive +# invocation of this $(MAKE), using these .elc's. This is faster than just +# compiling the native code directly using the interpreted compile-first +# files. Note that the epoch date is hard-coded into Fload in src/lread.c +# which uses it to avoid displaying certain messages which might be +# irritating/misleading during a bootstrap. .el.elc: $(AM_V_ELC)$(emacs) $(BYTE_COMPILE_FLAGS) \ -l comp -f batch-byte-compile $< - touch -t 197101010000 $@ + TZ=UTC touch -t 197001010000 $@ else .el.elc: $(AM_V_ELC)$(emacs) $(BYTE_COMPILE_FLAGS) \ diff --git a/src/lread.c b/src/lread.c index 51cbf811ba..dfa4d9afb5 100644 --- a/src/lread.c +++ b/src/lread.c @@ -1423,6 +1423,7 @@ Return t if the file exists and loads successfully. */) struct stat s1, s2; int result; + struct timespec epoch_timespec = {(time_t)0, 0}; /* 1970-01-01T00:00 UTC */ if (version < 0 && !(version = safe_to_load_version (file, fd))) error ("File `%s' was not compiled in Emacs", SDATA (found)); @@ -1451,7 +1452,12 @@ Return t if the file exists and loads successfully. */) newer = 1; /* If we won't print another message, mention this anyway. */ - if (!NILP (nomessage) && !force_load_messages) + if (!NILP (nomessage) && !force_load_messages + /* We don't want this message during + bootstrapping for the "compile-first" .elc + files, which have had their timestamps set to + the epoch. See bug #58224. */ + && timespec_cmp (get_stat_mtime (&s1), epoch_timespec)) { Lisp_Object msg_file; msg_file = Fsubstring (found, make_fixnum (0), make_fixnum (-1)); commit ffce59b3ade02c696f06f73f81e2df2e5f72ae07 Author: Paul Eggert Date: Sun Oct 2 13:05:02 2022 -0700 * .gitignore: Add lib/assert.h (Bug#58254). diff --git a/.gitignore b/.gitignore index eb77b2388f..c10b3b33d3 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,7 @@ src/emacs-module.h # C-level sources built by 'make'. lib/alloca.h +lib/assert.h lib/byteswap.h lib/dirent.h lib/errno.h commit 5e37b27ce9785b7b67506f44318fc56d3ce517e5 Author: Juri Linkov Date: Sun Oct 2 21:50:08 2022 +0300 * lisp/vc/vc-git.el (vc-git-checkin): Add more checks for vc-git-patch-string Check that vc-git-patch-string contains the same changes that already exists in the staged area when files were added/removed by vc commands (bug#52349). diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 9cc1aee674..4a2a42ad2a 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -1015,7 +1015,31 @@ It is based on `log-edit-mode', and has Git-specific extensions." (make-nearby-temp-file "git-msg"))))) (when vc-git-patch-string (unless (zerop (vc-git-command nil t nil "diff" "--cached" "--quiet")) - (user-error "Index not empty")) + ;; Check that all staged changes also exist in the patch. + ;; This is needed to allow adding/removing files that are + ;; currently staged to the index. So remove the whole file diff + ;; from the patch because commit will take it from the index. + (with-temp-buffer + (vc-git-command (current-buffer) t nil "diff" "--cached") + (goto-char (point-min)) + (let ((pos (point)) file-diff file-beg) + (while (not (eobp)) + (forward-line 1) ; skip current "diff --git" line + (search-forward "diff --git" nil 'move) + (move-beginning-of-line 1) + (setq file-diff (buffer-substring pos (point))) + (if (and (setq file-beg (string-search + file-diff vc-git-patch-string)) + ;; Check that file diff ends with an empty string + ;; or the beginning of the next file diff. + (string-match-p "\\`\\'\\|\\`diff --git" + (substring + vc-git-patch-string + (+ file-beg (length file-diff))))) + (setq vc-git-patch-string + (string-replace file-diff "" vc-git-patch-string)) + (user-error "Index not empty")) + (setq pos (point)))))) (let ((patch-file (make-temp-file "git-patch"))) (with-temp-file patch-file (insert vc-git-patch-string)) commit c37fda9e3117c8948ee691c79ccf747d45137d97 Author: Juri Linkov Date: Sun Oct 2 21:34:57 2022 +0300 In vc-git-log-incoming use the repository in the command "fetch" (bug#50340) * lisp/vc/vc-git.el (vc-git-log-incoming): Use repository part from non-nil remote-location in the command "fetch". * lisp/vc/vc.el (vc-log-incoming, vc-log-outgoing): Mention in docstrings and prompts that REMOTE-LOCATION can be a remote branch name. * doc/emacs/maintaining.texi (VC Change Log): For commands vc-log-incoming and vc-log-outgoing, use the term "remote location" instead of "repository". diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi index 6ceda6d7a5..6857e67def 100644 --- a/doc/emacs/maintaining.texi +++ b/doc/emacs/maintaining.texi @@ -1041,13 +1041,14 @@ revision at point. A second @key{RET} hides it again. (@code{vc-log-incoming}) command displays a log buffer showing the changes that will be applied, the next time you run the version control system's pull command to get new revisions from another -repository (@pxref{Pulling / Pushing}). This other repository is the default +remote location (@pxref{Pulling / Pushing}). This other remote location is the default one from which changes are pulled, as defined by the version control system; with a prefix argument, @code{vc-log-incoming} prompts for a -specific repository. Similarly, @kbd{C-x v O} +specific remote location. Similarly, @kbd{C-x v O} (@code{vc-log-outgoing}) shows the changes that will be sent to -another repository, the next time you run the push command; with a -prefix argument, it prompts for a specific destination repository. +another remote location, the next time you run the push command; with a +prefix argument, it prompts for a specific destination that +in case of some version control system can be a branch name. @cindex VC log buffer, commands in @cindex vc-log buffer diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 87f6a5a37c..9cc1aee674 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -1322,7 +1322,12 @@ If LIMIT is a revision string, use it as an end-revision." (defun vc-git-log-incoming (buffer remote-location) (vc-setup-buffer buffer) - (vc-git-command nil 0 nil "fetch") + (vc-git-command nil 0 nil "fetch" + (unless (string= remote-location "") + ;; `remote-location' is in format "repository/branch", + ;; so remove everything except a repository name. + (replace-regexp-in-string + "/.*" "" remote-location))) (vc-git-command buffer 'async nil "log" diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index 25bb0c848d..787dd51d07 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -2765,10 +2765,11 @@ with its diffs (if the underlying VCS supports that)." ;;;###autoload (defun vc-log-incoming (&optional remote-location) "Show log of changes that will be received with pull from REMOTE-LOCATION. -When called interactively with a prefix argument, prompt for REMOTE-LOCATION." +When called interactively with a prefix argument, prompt for REMOTE-LOCATION. +In some version control systems REMOTE-LOCATION can be a remote branch name." (interactive (when current-prefix-arg - (list (read-string "Remote location (empty for default): ")))) + (list (read-string "Remote location/branch (empty for default): ")))) (let ((backend (vc-deduce-backend))) (unless backend (error "Buffer is not version controlled")) @@ -2778,10 +2779,11 @@ When called interactively with a prefix argument, prompt for REMOTE-LOCATION." ;;;###autoload (defun vc-log-outgoing (&optional remote-location) "Show log of changes that will be sent with a push operation to REMOTE-LOCATION. -When called interactively with a prefix argument, prompt for REMOTE-LOCATION." +When called interactively with a prefix argument, prompt for REMOTE-LOCATION. +In some version control systems REMOTE-LOCATION can be a remote branch name." (interactive (when current-prefix-arg - (list (read-string "Remote location (empty for default): ")))) + (list (read-string "Remote location/branch (empty for default): ")))) (let ((backend (vc-deduce-backend))) (unless backend (error "Buffer is not version controlled")) commit d4f56e96665f1d2d98ce645d32d587013e8b8116 Author: Peter Mรผnster Date: Sun Oct 2 20:12:32 2022 +0200 Delete thumbs in image-dired-do-flagged-delete after confirmation * lisp/image/image-dired.el (image-dired-do-flagged-delete): Remove thumbnails only after confirming deletion of the files. (Bug#58255) diff --git a/lisp/image/image-dired.el b/lisp/image/image-dired.el index 8fb89d4502..c9d6741140 100644 --- a/lisp/image/image-dired.el +++ b/lisp/image/image-dired.el @@ -1347,17 +1347,21 @@ for deletion instead." (interactive nil image-dired-thumbnail-mode) (unless (derived-mode-p 'image-dired-thumbnail-mode) (user-error "Not in `image-dired-thumbnail-mode'")) - (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-flagged-delete))) + (image-dired--with-dired-buffer + (dired-do-flagged-delete)) + (let (deletions) + (save-excursion + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (while (not (eobp)) + (let ((file-name (image-dired-original-file-name))) + (if (image-dired--with-dired-buffer (dired-goto-file file-name)) + (forward-char 2) + (delete-char 1) + (forward-char) + (setq deletions t)))))) + (if deletions + (image-dired--line-up-with-method)))) (defun image-dired--thumb-update-mark-at-point () (with-silent-modifications commit 70b58d3eb46a9044818f8184cf27d1c5a4097d24 Author: Juri Linkov Date: Sun Oct 2 21:14:42 2022 +0300 * lisp/repeat.el (repeat): New customization group. (repeat-too-dangerous, repeat-on-final-keystroke) (repeat-exit-key, repeat-exit-timeout, repeat-keep-prefix) (repeat-check-key, repeat-echo-function, repeat-mode): Change group to 'repeat'. diff --git a/lisp/repeat.el b/lisp/repeat.el index a32f3a4c50..2181bc0e2a 100644 --- a/lisp/repeat.el +++ b/lisp/repeat.el @@ -89,9 +89,15 @@ ;;;;; ************************* USER OPTIONS ************************** ;;;;; +(defgroup repeat nil + "Convenient way to repeat previous commands." + :prefix "repeat-" + :version "29.1" + :group 'convenience) + (defcustom repeat-too-dangerous '(kill-this-buffer) "Commands too dangerous to repeat with \\[repeat]." - :group 'convenience + :group 'repeat :type '(repeat function)) ;; If the last command was self-insert-command, the char to be inserted was @@ -120,7 +126,7 @@ if `repeat' is bound to C-x z, typing C-x z z z repeats the previous command 3 times. If this variable is a sequence of characters, then re-execution only occurs if the final character by which `repeat' was invoked is a member of that sequence. If this variable is nil, no re-execution occurs." - :group 'convenience + :group 'repeat :type '(choice (const :tag "Repeat for all keys" t) (const :tag "Don't repeat" nil) (sexp :tag "Repeat for specific keys"))) @@ -339,7 +345,7 @@ recently executed command not bound to an input event\"." For example, you can set it to like `isearch-exit'." :type '(choice (const :tag "No special key to exit repeating sequence" nil) (key-sequence :tag "Key that exits repeating sequence")) - :group 'convenience + :group 'repeat :version "28.1") (defcustom repeat-exit-timeout nil @@ -350,7 +356,7 @@ You can also set the property `repeat-exit-timeout' on the command symbol. This property can override the value of this variable." :type '(choice (const :tag "No timeout to exit repeating sequence" nil) (number :tag "Timeout in seconds to exit repeating")) - :group 'convenience + :group 'repeat :version "28.1") (defvar repeat-exit-timer nil @@ -359,7 +365,7 @@ This property can override the value of this variable." (defcustom repeat-keep-prefix nil "Whether to keep the prefix arg of the previous command when repeating." :type 'boolean - :group 'convenience + :group 'repeat :version "28.1") (defcustom repeat-check-key t @@ -377,7 +383,7 @@ When the variable value is non-nil, but the property value is `no', then don't check the last key. Also when the variable value is nil, but the property value is `t', then check the last key." :type 'boolean - :group 'convenience + :group 'repeat :version "28.1") (defcustom repeat-echo-function #'repeat-echo-message @@ -390,7 +396,7 @@ a repeating map, or nil after deactivating the transient repeating mode." repeat-echo-mode-line) (const :tag "No visual feedback" ignore) (function :tag "Function")) - :group 'convenience + :group 'repeat :version "28.1") (defvar repeat-in-progress nil @@ -408,7 +414,7 @@ the map can't be set on the command symbol property `repeat-map'.") When Repeat mode is enabled, and the command symbol has the property named `repeat-map', this map is activated temporarily for the next command. See `describe-repeat-maps' for a list of all repeatable commands." - :global t :group 'convenience + :global t :group 'repeat (if (not repeat-mode) (remove-hook 'post-command-hook 'repeat-post-hook) (add-hook 'post-command-hook 'repeat-post-hook) commit 570a11052be6178954956a1c59c8ebcbdb77d38e Author: Stefan Monnier Date: Sun Oct 2 13:52:57 2022 -0400 keymap.el: Ease up support for non-`kbd` formats. While we want to standardize on the `kbd` syntax for user-facing code, the internal vector representation of key sequences is not going away, so let's not impose silly `key-description + key-parse` roundtrips. Also, provide some support for packages stuck with user configs defined to hold old-style key formats. * lisp/keymap.el (keymap-set): Allow vectors as `key`. (key-parse-old-format): New function, which stands out better than `key-description` when searching for uses of the old syntax. * list/outline.el (outline-minor-mode): Use it. diff --git a/lisp/keymap.el b/lisp/keymap.el index 107565590c..c46e72f0a8 100644 --- a/lisp/keymap.el +++ b/lisp/keymap.el @@ -39,7 +39,8 @@ (defun keymap-set (keymap key definition) "Set KEY to DEFINITION in KEYMAP. -KEY is a string that satisfies `key-valid-p'. +KEY is a string that satisfies `key-valid-p' (or a vector using the +internal representation of key sequences). DEFINITION is anything that can be a key's definition: nil (means key is undefined in this keymap), @@ -57,13 +58,13 @@ DEFINITION is anything that can be a key's definition: or an extended menu item definition. (See info node `(elisp)Extended Menu Items'.)" (declare (compiler-macro (lambda (form) (keymap--compile-check key) form))) - (keymap--check key) + (unless (vectorp key) (keymap--check key)) ;; If we're binding this key to another key, then parse that other ;; key, too. (when (stringp definition) (keymap--check definition) (setq definition (key-parse definition))) - (define-key keymap (key-parse key) definition)) + (define-key keymap (if (vectorp key) key (key-parse key)) definition)) (defun keymap-global-set (key command) "Give KEY a global binding as COMMAND. @@ -283,6 +284,18 @@ See `kbd' for a descripion of KEYS." (setq res (vconcat res key)))))) res))) +(defun key-parse-old-format (keys) + "Convert old-style string representation of KEYS to a vector. +Simpler alternative to the Rube-Goldbergesque composition of +`key-description' and `key-parse'." + (cond + ((vectorp keys) keys) + ((multibyte-string-p keys) (vconcat keys)) + ((stringp keys) + (vconcat (mapcar (lambda (c) (if (> c 127) (logior (- c 128) ?\M-\0) c)) + keys))) + (t (error "Invalid old-style key sequence: %S" keys)))) + (defun key-valid-p (keys) "Say whether KEYS is a valid key. A key is a string consisting of one or more key strokes. diff --git a/lisp/outline.el b/lisp/outline.el index 93a9247f61..388a04ed25 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -496,7 +496,8 @@ See the command `outline-mode' for more information on this mode." " " 'outline-cycle " S-" 'outline-cycle-buffer " S-" 'outline-cycle-buffer - (key-description outline-minor-mode-prefix) outline-mode-prefix-map) + (key-parse-old-format outline-minor-mode-prefix) + outline-mode-prefix-map) (if outline-minor-mode (progn (cond commit 4839b42a16635a3090f4fb374fb1fbe532ef0451 Author: Stefan Kangas Date: Sun Oct 2 17:52:05 2022 +0200 * lisp/files.el (after-find-file): Use substitute-command-keys. diff --git a/lisp/files.el b/lisp/files.el index 10b156fb30..40ad11ecfc 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -2711,7 +2711,8 @@ unless NOMODES is non-nil." (file-newer-than-file-p (or buffer-auto-save-file-name (make-auto-save-file-name)) buffer-file-name)) - (format "%s has auto save data; consider M-x recover-this-file" + (format (substitute-command-keys + "%s has auto save data; consider \\`M-x recover-this-file'") (file-name-nondirectory buffer-file-name)) (setq not-serious t) (if error "(New file)" nil))) commit 0a40120b40356ce43c084f44cedba8566a5685be Author: Stefan Kangas Date: Sun Oct 2 17:28:04 2022 +0200 Fix overly wide docstrings generated by eieio * lisp/emacs-lisp/eieio-core.el (eieio-make-class-predicate) (eieio-make-child-predicate, eieio-defclass-internal): Don't generate overly wide docstrings. (Bug#58252) diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el index 5e7b5cbfb2..65aa6aa6df 100644 --- a/lisp/emacs-lisp/eieio-core.el +++ b/lisp/emacs-lisp/eieio-core.el @@ -249,16 +249,22 @@ use '%s or turn off `eieio-backward-compatibility' instead" cname) (defun eieio-make-class-predicate (class) (lambda (obj) (:documentation - (format "Return non-nil if OBJ is an object of type `%S'.\n\n(fn OBJ)" - class)) + (concat + (internal--format-docstring-line + "Return non-nil if OBJ is an object of type `%S'." + class) + "\n\n(fn OBJ)")) (and (eieio-object-p obj) (same-class-p obj class)))) (defun eieio-make-child-predicate (class) (lambda (obj) (:documentation - (format "Return non-nil if OBJ is an object of type `%S' or a subclass. -\n(fn OBJ)" class)) + (concat + (internal--format-docstring-line + "Return non-nil if OBJ is an object of type `%S' or a subclass." + class) + "\n\n(fn OBJ)")) (and (eieio-object-p obj) (object-of-class-p obj class)))) @@ -353,8 +359,8 @@ See `defclass' for more information." (defalias csym (lambda (obj) (:documentation - (format - "Test OBJ to see if it a list of objects which are a child of type %s" + (internal--format-docstring-line + "Test OBJ to see if it a list of objects which are a child of type `%s'." cname)) (when (listp obj) (let ((ans t)) ;; nil is valid commit eb02c4d23088ed3b6806f2a8df2922301dbd515c Author: Lars Ingebrigtsen Date: Sun Oct 2 15:49:50 2022 +0200 Kill URL buffer in url-insert-file-contents-literally * lisp/url/url-handlers.el (url-insert-file-contents-literally): Kill the URL buffer after use. diff --git a/lisp/url/url-handlers.el b/lisp/url/url-handlers.el index b66c187c54..cb115fceb2 100644 --- a/lisp/url/url-handlers.el +++ b/lisp/url/url-handlers.el @@ -371,7 +371,9 @@ if it had been inserted from a file named URL." (let ((buffer (url-retrieve-synchronously url))) (unless buffer (signal 'file-error (list url "No Data"))) - (url-insert buffer nil nil t))) + (url-insert buffer nil nil t) + (kill-buffer buffer) + nil)) (defun url-file-name-completion (url _directory &optional _predicate) ;; Even if it's not implemented, it's not an error to ask for completion, commit 4efb2ef57237147111de90781755f666b3cb9bdd Author: Lars Ingebrigtsen Date: Sun Oct 2 14:58:25 2022 +0200 Fix coding system problems in gnus-read-ephemeral-bug-group * lisp/gnus/gnus-group.el (gnus-read-ephemeral-bug-group): Don't bind coding system variables, because that leads to loading other files (like cookie files) using that coding system (bug#58227). * lisp/url/url-handlers.el (url-insert-file-literally): New function. (url-insert): Allow forcing no-decode. diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el index d1098be6fd..35103e9c4f 100644 --- a/lisp/gnus/gnus-group.el +++ b/lisp/gnus/gnus-group.el @@ -2421,44 +2421,37 @@ the ephemeral group." (regexp-quote address) "\\(?:\\'\\|[ ,>]\\)")) (delim (concat "^" message-unix-mail-delimiter))) - (let ((coding-system-for-write 'binary) - (coding-system-for-read 'binary)) - (with-temp-file tmpfile - (mm-disable-multibyte) - (dolist (id ids) - (let ((file (expand-file-name id (locate-user-emacs-file - "debbugs-cache")))) - (if (and (not gnus-plugged) - (file-exists-p file)) - (insert-file-contents file) - ;; Pass non-nil VISIT to avoid errors with non-nil - ;; `url-automatic-caching' (bug#26063, bug#29008) - ;; and immediately unvisit. - ;; FIXME: This masks real errors! - (url-insert-file-contents (format mbox-url id) t) - (setq buffer-file-name nil)))) - (goto-char (point-min)) - ;; Throw an informative error early instead of passing nonsense - ;; to `gnus-group-read-ephemeral-group' (bug#36433). - (unless (save-excursion (re-search-forward delim nil t)) - (error "Invalid mbox format for bug IDs: %s" - (string-join ids ", "))) - (while (re-search-forward delim nil t) - (narrow-to-region (point) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (unless (string-match-p address-re - (concat (message-fetch-field "to") " " - (message-fetch-field "cc"))) - (goto-char (point-min)) - (if (not (re-search-forward "^To:" nil t)) - (insert "To: " address "\n") - (message-next-header) - (skip-chars-backward "\t\n ") - (insert ", " address))) - (goto-char (point-max)) - (widen)))) + (with-temp-file tmpfile + (mm-disable-multibyte) + (dolist (id ids) + (let ((file (expand-file-name id (locate-user-emacs-file + "debbugs-cache")))) + (if (and (not gnus-plugged) + (file-exists-p file)) + (insert-file-contents-literally file) + (url-insert-file-contents-literally (format mbox-url id))))) + (goto-char (point-min)) + ;; Throw an informative error early instead of passing nonsense + ;; to `gnus-group-read-ephemeral-group' (bug#36433). + (unless (save-excursion (re-search-forward delim nil t)) + (error "Invalid mbox format for bug IDs: %s" + (string-join ids ", "))) + (while (re-search-forward delim nil t) + (narrow-to-region (point) + (if (search-forward "\n\n" nil t) + (1- (point)) + (point-max))) + (unless (string-match-p address-re + (concat (message-fetch-field "to") " " + (message-fetch-field "cc"))) + (goto-char (point-min)) + (if (not (re-search-forward "^To:" nil t)) + (insert "To: " address "\n") + (message-next-header) + (skip-chars-backward "\t\n ") + (insert ", " address))) + (goto-char (point-max)) + (widen))) (gnus-group-read-ephemeral-group (concat "nndoc+ephemeral:bug#" (string-join ids ",")) `(nndoc ,tmpfile diff --git a/lisp/url/url-handlers.el b/lisp/url/url-handlers.el index 74f77cd238..b66c187c54 100644 --- a/lisp/url/url-handlers.el +++ b/lisp/url/url-handlers.el @@ -302,11 +302,13 @@ accessible." filename)) (put 'file-local-copy 'url-file-handlers #'url-file-local-copy) -(defun url-insert (buffer &optional beg end) +(defun url-insert (buffer &optional beg end inhibit-decode) "Insert the body of a URL object. BUFFER should be a complete URL buffer as returned by `url-retrieve'. If the headers specify a coding-system (and current buffer is multibyte), -it is applied to the body before it is inserted. +it is applied to the body before it is inserted. If INHIBIT-DECODE is +non-nil, don't do any coding system decoding even in multibyte buffers. + Returns a list of the form (SIZE CHARSET), where SIZE is the size in bytes of the inserted text and CHARSET is the charset that was specified in the header, or nil if none was found. @@ -318,7 +320,8 @@ They count bytes from the beginning of the body." (buffer-substring (+ (point-min) beg) (if end (+ (point-min) end) (point-max))) (buffer-string)))) - (charset (if enable-multibyte-characters + (charset (if (and enable-multibyte-characters + (not inhibit-decode)) (mail-content-type-get (mm-handle-type handle) 'charset)))) (mm-destroy-parts handle) @@ -362,6 +365,14 @@ if it had been inserted from a file named URL." (url-insert-buffer-contents buffer url visit beg end replace))) (put 'insert-file-contents 'url-file-handlers #'url-insert-file-contents) +;;;###autoload +(defun url-insert-file-contents-literally (url) + "Insert the data retrieved from URL literally in the current buffer." + (let ((buffer (url-retrieve-synchronously url))) + (unless buffer + (signal 'file-error (list url "No Data"))) + (url-insert buffer nil nil t))) + (defun url-file-name-completion (url _directory &optional _predicate) ;; Even if it's not implemented, it's not an error to ask for completion, ;; in case it's available (bug#14806). commit e922940674eb7cd7d604182732c310c6823f23ae Merge: b69f640b31 ab047d74dc Author: Eli Zaretskii Date: Sun Oct 2 16:24:08 2022 +0300 Merge branch 'master' of git.savannah.gnu.org:/srv/git/emacs commit b69f640b316bdeac253d0fec09fb2649c8b900e9 Author: Eli Zaretskii Date: Sun Oct 2 16:21:05 2022 +0300 ; Improve doc string of 'with-locale-environment' * lisp/international/mule-cmds.el (with-locale-environment): Doc fix. diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el index 8bece9a3ee..48e5c9aa1f 100644 --- a/lisp/international/mule-cmds.el +++ b/lisp/international/mule-cmds.el @@ -2664,7 +2664,13 @@ For example, translate \"swedish\" into \"sv_SE.ISO8859-1\"." "The currently set locale environment.") (defmacro with-locale-environment (locale-name &rest body) - "Execute BODY with the locale set to LOCALE-NAME." + "Execute BODY with the locale set to LOCALE-NAME. + +Note that changing the locale modifies settings that affect +the display, such as `terminal-coding-system' and `standard-display-table', +but this macro does not by itself perform redisplay. If BODY needs to +display something with LOCALE-NAME's settings, include a call +to `redraw-frame' in BODY." (declare (indent 1) (debug (sexp def-body))) (let ((current (gensym))) `(let ((,current current-locale-environment)) commit ab047d74dcc2f589c800d088efd4632c56d82fdd Author: Stefan Kangas Date: Sun Oct 2 15:16:17 2022 +0200 Decrease use of the word "Emacsen" in Tramp docs * lisp/net/tramp-archive.el: * lisp/net/tramp-smb.el: * lisp/net/tramp-uu.el: * lisp/net/tramp.el: Don't say "Emacsen" when a different wording would be clearer. diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el index b343e460df..646ae86452 100644 --- a/lisp/net/tramp-archive.el +++ b/lisp/net/tramp-archive.el @@ -201,7 +201,7 @@ It must be supported by libarchive(3).") (put #'tramp-archive-autoload-file-name-regexp 'tramp-autoload t) -;; In older Emacsen (prior 27.1), `tramp-archive-autoload-file-name-regexp' +;; In older Emacs (prior 27.1), `tramp-archive-autoload-file-name-regexp' ;; is not autoloaded. So we cannot expect it to be known in ;; tramp-loaddefs.el. But it exists, when tramp-archive.el is loaded. ;;;###tramp-autoload @@ -332,7 +332,7 @@ arguments to pass to the OPERATION." ;; Starting with Emacs 29, `tramp-archive-file-name-handler' is ;; autoloaded. But it must still be in tramp-loaddefs.el for older -;; Emacsen. +;; versions of Emacs. ;;;###autoload(autoload 'tramp-archive-file-name-handler "tramp-archive") ;;;###tramp-autoload (defun tramp-archive-file-name-handler (operation &rest args) diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el index 11b3689df6..e55f6bb6ee 100644 --- a/lisp/net/tramp-smb.el +++ b/lisp/net/tramp-smb.el @@ -1761,7 +1761,7 @@ Result is a list of (LOCALNAME MODE SIZE MONTH DAY TIME YEAR)." ;; ;; Problems: ;; * Modern regexp constructs, like spy groups and counted repetitions, aren't -;; available in older Emacsen. +;; available in older versions of Emacs. ;; * The length of constructs (file name, size) might exceed the default. ;; * File names might contain spaces. ;; * Permissions might be empty. diff --git a/lisp/net/tramp-uu.el b/lisp/net/tramp-uu.el index e849c36d13..2bbdb299a6 100644 --- a/lisp/net/tramp-uu.el +++ b/lisp/net/tramp-uu.el @@ -25,7 +25,7 @@ ;;; Commentary: ;; An implementation of "uuencode" in Lisp. Uses the function -;; base64-encode-region which is built-in to modern Emacsen. +;; base64-encode-region which is built-in to modern Emacs. ;;; Code: diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index ada529d396..03dc47a053 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -3676,7 +3676,7 @@ Let-bind it when necessary.") ;; `directory-abbrev-apply' and `directory-abbrev-make-regexp' exists ;; since Emacs 29.1. Since this handler isn't called for older -;; Emacsen, it is save to invoke them via `tramp-compat-funcall'. +;; Emacs, it is save to invoke them via `tramp-compat-funcall'. (defun tramp-handle-abbreviate-file-name (filename) "Like `abbreviate-file-name' for Tramp files." (let* ((case-fold-search (file-name-case-insensitive-p filename)) @@ -5487,7 +5487,7 @@ performed successfully. Any other value means an error." Mostly useful to protect BODY from being interrupted by timers." (declare (indent 1) (debug t)) `(if (tramp-get-connection-property ,proc "locked") - ;; Be kind for older Emacsen. + ;; Be kind for old versions of Emacs. (if (member 'remote-file-error debug-ignored-errors) (throw 'non-essential 'non-essential) (tramp-error commit 98dd8c6ebff7613721dadf294957916e23aaa8cf Author: Lars Ingebrigtsen Date: Sun Oct 2 14:09:39 2022 +0200 perform-replace doc string fix * lisp/replace.el (perform-replace): Fix doc string (bug#58177). diff --git a/lisp/replace.el b/lisp/replace.el index 6393c09288..8f81ec33a6 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -2817,8 +2817,8 @@ which will run faster and probably do exactly what you want. Please see the documentation of `replace-match' to find out how to simulate `case-replace'. -This function returns nil if and only if there were no matches to -make, or the user didn't cancel the call. +This function returns nil if there were no matches to make, or +the user cancelled the call. REPLACEMENTS is either a string, a list of strings, or a cons cell containing a function and its first argument. The function is commit ef6f16da2f36278706ae787131062dee088f76ee Author: Lars Ingebrigtsen Date: Sun Oct 2 14:05:53 2022 +0200 Fix point movement when indenting in sieve-mode * lisp/net/sieve-mode.el (sieve-mode-indent-function): Fix point movement when point is at the start of the line (bug#58202). diff --git a/lisp/net/sieve-mode.el b/lisp/net/sieve-mode.el index f62af03534..695a3235a7 100644 --- a/lisp/net/sieve-mode.el +++ b/lisp/net/sieve-mode.el @@ -200,7 +200,13 @@ Turning on Sieve mode runs `sieve-mode-hook'." (let ((depth (car (syntax-ppss)))) (when (looking-at "[ \t]*}") (setq depth (1- depth))) - (indent-line-to (* 2 depth))))) + (indent-line-to (* 2 depth)))) + ;; Skip to the end of the indentation if at the beginning of the + ;; line. + (when (save-excursion + (skip-chars-backward " \t") + (bolp)) + (skip-chars-forward " \t"))) (provide 'sieve-mode) commit b14f049f0000e598cf07b2292c6766bba00bba38 Author: Eli Zaretskii Date: Sun Oct 2 11:44:30 2022 +0300 ; Fix last change. * lisp/leim/quail/misc-lang.el ("gothic"): * lisp/language/misc-lang.el ("Gothic"): Doc fixes. (Bug#58194) diff --git a/lisp/language/misc-lang.el b/lisp/language/misc-lang.el index 2708deb940..4a2e7838fc 100644 --- a/lisp/language/misc-lang.el +++ b/lisp/language/misc-lang.el @@ -316,7 +316,7 @@ in this language environment."))) (input-method . "gothic") (sample-text . "Gothic (๐Œฒ๐Œฟ๐„๐Œน๐ƒ๐Œบ๐Œฐ) ๐Œท๐Œฐ๐Œน๐Œป๐ƒ / ๐Œท๐Œฐ๐Œน๐Œป๐Œฐ") (documentation . "\ -Gothic language using the Gothic script is supported in this +Ancient Gothic language using the Gothic script is supported in this language environment."))) (provide 'misc-lang) diff --git a/lisp/leim/quail/misc-lang.el b/lisp/leim/quail/misc-lang.el index 8b4fe86dac..dad5cfc3e3 100644 --- a/lisp/leim/quail/misc-lang.el +++ b/lisp/leim/quail/misc-lang.el @@ -1526,7 +1526,8 @@ (quail-define-package "gothic" "Gothic" "๐Œฐ" nil - "Gothic script input method." nil t t t t nil nil nil nil nil t) + "Input methid for the ancient Gothic script." + nil t t t t nil nil nil nil nil t) (quail-define-rules ("q" ?๐Œต) commit 9c3d397adc62427d4dec27fa773a4763965120ed Author: เคธเคฎเฅ€เคฐ เคธเคฟเค‚เคน Sameer Singh Date: Fri Sep 30 18:46:56 2022 +0530 Add support for the Gothic script (bug#58194) * lisp/language/misc-lang.el ("Gothic"): New language environment. Add sample text and input method. * lisp/international/fontset.el (script-representative-chars) (setup-default-fontset): Support gothic. * lisp/leim/quail/misc-lang.el ("gothic"): New input method. * etc/HELLO: Add Gothic greetings. * etc/NEWS: Announce the new language environment. diff --git a/etc/HELLO b/etc/HELLO index f0dcb45d38..7ddaed44b9 100644 --- a/etc/HELLO +++ b/etc/HELLO @@ -57,6 +57,7 @@ Finnish (suomi) Hei / Hyvรครค pรคivรครค French (franรงais) Bonjour / Salut Georgian (แƒฅแƒแƒ แƒ—แƒฃแƒšแƒ˜) แƒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ German (Deutsch) Guten Tag / GrรผรŸ Gott +Gothic (๐Œฒ๐Œฟ๐„๐Œน๐ƒ๐Œบ๐Œฐ) ๐Œท๐Œฐ๐Œน๐Œป๐ƒ / ๐Œท๐Œฐ๐Œน๐Œป๐Œฐ Grantha (๐‘Œ—๐‘๐‘Œฐ๐‘Œจ๐‘๐‘Œฅ) ๐‘Œจ๐‘Œฎ๐‘Œธ๐‘๐‘Œค๐‘‡ / ๐‘Œจ๐‘Œฎ๐‘Œธ๐‘๐‘Œ•๐‘Œพ๐‘Œฐ๐‘Œƒ Greek (ฮตฮปฮปฮทฮฝฮนฮบฮฌ) ฮ“ฮตฮนฮฌ ฯƒฮฑฯ‚ Greek, ancient (แผ‘ฮปฮปฮทฮฝฮนฮบฮฎ) ฮŸแฝ–ฮปฮญ ฯ„ฮต ฮบฮฑแฝถ ฮผฮญฮณฮฑ ฯ‡ฮฑแฟ–ฯฮต diff --git a/etc/NEWS b/etc/NEWS index ec23f10b1f..8f9b0a0330 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1280,6 +1280,7 @@ Adlam script and language environment Mende Kikakui script and language environment Wancho script and language environment Toto script and language environment +Gothic 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 aa1477e2ae..6e44b85e6c 100644 --- a/lisp/international/fontset.el +++ b/lisp/international/fontset.el @@ -221,6 +221,7 @@ (lycian #x10280) (carian #x102A0) (old-italic #x10300) + (gothic #x10330 #x10348) (ugaritic #x10380) (old-permic #x10350) (old-persian #x103A0) @@ -791,6 +792,7 @@ lycian carian old-italic + gothic ugaritic old-persian deseret diff --git a/lisp/language/misc-lang.el b/lisp/language/misc-lang.el index 1f85c3973f..2708deb940 100644 --- a/lisp/language/misc-lang.el +++ b/lisp/language/misc-lang.el @@ -305,6 +305,20 @@ in this language environment."))) Mende language and its script Kikakui are supported in this language environment."))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Gothic +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(set-language-info-alist + "Gothic" '((charset unicode) + (coding-system utf-8) + (coding-priority utf-8) + (input-method . "gothic") + (sample-text . "Gothic (๐Œฒ๐Œฟ๐„๐Œน๐ƒ๐Œบ๐Œฐ) ๐Œท๐Œฐ๐Œน๐Œป๐ƒ / ๐Œท๐Œฐ๐Œน๐Œป๐Œฐ") + (documentation . "\ +Gothic language using the Gothic script is 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 1bf9de4d8c..8b4fe86dac 100644 --- a/lisp/leim/quail/misc-lang.el +++ b/lisp/leim/quail/misc-lang.el @@ -1524,5 +1524,38 @@ ("nyen" ?๐žฃƒ) ("nyon" ?๐žฃ„)) +(quail-define-package + "gothic" "Gothic" "๐Œฐ" nil + "Gothic script input method." nil t t t t nil nil nil nil nil t) + +(quail-define-rules + ("q" ?๐Œต) + ("w" ?๐…) + ("e" ?๐Œด) + ("r" ?๐‚) + ("t" ?๐„) + ("y" ?๐Œธ) + ("u" ?๐Œฟ) + ("i" ?๐Œน) + ("o" ?๐‰) + ("p" ?๐€) + ("a" ?๐Œฐ) + ("s" ?๐ƒ) + ("d" ?๐Œณ) + ("f" ?๐†) + ("g" ?๐Œฒ) + ("h" ?๐Œท) + ("j" ?๐Œพ) + ("k" ?๐Œบ) + ("l" ?๐Œป) + ("z" ?๐Œถ) + ("x" ?๐‡) + ("c" ?๐ˆ) + ("v" ?๐) + ("V" ?๐Š) + ("b" ?๐Œฑ) + ("n" ?๐Œฝ) + ("m" ?๐Œผ)) + (provide 'misc-lang) ;;; misc-lang.el ends here