emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 5d5d5d4 3/3: Merge from origin/emacs-27


From: Glenn Morris
Subject: master 5d5d5d4 3/3: Merge from origin/emacs-27
Date: Mon, 23 Mar 2020 12:48:28 -0400 (EDT)

branch: master
commit 5d5d5d492c0f1cc500713b133b1ad3e205031714
Merge: 7832e61 d66331a
Author: Glenn Morris <address@hidden>
Commit: Glenn Morris <address@hidden>

    Merge from origin/emacs-27
    
    d66331aea4 (origin/emacs-27) Don't build the Gnulib 'utimens' module ...
    f2351a689b Add Harfbuzz dependency
    8944310d7c Don't signal during backtrace unrewind (Bug#40088)
    8709aaddd8 Fix a couple of problems in changelog generating functions
    9ab85f087f Fix cl-concatenate (Bug#40180)
    561e9fb91b Improve documentation of project.el commands
    b28a9a6cc3 Make svg images with links valid
    7515252cce * lisp/tab-line.el (tab-line-new-button-show): New defcustom.
    
    # Conflicts:
    #   etc/NEWS
    #   nt/gnulib-cfg.mk
---
 admin/nt/dist-build/build-dep-zips.py  |  1 +
 doc/emacs/emacs.texi                   |  1 +
 doc/emacs/maintaining.texi             | 75 ++++++++++++++++++++++++++++++++++
 etc/NEWS.27                            |  3 ++
 lisp/emacs-lisp/cl-extra.el            |  2 +-
 lisp/progmodes/project.el              | 11 +++--
 lisp/svg.el                            |  3 +-
 lisp/tab-line.el                       | 22 +++++++---
 lisp/vc/diff-mode.el                   | 49 +++++++++++-----------
 lisp/vc/log-edit.el                    | 26 ++++++------
 nt/gnulib-cfg.mk                       |  1 +
 src/data.c                             |  2 +-
 src/eval.c                             |  4 +-
 src/lisp.h                             |  1 +
 test/lisp/emacs-lisp/cl-extra-tests.el |  8 ++++
 15 files changed, 159 insertions(+), 50 deletions(-)

diff --git a/admin/nt/dist-build/build-dep-zips.py 
b/admin/nt/dist-build/build-dep-zips.py
index 9d19fe0..b0345a4 100755
--- a/admin/nt/dist-build/build-dep-zips.py
+++ b/admin/nt/dist-build/build-dep-zips.py
@@ -31,6 +31,7 @@ EMACS_MAJOR_VERSION="28"
 # This list derives from the features we want Emacs to compile with.
 PKG_REQ='''mingw-w64-x86_64-giflib
 mingw-w64-x86_64-gnutls
+mingw-w64-x86_64-harfbuzz
 mingw-w64-x86_64-lcms2
 mingw-w64-x86_64-libjpeg-turbo
 mingw-w64-x86_64-libpng
diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi
index c3cb37e..6ef4ca6 100644
--- a/doc/emacs/emacs.texi
+++ b/doc/emacs/emacs.texi
@@ -785,6 +785,7 @@ GDB Graphical Interface
 Maintaining Large Programs
 
 * Version Control::     Using version control systems.
+* Projects::            Commands for handling source files in a project.
 * Change Log::          Maintaining a change history for your program.
 * Xref::                Find definitions and references of any function,
                           method, struct, macro, @dots{} in your program.
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index a6f66f6..ebcdddf 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -14,6 +14,9 @@ Unified interface to Support for Version Control Systems
 (@acronym{VCS}) that record the history of changes to source files.
 
 @item
+Commands for handling programming projects.
+
+@item
 A specialized mode for maintaining @file{ChangeLog} files that provide
 a chronological log of program changes.
 
@@ -38,6 +41,7 @@ Lisp Regression Testing}).
 
 @menu
 * Version Control::     Using version control systems.
+* Projects::            Commands for handling source files in a project.
 * Change Log::          Maintaining a change history for your program.
 * Xref::                Find definitions and references of any function,
                           method, struct, macro, @dots{} in your program.
@@ -1630,6 +1634,77 @@ different revision with @kbd{C-u C-x v v}.
 @include vc1-xtra.texi
 @end ifnottex
 
+@node Projects
+@section Working with Projects
+@cindex projects
+
+@cindex project root
+  A @dfn{project} is a collection of files used for producing one or
+more programs.  Files that belong to a project are typically stored in
+a hierarchy of directories; the top-level directory of the hierarchy
+is known as the @dfn{project root}.
+
+@cindex project back-end
+  Whether a given directory is a root of some project is determined by
+the project-specific infrastructure, known as @dfn{project back-end}.
+Emacs currently supports two such back-ends: VC (@pxref{Version
+Control}), whereby a VCS repository is considered a project; and EDE
+(@pxref{EDE}).  This is expected to be extended in the future to
+support additional types of projects.
+
+  Which files do or don't belong to a project is also determined by
+the project back-end.  For example, the VC back-end doesn't consider
+``ignored'' files (@pxref{VC Ignore}) to be part of the project.
+
+  Emacs provides commands for handling project files conveniently.
+This section describes these commands.
+
+@cindex current project
+  All of the commands described here share the notion of the
+@dfn{current project}.  The current project is determined by the
+@code{default-directory} (@pxref{File Names}) of the buffer that is
+the current buffer when the command is invoked.  If that directory
+doesn't seem to belong to a recognizable project, these commands
+prompt you for the project directory.
+
+@findex project-find-file
+  The command @code{project-find-file} is a convenient way of visiting
+files (@pxref{Visiting}) that belong to the current project.  Unlike
+@kbd{C-x C-f}, this command doesn't require to type the full file name
+of the file to visit, you can type only the file's base name (i.e.,
+omit the leading directories).  In addition, the completion candidates
+considered by the command include only the files belonging to the
+current project, and nothing else.  If there's a file name at point,
+this command offers that file as the default to visit.
+
+@findex project-find-regexp
+  The command @code{project-find-regexp} is similar to @code{rgrep}
+(@pxref{Grep Searching}), but it searches only the files that belong
+to the current project.  The command prompts for the regular
+expression to search, and pops up an Xref mode buffer with the search
+results, where you can select a match using the Xref mode commands
+(@pxref{Xref Commands}).  When invoked with a prefix argument, this
+command additionally prompts for the base directory from which to
+start the search; this allows, for example, to limit the search only
+to project files under a certain subdirectory of the project root.
+
+@findex project-search
+  @kbd{M-x project-search} is an interactive variant of
+@code{project-find-regexp}.  It prompts for a regular expression to
+search in the current project's files, but instead of finding all the
+matches and displaying them, it stops when it finds a match and visits
+the matched file at the locus of the match, allowing you to edit the
+matched file.  To find the rest of the matches, type @w{@kbd{M-x
+fileloop-continue @key{RET}}}.
+
+@findex project-query-replace-regexp
+  @kbd{M-x project-query-replace-regexp} is similar to
+@code{project-search}, but it prompts you for whether to replace each
+match it finds, like @code{query-replace} does (@pxref{Query
+Replace}), and continues to the next match after you respond.  If your
+response causes Emacs to exit the query-replace loop, you can later
+continue with @w{@kbd{M-x fileloop-continue @key{RET}}}.
+
 @node Change Log
 @section Change Logs
 
diff --git a/etc/NEWS.27 b/etc/NEWS.27
index b41541c..d3f27e3 100644
--- a/etc/NEWS.27
+++ b/etc/NEWS.27
@@ -978,7 +978,10 @@ The mode is automatically enabled in files that start with 
the
 
 ** project.el
 
++++
 *** New commands 'project-search' and 'project-query-replace-regexp'.
+
+---
 *** New user option 'project-read-file-name-function'.
 
 ** Etags
diff --git a/lisp/emacs-lisp/cl-extra.el b/lisp/emacs-lisp/cl-extra.el
index 323bbbb..f8336d3 100644
--- a/lisp/emacs-lisp/cl-extra.el
+++ b/lisp/emacs-lisp/cl-extra.el
@@ -555,7 +555,7 @@ too large if positive or too small if negative)."
 (defun cl-concatenate (type &rest sequences)
   "Concatenate, into a sequence of type TYPE, the argument SEQUENCEs.
 \n(fn TYPE SEQUENCE...)"
-  (seq-concatenate type sequences))
+  (apply #'seq-concatenate type sequences))
 
 ;;; List functions.
 
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index ccd8cc0..f467868 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -437,6 +437,7 @@ triggers completion when entering a pattern, including it
 requires quoting, e.g. `\\[quoted-insert]<space>'."
   (interactive (list (project--read-regexp)))
   (require 'xref)
+  (require 'grep)
   (let* ((pr (project-current t))
          (files
           (if (not current-prefix-arg)
@@ -606,7 +607,8 @@ PREDICATE, HIST, and DEFAULT have the same meaning as in
 (defun project-search (regexp)
   "Search for REGEXP in all the files of the project.
 Stops when a match is found.
-To continue searching for next match, use command \\[fileloop-continue]."
+To continue searching for the next match, use the
+command \\[fileloop-continue]."
   (interactive "sSearch (regexp): ")
   (fileloop-initialize-search
    regexp (project-files (project-current t)) 'default)
@@ -614,9 +616,10 @@ To continue searching for next match, use command 
\\[fileloop-continue]."
 
 ;;;###autoload
 (defun project-query-replace-regexp (from to)
-  "Search for REGEXP in all the files of the project.
-Stops when a match is found.
-To continue searching for next match, use command \\[fileloop-continue]."
+  "Query-replace REGEXP in all the files of the project.
+Stops when a match is found and prompts for whether to replace it.
+If you exit the query-replace, you can later continue the query-replace
+loop using the command \\[fileloop-continue]."
   (interactive
    (pcase-let ((`(,from ,to)
                 (query-replace-read-args "Query replace (regexp)" t t)))
diff --git a/lisp/svg.el b/lisp/svg.el
index 6a2fc4c..370c9c0 100644
--- a/lisp/svg.el
+++ b/lisp/svg.el
@@ -70,7 +70,8 @@ any further elements added."
              (height . ,height)
              (version . "1.1")
              (xmlns . "http://www.w3.org/2000/svg";)
-             ,@(svg--arguments nil args))))
+              (xmlns:xlink . "http://www.w3.org/1999/xlink";)
+              ,@(svg--arguments nil args))))
 
 (defun svg-gradient (svg id type stops)
   "Add a gradient with ID to SVG.
diff --git a/lisp/tab-line.el b/lisp/tab-line.el
index 53fa984..eb279de 100644
--- a/lisp/tab-line.el
+++ b/lisp/tab-line.el
@@ -142,11 +142,19 @@
 (defcustom tab-line-new-tab-choice t
   "Defines what to show in a new tab.
 If t, display a selection menu with all available buffers.
-If the value is a function, call it with no arguments.
-If nil, don't show the new tab button."
+If the value is a function, call it with no arguments."
   :type '(choice (const     :tag "Buffer menu" t)
-                 (function  :tag "Function")
-                 (const     :tag "No button" nil))
+                 (function  :tag "Function"))
+  :group 'tab-line
+  :version "27.1")
+
+(defcustom tab-line-new-button-show t
+  "If non-nil, show the \"New tab\" button in the tab line."
+  :type 'boolean
+  :initialize 'custom-initialize-default
+  :set (lambda (sym val)
+         (set-default sym val)
+         (force-mode-line-update))
   :group 'tab-line
   :version "27.1")
 
@@ -211,7 +219,8 @@ If nil, don't show it at all."
               'help-echo "Click to scroll right")
   "Button for scrolling horizontally to the right.")
 
-(defvar tab-line-separator nil)
+(defvar tab-line-separator nil
+  "String that delimits tabs.")
 
 
 (defcustom tab-line-tab-name-function #'tab-line-tab-name-buffer
@@ -455,7 +464,8 @@ variable `tab-line-tabs-function'."
      (if hscroll (nthcdr (truncate hscroll) strings) strings)
      (list separator)
      (when (and (eq tab-line-tabs-function #'tab-line-tabs-window-buffers)
-                tab-line-new-tab-choice)
+                tab-line-new-button-show
+                tab-line-new-button)
        (list tab-line-new-button)))))
 
 (defvar tab-line-auto-hscroll)
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index d61c363..8171a58 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -2247,29 +2247,32 @@ The elements of the alist are of the form (FILE . 
(DEFUN...)),
 where DEFUN... is a list of function names found in FILE."
   (save-excursion
     (goto-char (point-min))
-    (let ((defuns nil)
-          (hunk-end nil)
-          (hunk-mismatch-files nil)
-          (make-defun-context-follower
-           (lambda (goline)
-             (let ((eodefun nil)
-                   (defname nil))
-               (list
-                (lambda () ;; Check for end of current defun.
-                  (when (and eodefun
-                             (funcall goline)
-                             (>= (point) eodefun))
-                    (setq defname nil)
-                    (setq eodefun nil)))
-                (lambda (&optional get-current) ;; Check for new defun.
-                  (if get-current
-                      defname
-                    (when-let* ((def (and (not eodefun)
-                                          (funcall goline)
-                                          (add-log-current-defun)))
-                                (eof (save-excursion (end-of-defun) (point))))
-                      (setq eodefun eof)
-                      (setq defname def)))))))))
+    (let* ((defuns nil)
+           (hunk-end nil)
+           (hunk-mismatch-files nil)
+           (make-defun-context-follower
+            (lambda (goline)
+              (let ((eodefun nil)
+                    (defname nil))
+                (list
+                 (lambda () ;; Check for end of current defun.
+                   (when (and eodefun
+                              (funcall goline)
+                              (>= (point) eodefun))
+                     (setq defname nil)
+                     (setq eodefun nil)))
+                 (lambda (&optional get-current) ;; Check for new defun.
+                   (if get-current
+                       defname
+                     (when-let* ((def (and (not eodefun)
+                                           (funcall goline)
+                                           (add-log-current-defun)))
+                                 (eof (save-excursion
+                                        (condition-case ()
+                                            (progn (end-of-defun) (point))
+                                          (scan-error hunk-end)))))
+                       (setq eodefun eof)
+                       (setq defname def)))))))))
       (while
           ;; Might need to skip over file headers between diff
           ;; hunks (e.g., "diff --git ..." etc).
diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el
index 8b61688..d5d4614 100644
--- a/lisp/vc/log-edit.el
+++ b/lisp/vc/log-edit.el
@@ -788,18 +788,20 @@ This command will generate a ChangeLog entries listing the
 functions.  You can then add a description where needed, and use
 \\[fill-paragraph] to join consecutive function names."
   (interactive)
-  (let* ((diff-buf nil)
-         ;; Unfortunately, `log-edit-show-diff' doesn't have a NO-SHOW
-         ;; option, so we try to work around it via display-buffer
-         ;; machinery.
-         (display-buffer-overriding-action
-          `(,(lambda (buf alist)
-               (setq diff-buf buf)
-               (display-buffer-no-window buf alist))
-            . ((allow-no-window . t)))))
-    (change-log-insert-entries
-     (with-current-buffer (progn (log-edit-show-diff) diff-buf)
-       (diff-add-log-current-defuns)))))
+  (change-log-insert-entries
+   (with-current-buffer
+       (let* ((diff-buf nil)
+              ;; Unfortunately, `log-edit-show-diff' doesn't have a
+              ;; NO-SHOW option, so we try to work around it via
+              ;; display-buffer machinery.
+              (display-buffer-overriding-action
+               `(,(lambda (buf alist)
+                    (setq diff-buf buf)
+                    (display-buffer-no-window buf alist))
+                 . ((allow-no-window . t)))))
+         (log-edit-show-diff)
+         diff-buf)
+     (diff-add-log-current-defuns))))
 
 (defun log-edit-insert-changelog (&optional use-first)
   "Insert a log message by looking at the ChangeLog.
diff --git a/nt/gnulib-cfg.mk b/nt/gnulib-cfg.mk
index e3b9457..b84626d 100644
--- a/nt/gnulib-cfg.mk
+++ b/nt/gnulib-cfg.mk
@@ -63,6 +63,7 @@ OMIT_GNULIB_MODULE_sys_time = true
 OMIT_GNULIB_MODULE_sys_types = true
 OMIT_GNULIB_MODULE_unistd = true
 OMIT_GNULIB_MODULE_canonicalize-lgpl = true
+OMIT_GNULIB_MODULE_utimens = true
 OMIT_GNULIB_MODULE_fchmodat = true
 OMIT_GNULIB_MODULE_lchmod = true
 OMIT_GNULIB_MODULE_futimens = true
diff --git a/src/data.c b/src/data.c
index 460cb93..b0d438e 100644
--- a/src/data.c
+++ b/src/data.c
@@ -1567,7 +1567,7 @@ notify_variable_watchers (Lisp_Object symbol,
 /* Return the default value of SYMBOL, but don't check for voidness.
    Return Qunbound if it is void.  */
 
-static Lisp_Object
+Lisp_Object
 default_value (Lisp_Object symbol)
 {
   struct Lisp_Symbol *sym;
diff --git a/src/eval.c b/src/eval.c
index 4559a0e..78a787c 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -3816,7 +3816,7 @@ backtrace_eval_unrewind (int distance)
          {
            Lisp_Object sym = specpdl_symbol (tmp);
            Lisp_Object old_value = specpdl_old_value (tmp);
-           set_specpdl_old_value (tmp, Fdefault_value (sym));
+           set_specpdl_old_value (tmp, default_value (sym));
            Fset_default (sym, old_value);
          }
          break;
@@ -3832,7 +3832,7 @@ backtrace_eval_unrewind (int distance)
            if (!NILP (Flocal_variable_p (symbol, where)))
              {
                set_specpdl_old_value
-                 (tmp, Fbuffer_local_value (symbol, where));
+                 (tmp, buffer_local_value (symbol, where));
                 set_internal (symbol, old_value, where, SET_INTERNAL_UNBIND);
              }
          }
diff --git a/src/lisp.h b/src/lisp.h
index a379977..cd62823 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -595,6 +595,7 @@ extern void char_table_set (Lisp_Object, int, Lisp_Object);
 
 /* Defined in data.c.  */
 extern AVOID wrong_type_argument (Lisp_Object, Lisp_Object);
+extern Lisp_Object default_value (Lisp_Object symbol);
 
 
 /* Defined in emacs.c.  */
diff --git a/test/lisp/emacs-lisp/cl-extra-tests.el 
b/test/lisp/emacs-lisp/cl-extra-tests.el
index 2d20ba7..7546c14 100644
--- a/test/lisp/emacs-lisp/cl-extra-tests.el
+++ b/test/lisp/emacs-lisp/cl-extra-tests.el
@@ -99,4 +99,12 @@
     ;; Test for Bug#33731.
     (should-not (eq s (cl-make-random-state s)))))
 
+(ert-deftest cl-concatenate ()
+  (should (equal (cl-concatenate 'list '(1 2 3) '(4 5 6))
+                 '(1 2 3 4 5 6)))
+  (should (equal (cl-concatenate 'vector [1 2 3] [4 5 6])
+                 [1 2 3 4 5 6]))
+  (should (equal (cl-concatenate 'string "123" "456")
+                 "123456")))
+
 ;;; cl-extra-tests.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]