bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#63829: 29.0.90; project-find-file's future history breaks with commo


From: Dmitry Gutov
Subject: bug#63829: 29.0.90; project-find-file's future history breaks with common-parent-directory
Date: Sat, 3 Jun 2023 05:30:10 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0

Hi!

On 02/06/2023 01:32, Spencer Baugh wrote:

1. emacs -Q
2. Open a project where project-files only returns files in a certain
subdirectory.  For example, a git repo /repo where the only file is
"dir/file.txt".
3. Open dir/file.txt
4. C-x p f   ;; project-find file
5. Observe that the prompt is "Find file in /repo/dir: " which correctly
contains the common parent directory between all the paths returned by
project-files.
6. M-n       ;; next-history-element
7. The minibuffer now contains "dir/file.txt".  RET will fail to
open the file.

Note that if you continue pressing 'M-n', you will see the corresponding proper relative file names. The first one comes from the value constructed in project-find-file. Which indeed looks problematic, since we remove context in there by creating a relative name.

Instead, the common parent directory should be stripped from the "future
history" element.

Try the patch at the end, please. It seems to fix the scenario you presented. Does it help with the feature you mention below, too?

It doesn't handle the case when (thing-at-point 'filename) returns a relative file name that includes a directory name, relative to the project root (where common-parent-directory differs), but that one seems even more ambiguous.

(As a separate point: I ran into this while adding a feature for
switching between projects with similar directory structures.  I want to
include the relative path in the starting project in the "future
history", so that when you have a file in projectA open, you can switch
to the same file in projectB with C-x p p f M-n RET.  For example,
switching between the same file in multiple clones of Emacs.  But sadly
the future history doesn't work properly right now even in a single
project)

diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 7c51778d5d4..184f2316074 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -1008,7 +1008,7 @@ project-find-file
          (dirs (list root)))
     (project-find-file-in
      (or (thing-at-point 'filename)
-         (and buffer-file-name (file-relative-name buffer-file-name root)))
+         buffer-file-name)
      dirs pr include-all)))

 ;;;###autoload
@@ -1062,6 +1062,10 @@ project--read-file-cpd-relative
                                (delete common-parent-directory all-files))
                          t))
(substrings (mapcar (lambda (s) (substring s cpd-length)) all-files))
+         (mb-default (if (and common-parent-directory
+                              (file-name-absolute-p mb-default))
+ (file-relative-name mb-default common-parent-directory)
+                       mb-default))
          (_ (when included-cpd
               (setq substrings (cons "./" substrings))))
          (new-collection (project--file-completion-table substrings))






reply via email to

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