diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | admin/admin.el | 211 | ||||
-rw-r--r-- | doc/misc/org.org | 4 | ||||
-rw-r--r-- | etc/NEWS.28 | 3 | ||||
-rw-r--r-- | lisp/textmodes/page-ext.el | 54 | ||||
-rw-r--r-- | lisp/textmodes/picture.el | 66 |
6 files changed, 196 insertions, 143 deletions
diff --git a/.gitignore b/.gitignore index 0ca5d4a85c4..eb77b2388f4 100644 --- a/.gitignore +++ b/.gitignore @@ -268,7 +268,6 @@ doc/misc/cc-mode.ss doc/misc/modus-themes.texi doc/misc/org.texi etc/DOC -etc/NEWS*.html etc/refcards/emacsver.tex gnustmp* /info/ diff --git a/admin/admin.el b/admin/admin.el index 07a66c419df..60073f103ba 100644 --- a/admin/admin.el +++ b/admin/admin.el @@ -778,69 +778,13 @@ Optional argument TYPE is type of output (nil means all)." (if (member type (list nil m)) (make-manuals-dist--1 root m)))) -(defun make-news-html-file (root version) - "Convert the NEWS file into an HTML file." - (interactive (let ((root - (if noninteractive - (or (pop command-line-args-left) - default-directory) - (read-directory-name "Emacs root directory: " - source-directory nil t)))) - (list root - (read-string "Version number: " emacs-version)))) - (unless (file-exists-p (expand-file-name "src/emacs.c" root)) - (user-error "%s doesn't seem to be the root of an Emacs source tree" root)) - (let* ((dir (make-temp-file "emacs-news-file" t)) - (orig (expand-file-name "etc/NEWS" root)) - (new (expand-file-name (format "NEWS.%s.org" version) dir)) - (html-file (format "%s.html" (file-name-base new))) - (copyright-years (format-time-string "%Y"))) - (unwind-protect - (progn - (copy-file orig new) - (find-file new) - - ;; Find the copyright range: - (goto-char (point-min)) - (re-search-forward "^Copyright (C) \\([0-9-]+\\) Free Software Foundation, Inc.") - (setq copyright-years (match-string 1)) - - ;; Get rid of some unnecessary stuff: - (replace-regexp-in-region "^---$" "" (point-min) (point-max)) - (replace-regexp-in-region "^\\+\\+\\+$" "" (point-min) (point-max)) - (dolist (str '("\n" - "GNU Emacs NEWS -- history of user-visible changes." - "Temporary note:" - "+++ indicates that all relevant manuals in doc/ have been updated." - "--- means no change in the manuals is needed." - "When you add a new item, use the appropriate mark if you are sure it" - "applies, and please also update docstrings as needed." - "You can narrow news to a specific version by calling 'view-emacs-news'" - "with a prefix argument or by typing 'C-u C-h C-n'.")) - (replace-string-in-region str "" (point-min) (point-max))) - - ;; Use Org-mode markers for <code>. - (replace-regexp-in-region - ;; This could probably be improved quite a bit... - (rx "'" (group (+ (not (any "'\n")))) "'") - "~\\1~" (point-min) (point-max)) - - ;; Format Emacs Lisp. - (while (re-search-forward "^ " nil t) - (backward-paragraph) - (insert "\n#+begin_src emacs-lisp") - (forward-paragraph) - (insert "#+end_src\n")) - - ;; Insert Org-mode export headers. - (goto-char (point-min)) - (insert (format - "\ +(defvar admin--org-export-headers-format "\ #+title: GNU Emacs %s NEWS -- history of user-visible changes #+author: -#+options: author:nil creator:nil toc:1 num:2 *:nil \\n:nil +#+options: author:nil creator:nil toc:1 num:2 *:nil \\n:t ^:nil tex:nil #+language: en -#+HTML_LINK_HOME: https://www.gnu.org/software/emacs +#+HTML_LINK_HOME: /software/emacs +#+HTML_LINK_UP: /software/emacs #+html_head_extra: <link rel=\"stylesheet\" type=\"text/css\" href=\"/mini.css\" media=\"handheld\" /> #+html_head_extra: <link rel=\"stylesheet\" type=\"text/css\" href=\"/layout.min.css\" media=\"screen\" /> #+html_head_extra: <link rel=\"stylesheet\" type=\"text/css\" href=\"/print.min.css\" media=\"print\" /> @@ -852,12 +796,9 @@ Optional argument TYPE is type of output (nil means all)." of a GNU] \" width=\"129\" height=\"122\"/> </a> </div> -#+END_EXPORT\n\n" - version)) - (org-mode) - (let ((org-html-postamble - (format - " +#+END_EXPORT\n\n") + +(defvar admin--org-html-postamble " <p> Return to the <a href=\"/software/emacs/emacs.html\">GNU Emacs home page</a>. </p> @@ -892,21 +833,129 @@ $Date: %s $ <!-- timestamp end --> </p> </div> -</div>" - copyright-years - ;; e.g. "2022/09/13 09:13:13" - (format-time-string "%Y/%M/%y %H:%m:%S")))) - ;; Actually export. - (org-html-export-to-html) - ;; Kill the .org buffer. - (kill-buffer (current-buffer)) - ;; Move file into place. - (let ((old (expand-file-name html-file dir)) - (new (expand-file-name html-file (expand-file-name "etc" root)))) - (delete-file new) - (copy-file old new) - (find-file new)))) - (delete-directory dir t)))) +</div>") + +(defun admin--require-external-package (pkg) + (package-initialize) + (require pkg nil t) + (unless (featurep pkg) + (when (yes-or-no-p (format "Package \"%s\" is missing. Install now?" pkg)) + (package-install pkg) + (require pkg nil t)))) + +(defvar org-html-postamble) +(defvar org-html-mathjax-template) +(defun make-news-html-file (root version) + "Convert the NEWS file into an HTML file." + (interactive (let ((root + (if noninteractive + (or (pop command-line-args-left) + default-directory) + (read-directory-name "Emacs root directory: " + source-directory nil t)))) + (list root + (read-string "Major version number: " + (number-to-string emacs-major-version))))) + (unless (file-exists-p (expand-file-name "src/emacs.c" root)) + (user-error "%s doesn't seem to be the root of an Emacs source tree" root)) + (admin--require-external-package 'htmlize) + (let* ((orig (expand-file-name "etc/NEWS" root)) + (new (expand-file-name (format "etc/NEWS.%s.org" version) root)) + (html-file (format "%s.html" (file-name-base new))) + (copyright-years (format-time-string "%Y"))) + (copy-file orig new t) + (find-file new) + + ;; Find the copyright range. + (goto-char (point-min)) + (re-search-forward "^Copyright (C) \\([0-9-]+\\) Free Software Foundation, Inc.") + (setq copyright-years (match-string 1)) + + ;; Delete some unnecessary stuff. + (replace-regexp-in-region "^---$" "" (point-min) (point-max)) + (replace-regexp-in-region "^\\+\\+\\+$" "" (point-min) (point-max)) + (dolist (str '("\n" + "GNU Emacs NEWS -- history of user-visible changes." + "Temporary note:" + "+++ indicates that all relevant manuals in doc/ have been updated." + "--- means no change in the manuals is needed." + "When you add a new item, use the appropriate mark if you are sure it" + "applies, and please also update docstrings as needed." + "You can narrow news to a specific version by calling 'view-emacs-news'" + "with a prefix argument or by typing 'C-u C-h C-n'.")) + (replace-string-in-region str "" (point-min) (point-max))) + + ;; Escape some characters. + (replace-regexp-in-region (rx "$") "@@html:$@@" (point-min) (point-max)) + + ;; Use Org-mode markers for 'symbols', 'C-x k', etc. + (replace-regexp-in-region + (rx-let ((key (seq + ;; Modifier (optional) + (? (any "ACHMSs") "-") + (or + ;; single key + (not (any " \n")) + ;; "<return>" and "<remap> <foo>" + (seq "<" + (+ (any "A-Za-z-")) + (+ (seq " " (+ (any "A-Za-z-")))) + ">") + "NUL" "RET" "LFD" "TAB" + "ESC" "SPC" "DEL"))) + (email (seq (+ (not (any " @\n"))) + "@" + (+ (not (any " @\n"))))) + (lisp-symbol (regexp lisp-mode-symbol-regexp))) + (rx "'" (group + (or lisp-symbol + email + (seq "M-x " lisp-symbol) + (seq key (+ " " key)))) + "'")) + "~\\1~" (point-min) (point-max)) + + ;; Format code blocks. + (while (re-search-forward "^ " nil t) + (let ((elisp-block (looking-at "("))) + (backward-paragraph) + (insert (if elisp-block + "\n#+BEGIN_SRC emacs-lisp" + "\n#+BEGIN_EXAMPLE")) + (forward-paragraph) + (insert (if elisp-block + "#+END_SRC\n" + "#+END_EXAMPLE\n")))) + + ;; Delete buffer local variables. + (goto-char (point-max)) + (when (re-search-backward "Local variables:") + (forward-line -1) + (delete-region (point) (point-max))) + + ;; Insert Org-mode export headers. + (goto-char (point-min)) + (insert (format admin--org-export-headers-format version)) + (org-mode) + (save-buffer) + + ;; Make the HTML export. + (let* ((org-html-postamble + (format admin--org-html-postamble + copyright-years + ;; e.g. "2022/09/13 09:13:13" + (format-time-string "%Y/%M/%y %H:%m:%S"))) + (org-html-mathjax-template "") + (htmlize-output-type 'css)) + (org-html-export-as-html)) + + ;; Write HTML to file. + (let ((new (expand-file-name html-file (expand-file-name "etc" root)))) + (write-file new) + (unless noninteractive + (find-file new) + (html-mode)) + (message "Successfully exported HTML to %s" new)))) ;; Stuff to check new `defcustom's got :version tags. diff --git a/doc/misc/org.org b/doc/misc/org.org index 7971c417a52..1ce99728c60 100644 --- a/doc/misc/org.org +++ b/doc/misc/org.org @@ -11042,7 +11042,7 @@ a major LaTeX mode like AUCTeX in order to speed-up insertion of environments and math templates. Inside Org mode, you can make use of some of the features of CDLaTeX mode. You need to install =cdlatex.el= and =texmathp.el= (the latter comes also with AUCTeX) -using [[https://melpa.org/][MELPA]] with the [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Package-Installation.html][Emacs packaging system]] or alternatively from +from [[https://elpa.nongnu.org/][NonGNU ELPA]] with the [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Package-Installation.html][Emacs packaging system]] or alternatively from [[https://staff.fnwi.uva.nl/c.dominik/Tools/cdlatex/]]. Do not use CDLaTeX mode itself under Org mode, but use the special version Org CDLaTeX minor mode that comes as part of Org. Turn it on for the @@ -22024,7 +22024,7 @@ a deadline string. See ~org-agenda-entry-types~ on how to set what planning information is taken into account. [fn:104] For HTML you need to install Hrvoje Nikšić's =htmlize.el= -as an Emacs package from MELPA or from [[https://github.com/hniksic/emacs-htmlize][Hrvoje Nikšić's repository]]. +as an Emacs package from [[https://elpa.nongnu.org/][NonGNU ELPA]] or from [[https://github.com/hniksic/emacs-htmlize][Hrvoje Nikšić's repository]]. [fn:105] To create PDF output, the Ghostscript ps2pdf utility must be installed on the system. Selecting a PDF file also creates the diff --git a/etc/NEWS.28 b/etc/NEWS.28 index 5f3626eeeb0..47e82a96e64 100644 --- a/etc/NEWS.28 +++ b/etc/NEWS.28 @@ -386,7 +386,7 @@ the current buffer and the text "GNU Emacs" instead of the value of your init file: (setq frame-title-format '(multiple-frames "%b" - ("" invocation-name "@" system-name))) + ("" invocation-name "@" system-name))) *** New frame parameter 'drag-with-tab-line'. This parameter, similar to 'drag-with-header-line', allows moving frames @@ -3958,7 +3958,6 @@ and enable the MS-Windows native Input Method Editor (IME) at run time. A companion function 'w32-get-ime-open-status' returns the current IME activation status. --- ** On macOS, 's-<left>' and 's-<right>' are now bound to 'move-beginning-of-line' and 'move-end-of-line' respectively. The commands to select previous/next frame are still bound to 's-~' and 's-`'. diff --git a/lisp/textmodes/page-ext.el b/lisp/textmodes/page-ext.el index 6b71f26e4f2..05c02308e52 100644 --- a/lisp/textmodes/page-ext.el +++ b/lisp/textmodes/page-ext.el @@ -1,7 +1,6 @@ ;;; page-ext.el --- extended page handling commands -*- lexical-binding:t -*- -;; Copyright (C) 1990-1991, 1993-1994, 2001-2022 Free Software -;; Foundation, Inc. +;; Copyright (C) 1990-2022 Free Software Foundation, Inc. ;; Author: Robert J. Chassell <bob@gnu.org> ;; (according to ack.texi) @@ -25,20 +24,20 @@ ;;; Commentary: ;; You may use these commands to handle an address list or other -;; small data base. +;; small database. ;;; Summary ;; The current page commands are: -;; forward-page C-x ] -;; backward-page C-x [ -;; narrow-to-page C-x p -;; count-lines-page C-x l -;; mark-page C-x C-p (change this to C-x C-p C-m) -;; sort-pages not bound -;; what-page not bound +;; `forward-page' C-x ] +;; `backward-page' C-x [ +;; `narrow-to-page' C-x p +;; `count-lines-page' C-x l +;; `mark-page' C-x C-p (change this to C-x C-p C-m) +;; `sort-pages' not bound +;; `what-page' not bound ;; The new page handling commands all use `C-x C-p' as a prefix. This ;; means that the key binding for `mark-page' must be changed. @@ -47,15 +46,15 @@ ;; New page handling commands: -;; pages-next-page C-x C-p C-n -;; pages-previous-page C-x C-p C-p -;; pages-search C-x C-p C-s -;; pages-add-new-page C-x C-p C-a -;; pages-sort-buffer C-x C-p s -;; pages-set-delimiter C-x C-p C-l -;; pages-directory C-x C-p C-d -;; pages-directory-for-addresses C-x C-p d -;; pages-directory-goto C-c C-c +;; `pages-next-page' C-x C-p C-n +;; `pages-previous-page' C-x C-p C-p +;; `pages-search' C-x C-p C-s +;; `pages-add-new-page' C-x C-p C-a +;; `pages-sort-buffer' C-x C-p s +;; `pages-set-delimiter' C-x C-p C-l +;; `pages-directory' C-x C-p C-d +;; `pages-directory-for-addresses' C-x C-p d +;; `pages-directory-goto' C-c C-c ;;; Using the page commands @@ -103,8 +102,8 @@ ;; ;; 2. The first line of text in each entry is the `heading line'; it ;; will appear in the pages-directory-buffer which is constructed -;; using the `C-x C-p C-d' (pages-directory) command or the `C-x -;; C-p d' (pages-directory-for-addresses) command. +;; using the `C-x C-p C-d' (`pages-directory') command or the +;; `C-x C-p d' (`pages-directory-for-addresses') command. ;; ;; The heading line may be on the same line as the page-delimiter ;; or it may follow after. It is the first non-blank line on the @@ -163,17 +162,18 @@ ;; `pages-previous-page', `pages-add-new-page', `mark-page', and `pages-search' ;; commands. -;; You may use either the `C-x C-p d' (pages-directory-for-addresses) -;; or the `C-x C-p C-d' (pages-directory) command to construct and +;; You may use either the `C-x C-p d' (`pages-directory-for-addresses') +;; or the `C-x C-p C-d' (`pages-directory') command to construct and ;; display a directory of all the heading lines. ;; In the directory, you may position the cursor over a heading line -;; and type `C-c C-c' (pages-directory-goto) to go to the entry to +;; and type `C-c C-c' (`pages-directory-goto') to go to the entry to ;; which it refers in the pages buffer. -;; You can type `C-c C-p C-a' (pages-add-new-page) to add a new entry in the -;; pages buffer or address file. This is the same command you use to -;; add a new entry when you are in the pages buffer or address file. +;; You can type `C-c C-p C-a' (`pages-add-new-page') to add a new +;; entry in the pages buffer or address file. This is the same +;; command you use to add a new entry when you are in the pages buffer +;; or address file. ;; If you wish, you may create several different directories, ;; one for each different buffer. diff --git a/lisp/textmodes/picture.el b/lisp/textmodes/picture.el index a020b7de850..ab211fdd7bf 100644 --- a/lisp/textmodes/picture.el +++ b/lisp/textmodes/picture.el @@ -23,9 +23,9 @@ ;;; Commentary: -;; This code provides the picture-mode commands documented in the Emacs +;; This code provides the `picture-mode' commands documented in the Emacs ;; manual. The screen is treated as a semi-infinite quarter-plane with -;; support for rectangle operations and `etch-a-sketch' character +;; support for rectangle operations and "etch-a-sketch" character ;; insertion in any of eight directions. ;;; Code: @@ -96,7 +96,7 @@ If scan reaches end of buffer, stop there without error." (defun picture-forward-column (arg &optional interactive) "Move cursor right, making whitespace if necessary. -With argument, move that many columns." +With prefix argument ARG, move that many columns." (interactive "^p\nd") (let (deactivate-mark) (picture-update-desired-column interactive) @@ -110,14 +110,14 @@ With argument, move that many columns." (defun picture-backward-column (arg &optional interactive) "Move cursor left, making whitespace if necessary. -With argument, move that many columns." +With prefix argument ARG, move that many columns." (interactive "^p\nd") (picture-update-desired-column interactive) (picture-forward-column (- arg))) (defun picture-move-down (arg) "Move vertically down, making whitespace if necessary. -With argument, move that many lines." +With prefix argument ARG, move that many lines." (interactive "^p") (let (deactivate-mark) (picture-update-desired-column nil) @@ -134,7 +134,7 @@ With argument, move that many lines." (defun picture-move-up (arg) "Move vertically up, making whitespace if necessary. -With argument, move that many lines." +With prefix argument ARG, move that many lines." (interactive "^p") (picture-update-desired-column nil) (picture-move-down (- arg))) @@ -161,36 +161,36 @@ With argument, move that many lines." (defun picture-movement-nw (&optional arg) "Move up and left after self-inserting character in Picture mode. -With prefix argument, move up and two-column left." +With prefix argument ARG, move up and two-column left." (interactive "P") (picture-set-motion -1 (if arg -2 -1))) (defun picture-movement-ne (&optional arg) "Move up and right after self-inserting character in Picture mode. -With prefix argument, move up and two-column right." +With prefix argument ARG, move up and two-column right." (interactive "P") (picture-set-motion -1 (if arg 2 1))) (defun picture-movement-sw (&optional arg) "Move down and left after self-inserting character in Picture mode. -With prefix argument, move down and two-column left." +With prefix argument ARG, move down and two-column left." (interactive "P") (picture-set-motion 1 (if arg -2 -1))) (defun picture-movement-se (&optional arg) "Move down and right after self-inserting character in Picture mode. -With prefix argument, move down and two-column right." +With prefix argument ARG, move down and two-column right." (interactive "P") (picture-set-motion 1 (if arg 2 1))) -(defun picture-set-motion (vert horiz) +(defun picture-set-motion (vertical horizontal) "Set VERTICAL and HORIZONTAL increments for movement in Picture mode. The mode line is updated to reflect the current direction." - (setq picture-vertical-step vert - picture-horizontal-step horiz) + (setq picture-vertical-step vertical + picture-horizontal-step horizontal) (setq mode-name (format "Picture:%s" - (nth (+ 2 (% horiz 3) (* 5 (1+ (% vert 2)))) + (nth (+ 2 (% horizontal 3) (* 5 (1+ (% vertical 2)))) '(wnw nw up ne ene Left left none right Right wsw sw down se ese)))) (force-mode-line-update) @@ -305,9 +305,9 @@ Use \"\\[command-apropos] picture-movement\" to see those commands." (defun picture-clear-line (arg) "Clear out rest of line; if at end of line, advance to next line. -Cleared-out line text goes into the kill ring, as do newlines that are -advanced over. With argument, clear out (and save in kill ring) that -many lines." +Cleared-out line text goes into the kill ring, as do newlines +that are advanced over. With prefix argument ARG, clear out (and +save in kill ring) that many lines." (interactive "P") (if arg (progn @@ -320,7 +320,8 @@ many lines." (defun picture-newline (arg) "Move to the beginning of the following line. -With argument, moves that many lines (up, if negative argument); +With prefix argument ARG, move that many lines (up, if negative +argument); always moves to the beginning of a line." (interactive "^p") (let ((start (point)) @@ -466,8 +467,11 @@ If no such character is found, move to beginning of line." (defun picture-tab (&optional arg) "Tab transparently (just move point) to next tab stop. -With prefix arg, overwrite the traversed text with spaces. The tab stop -list can be changed by \\[picture-set-tab-stops] and \\[edit-tab-stops]. +With prefix argument ARG, overwrite the traversed text with +spaces. The tab stop list can be changed by \ +\\<picture-mode-map>\\[picture-set-tab-stops] and +\\[edit-tab-stops]. + See also documentation for variable `picture-tab-chars'." (interactive "^P") (let* ((opoint (point))) @@ -515,10 +519,11 @@ Interactively, reads the register using `register-read-with-preview'." (defun picture-yank-rectangle (&optional insertp) "Overlay rectangle saved by \\[picture-clear-rectangle]. -The rectangle is positioned with upper left corner at point, overwriting -existing text. With prefix argument, the rectangle is inserted instead, -shifting existing text. Leaves mark at one corner of rectangle and -point at the other (diagonally opposed) corner." +The rectangle is positioned with upper left corner at point, +overwriting existing text. With prefix argument INSERTP, the +rectangle is inserted instead, shifting existing text. Leave +mark at one corner of rectangle and point at the +other (diagonally opposed) corner." (interactive "P") (if (not (consp picture-killed-rectangle)) (error "No rectangle saved") @@ -536,10 +541,11 @@ regardless of where you click." (defun picture-yank-rectangle-from-register (register &optional insertp) "Overlay rectangle saved in REGISTER. -The rectangle is positioned with upper left corner at point, overwriting -existing text. With prefix argument, the rectangle is -inserted instead, shifting existing text. Leaves mark at one corner -of rectangle and point at the other (diagonally opposed) corner. +The rectangle is positioned with upper left corner at point, +overwriting existing text. With prefix argument INSERTP, the +rectangle is inserted instead, shifting existing text. Leave +mark at one corner of rectangle and point at the +other (diagonally opposed) corner. Interactively, reads the register using `register-read-with-preview'." (interactive (list (register-read-with-preview "Rectangle from register: ") @@ -552,7 +558,7 @@ Interactively, reads the register using `register-read-with-preview'." (defun picture-insert-rectangle (rectangle &optional insertp) "Overlay RECTANGLE with upper left corner at point. Optional argument INSERTP, if non-nil causes RECTANGLE to be inserted. -Leaves the region surrounding the rectangle." +Leave the region surrounding the rectangle." (let ((indent-tabs-mode nil)) (if (not insertp) (save-excursion @@ -570,7 +576,7 @@ Leaves the region surrounding the rectangle." (if (= (current-column) 0) 1 0))) (defun picture-draw-rectangle (start end) - "Draw a rectangle around region." + "Draw a rectangle around region from START to END." (interactive "*r") ; start will be less than end (let* ((sl (picture-current-line)) (sc (current-column)) |