Merge from origin/emacs-28

f232d989fd Improve HTML export of NEWS file
397890ba77 Delete "etc/NEWS*.html" from .gitignore
70ca5f6524 ; * etc/NEWS: Fix typos.
19de241a7d Recommend NonGNU ELPA over MELPA
f25f9dbf30 Minor doc fixes in picture.el
520b041b54 * lisp/textmodes/page-ext.el: Improve Commentary.

# Conflicts:
#	etc/NEWS
This commit is contained in:
Stefan Kangas 2022-09-16 16:27:37 +02:00
commit 6e4f6e97bf
6 changed files with 196 additions and 143 deletions

1
.gitignore vendored
View file

@ -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/

View file

@ -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:&dollar;@@" (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.

View file

@ -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

View file

@ -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-`'.

View file

@ -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.

View file

@ -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))