diff --git a/doc/emacs/building.texi b/doc/emacs/building.texi index 87ac61bac3b..e108a4e7c10 100644 --- a/doc/emacs/building.texi +++ b/doc/emacs/building.texi @@ -303,6 +303,11 @@ And here's how to do it in csh: if ($?prompt) set prompt = @dots{} @end example +@vindex TERM, environment variable, in compilation mode + If you want to customize the value of the @env{TERM} environment +variable passed to the compilation subshell, customize the variable +@code{comint-terminfo-terminal} (@pxref{Shell Options}). + Emacs does not expect a compiler process to launch asynchronous subprocesses; if it does, and they keep running after the main compiler process has terminated, Emacs may kill them or their output diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi index 6ad5fbafdd6..e4be004ae52 100644 --- a/doc/emacs/misc.texi +++ b/doc/emacs/misc.texi @@ -1396,6 +1396,16 @@ directory stack if they are not already on it (@code{shell-pushd-dunique}). The values you choose should match the underlying shell, of course. +@vindex comint-terminfo-terminal +@vindex TERM, environment variable, in sub-shell +Comint mode sets the @env{TERM} environment variable to a safe default +value, but this value disables some useful features. For example, +color is disabled in applications that use @env{TERM} to determine if +color is supported. Therefore, Emacs provides an option +@code{comint-terminfo-terminal}, which you can set to a terminal that +is present in your system's terminfo database, in order to take +advantage of advanced features of that terminal. + @node Terminal emulator @subsection Emacs Terminal Emulator @findex term diff --git a/doc/emacs/trouble.texi b/doc/emacs/trouble.texi index 4a836c3224b..e98322d74e2 100644 --- a/doc/emacs/trouble.texi +++ b/doc/emacs/trouble.texi @@ -780,7 +780,7 @@ the dribble file. @item @findex open-termscript @cindex termscript file -@cindex @env{TERM} environment variable +@vindex TERM, environment variable, and display bugs For possible display bugs, the terminal type (the value of environment variable @env{TERM}), the complete termcap entry for the terminal from @file{/etc/termcap} (since that file is not identical on all machines), diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index 7af8d9efb7c..50069e3d1da 100644 --- a/doc/lispref/display.texi +++ b/doc/lispref/display.texi @@ -929,13 +929,18 @@ major mode should use the mode's own name as an element of @defun invisible-p pos-or-prop If @var{pos-or-prop} is a marker or number, this function returns a -non-@code{nil} value if the text at that position is invisible. +non-@code{nil} value if the text at that position is currently +invisible. If @var{pos-or-prop} is any other kind of Lisp object, that is taken to mean a possible value of the @code{invisible} text or overlay property. In that case, this function returns a non-@code{nil} value if that value would cause text to become invisible, based on the current value of @code{buffer-invisibility-spec}. + +The return value of this function is @code{t} if the text would be +completely hidden on display, or a non-@code{nil}, non-@code{t} value +if the text would be replaced by an ellipsis. @end defun @vindex line-move-ignore-invisible diff --git a/doc/lispref/sequences.texi b/doc/lispref/sequences.texi index 4fba880803e..8d56e022d8f 100644 --- a/doc/lispref/sequences.texi +++ b/doc/lispref/sequences.texi @@ -425,6 +425,7 @@ useful example of @code{sort}. @cindex sequence functions in seq @cindex seq library +@cindex sequences, generalized The @file{seq.el} library provides the following additional sequence manipulation macros and functions, prefixed with @code{seq-}. To use them, you must first load the @file{seq} library. @@ -859,6 +860,7 @@ it is a function of two arguments to use instead of the default @code{equal}. @end defun @defun seq-subseq sequence start &optional end +@cindex sub-sequence This function returns a subset of @var{sequence} from @var{start} to @var{end}, both integers (@var{end} defaults to the last element). If @var{start} or @var{end} is negative, it counts from the end of @@ -926,6 +928,8 @@ contain less elements than @var{n}. @var{n} must be an integer. If @end defun @defun seq-intersection sequence1 sequence2 &optional function +@cindex sequences, intersection of +@cindex intersection of sequences This function returns a list of the elements that appear both in @var{sequence1} and @var{sequence2}. If the optional argument @var{function} is non-@code{nil}, it is a function of two arguments to @@ -972,6 +976,10 @@ of @var{sequence}. Keys are compared using @code{equal}. @end defun @defun seq-into sequence type +@cindex convert sequence to another type +@cindex list to vector +@cindex vector to list +@cindex string to vector This function converts the sequence @var{sequence} into a sequence of type @var{type}. @var{type} can be one of the following symbols: @code{vector}, @code{string} or @code{list}. @@ -993,6 +1001,8 @@ of type @var{type}. @var{type} can be one of the following symbols: @end defun @defun seq-min sequence +@cindex minimum value of sequence +@cindex sequence minimum This function returns the smallest element of @var{sequence}. The elements of @var{sequence} must be numbers or markers (@pxref{Markers}). @@ -1010,6 +1020,8 @@ elements of @var{sequence} must be numbers or markers @end defun @defun seq-max sequence +@cindex maximum value of sequence +@cindex sequence maximum This function returns the largest element of @var{sequence}. The elements of @var{sequence} must be numbers or markers. @@ -1027,6 +1039,7 @@ elements of @var{sequence} must be numbers or markers. @defmac seq-doseq (var sequence) body@dots{} @cindex sequence iteration +@cindex iteration over vector or string This macro is like @code{dolist} (@pxref{Iteration, dolist}), except that @var{sequence} can be a list, vector or string. This is primarily useful for side-effects. diff --git a/doc/misc/emacs-gnutls.texi b/doc/misc/emacs-gnutls.texi index 92846a924c5..1715c83a0d2 100644 --- a/doc/misc/emacs-gnutls.texi +++ b/doc/misc/emacs-gnutls.texi @@ -116,9 +116,11 @@ information. The @code{gnutls-algorithm-priority} variable sets the GnuTLS priority string. This is global, not per host name (although @code{gnutls-negotiate} supports a priority string per connection so -it could be done if needed). The priority string syntax is in the +it could be done if needed). For details see the @uref{https://www.gnu.org/software/gnutls/documentation.html, GnuTLS -documentation}. +documentation} and the +@uref{https://gnutls.org/manual/html_node/Priority-Strings.html, +GnuTLS priority string syntax and description}. @end defvar @defvar gnutls-trustfiles diff --git a/etc/NEWS.26 b/etc/NEWS.26 index 64b53d88c83..784c608041b 100644 --- a/etc/NEWS.26 +++ b/etc/NEWS.26 @@ -431,6 +431,11 @@ You can enable this by customizing 'mwheel-tilt-scroll-p'. If you want to reverse the direction of the scroll, customize 'mwheel-flip-direction'. ++++ +** The default GnuTLS priority string now includes %DUMBFW. +This is to avoid bad behavior in some firewalls, which causes the +connection to be closed by the remote host. + ** Emacsclient changes +++ @@ -807,6 +812,13 @@ whose content matches a regexp; bound to '% g'. *** New user option 'comint-move-point-for-matching-input' to control where to place point after 'C-c M-r' and 'C-c M-s'. ++++ +*** New user option 'comint-terminfo-terminal'. +This option allows control of the value of the TERM environment +variable Emacs puts into the environment of the Comint mode and its +derivatives, such as Shell mode and Compilation Shell minor-mode. The +default is "dumb", for compatibility with previous behavior. + ** Compilation mode --- @@ -1462,6 +1474,17 @@ them through 'format' first. Even that is discouraged: for ElDoc support, you should set 'eldoc-documentation-function' instead of calling 'eldoc-message' directly. +--- +** Using '&rest' or '&optional' incorrectly is now an error. +For example giving '&optional' without a following variable, or +passing '&optional' multiple times: + + (defun foo (&optional &rest x)) + (defun bar (&optional &optional x)) + +Previously, Emacs would just ignore the extra keyword, or give +incorrect results in certain cases. + * Lisp Changes in Emacs 26.1 diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el index 129cd6d9ad3..27f1b0324e3 100644 --- a/lisp/calendar/icalendar.el +++ b/lisp/calendar/icalendar.el @@ -1310,7 +1310,7 @@ Returns an alist." Argument ADVANCE-TIME is a number giving the time when the alarm fires (minutes before the respective event). Argument ALARM-SPEC is a list which must be one of (audio), (display) or -(email (ADDRESS1 ...)), see `icalendar-export-alarms'. Argument +\(email (ADDRESS1 ...)), see `icalendar-export-alarms'. Argument SUMMARY is a string which contains a short description for the alarm." (let* ((action (car alarm-spec)) diff --git a/lisp/comint.el b/lisp/comint.el index aa7dab28f32..5ee4e48d636 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -290,6 +290,7 @@ If `after-input', point will be positioned after the input typed by the user, but before the rest of the history entry that has been inserted. If `end-of-line', point will be positioned at the end of the current logical (not visual) line after insertion." + :version "26.1" :type '(radio (const :tag "Stay after input" after-input) (const :tag "Move to end of line" end-of-line)) :group 'comint) @@ -458,6 +459,12 @@ executed once when the buffer is created." :type 'hook :group 'comint) +(defcustom comint-terminfo-terminal "dumb" + "Value to use for TERM when the system uses terminfo." + :type 'string + :group 'comint + :version "26.1") + (defvar comint-mode-map (let ((map (make-sparse-keymap))) ;; Keys: @@ -816,19 +823,7 @@ series of processes in the same Comint buffer. The hook (defun comint-exec-1 (name buffer command switches) (let ((process-environment (nconc - ;; If using termcap, we specify `emacs' as the terminal type - ;; because that lets us specify a width. - ;; If using terminfo, we specify `dumb' because that is - ;; a defined terminal type. `emacs' is not a defined terminal type - ;; and there is no way for us to define it here. - ;; Some programs that use terminfo get very confused - ;; if TERM is not a valid terminal type. - ;; ;; There is similar code in compile.el. - (if (and (boundp 'system-uses-terminfo) system-uses-terminfo) - (list "TERM=dumb" "TERMCAP=" - (format "COLUMNS=%d" (window-width))) - (list "TERM=emacs" - (format "TERMCAP=emacs:co#%d:tc=unknown:" (window-width)))) + (comint-term-environment) (list (format "INSIDE_EMACS=%s,comint" emacs-version)) process-environment)) (default-directory @@ -857,6 +852,22 @@ series of processes in the same Comint buffer. The hook (set-process-coding-system proc decoding encoding)) proc)) +(defun comint-term-environment () + "Return an environment variable list for terminal configuration." + ;; If using termcap, we specify `emacs' as the terminal type + ;; because that lets us specify a width. + ;; If using terminfo, we default to `dumb' because that is + ;; a defined terminal type. `emacs' is not a defined terminal type + ;; and there is no way for us to define it here. + ;; Some programs that use terminfo get very confused + ;; if TERM is not a valid terminal type. + (if (and (boundp 'system-uses-terminfo) system-uses-terminfo) + (list (format "TERM=%s" comint-terminfo-terminal) + "TERMCAP=" + (format "COLUMNS=%d" (window-width))) + (list "TERM=emacs" + (format "TERMCAP=emacs:co#%d:tc=unknown:" (window-width))))) + (defun comint-nonblank-p (str) "Return non-nil if STR contains non-whitespace syntax." (not (string-match "\\`\\s *\\'" str))) diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index c898305d916..25f738cb8ec 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -236,6 +236,7 @@ This includes variable references and calls to functions such as `car'." (defcustom byte-compile-cond-use-jump-table t "Compile `cond' clauses to a jump table implementation (using a hash-table)." + :version "26.1" :group 'bytecomp :type 'boolean) diff --git a/lisp/epa.el b/lisp/epa.el index aca9aaa7d22..8e84b5b223d 100644 --- a/lisp/epa.el +++ b/lisp/epa.el @@ -40,6 +40,7 @@ If t, replace the original text without any confirmation. If nil, don't replace the original text and show the result in a new buffer. If neither t nor nil, ask user for confirmation." + :version "26.1" :type '(choice (const :tag "Never" nil) (const :tag "Ask the user" ask) (const :tag "Always" t)) diff --git a/lisp/eshell/em-tramp.el b/lisp/eshell/em-tramp.el index e322cea1e21..e2da3468aba 100644 --- a/lisp/eshell/em-tramp.el +++ b/lisp/eshell/em-tramp.el @@ -32,6 +32,8 @@ (require 'eshell) (require 'tramp)) +;; There are no items in this custom group, but eshell modules (ab)use +;; custom groups. ;;;###autoload (progn (defgroup eshell-tramp nil diff --git a/lisp/eshell/em-xtra.el b/lisp/eshell/em-xtra.el index 7b80f64d629..89814467d1f 100644 --- a/lisp/eshell/em-xtra.el +++ b/lisp/eshell/em-xtra.el @@ -29,6 +29,8 @@ (require 'pcomplete)) (require 'compile) +;; There are no items in this custom group, but eshell modules (ab)use +;; custom groups. ;;;###autoload (progn (defgroup eshell-xtra nil diff --git a/lisp/files.el b/lisp/files.el index 8045ba5c22b..e474de6abad 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -5199,7 +5199,9 @@ Before and after saving the buffer, this function runs This allows you to stop `save-some-buffers' from asking about certain files that you'd usually rather not save." :group 'auto-save - :type 'function + ;; FIXME nil should not be a valid option, let alone the default, + ;; eg so that add-function can be used. + :type '(choice (const :tag "Default" nil) function) :version "26.1") (defun save-some-buffers (&optional arg pred) diff --git a/lisp/frame.el b/lisp/frame.el index 2e925325a9e..6f8d6a1cc9a 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -800,7 +800,7 @@ the user during startup." (nreverse frame-initial-geometry-arguments)) (cdr param-list)) -(declare-function x-focus-frame "frame.c" (frame)) +(declare-function x-focus-frame "frame.c" (frame &optional noactivate)) (defun select-frame-set-input-focus (frame &optional norecord) "Select FRAME, raise it, and set input focus, if possible. @@ -1484,7 +1484,7 @@ FRAME." (declare-function w32-mouse-absolute-pixel-position "w32fns.c") (declare-function x-mouse-absolute-pixel-position "xfns.c") -(declare-function ns-mouse-absolute-pixel-position "nsfns.c") +(declare-function ns-mouse-absolute-pixel-position "nsfns.m") (defun mouse-absolute-pixel-position () "Return absolute position of mouse cursor in pixels. diff --git a/lisp/frameset.el b/lisp/frameset.el index 16940f814a9..e2d26411e96 100644 --- a/lisp/frameset.el +++ b/lisp/frameset.el @@ -745,6 +745,8 @@ The relationships recorded for each frame are - `delete-before' via `frameset--delete-before' - `parent-frame' via `frameset--parent-frame' - `mouse-wheel-frame' via `frameset--mouse-wheel-frame' +- `text-pixel-width' via `frameset--text-pixel-width' +- `text-pixel-height' via `frameset--text-pixel-height' Internal use only." ;; Record frames with their own minibuffer @@ -791,7 +793,23 @@ Internal use only." 'frameset--mini (cons nil (and mb-frame - (frameset-frame-id mb-frame)))))))))) + (frameset-frame-id mb-frame))))))))) + ;; Now store text-pixel width and height if it differs from the calculated + ;; width and height and the frame is not fullscreen. + (dolist (frame frame-list) + (unless (frame-parameter frame 'fullscreen) + (unless (eq (* (frame-parameter frame 'width) + (frame-char-width frame)) + (frame-text-width frame)) + (set-frame-parameter + frame 'frameset--text-pixel-width + (frame-text-width frame))) + (unless (eq (* (frame-parameter frame 'height) + (frame-char-height frame)) + (frame-text-height frame)) + (set-frame-parameter + frame 'frameset--text-pixel-height + (frame-text-height frame)))))) ;;;###autoload (cl-defun frameset-save (frame-list @@ -1002,6 +1020,14 @@ Internal use only." (display (cdr (assq 'display filtered-cfg))) ;; post-filtering alt-cfg frame) + ;; Use text-pixels for height and width, if available. + (let ((text-pixel-width (cdr (assq 'frameset--text-pixel-width parameters))) + (text-pixel-height (cdr (assq 'frameset--text-pixel-height parameters)))) + (when text-pixel-width + (setf (alist-get 'width filtered-cfg) (cons 'text-pixels text-pixel-width))) + (when text-pixel-height + (setf (alist-get 'height filtered-cfg) (cons 'text-pixels text-pixel-height)))) + (when fullscreen ;; Currently Emacs has the limitation that it does not record the size ;; and position of a frame before maximizing it, so we cannot save & diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index 6ee0d7b0231..0fd141201cb 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -527,7 +527,7 @@ each invocation of the saving commands." "If non-nil, show the cursor in the Article buffer even when not selected." :version "25.1" :group 'gnus-article - :type 'bool) + :type 'boolean) (defcustom gnus-saved-headers gnus-visible-headers "Headers to keep if `gnus-save-all-headers' is nil. @@ -6711,8 +6711,7 @@ not have a face in `gnus-article-boring-faces'." (member keys nosave-but-article) (member keys nosave-in-article)) (let (func) - (save-window-excursion - (pop-to-buffer gnus-article-current-summary) + (with-current-buffer gnus-article-current-summary ;; We disable the pick minor mode commands. (let (gnus-pick-mode) (setq func (key-binding keys t)))) diff --git a/lisp/gnus/gnus-cloud.el b/lisp/gnus/gnus-cloud.el index f3acd9e4c53..409fc53df78 100644 --- a/lisp/gnus/gnus-cloud.el +++ b/lisp/gnus/gnus-cloud.el @@ -51,6 +51,7 @@ (defcustom gnus-cloud-storage-method (if (featurep 'epg) 'epg 'base64-gzip) "Storage method for cloud data, defaults to EPG if that's available." + :version "26.1" :group 'gnus-cloud :type '(radio (const :tag "No encoding" nil) (const :tag "Base64" base64) @@ -59,6 +60,7 @@ (defcustom gnus-cloud-interactive t "Whether Gnus Cloud changes should be confirmed." + :version "26.1" :group 'gnus-cloud :type 'boolean) diff --git a/lisp/gnus/mail-source.el b/lisp/gnus/mail-source.el index 93f03be72d0..ef34c492545 100644 --- a/lisp/gnus/mail-source.el +++ b/lisp/gnus/mail-source.el @@ -1097,7 +1097,8 @@ This only works when `display-time' is enabled." ;; remember password (with-current-buffer buf (when (and imap-password - (not (assoc from mail-source-password-cache))) + (not (member (cons from imap-password) + mail-source-password-cache))) (push (cons from imap-password) mail-source-password-cache))) ;; if predicate is nil, use all uids (dolist (uid (imap-search (or predicate "1:*") buf)) diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index 0f99cb697dc..6053d33223a 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -1427,152 +1427,142 @@ starting with `not' and followed by regexps." (defface message-header-to '((((class color) (background dark)) - (:foreground "DarkOliveGreen1" :bold t)) + :foreground "DarkOliveGreen1" :bold t) (((class color) (background light)) - (:foreground "MidnightBlue" :bold t)) + :foreground "MidnightBlue" :bold t) (t - (:bold t :italic t))) + :bold t :italic t)) "Face used for displaying To headers." :group 'message-faces) -;; backward-compatibility alias -(put 'message-header-to-face 'face-alias 'message-header-to) -(put 'message-header-to-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-header-to-face + 'message-header-to "22.1") (defface message-header-cc '((((class color) (background dark)) - (:foreground "chartreuse1" :bold t)) + :foreground "chartreuse1" :bold t) (((class color) (background light)) - (:foreground "MidnightBlue")) + :foreground "MidnightBlue") (t - (:bold t))) + :bold t)) "Face used for displaying Cc headers." :group 'message-faces) -;; backward-compatibility alias -(put 'message-header-cc-face 'face-alias 'message-header-cc) -(put 'message-header-cc-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-header-cc-face + 'message-header-cc "22.1") (defface message-header-subject '((((class color) (background dark)) - (:foreground "OliveDrab1")) + :foreground "OliveDrab1") (((class color) (background light)) - (:foreground "navy blue" :bold t)) + :foreground "navy blue" :bold t) (t - (:bold t))) + :bold t)) "Face used for displaying Subject headers." :group 'message-faces) -;; backward-compatibility alias -(put 'message-header-subject-face 'face-alias 'message-header-subject) -(put 'message-header-subject-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-header-subject-face + 'message-header-subject "22.1") (defface message-header-newsgroups '((((class color) (background dark)) - (:foreground "yellow" :bold t :italic t)) + :foreground "yellow" :bold t :italic t) (((class color) (background light)) - (:foreground "blue4" :bold t :italic t)) + :foreground "blue4" :bold t :italic t) (t - (:bold t :italic t))) + :bold t :italic t)) "Face used for displaying Newsgroups headers." :group 'message-faces) -;; backward-compatibility alias -(put 'message-header-newsgroups-face 'face-alias 'message-header-newsgroups) -(put 'message-header-newsgroups-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-header-newsgroups-face + 'message-header-newsgroups "22.1") (defface message-header-other '((((class color) (background dark)) - (:foreground "VioletRed1")) + :foreground "VioletRed1") (((class color) (background light)) - (:foreground "steel blue")) + :foreground "steel blue") (t - (:bold t :italic t))) + :bold t :italic t)) "Face used for displaying other headers." :group 'message-faces) -;; backward-compatibility alias -(put 'message-header-other-face 'face-alias 'message-header-other) -(put 'message-header-other-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-header-other-face + 'message-header-other "22.1") (defface message-header-name '((((class color) (background dark)) - (:foreground "green")) + :foreground "green") (((class color) (background light)) - (:foreground "cornflower blue")) + :foreground "cornflower blue") (t - (:bold t))) + :bold t)) "Face used for displaying header names." :group 'message-faces) -;; backward-compatibility alias -(put 'message-header-name-face 'face-alias 'message-header-name) -(put 'message-header-name-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-header-name-face + 'message-header-name "22.1") (defface message-header-xheader '((((class color) (background dark)) - (:foreground "DeepSkyBlue1")) + :foreground "DeepSkyBlue1") (((class color) (background light)) - (:foreground "blue")) + :foreground "blue") (t - (:bold t))) + :bold t)) "Face used for displaying X-Header headers." :group 'message-faces) -;; backward-compatibility alias -(put 'message-header-xheader-face 'face-alias 'message-header-xheader) -(put 'message-header-xheader-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-header-xheader-face + 'message-header-xheader "22.1") (defface message-separator '((((class color) (background dark)) - (:foreground "LightSkyBlue1")) + :foreground "LightSkyBlue1") (((class color) (background light)) - (:foreground "brown")) + :foreground "brown") (t - (:bold t))) + :bold t)) "Face used for displaying the separator." :group 'message-faces) -;; backward-compatibility alias -(put 'message-separator-face 'face-alias 'message-separator) -(put 'message-separator-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-separator-face + 'message-separator "22.1") (defface message-cited-text '((((class color) (background dark)) - (:foreground "LightPink1")) + :foreground "LightPink1") (((class color) (background light)) - (:foreground "red")) + :foreground "red") (t - (:bold t))) + :bold t)) "Face used for displaying cited text names." :group 'message-faces) -;; backward-compatibility alias -(put 'message-cited-text-face 'face-alias 'message-cited-text) -(put 'message-cited-text-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-cited-text-face + 'message-cited-text "22.1") (defface message-mml '((((class color) (background dark)) - (:foreground "MediumSpringGreen")) + :foreground "MediumSpringGreen") (((class color) (background light)) - (:foreground "ForestGreen")) + :foreground "ForestGreen") (t - (:bold t))) + :bold t)) "Face used for displaying MML." :group 'message-faces) -;; backward-compatibility alias -(put 'message-mml-face 'face-alias 'message-mml) -(put 'message-mml-face 'obsolete-face "22.1") +(define-obsolete-face-alias 'message-mml-face + 'message-mml "22.1") (defun message-font-lock-make-header-matcher (regexp) (let ((form diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el index cb4c83d33e0..aa7cf430a4d 100644 --- a/lisp/htmlfontify.el +++ b/lisp/htmlfontify.el @@ -370,8 +370,8 @@ commands in `hfy-etags-cmd-alist'." (when (eq (call-process hfy-etags-bin nil t nil "--version") 0) (goto-char (point-min)) (cond - ((looking-at-p "exube") "exuberant ctags") - ((looking-at-p "GNU E") "emacs etags"))) + ((search-forward "exube" nil t) "exuberant ctags") + ((search-forward "GNU E" nil t) "emacs etags"))) ;; Return nil if the etags binary isn't executable (Bug#25468). (file-error nil)))) @@ -426,7 +426,7 @@ Some valid class specification elements are:\n (type lucid) Multiple values for a tag may be combined, to indicate that any one or more of these values in the specification key constitutes a match, eg:\n -((class color grayscale) (type tty)) would match any of:\n +\((class color grayscale) (type tty)) would match any of:\n ((class color)) ((class grayscale)) ((class color grayscale)) diff --git a/lisp/image-dired.el b/lisp/image-dired.el index 175d9df5e8c..e8046af3c0b 100644 --- a/lisp/image-dired.el +++ b/lisp/image-dired.el @@ -305,6 +305,7 @@ temporary file name (typically generated by pnqnq)" (defcustom image-dired-cmd-optipng-program (executable-find "optipng") "The file name of the `optipng' program." + :version "26.1" :type '(choice (const :tag "Not Set" nil) file) :group 'image-dired) @@ -312,6 +313,7 @@ temporary file name (typically generated by pnqnq)" "Arguments passed to `image-dired-optipng-program'. Available format specifiers are described in `image-dired-cmd-create-thumbnail-options'." + :version "26.1" :type '(repeat (string :tag "Argument")) :link '(url-link "man:optipng(1)") :group 'image-dired) diff --git a/lisp/international/mule.el b/lisp/international/mule.el index 857fa800eb4..81c04db90e9 100644 --- a/lisp/international/mule.el +++ b/lisp/international/mule.el @@ -2493,7 +2493,17 @@ This function is intended to be added to `auto-coding-functions'." (let* ((match (match-string 1)) (sym (intern (downcase match)))) (if (coding-system-p sym) - sym + ;; If the encoding tag is UTF-8 and the buffer's + ;; encoding is one of the variants of UTF-8, use the + ;; buffer's encoding. This allows, e.g., saving an + ;; XML file as UTF-8 with BOM when the tag says UTF-8. + (let ((sym-type (coding-system-type sym)) + (bfcs-type + (coding-system-type buffer-file-coding-system))) + (if (and (coding-system-equal 'utf-8 sym-type) + (coding-system-equal 'utf-8 bfcs-type)) + buffer-file-coding-system + sym)) (message "Warning: unknown coding system \"%s\"" match) nil)) ;; Files without an encoding tag should be UTF-8. But users @@ -2506,7 +2516,8 @@ This function is intended to be added to `auto-coding-functions'." (coding-system-base (detect-coding-region (point-min) size t))))) ;; Pure ASCII always comes back as undecided. - (if (memq detected '(utf-8 undecided)) + (if (memq detected + '(utf-8 'utf-8-with-signature 'utf-8-hfs undecided)) 'utf-8 (warn "File contents detected as %s. Consider adding an encoding attribute to the xml declaration, diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 2b38cb5f2b0..5c96663316e 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -2294,8 +2294,8 @@ It must accept a buffer as its only required argument.") (define-minor-mode menu-bar-mode "Toggle display of a menu bar on each frame (Menu Bar mode). With a prefix argument ARG, enable Menu Bar mode if ARG is -positive, and disable it otherwise. If called from Lisp, enable -Menu Bar mode if ARG is omitted or nil. +positive, and disable it otherwise. If called from Lisp, also +enable Menu Bar mode if ARG is omitted or nil. This command applies to all frames that exist and frames to be created in the future." diff --git a/lisp/net/gnutls.el b/lisp/net/gnutls.el index 98f7b585588..a406b0b07fd 100644 --- a/lisp/net/gnutls.el +++ b/lisp/net/gnutls.el @@ -217,7 +217,7 @@ For the meaning of the rest of the parameters, see `gnutls-boot-parameters'." TYPE is `gnutls-x509pki' (default) or `gnutls-anon'. Use nil for the default. HOSTNAME is the remote hostname. It must be a valid string. -PRIORITY-STRING is as per the GnuTLS docs, default is \"NORMAL\". +PRIORITY-STRING is as per the GnuTLS docs, default is based on \"NORMAL\". TRUSTFILES is a list of CA bundles. It defaults to `gnutls-trustfiles'. CRLFILES is a list of CRL files. KEYLIST is an alist of (client key file, client cert file) pairs. @@ -265,11 +265,11 @@ defaults to GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT." (priority-string (or priority-string (cond ((eq type 'gnutls-anon) - "NORMAL:+ANON-DH:!ARCFOUR-128") + "NORMAL:+ANON-DH:!ARCFOUR-128:%DUMBFW") ((eq type 'gnutls-x509pki) (if gnutls-algorithm-priority (upcase gnutls-algorithm-priority) - "NORMAL"))))) + "NORMAL:%DUMBFW"))))) (verify-error (or verify-error ;; this uses the value of `gnutls-verify-error' (cond diff --git a/lisp/net/mailcap.el b/lisp/net/mailcap.el index b4b38707c89..be1a171cd48 100644 --- a/lisp/net/mailcap.el +++ b/lisp/net/mailcap.el @@ -99,6 +99,7 @@ When selecting a viewer for a given MIME type, the first viewer in this list with a matching MIME-TYPE and successful TEST is selected. Only if none matches, the standard `mailcap-mime-data' is consulted." + :version "26.1" :type '(repeat (list (choice (function :tag "Function or mode") diff --git a/lisp/net/newst-backend.el b/lisp/net/newst-backend.el index 0b3881428e2..00e81f8b5e2 100644 --- a/lisp/net/newst-backend.el +++ b/lisp/net/newst-backend.el @@ -64,9 +64,12 @@ considered to be running if the newsticker timer list is not empty." "Aggregator for RSS and Atom feeds." :group 'applications) +;; Hard-coding URLs like this is a recipe for propagating obsolete info. (defconst newsticker--raw-url-list-defaults - '(("CNET News.com" - "http://export.cnet.com/export/feeds/news/rss/1,11176,,00.xml") + '( + ;; 2017/12: no response. +;;; ("CNET News.com" +;;; "http://export.cnet.com/export/feeds/news/rss/1,11176,,00.xml") ("Debian Security Advisories" "http://www.debian.org/security/dsa.en.rdf") ("Debian Security Advisories - Long format" @@ -76,23 +79,24 @@ considered to be running if the newsticker timer list is not empty." nil 3600) ("LWN (Linux Weekly News)" - "http://lwn.net/headlines/rss") - ("NY Times: Technology" - "http://partners.userland.com/nytRss/technology.xml") - ("NY Times" - "http://partners.userland.com/nytRss/nytHomepage.xml") + "https://lwn.net/headlines/rss") + ;; Not updated since 2010. +;;; ("NY Times: Technology" +;;; "http://www.nytimes.com/services/xml/rss/userland/Technology.xml") +;;; ("NY Times" +;;; "http://www.nytimes.com/services/xml/rss/userland/HomePage.xml") ("Quote of the day" - "http://www.quotationspage.com/data/qotd.rss" + "http://feeds.feedburner.com/quotationspage/qotd" "07:00" 86400) ("The Register" - "http://www.theregister.co.uk/tonys/slashdot.rdf") + "https://www.theregister.co.uk/headlines.rss") ("slashdot" - "http://slashdot.org/index.rss" + "http://rss.slashdot.org/Slashdot/slashdot" nil 3600) ;/. will ban you if under 3600 seconds! ("Wired News" - "http://www.wired.com/news_drop/netcenter/netcenter.rdf") + "https://www.wired.com/feed/rss") ("Heise News (german)" "http://www.heise.de/newsticker/heise.rdf") ("Tagesschau (german)" @@ -158,7 +162,7 @@ value effective." (defcustom newsticker-url-list-defaults '(("Emacs Wiki" - "http://www.emacswiki.org/cgi-bin/wiki.pl?action=rss" + "https://www.emacswiki.org/emacs?action=rss" nil 3600)) "A customizable list of news feeds to select from. diff --git a/lisp/net/shr.el b/lisp/net/shr.el index ad5d869531c..c505f25a5a9 100644 --- a/lisp/net/shr.el +++ b/lisp/net/shr.el @@ -149,7 +149,7 @@ cid: URL as the argument.") "Alist of tag/function pairs used to alter how shr renders certain tags. For instance, eww uses this to alter rendering of title, forms and other things: -((title . eww-tag-title) +\((title . eww-tag-title) (form . eww-tag-form) ...)") @@ -591,9 +591,14 @@ size, and full-buffer size." (defun shr-string-pixel-width (string) (if (not shr-use-fonts) (length string) - (with-temp-buffer - (insert string) - (shr-pixel-column)))) + ;; Save and restore point across with-temp-buffer, since + ;; shr-pixel-column uses save-window-excursion, which can reset + ;; point to 1. + (let ((pt (point))) + (with-temp-buffer + (insert string) + (shr-pixel-column)) + (goto-char pt)))) (defsubst shr--translate-insertion-chars () ;; Remove soft hyphens. diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el index bff1c9eb65d..973d97c2560 100644 --- a/lisp/progmodes/cc-defs.el +++ b/lisp/progmodes/cc-defs.el @@ -87,7 +87,7 @@ ;;; Variables also used at compile time. -(defconst c-version "5.33" +(defconst c-version "5.33.1" "CC Mode version number.") (defconst c-version-sym (intern c-version)) diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index ab0204cb961..12ec8f74fea 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -7572,8 +7572,8 @@ comment at the start of cc-engine.el for more info." ;; Skip leading type modifiers. If any are found we know it's a ;; prefix of a type. - (when c-opt-type-modifier-key ; e.g. "const" "volatile", but NOT "typedef" - (while (looking-at c-opt-type-modifier-key) + (when c-opt-type-modifier-prefix-key ; e.g. "const" "volatile", but NOT "typedef" + (while (looking-at c-opt-type-modifier-prefix-key) (goto-char (match-end 1)) (c-forward-syntactic-ws) (setq res 'prefix))) @@ -8167,9 +8167,9 @@ comment at the start of cc-engine.el for more info." ;; If a declaration is parsed: ;; ;; The point is left at the first token after the first complete - ;; declarator, if there is one. The return value is a list of 4 elements, + ;; declarator, if there is one. The return value is a list of 5 elements, ;; where the first is the position of the first token in the declarator. - ;; (See below for the other three.) + ;; (See below for the other four.) ;; Some examples: ;; ;; void foo (int a, char *b) stuff ... @@ -8210,7 +8210,9 @@ comment at the start of cc-engine.el for more info." ;; ;; The third element of the return value is non-nil when the declaration ;; parsed might be an expression. The fourth element is the position of - ;; the start of the type identifier. + ;; the start of the type identifier. The fifth element is t if either + ;; CONTEXT was 'top, or the declaration is detected to be treated as top + ;; level (e.g. with the keyword "extern"). ;; ;; If a cast is parsed: ;; @@ -8308,6 +8310,9 @@ comment at the start of cc-engine.el for more info." ;; Set when the symbol before `preceding-token-end' is known to ;; terminate the previous construct, or when we're at point-min. at-decl-start + ;; Set when we have encountered a keyword (e.g. "extern") which + ;; causes the following declaration to be treated as though top-level. + make-top ;; Save `c-record-type-identifiers' and ;; `c-record-ref-identifiers' since ranges are recorded ;; speculatively and should be thrown away if it turns out @@ -8339,7 +8344,9 @@ comment at the start of cc-engine.el for more info." (cond ;; Look for a specifier keyword clause. - ((or (looking-at c-prefix-spec-kwds-re) + ((or (and (looking-at c-make-top-level-key) + (setq make-top t)) + (looking-at c-prefix-spec-kwds-re) (and (c-major-mode-is 'java-mode) (looking-at "@[A-Za-z0-9]+"))) (save-match-data @@ -8609,7 +8616,7 @@ comment at the start of cc-engine.el for more info." ;; construct here in C, since we want to recognize this as a ;; typeless function declaration. (not (and (c-major-mode-is 'c-mode) - (eq context 'top) + (or (eq context 'top) make-top) (eq (char-after) ?\))))) (if (eq (char-after) ?\)) (when (> paren-depth 0) @@ -8657,7 +8664,7 @@ comment at the start of cc-engine.el for more info." ;; Recognize a top-level typeless ;; function declaration in C. (and (c-major-mode-is 'c-mode) - (eq context 'top) + (or (eq context 'top) make-top) (eq (char-after) ?\)))))))) (setq pos (c-up-list-forward (point))) (eq (char-before pos) ?\))) @@ -8914,6 +8921,7 @@ comment at the start of cc-engine.el for more info." (when (and got-identifier (looking-at c-after-suffixed-type-decl-key) (or (eq context 'top) + make-top (and (eq context nil) (match-beginning 1))) (if (and got-parens @@ -9080,7 +9088,7 @@ comment at the start of cc-engine.el for more info." ;; CASE 19 (or (eq context 'decl) (and (c-major-mode-is 'c-mode) - (eq context 'top)))))) + (or (eq context 'top) make-top)))))) ;; The point is now after the type decl expression. @@ -9185,7 +9193,8 @@ comment at the start of cc-engine.el for more info." (and (or at-type-decl at-typedef) (cons at-type-decl at-typedef)) maybe-expression - type-start)) + type-start + (or (eq context 'top) make-top))) (t ;; False alarm. Restore the recorded ranges. @@ -10431,7 +10440,7 @@ comment at the start of cc-engine.el for more info." c-decl-block-key)) (braceassignp 'dontknow) inexpr-brace-list bufpos macro-start res pos after-type-id-pos - in-paren) + in-paren parens-before-brace) (setq res (c-backward-token-2 1 t lim)) ;; Checks to do only on the first sexp before the brace. @@ -10449,6 +10458,9 @@ comment at the start of cc-engine.el for more info." ((and (looking-at c-symbol-start) (not (looking-at c-keywords-regexp))) (setq after-type-id-pos (point))) + ((eq (char-after) ?\() + (setq parens-before-brace t) + nil) (t nil)) (save-excursion (cond @@ -10497,6 +10509,14 @@ comment at the start of cc-engine.el for more info." ;; Single identifier between '(' and '{'. We have a bracelist. (cons after-type-id-pos 'in-paren)) + ;; Are we at the parens of a C++ lambda expression? + ((and parens-before-brace + (save-excursion + (and + (zerop (c-backward-token-2 1 t lim)) + (c-looking-at-c++-lambda-capture-list)))) + nil) ; a lambda expression isn't a brace list. + (t (goto-char pos) ;; Checks to do on all sexps before the brace, up to the diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index d352e5b08c9..7b99c2f54e5 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el @@ -1251,6 +1251,17 @@ casts and declarations are fontified. Used on level 2 and higher." ;; Got a cached hit in some other type of arglist. (type (cons 'arglist t)) + ;; We're at a C++ uniform initialization. + ((and (c-major-mode-is 'c++-mode) + (eq (char-before match-pos) ?\() + (save-excursion + (goto-char match-pos) + (and + (zerop (c-backward-token-2 2)) + (looking-at c-identifier-start) + (c-got-face-at (point) + '(font-lock-variable-name-face))))) + (cons 'not-decl nil)) ((and not-front-decl ;; The point is within the range of a previously ;; encountered type decl expression, so the arglist @@ -1589,7 +1600,8 @@ casts and declarations are fontified. Used on level 2 and higher." (setq max-type-decl-end (point)))) (goto-char start-pos) (c-font-lock-single-decl limit decl-or-cast match-pos - context toplev)) + context + (or toplev (nth 4 decl-or-cast)))) (t t)))) diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el index 227b3e16485..169b61c3dd3 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -1925,16 +1925,32 @@ on one of the `*-decl-kwds' lists." t (c-make-keywords-re t (c-lang-const c-type-prefix-kwds))) (c-lang-defvar c-type-prefix-key (c-lang-const c-type-prefix-key)) -(c-lang-defconst c-type-modifier-kwds - "Type modifier keywords. These can occur almost anywhere in types -but they don't build a type of themselves. Unlike the keywords on -`c-primitive-type-kwds', they are fontified with the keyword face and -not the type face." +(c-lang-defconst c-type-modifier-prefix-kwds + "Type modifier keywords which can appear in front of a type. These can +also occur almost anywhere in types but they don't build a type of +themselves. Unlike the keywords on `c-primitive-type-kwds', they are +fontified with the keyword face and not the type face." t nil c '("const" "restrict" "volatile") - c++ '("const" "noexcept" "volatile" "throw") + c++ '("const" "noexcept" "volatile") objc '("const" "volatile")) +(c-lang-defconst c-opt-type-modifier-prefix-key + ;; Adorned regexp matching `c-type-modifier-prefix-kwds', or nil in + ;; languages without such keywords. + t (and (c-lang-const c-type-modifier-prefix-kwds) + (c-make-keywords-re t (c-lang-const c-type-modifier-prefix-kwds)))) +(c-lang-defvar c-opt-type-modifier-prefix-key + (c-lang-const c-opt-type-modifier-prefix-key)) + +(c-lang-defconst c-type-modifier-kwds + "Type modifier keywords. These can occur almost anywhere in types except +at the start, but they don't build a type of themselves. Unlike the keywords +on `c-primitive-type-kwds', they are fontified with the keyword face and not +the type face." + t (c-lang-const c-type-modifier-prefix-kwds) + c++ (append (c-lang-const c-type-modifier-prefix-kwds) '("throw"))) + (c-lang-defconst c-opt-type-modifier-key ;; Adorned regexp matching `c-type-modifier-kwds', or nil in ;; languages without such keywords. @@ -2355,6 +2371,16 @@ construct it's part of continues." t nil (c c++ objc) '("extern")) +(c-lang-defconst c-make-top-level-kwds + "Keywords which make declarations they introduce be handled as top-level." + t nil + (c c++ objc) '("extern")) + +(c-lang-defconst c-make-top-level-key + ;; A regexp which matches any `c-make-top-level-kwds' keyword. + t (c-make-keywords-re t (c-lang-const c-make-top-level-kwds))) +(c-lang-defvar c-make-top-level-key (c-lang-const c-make-top-level-key)) + (c-lang-defconst c-type-list-kwds "Keywords that may be followed by a comma separated list of type identifiers, where each optionally can be prefixed by keywords. (Can diff --git a/lisp/progmodes/cc-vars.el b/lisp/progmodes/cc-vars.el index c4213797636..f7bfe7c672a 100644 --- a/lisp/progmodes/cc-vars.el +++ b/lisp/progmodes/cc-vars.el @@ -1641,8 +1641,9 @@ In the fontification engine, it is sometimes impossible to determine whether a construct is a declaration or an expression. This happens particularly in C++, due to ambiguities in the language. When such a construct is like \"foo * bar\" or \"foo &bar\", and this variable is non-nil -(the default), the construct will be fontified as a declaration if there is +\(the default), the construct will be fontified as a declaration if there is white space either before or after the operator, but not both." + :version "26.1" :type 'boolean :group 'c) @@ -1658,6 +1659,7 @@ identifiers. If you change this variable's value, call the function `c-make-noise-macro-regexps' to set the necessary internal variables (or do this implicitly by reinitializing C/C++/Objc Mode on any buffer)." + :version "26.1" :type '(repeat :tag "List of names" string) :group 'c) (put 'c-noise-macro-names 'safe-local-variable #'c-string-list-p) @@ -1666,7 +1668,8 @@ this implicitly by reinitializing C/C++/Objc Mode on any buffer)." "A list of names of macros \(or compiler extensions like \"__attribute__\") which optionally have arguments in parentheses, and which expand to nothing. These are recognized by CC Mode only in declarations." - :type '(regexp :tag "List of names (possibly empty)" string) + :version "26.1" + :type '(repeat :tag "List of names (possibly empty)" string) :group 'c) (put 'c-noise-macro-with-parens-names 'safe-local-variable #'c-string-list-p) diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el index 4cce47e5d8c..c68001d2366 100644 --- a/lisp/progmodes/compile.el +++ b/lisp/progmodes/compile.el @@ -1746,13 +1746,7 @@ Returns the compilation buffer created." (let ((process-environment (append compilation-environment - (if (if (boundp 'system-uses-terminfo);`If' for compiler warning. - system-uses-terminfo) - (list "TERM=dumb" "TERMCAP=" - (format "COLUMNS=%d" (window-width))) - (list "TERM=emacs" - (format "TERMCAP=emacs:co#%d:tc=unknown:" - (window-width)))) + (comint-term-environment) (list (format "INSIDE_EMACS=%s,compile" emacs-version)) (copy-sequence process-environment)))) (set (make-local-variable 'compilation-arguments) diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el index 15a36175970..f23af82d354 100644 --- a/lisp/progmodes/flymake.el +++ b/lisp/progmodes/flymake.el @@ -127,6 +127,7 @@ If nil, never start checking buffer automatically like this." (defcustom flymake-start-on-flymake-mode t "Start syntax check when `flymake-mode' is enabled. Specifically, start it when the buffer is actually displayed." + :version "26.1" :type 'boolean) (define-obsolete-variable-alias 'flymake-start-syntax-check-on-find-file @@ -141,6 +142,7 @@ Specifically, start it when the buffer is actually displayed." (defcustom flymake-wrap-around t "If non-nil, moving to errors wraps around buffer boundaries." + :version "26.1" :type 'boolean) (when (fboundp 'define-fringe-bitmap) diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el index c2d80223541..dac3726bb14 100644 --- a/lisp/progmodes/grep.el +++ b/lisp/progmodes/grep.el @@ -162,6 +162,7 @@ Customize or call the function `grep-apply-setting'." (defcustom grep-use-null-filename-separator 'auto-detect "If non-nil, use `grep's `--null' option. This is done to disambiguate file names in `grep's output." + :version "26.1" :type '(choice (const :tag "Do Not Use `--null'" nil) (const :tag "Use `--null'" t) (other :tag "Not Set" auto-detect)) diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index 3d3ea079cff..18101f53e0a 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -477,6 +477,7 @@ This applies to function movement, marking, and so on." (defcustom js-indent-align-list-continuation t "Align continuation of non-empty ([{ lines in `js-mode'." + :version "26.1" :type 'boolean :group 'js) diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el index f3cb8109133..fecdb720f58 100644 --- a/lisp/progmodes/perl-mode.el +++ b/lisp/progmodes/perl-mode.el @@ -587,6 +587,7 @@ create a new comment." This is a non empty list of strings, the checker tool possibly followed by required arguments. Once launched it will receive the Perl source to be checked as its standard input." + :version "26.1" :group 'perl :type '(repeat string)) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 9d3e428e23c..2de40c4ab88 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -5165,6 +5165,7 @@ This is a non empty list of strings, the checker tool possibly followed by required arguments. Once launched it will receive the Python source to be checked as its standard input. To use `flake8' you would set this to (\"flake8\" \"-\")." + :version "26.1" :group 'python-flymake :type '(repeat string)) @@ -5186,6 +5187,7 @@ MESSAGE'th gives the message text itself. If COLUMN or TYPE are nil or that index didn't match, that information is not present on the matched line and a default will be used." + :version "26.1" :group 'python-flymake :type '(list regexp (integer :tag "Line's index") @@ -5209,6 +5211,7 @@ For example, when using `flake8' a possible configuration could be: (\"^[EW][0-9]+\" . :note)) By default messages are considered errors." + :version "26.1" :group 'python-flymake :type `(alist :key-type (regexp) :value-type (symbol))) diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index dc1b0f8e2da..1c7df7e35a2 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -2314,12 +2314,14 @@ See `font-lock-syntax-table'.") (defcustom ruby-flymake-use-rubocop-if-available t "Non-nil to use the Rubocop Flymake backend. Only takes effect if Rubocop is installed." + :version "26.1" :type 'boolean :group 'ruby :safe 'booleanp) (defcustom ruby-rubocop-config ".rubocop.yml" "Configuration file for `ruby-flymake-rubocop'." + :version "26.1" :type 'string :group 'ruby :safe 'stringp) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 10a1edc3ee0..1baac1d4204 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -764,14 +764,14 @@ mode is experimental." :version "24.1" ; rev670 :group 'verilog-mode-actions :type 'boolean) -(put 'verilog-auto-declare-nettype 'safe-local-variable `stringp) +(put 'verilog-auto-declare-nettype 'safe-local-variable 'stringp) (defcustom verilog-auto-wire-comment t "Non-nil indicates to insert to/from comments with `verilog-auto-wire' etc." :version "25.1" :group 'verilog-mode-actions :type 'boolean) -(put 'verilog-auto-wire-comment 'safe-local-variable `verilog-booleanp) +(put 'verilog-auto-wire-comment 'safe-local-variable 'verilog-booleanp) (defcustom verilog-auto-wire-type nil "Non-nil specifies the data type to use with `verilog-auto-wire' etc. @@ -781,8 +781,8 @@ this is generally only appropriate when making a non-SystemVerilog wrapper containing SystemVerilog cells." :version "24.1" ; rev673 :group 'verilog-mode-actions - :type 'string) -(put 'verilog-auto-wire-type 'safe-local-variable `stringp) + :type '(choice (const nil) string)) +(put 'verilog-auto-wire-type 'safe-local-variable 'stringp) (defcustom verilog-auto-endcomments t "Non-nil means insert a comment /* ... */ after `end's. diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el index 93ca36b08aa..96c3f6b9395 100644 --- a/lisp/textmodes/css-mode.el +++ b/lisp/textmodes/css-mode.el @@ -1037,7 +1037,7 @@ This recognizes CSS-color-4 extensions." STR is the incoming CSS hex color. This function simply drops any transparency." ;; Either #RGB or #RRGGBB, drop the "A" or "AA". - (if (> (length str) 4) + (if (> (length str) 5) (substring str 0 7) (substring str 0 4))) diff --git a/lisp/textmodes/less-css-mode.el b/lisp/textmodes/less-css-mode.el index d31414e3a4b..c2846ac926b 100644 --- a/lisp/textmodes/less-css-mode.el +++ b/lisp/textmodes/less-css-mode.el @@ -78,6 +78,7 @@ (defgroup less-css nil "Less CSS mode." + :version "26.1" :prefix "less-css-" :group 'css) @@ -105,7 +106,7 @@ Use \"-x\" to minify output." This path is expanded relative to the directory of the Less file using `expand-file-name', so both relative and absolute paths will work as expected." - :type 'directory) + :type '(choice (const :tag "Same as Less file" nil) directory)) ;;;###autoload (put 'less-css-output-directory 'safe-local-variable 'stringp) @@ -115,7 +116,7 @@ This can be also be set to a full path, or a relative path. If the path is relative, it will be relative to the value of `less-css-output-dir', if set, or the current directory by default." - :type 'file) + :type '(choice (const :tag "Default" nil) file)) (make-variable-buffer-local 'less-css-output-file-name) (defcustom less-css-input-file-name nil @@ -131,7 +132,7 @@ variables. This can be also be set to a full path, or a relative path. If the path is relative, it will be relative to the current directory by default." - :type 'file) + :type '(choice (const nil) file)) ;;;###autoload (put 'less-css-input-file-name 'safe-local-variable 'stringp) (make-variable-buffer-local 'less-css-input-file-name) diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el index 5c585ea46ca..432a779b4a8 100644 --- a/lisp/textmodes/tex-mode.el +++ b/lisp/textmodes/tex-mode.el @@ -266,12 +266,14 @@ measured relative to that of the normal text." (defcustom tex-chktex-program "chktex" "ChkTeX executable to use for linting TeX files." + :version "26.1" :type 'string :link '(url-link "man:chktex(1)") :group 'tex-flymake) (defcustom tex-chktex-extra-flags nil "Extra command line flags for `tex-chktex-program'." + :version "26.1" :type '(repeat string) :group 'tex-flymake) @@ -1012,9 +1014,10 @@ Inherits `shell-mode-map' with a few additions.") ;; This is a) ugly, and b) cheating, but this was the last ;; remaining warning from byte-compiling all of Emacs... (eval-when-compile - (setq byte-compile-function-environment - (delq (assq 'tex-mode byte-compile-function-environment) - byte-compile-function-environment))) + (if (boundp 'byte-compile-function-environment) + (setq byte-compile-function-environment + (delq (assq 'tex-mode byte-compile-function-environment) + byte-compile-function-environment)))) ;;;###autoload (defun tex-mode () diff --git a/lisp/textmodes/tildify.el b/lisp/textmodes/tildify.el index 0d7b15dfc6b..f25dfbcc75d 100644 --- a/lisp/textmodes/tildify.el +++ b/lisp/textmodes/tildify.el @@ -350,7 +350,7 @@ If ASK is nil, perform replace without asking user for confirmation. Returns (count . response) cons where count is number of string replacements done and response is one of symbols: t (all right), nil -(quit), force (replace without further questions)." +\(quit), force (replace without further questions)." (save-excursion (goto-char beg) (let ((regexp tildify-pattern) diff --git a/lisp/time.el b/lisp/time.el index 6cd7320e72f..49f345c26d5 100644 --- a/lisp/time.el +++ b/lisp/time.el @@ -173,7 +173,9 @@ If the value is t instead of an alist, use the value of `legacy-style-world-list' otherwise." :group 'display-time - :type '(repeat (list string string)) + :type '(choice (const :tag "Default" t) + (repeat :tag "List of zones and labels" + (list (string :tag "Zone") (string :tag "Label")))) :version "23.1") (defun time--display-world-list () diff --git a/lisp/vc/cvs-status.el b/lisp/vc/cvs-status.el index 770791a3c09..3124a61422b 100644 --- a/lisp/vc/cvs-status.el +++ b/lisp/vc/cvs-status.el @@ -33,11 +33,6 @@ ;;; -(defgroup cvs-status nil - "Major mode for browsing `cvs status' output." - :group 'pcl-cvs - :prefix "cvs-status-") - (easy-mmode-defmap cvs-status-mode-map '(("n" . next-line) ("p" . previous-line) diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index df9627abdf0..df33d10ed0c 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -2005,9 +2005,6 @@ For use in `add-log-current-defun-function'." (replace-match (cdr (assq (char-before) '((?+ . "-") (?> . "<")))))) ) -(declare-function smerge-refine-subst "smerge-mode" - (beg1 end1 beg2 end2 props-c &optional preproc props-r props-a)) - (defun diff--forward-while-leading-char (char bound) "Move point until reaching a line not starting with CHAR. Return new point, if it was moved." @@ -2049,13 +2046,13 @@ Return new point, if it was moved." (diff--forward-while-leading-char ?+ end) (progn (diff--forward-while-leading-char ?\\ end) (setq end-add (point)))) - (smerge-refine-subst beg-del beg-add beg-add end-add + (smerge-refine-regions beg-del beg-add beg-add end-add nil 'diff-refine-preproc props-r props-a))))) (`context (let* ((middle (save-excursion (re-search-forward "^---"))) (other middle)) (while (re-search-forward "^\\(?:!.*\n\\)+" middle t) - (smerge-refine-subst (match-beginning 0) (match-end 0) + (smerge-refine-regions (match-beginning 0) (match-end 0) (save-excursion (goto-char other) (re-search-forward "^\\(?:!.*\n\\)+" end) @@ -2070,7 +2067,7 @@ Return new point, if it was moved." (let ((beg1 (1+ (point)))) (when (re-search-forward "^---.*\n" end t) ;; It's a combined add&remove, so there's something to do. - (smerge-refine-subst beg1 (match-beginning 0) + (smerge-refine-regions beg1 (match-beginning 0) (match-end 0) end nil 'diff-refine-preproc props-r props-a))))))))) diff --git a/lisp/vc/emerge.el b/lisp/vc/emerge.el index 9c25ec43321..3f945bbb2bf 100644 --- a/lisp/vc/emerge.el +++ b/lisp/vc/emerge.el @@ -3171,11 +3171,9 @@ See also `auto-save-file-name-p'." (setq limit (1+ (match-end 0))))) s) -;; Metacharacters that have to be protected from the shell when executing -;; a diff/diff3 command. (defcustom emerge-metachars nil - "Obsolete, emerge now uses `shell-quote-argument'." - :type 'regexp + "No longer used. Emerge now uses `shell-quote-argument'." + :type '(choice (const nil) regexp) :group 'emerge) (make-obsolete-variable 'emerge-metachars nil "26.1") diff --git a/lisp/vc/smerge-mode.el b/lisp/vc/smerge-mode.el index b988463de1e..ea1e0c726fd 100644 --- a/lisp/vc/smerge-mode.el +++ b/lisp/vc/smerge-mode.el @@ -919,7 +919,7 @@ Its behavior has mainly two restrictions: after the newline. This only matters if `smerge-refine-ignore-whitespace' is nil. - it needs to be unaffected by changes performed by the `preproc' argument - to `smerge-refine-subst'. + to `smerge-refine-regions'. This only matters if `smerge-refine-weight-hack' is nil.") (defvar smerge-refine-ignore-whitespace t @@ -1188,15 +1188,15 @@ repeating the command will highlight other two parts." (put-text-property (match-beginning 0) (1+ (match-beginning 0)) 'smerge-refine-part (cons (buffer-chars-modified-tick) part))) - (smerge-refine-subst (match-beginning n1) (match-end n1) + (smerge-refine-regions (match-beginning n1) (match-end n1) (match-beginning n2) (match-end n2) (if smerge-use-changed-face - '((smerge . refine) (face . smerge-refined-change))) + '((smerge . refine) (font-lock-face . smerge-refined-change))) nil (unless smerge-use-changed-face - '((smerge . refine) (face . smerge-refined-removed))) + '((smerge . refine) (font-lock-face . smerge-refined-removed))) (unless smerge-use-changed-face - '((smerge . refine) (face . smerge-refined-added)))))) + '((smerge . refine) (font-lock-face . smerge-refined-added)))))) (defun smerge-swap () "Swap the \"Upper\" and the \"Lower\" chunks. diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el index 9e597a209a7..7962b70f20a 100644 --- a/lisp/vc/vc-hg.el +++ b/lisp/vc/vc-hg.el @@ -278,7 +278,7 @@ within the repository. If no list entry produces a useful revision, return `nil'." :type '(repeat (choice - (const :tag "Active bookmark" 'bookmark) + (const :tag "Active bookmark" builtin-active-bookmark) (string :tag "Hg template") (function :tag "Custom"))) :version "26.1" diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el index 99c8211ad5f..394b86c024b 100644 --- a/lisp/vc/vc-hooks.el +++ b/lisp/vc/vc-hooks.el @@ -34,9 +34,9 @@ ;; Faces -(defgroup vc-state-faces nil +(defgroup vc-faces nil "Faces used in the mode line by the VC state indicator." - :group 'vc-faces + :group 'vc :group 'mode-line :version "25.1") diff --git a/src/buffer.c b/src/buffer.c index 12a467daae4..75cb470af8d 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -386,9 +386,9 @@ Value is nil if OBJECT is not a buffer or if it has been killed. */) } DEFUN ("buffer-list", Fbuffer_list, Sbuffer_list, 0, 1, 0, - doc: /* Return a list of all existing live buffers. -If the optional arg FRAME is a frame, we return the buffer list in the -proper order for that frame: the buffers show in FRAME come first, + doc: /* Return a list of all live buffers. +If the optional arg FRAME is a frame, return the buffer list in the +proper order for that frame: the buffers shown in FRAME come first, followed by the rest of the buffers. */) (Lisp_Object frame) { diff --git a/src/data.c b/src/data.c index 3c9152049b7..b94c899a3d8 100644 --- a/src/data.c +++ b/src/data.c @@ -1481,7 +1481,7 @@ SYMBOL is the variable being changed. NEWVAL is the value it will be changed to. OPERATION is a symbol representing the kind of change, one of: `set', `let', `unlet', `makunbound', and `defvaralias'. -WHERE is a buffer if the buffer-local value of the variable being +WHERE is a buffer if the buffer-local value of the variable is being changed, nil otherwise. All writes to aliases of SYMBOL will call WATCH-FUNCTION too. */) diff --git a/src/font.c b/src/font.c index 441652b0951..69efd7d56d2 100644 --- a/src/font.c +++ b/src/font.c @@ -5055,10 +5055,10 @@ DEFUN ("font-info", Ffont_info, Sfont_info, 1, 2, 0, doc: /* Return information about a font named NAME on frame FRAME. If FRAME is omitted or nil, use the selected frame. -The returned value is a vector: +The returned value is a vector of 14 elements: [ OPENED-NAME FULL-NAME SIZE HEIGHT BASELINE-OFFSET RELATIVE-COMPOSE DEFAULT-ASCENT MAX-WIDTH ASCENT DESCENT SPACE-WIDTH AVERAGE-WIDTH - CAPABILITY ] + FILENAME CAPABILITY ] where OPENED-NAME is the name used for opening the font, FULL-NAME is the full name of the font, @@ -5068,12 +5068,12 @@ where RELATIVE-COMPOSE and DEFAULT-ASCENT are the numbers controlling how to compose characters, MAX-WIDTH is the maximum advance width of the font, - ASCENT, DESCENT, SPACE-WIDTH, AVERAGE-WIDTH are metrics of the font - in pixels, + ASCENT, DESCENT, SPACE-WIDTH, and AVERAGE-WIDTH are metrics of + the font in pixels, FILENAME is the font file name, a string (or nil if the font backend doesn't provide a file name). CAPABILITY is a list whose first element is a symbol representing the - font format, one of x, opentype, truetype, type1, pcf, or bdf. + font format, one of `x', `opentype', `truetype', `type1', `pcf', or `bdf'. The remaining elements describe the details of the font capabilities, as follows: diff --git a/src/frame.c b/src/frame.c index 94ec9fbdc7d..09c0e79bdef 100644 --- a/src/frame.c +++ b/src/frame.c @@ -1608,6 +1608,8 @@ next_frame (Lisp_Object frame, Lisp_Object minibuf) Lisp_Object f, tail; int passed = 0; + eassume (CONSP (Vframe_list)); + while (passed < 2) FOR_EACH_FRAME (tail, f) { @@ -1630,6 +1632,8 @@ prev_frame (Lisp_Object frame, Lisp_Object minibuf) { Lisp_Object f, tail, prev = Qnil; + eassume (CONSP (Vframe_list)); + FOR_EACH_FRAME (tail, f) { if (EQ (frame, f) && !NILP (prev)) @@ -1915,6 +1919,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force) if (f == sf) { Lisp_Object tail; + eassume (CONSP (Vframe_list)); /* Look for another visible frame on the same terminal. Do not call next_frame here because it may loop forever. diff --git a/src/frame.h b/src/frame.h index a3b77636435..a5d4e4fc88b 100644 --- a/src/frame.h +++ b/src/frame.h @@ -1149,8 +1149,7 @@ default_pixels_per_inch_y (void) /* FOR_EACH_FRAME (LIST_VAR, FRAME_VAR) followed by a statement is a `for' loop which iterates over the elements of Vframe_list. The loop will set FRAME_VAR, a Lisp_Object, to each frame in - Vframe_list in succession and execute the statement. Vframe_list - should be nonempty, so the body is executed at least once. LIST_VAR + Vframe_list in succession and execute the statement. LIST_VAR should be a Lisp_Object too; it is used to iterate through the Vframe_list. Note that this macro walks over child frames and the tooltip frame as well. @@ -1160,7 +1159,7 @@ default_pixels_per_inch_y (void) something which executes the statement once. */ #define FOR_EACH_FRAME(list_var, frame_var) \ - for ((list_var) = (eassume (CONSP (Vframe_list)), Vframe_list); \ + for ((list_var) = Vframe_list; \ (CONSP (list_var) \ && (frame_var = XCAR (list_var), true)); \ list_var = XCDR (list_var)) diff --git a/src/xdisp.c b/src/xdisp.c index 3791d982b28..efc47b39e60 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -25087,19 +25087,25 @@ invisible_prop (Lisp_Object propval, Lisp_Object list) } DEFUN ("invisible-p", Finvisible_p, Sinvisible_p, 1, 1, 0, - doc: /* Non-nil if the property makes the text invisible. -POS-OR-PROP can be a marker or number, in which case it is taken to be -a position in the current buffer and the value of the `invisible' property -is checked; or it can be some other value, which is then presumed to be the -value of the `invisible' property of the text of interest. -The non-nil value returned can be t for truly invisible text or something -else if the text is replaced by an ellipsis. */) - (Lisp_Object pos_or_prop) + doc: /* Non-nil if text properties at POS cause text there to be currently invisible. +POS should be a marker or a buffer position; the value of the `invisible' +property at that position in the current buffer is examined. +POS can also be the actual value of the `invisible' text or overlay +property of the text of interest, in which case the value itself is +examined. + +The non-nil value returned can be t for currently invisible text that is +entirely hidden on display, or some other non-nil, non-t value if the +text is replaced by an ellipsis. + +Note that whether text with `invisible' property is actually hidden on +display may depend on `buffer-invisibility-spec', which see. */) + (Lisp_Object pos) { Lisp_Object prop - = (NATNUMP (pos_or_prop) || MARKERP (pos_or_prop) - ? Fget_char_property (pos_or_prop, Qinvisible, Qnil) - : pos_or_prop); + = (NATNUMP (pos) || MARKERP (pos) + ? Fget_char_property (pos, Qinvisible, Qnil) + : pos); int invis = TEXT_PROP_MEANS_INVISIBLE (prop); return (invis == 0 ? Qnil : invis == 1 ? Qt diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el index 1bcd3a0f98b..41687e41c8d 100644 --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@ -3671,7 +3671,7 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'." (format "%s=%d" envvar port) tramp-remote-process-environment))) (should - (string-equal + (string-match (number-to-string port) (shell-command-to-string (format "echo -n $%s" envvar)))))) diff --git a/test/lisp/textmodes/css-mode-tests.el b/test/lisp/textmodes/css-mode-tests.el index 47cf5f9244b..1e58751f140 100644 --- a/test/lisp/textmodes/css-mode-tests.el +++ b/test/lisp/textmodes/css-mode-tests.el @@ -295,6 +295,12 @@ (insert input ")")) (should (equal (css--hsl-color) "#ff0000"))))) +(ert-deftest css-test-hex-color () + (should (equal (css--hex-color "#abc") "#abc")) + (should (equal (css--hex-color "#abcd") "#abc")) + (should (equal (css--hex-color "#aabbcc") "#aabbcc")) + (should (equal (css--hex-color "#aabbccdd") "#aabbcc"))) + (ert-deftest css-test-named-color () (dolist (text '("@mixin black" "@include black")) (with-temp-buffer