emacs-diffs
[Top][All Lists]
Advanced

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

master 5f53a49: Search harder for file name matches in *compilation* buf


From: Lars Ingebrigtsen
Subject: master 5f53a49: Search harder for file name matches in *compilation* buffers
Date: Thu, 15 Oct 2020 10:47:54 -0400 (EDT)

branch: master
commit 5f53a49d48df8c637904fdc2b5e58ab900a1a327
Author: David Engster <deng@randomsample.de>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Search harder for file name matches in *compilation* buffers
    
    * lisp/progmodes/compile.el (compilation-find-file): Use it (bug#14411).
    (compilation-search-all-directories): New variable.
---
 etc/NEWS                  |  8 ++++++++
 lisp/progmodes/compile.el | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/etc/NEWS b/etc/NEWS
index 97e2e6f..2a75e13 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1138,6 +1138,14 @@ window after starting).  This variable defaults to nil.
 
 ** Miscellaneous
 
+---
+*** New user option 'compilation-search-all-directories'.
+When doing parallel builds, directories and compilation errors may
+arrive in the *compilation* buffer out-of-order.  If this variable is
+non-nil (the default), Emacs will now search backwards in the buffer
+for any directory the file with errors may be in.  If nil, this won't
+be done (and this restores how this previously worked).
+
 +++
 *** New user option 'next-error-message-highlight'.
 In addition to a fringe arrow, 'next-error' error may now optionally
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 4fe1377..bc0fe6d 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -745,6 +745,18 @@ variable, and you might not notice.  Therefore, 
`compile-command'
 is considered unsafe if this variable is nil."
   :type 'boolean)
 
+(defcustom compilation-search-all-directories t
+  "Whether further upward directories should be used when searching a file.
+When doing a parallel build, several files from different
+directories can be compiled at the same time.  This makes it
+difficult to determine the base directory for a relative file
+name in a compiler error or warning.  If this variable is
+non-nil, instead of just relying on the previous directory change
+in the compilation buffer, all other directories further upwards
+will be used as well."
+  :type 'boolean
+  :version "28.1")
+
 ;;;###autoload
 (defcustom compilation-ask-about-save t
   "Non-nil means \\[compile] asks which buffers to save before compiling.
@@ -2916,6 +2928,28 @@ attempts to find a file whose name is produced by 
(format FMT FILENAME)."
                           (find-file-noselect name))
               fmts (cdr fmts)))
       (setq dirs (cdr dirs)))
+    ;; If we haven't found it, this might be a parallel build.
+    ;; Search the directories further up the buffer.
+    (when (and (null buffer)
+               compilation-search-all-directories)
+      (with-current-buffer (marker-buffer marker)
+        (save-excursion
+          (goto-char (marker-position marker))
+          (when-let ((prev (compilation--previous-directory (point))))
+            (goto-char prev))
+          (setq dirs (cdr (or (get-text-property
+                               (1- (point)) 'compilation-directory)
+                              (get-text-property
+                               (point) 'compilation-directory))))))
+      (while (and dirs (null buffer))
+        (setq thisdir (car dirs)
+              fmts formats)
+        (while (and fmts (null buffer))
+          (setq name (expand-file-name (format (car fmts) filename) thisdir)
+                buffer (and (file-exists-p name)
+                            (find-file-noselect name))
+                fmts (cdr fmts)))
+        (setq dirs (cdr dirs))))
     (while (null buffer)    ;Repeat until the user selects an existing file.
       ;; The file doesn't exist.  Ask the user where to find it.
       (save-excursion            ;This save-excursion is probably not right.



reply via email to

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