unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Comparison of tools to search for related files
@ 2022-09-05 20:51 Damien Cassou
  2022-09-06  4:26 ` Stefan Monnier
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Damien Cassou @ 2022-09-05 20:51 UTC (permalink / raw)
  To: emacs-devel; +Cc: Eli Zaretskii, Lars Ingebrigtsen

Hi,

I'm implementing jumprel to jump from a file to related files (e.g., its
tests, its CSS, its .h header file…). During discussion for bug#57564,
Eli asked me

      How will this be different from what we already have:

      • the find-file.el package
      • the new command 'find-sibling-file'

I didn't know about these 2 packages so thank you very much for telling
me about them. Because I just learned about them, my description and
comparison below might be incomplete.

In the following I will compare the packages according to my 2 use
cases:

1. In the Emacs core code base, I want to jump from an elisp file (e.g.,
   `lisp/calendar/parse-time.el') to its test file (e.g.,
   `test/lisp/calendar/parse-time-tests.el', note the parallel folder
   hierarchy) and back.

2. In my JavaScript frontend project, I want to jump from a component
   file (e.g., `foo/MyComponent.js') to its Less file (e.g.,
   `foo/MyComponent.less', same folder and different extension) or to
   its UI test file (e.g., `foo/MyComponent.spec.component.js', same
   folder, same extension but different suffix) or to its non-UI test
   file (e.g., `test/foo/myComponent-tests.js', different casing and
   parallel folder hierarchy).

In both use cases, it would be nice to facilitate the creation of
non-existing files: for example, if a buffer visits `MyComponent.js' and
there is no `MyComponent.less', it would be great if Emacs could let me
create it from a list of non-existing related files.

I derive the following required features from these 2 use cases:

Parallel folder hierarchy
      It should be possible to jump from a file in `foo/bar/' to a file
      in `XX/foo/bar/' and back ("XX/" usually equals "test/" or
      "tests/");
Choose candidate
      The user should be presented with a list of related file
      candidates to pick the one to jump to;
Case changing
      Some related files might have a different casing;
Creation
      The user should be presented with the related files that don't
      exist so they can be created automatically (very useful with
      parallel folder hierarchies). I don't consider that a must but a
      nice to have.


1 find-file.el
══════════════

  find-file.el provides `ff-find-other-file' to jump from a file to a
  related file. How a file relates to another is done through
  `ff-other-file-alist' where elements can have 2 different forms:

  ┌────
  │ (REGEXP (EXTENSION...))
  │ (REGEXP FUNCTION)
  └────

  The first form above associates a filename regexp to a list of related
  file extensions. For example, `("\\.c\\'" (".h"))' associates a C file
  to its header file (it seems that C and C++ projects where the main
  target for this package).

  I didn't manage to configure find-file.el for parallel folder
  hierarchies. find-file.el provides `ff-search-directories' but it's
  not completely clear to me if this variable would make it possible to
  implement the use cases using the first form above (aka without
  relying on a function). I have the impression that it wouldn't.

  I managed to configure find-file.el for the cases when files are in
  the same folder as in most of the second use case:

  ┌────
  │ (("\\.spec.component\\.js\\'" (".js" ".less"))
  │  ("\\.less\\'" (".js" ".spec.component.js"))
  │  ("\\.js\\'" (".less" ".spec.component.js")))
  └────

  Unfortunately, only the first file matching from the EXTENSION list is
  used and the user is never presented a choice of candidate. Looking at
  the third line above, this means that if I'm in `MyComponent.js' and
  `MyComponent.less' exists, there is no way to go to
  `MyComponent.spec.component.js'.

  To implement parallel folder hierarchy, it is possible to use the
  second as it allows for more flexibility. The Emacs core use case
  would be implemented with:

  ┌────
  │ (defun my/ff-other-file-for-emacs-core (filename)
  │   (save-match-data
  │     (if (string-match "test/lisp" filename)
  │         (let ((without-test-directory (replace-match "lisp" nil t filename)))
  │           (list (replace-regexp-in-string "-tests\\.el$" ".el" without-test-directory)))
  │       (let ((with-test-directory (string-replace "/lisp/" "/test/lisp/" filename)))
  │         (list (replace-regexp-in-string "\\.el$" "-tests.el" with-test-directory))))))
  └────

  I have the impression that relying on elisp for such use cases will
  limit the usage of the package. For example, I haven't found any place
  in Emacs core code base or documentation where such a function would
  be given to facilitate the life of Emacs core contributors.

  find-file.el has a `ff-file-created-hook' variable to create and
  populate a file if no file exists. While a hook variable allows the
  user to do whatever it wants, it also means the user must write even
  more elisp code to do so.

  find-file.el has a `ff-special-constructs' to match import/include
  lines and open the imported file when cursor is on such a line. This
  seems completely unrelated to the rest of the code in find-file.el
  though and other find-file.el mechanisms are ignored in this case. I'm
  not sure why this code is here.

  Summary of find-file.el:

  Parallel folder hierarchy
        Supported through the creation of functions only. This limits
        the usage of this feature to elisp developers;
  Choose candidate
        find-file.el opens the first existing file and never let the
        user choose;
  Case changing
        Supported through the creation of functions only.
  Creation
        A hook exists which means it is possible but is limited to elisp
        developers.

  Beyond features, I found the code hard to read with very long
  functions, a lot of state mutation and no unit test. The code is
  around 800-line long.


2 find-sibling-file
═══════════════════

  This "package" consists of an interactive function, a customizable
  variable and a helper function.

  The Emacs core use case can easily be implemented by configuring
  `find-sibling-rules':

  ┌────
  │ (("test/lisp/\\(.*\\)-tests\\.el$" "lisp/\\1.el")
  │  ("lisp/\\(.*\\)\\.el$" "test/lisp/\\1-tests.el"))
  └────

  This works great.

  Ignoring parallel folder hierarchy (implemented just like in the
  previous use case) and case changing, the second use case can be

  ┌────
  │ (("\\(.*\\)\\.spec.component\\.js\\'" "\\1.js" "\\1.less")
  │  ("\\(.*\\)\\.less\\'" "\\1.js" "\\1.spec.component.js")
  │  ("\\(.*\\)\\.js\\'" "\\1.spec.component.js" "\\1.less"))
  └────

  This works great but redundancy starts to be annoying. If you need to
  add `*.stories.js' files (as is the case for my JS project), you will
  start suffering.

  If several matching files exist, the user is prompted with a list of
  candidates to choose from.

  I haven't found a way to implement case changing and there is no
  creation mechanism either.

  When regexps are not enough, there is no fallback-to-function
  workaround as was the case with find-file.el. I don't doubt this can
  easily be implemented though.

  The package has a nice feature to let the user switch between the same
  file in two different projects (e.g., `emacs-src-27/lisp/abbrev.el'
  and `emacs-src-28/lisp/abbrev.el'). I don't need the feature but I can
  see how it can be useful.

  Summary of find-sibling-file:

  Parallel folder hierarchy
        Supported with (slightly redundant) regexps;
  Choose candidate
        Supported;
  Case changing
        Unsupported.
  Creation
        Unsupported.

  Beyond features, the code is really simple and only 89-line long. It
  has no unit test though (yet?).


3 jumprel
═════════

  This is the package I'm working on. It provides a command to jump to a
  related file among existing candidates. It features a Domain-Specific
  Language (DSL) to describe the relation between files. For Emacs core,
  it would look like this
  ┌────

  └────

  ┌────
  │ (filename :remove-suffix ".el" :add-suffix "-tests.el" :add-directory "test")
  └────

  This line represents a jumper and must be added to
  `jumprel-jumpers'. This can be done in a `.dir-locals.el' file for
  example. This line is in my opinion much easier to understand and
  modify than the alternatives of the other two packages. Please note
  that this line works to go from a file to its test file and back: this
  limits the redundancy noticed above.

  The JavaScript UI use case would be implemented with these jumpers:

  ┌────
  │ (filename :remove-suffix ".js" :add-suffix "-tests.js" :add-directory "tests" :case-transformer uncapitalize)
  │ (filename :remove-suffix ".js" :add-suffix ".spec.component.js")
  │ (filename :remove-suffix ".js" :add-suffix ".less")
  │ (filename :remove-suffix ".js" :add-suffix ".stories.js")
  └────

  Note that the first line shows an example of using case
  transformation.

  When several files exist, the user is presented with a list of
  candidates just like `find-sibling-file'.

  `find-file.el' natively supports C and C++-based projects (see
  `cc-other-file-alist'). A similar configuration can be achieved with
  jumprel through such a simple jumper:

  ┌────
  │ (filename :remove-suffix ".c" :add-suffix ".h")
  └────

  If the DSL doesn't support your use case, it is possible to fallback
  to implementing a function, just like with find-file.el (I would
  prefer a patch to improve the DSL when it makes sense though). Another
  possibility is to define another DSL. For example, contrary to the
  other two packages, jumprel doesn't have any support for regexp-based
  definitions of file relations. This can easily be implemented by
  defining a new DSL and leveraging `find-sibling-file-search':

  ┌────
  │ (cl-defmethod jumprel-apply ((jumper (head regexp)) place)
  │   "Apply JUMPER to PLACE and return a new place or nil."
  │   (find-sibling-file-search
  │    place
  │    (list (cdr jumper))))
  └────

  With this in place, users can now specify exactly the same patterns as
  they would in `find-sibling-rules'. For example, the jumper below lets
  the user switch between the same file in two different projects (e.g.,
  `emacs-src-27/lisp/abbrev.el' and `emacs-src-28/lisp/abbrev.el'):

  ┌────
  │ (regexp "emacs/[^/]+/\\(.*\\)\\'" "emacs/.*/\\1")
  └────

  Additionally, jumprel provides a simple mechanism to declare how to
  populate files. For Emacs core, the `.dir-locals.el' file could
  contain:

  ┌────
  │ (filename :remove-suffix ".el" :add-suffix "-tests.el" :add-directory "test" :filler auto-insert)
  └────

  The `:filler auto-insert' part indicates that `auto-insert' must be
  called when a test file is created. You can also specify a string
  instead of `auto-insert' to give a default content. The mechanism is
  extensible so I also implemented a way to populate a file based on a
  yasnippet snippet (in my `init.el' file):

  ┌────
  │ (cl-defmethod jumprel-maker-fill ((filler (head yasnippet)) &allow-other-keys &rest)
  │   (when-let* ((snippet (map-elt (cdr filler) :name)))
  │     (yas-expand-snippet (yas-lookup-snippet snippet major-mode))))
  └────

  Which means the user can now specify a yasnippet snippet in their
  `.dir-locals.el' file:

  ┌────
  │ (filename :remove-suffix ".js" :add-suffix ".spec.component.js" :filler (yasnippet :name "componentSpec"))
  └────


  Summary of jumprel:

  Parallel folder hierarchy
        Supported with a simple `:add-directory' directive.
  Choose candidate
        Supported.
  Case changing
        Supported with a simple `:case-transformer' directive.
  Creation
        Supported with a simple `:filler' directive.

  Beyond features, jumprel's code is 403-line long but isn't fully
  documented yet. There are 227 lines of unit tests.

-- 
Damien Cassou

"Success is the ability to go from one failure to another without
losing enthusiasm." --Winston Churchill



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-09-05 20:51 Comparison of tools to search for related files Damien Cassou
@ 2022-09-06  4:26 ` Stefan Monnier
  2022-09-06  4:45   ` Emanuel Berg
                     ` (2 more replies)
  2022-09-06 12:59 ` Eli Zaretskii
  2022-10-06  6:37 ` Damien Cassou
  2 siblings, 3 replies; 14+ messages in thread
From: Stefan Monnier @ 2022-09-06  4:26 UTC (permalink / raw)
  To: Damien Cassou; +Cc: emacs-devel, Eli Zaretskii, Lars Ingebrigtsen

>   This is the package I'm working on. It provides a command to jump to a
>   related file among existing candidates. It features a Domain-Specific
>   Language (DSL) to describe the relation between files. For Emacs core,
>   it would look like this

I have not looked in detail at your proposal, but it seems to aim to
cover a superset of what's supported by `find-sibling-file` and
`ff-find-other-file`, which is great.

But I keep dreaming of a tool that doesn't require *any* setup at all.
In my ideal world, from a `MyComponent.js` I'd be able to type
`M-x find-file-dwim RET .le RET` and that would jump to
`MyComponent.less`.

Or from `/opt/emacs-27/lisp/subr.el` I'd type `M-x find-file-dwim RET 28
RET` and that'd jump to `/opt/emacs-28/lisp/subr.el`.

Maybe also:

    /foo/lisp/toto.el      +  test     =>  /foo/tests/lisp/toto.el
    /foo/bar/lisp/toto.el  +  baz      =>  /foo/bazaar/toto.el
    /foo/lisp/toto.el      +  te/-te   =>  /foo/test/lisp/toto-tests.el

Admittedly, I'm only thinking of the case where the target file already
exists (we can only find the target file by looking at the filesystem to
see which of the the many possible targets is meant), but it seems like
most of it should be doable.


        Stefan




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-09-06  4:26 ` Stefan Monnier
@ 2022-09-06  4:45   ` Emanuel Berg
  2022-09-06 12:52     ` Stefan Monnier
  2022-09-06  7:22   ` Rudolf Schlatte
  2022-09-06 13:00   ` Eli Zaretskii
  2 siblings, 1 reply; 14+ messages in thread
From: Emanuel Berg @ 2022-09-06  4:45 UTC (permalink / raw)
  To: emacs-devel

Stefan Monnier wrote:

>
> But I keep dreaming of a tool that doesn't require *any*
> setup at all. In my ideal world, from a `MyComponent.js` I'd
> be able to type `M-x find-file-dwim RET .le RET` and that
> would jump to `MyComponent.less`.
>
> Or from `/opt/emacs-27/lisp/subr.el` I'd type `M-x
> find-file-dwim RET 28 RET` and that'd jump to
> `/opt/emacs-28/lisp/subr.el`.
>
> Maybe also:
>
>     /foo/lisp/toto.el      +  test     =>  /foo/tests/lisp/toto.el
>     /foo/bar/lisp/toto.el  +  baz      =>  /foo/bazaar/toto.el
>     /foo/lisp/toto.el      +  te/-te   =>  /foo/test/lisp/toto-tests.el

One would then have several algorithms all intended to find
one file from another, but using different methods, and the
DWIM algorithm would try them one by one ...

-- 
underground experts united
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-09-06  4:26 ` Stefan Monnier
  2022-09-06  4:45   ` Emanuel Berg
@ 2022-09-06  7:22   ` Rudolf Schlatte
  2022-09-06 13:00   ` Eli Zaretskii
  2 siblings, 0 replies; 14+ messages in thread
From: Rudolf Schlatte @ 2022-09-06  7:22 UTC (permalink / raw)
  To: emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>>   This is the package I'm working on. It provides a command to jump to a
>>   related file among existing candidates. It features a Domain-Specific
>>   Language (DSL) to describe the relation between files. For Emacs core,
>>   it would look like this
>
> I have not looked in detail at your proposal, but it seems to aim to
> cover a superset of what's supported by `find-sibling-file` and
> `ff-find-other-file`, which is great.
>
> But I keep dreaming of a tool that doesn't require *any* setup at all.
> In my ideal world, from a `MyComponent.js` I'd be able to type
> `M-x find-file-dwim RET .le RET` and that would jump to
> `MyComponent.less`.

Hmm, would `find-file' do the job if the future history (accessible via
`M-n') is filled with all candidate sibling files?




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-09-06  4:45   ` Emanuel Berg
@ 2022-09-06 12:52     ` Stefan Monnier
  0 siblings, 0 replies; 14+ messages in thread
From: Stefan Monnier @ 2022-09-06 12:52 UTC (permalink / raw)
  To: emacs-devel

Emanuel Berg [2022-09-06 06:45:30] wrote:

> Stefan Monnier wrote:
>
>>
>> But I keep dreaming of a tool that doesn't require *any*
>> setup at all. In my ideal world, from a `MyComponent.js` I'd
>> be able to type `M-x find-file-dwim RET .le RET` and that
>> would jump to `MyComponent.less`.
>>
>> Or from `/opt/emacs-27/lisp/subr.el` I'd type `M-x
>> find-file-dwim RET 28 RET` and that'd jump to
>> `/opt/emacs-28/lisp/subr.el`.
>>
>> Maybe also:
>>
>>     /foo/lisp/toto.el      +  test     =>  /foo/tests/lisp/toto.el
>>     /foo/bar/lisp/toto.el  +  baz      =>  /foo/bazaar/toto.el
>>     /foo/lisp/toto.el      +  te/-te   =>  /foo/test/lisp/toto-tests.el
>
> One would then have several algorithms all intended to find
> one file from another, but using different methods, and the
> DWIM algorithm would try them one by one ...

No, I'm thinking of the DWIM algorithm as a single one.

It takes a file name FN considers it as a concatenation of PREFIX + STR +
SUFFIX and looks for a file that matches PREFIX + TXT + * + SUFFIX

And if TXT has a slash then the slash decomposes TXT into several such
sub-cases.

The hard part is that we're not told which part is PREFIX and which part
is SUFFIX, so we'd have to use `directory-files` looking for files that
match TXT and filter these matches according to whether they can be
treated as PREFIX + TXT + * + SUFFIX.


        Stefan




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-09-05 20:51 Comparison of tools to search for related files Damien Cassou
  2022-09-06  4:26 ` Stefan Monnier
@ 2022-09-06 12:59 ` Eli Zaretskii
  2022-10-06  6:37 ` Damien Cassou
  2 siblings, 0 replies; 14+ messages in thread
From: Eli Zaretskii @ 2022-09-06 12:59 UTC (permalink / raw)
  To: Damien Cassou; +Cc: emacs-devel, larsi

> From: Damien Cassou <damien@cassou.me>
> Cc: Eli Zaretskii <eliz@gnu.org>, Lars Ingebrigtsen <larsi@gnus.org>
> Date: Mon, 05 Sep 2022 22:51:29 +0200
> 
> I'm implementing jumprel to jump from a file to related files (e.g., its
> tests, its CSS, its .h header file…). During discussion for bug#57564,
> Eli asked me
> 
>       How will this be different from what we already have:
> 
>       • the find-file.el package
>       • the new command 'find-sibling-file'
> 
> I didn't know about these 2 packages so thank you very much for telling
> me about them. Because I just learned about them, my description and
> comparison below might be incomplete.
> 
> In the following I will compare the packages according to my 2 use
> cases:

[...]

Thank you for the details and the summaries.

My point in mentioning the existing features is that from where I
stand, it is much better to extend existing features rather than to
introduce a completely separate package with a different
implementation.  I think having several different overlapping features
in core is not good for maintenance.  I was even unhappy when Lars
introduced find-sibling-file, which IMO could have been implemented on
top of find-file.el with some extensions.

So the fact that neither of the 2 existing features fits your use case
doesn't invalidate what I was trying to convey.  I didn't claim that
one or both of the existing features already support your needs, I
wanted to urge you to consider how one of them could be extended to
cover your use cases.  AFAIU, the question whether such extensions are
reasonably practical and will yield convenient solutions -- that
question still stands.

Thanks.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-09-06  4:26 ` Stefan Monnier
  2022-09-06  4:45   ` Emanuel Berg
  2022-09-06  7:22   ` Rudolf Schlatte
@ 2022-09-06 13:00   ` Eli Zaretskii
  2 siblings, 0 replies; 14+ messages in thread
From: Eli Zaretskii @ 2022-09-06 13:00 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: damien, emacs-devel, larsi

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: emacs-devel@gnu.org,  Eli Zaretskii <eliz@gnu.org>,  Lars Ingebrigtsen
>  <larsi@gnus.org>
> Date: Tue, 06 Sep 2022 00:26:13 -0400
> 
> Admittedly, I'm only thinking of the case where the target file already
> exists (we can only find the target file by looking at the filesystem to
> see which of the the many possible targets is meant), but it seems like
> most of it should be doable.

I think the case where the target file doesn't yet exist is not much
less important than the other one.  Features like these should support
both.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-09-05 20:51 Comparison of tools to search for related files Damien Cassou
  2022-09-06  4:26 ` Stefan Monnier
  2022-09-06 12:59 ` Eli Zaretskii
@ 2022-10-06  6:37 ` Damien Cassou
  2022-10-06 11:16   ` Eli Zaretskii
  2 siblings, 1 reply; 14+ messages in thread
From: Damien Cassou @ 2022-10-06  6:37 UTC (permalink / raw)
  To: emacs-devel; +Cc: Eli Zaretskii, Lars Ingebrigtsen, emacs-devel

Hi,

in bug#58071 [1] I submitted related-files (formerly jumprel), the tool
I described in the first message of this thread. The question is now if
related-files should be included into Emacs core and, if yes, what to do
about `find-file.el' and `find-sibling-file' whose behavior is, I think,
largely covered by related-files.

What do you think?

[1] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=58071

-- 
Damien Cassou

"Success is the ability to go from one failure to another without
losing enthusiasm." --Winston Churchill



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-10-06  6:37 ` Damien Cassou
@ 2022-10-06 11:16   ` Eli Zaretskii
  2022-10-06 12:10     ` Lars Ingebrigtsen
  0 siblings, 1 reply; 14+ messages in thread
From: Eli Zaretskii @ 2022-10-06 11:16 UTC (permalink / raw)
  To: Damien Cassou; +Cc: emacs-devel, larsi, emacs-devel

> From: Damien Cassou <damien@cassou.me>
> Cc: Eli Zaretskii <eliz@gnu.org>, Lars Ingebrigtsen <larsi@gnus.org>,
>  emacs-devel@gnu.org
> Date: Thu, 06 Oct 2022 08:37:05 +0200
> 
> in bug#58071 [1] I submitted related-files (formerly jumprel), the tool
> I described in the first message of this thread. The question is now if
> related-files should be included into Emacs core and, if yes, what to do
> about `find-file.el' and `find-sibling-file' whose behavior is, I think,
> largely covered by related-files.
> 
> What do you think?

Given that we already have 2 such facilities, I personally don't mind
to have a third, which perhaps could replace the other two in the
future.  (Although, to tell the truth, I'd be happier to have just one
package for this.)  But Lars is objected to adding this, AFAIU, so if
we cannot convince him, this should go to ELPA, I think.

I'm also interested in the opinions of others.

Thanks.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-10-06 11:16   ` Eli Zaretskii
@ 2022-10-06 12:10     ` Lars Ingebrigtsen
  2022-10-06 16:50       ` Felician Nemeth
  0 siblings, 1 reply; 14+ messages in thread
From: Lars Ingebrigtsen @ 2022-10-06 12:10 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Damien Cassou, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

> Given that we already have 2 such facilities, I personally don't mind
> to have a third, which perhaps could replace the other two in the
> future.  (Although, to tell the truth, I'd be happier to have just one
> package for this.)  But Lars is objected to adding this, AFAIU, so if
> we cannot convince him, this should go to ELPA, I think.

My preference would be to have it as en ELPA package, but I won't
protest if you want it included in Emacs core.

> I'm also interested in the opinions of others.

Me too.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-10-06 12:10     ` Lars Ingebrigtsen
@ 2022-10-06 16:50       ` Felician Nemeth
  2022-10-13  7:20         ` Damien Cassou
  0 siblings, 1 reply; 14+ messages in thread
From: Felician Nemeth @ 2022-10-06 16:50 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Eli Zaretskii, Damien Cassou, emacs-devel

>> I'm also interested in the opinions of others.

As a developer of foo-mode, I'd like to implement a related file
functionality for just one backend (find-file or related-file).  As a
user, I'd like to bind just one (global) key to this functionality and
be ignorant how foo-mode or bar-mode implements it.

To paraphrase what Lars wrote earlier, we had
completion-at-point-functions providing a clear completion API between
backends and frontends.  Does a similar API exist for related files?

If I understand correctly find-sibling-file primarily solves a
different problem: to easily switch among different versions of the same
file when for example multiple branches of a project is checked out in
parallel.

But maybe I misunderstand the purpose of related-files.el.  If it's the
user who configures related-files because the user has a special naming
convention, for example, to have files like page.html, page.css,
page.js, then I don't think a common API is necessary.  Then users can
choose to configure whatever package they like.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-10-06 16:50       ` Felician Nemeth
@ 2022-10-13  7:20         ` Damien Cassou
  2022-10-14 21:24           ` Richard Stallman
  0 siblings, 1 reply; 14+ messages in thread
From: Damien Cassou @ 2022-10-13  7:20 UTC (permalink / raw)
  To: Felician Nemeth, Lars Ingebrigtsen; +Cc: Eli Zaretskii, emacs-devel

Felician Nemeth <felician.nemeth@gmail.com> writes:
> As a developer of foo-mode, I'd like to implement a related file
> functionality for just one backend (find-file or related-file).


You mean the developer of c-mode would specify that .c and .h are
related? This makes sense.


> As a user, I'd like to bind just one (global) key to this
> functionality and be ignorant how foo-mode or bar-mode implements it.


Indeed.


> To paraphrase what Lars wrote earlier, we had
> completion-at-point-functions providing a clear completion API between
> backends and frontends.  Does a similar API exist for related files?


I'm not sure the comparison stands here because there are not several
frontends and backends with pros and cons. We just need 1 key binding to
jump to a related file and a configuration option to specify how to
compute related files from the current file.


> If I understand correctly find-sibling-file primarily solves a
> different problem: to easily switch among different versions of the same
> file when for example multiple branches of a project is checked out in
> parallel.


find-sibling-file goes beyond that. It allows for specifying a regexp
and an expansion so the user could also specify how to go from a .c file
to a .h file.

For related-files.el, the regexp way of specifying related files is just
one among others: the user can also specify related files through
functions and a recipe DSL or define another way. related-files also
allows creating related files through different mechanisms and users can
add more mechanisms.


> But maybe I misunderstand the purpose of related-files.el.  If it's the
> user who configures related-files because the user has a special naming
> convention, for example, to have files like page.html, page.css,
> page.js


This is indeed the use-case I had in mind and it seems similar to the
one of find-sibling-file.


>, then I don't think a common API is necessary.  Then users can
> choose to configure whatever package they like.


That is true. But I'm not sure we want the same feature implemented 3
times in 3 different ways.

-- 
Damien Cassou

"Success is the ability to go from one failure to another without
losing enthusiasm." --Winston Churchill



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-10-13  7:20         ` Damien Cassou
@ 2022-10-14 21:24           ` Richard Stallman
  2022-10-17 18:34             ` Damien Cassou
  0 siblings, 1 reply; 14+ messages in thread
From: Richard Stallman @ 2022-10-14 21:24 UTC (permalink / raw)
  To: Damien Cassou; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > You mean the developer of c-mode would specify that .c and .h are
  > related? This makes sense.

In some programs, foo.c and foo.h are generally closely related.  But
that is not always true.  For instance, the C code of GNU Emacs does
not generally pair up header files with source files.

Depending on details, a feature that assumes ,c and .h files a paired
might be convenient with the programs which do that, and harmless with
other programs.  If it doesn't get in the way for the other programs,
then the feature does good and no harm.

But if it tends to be a nuisance when editing the programs that don't
pair the .h and .c files, that starts to be a bad thing.

-- 
Dr Richard Stallman (https://stallman.org)
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Comparison of tools to search for related files
  2022-10-14 21:24           ` Richard Stallman
@ 2022-10-17 18:34             ` Damien Cassou
  0 siblings, 0 replies; 14+ messages in thread
From: Damien Cassou @ 2022-10-17 18:34 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel

Richard Stallman <rms@gnu.org> writes:
> But if it tends to be a nuisance when editing the programs that don't
> pair the .h and .c files, that starts to be a bad thing.

For this to be a nuisance, it requires:

1. that the user actually tries to use related-files,

2. that the user hasn't configured related-files-jumpers for the
   project,

3. that the default "related" file (e.g., foo.c ⇒ foo.h) would exist but
   that the user would consider it unrelated.

I don't think that is a problem.

-- 
Damien Cassou

"Success is the ability to go from one failure to another without
losing enthusiasm." --Winston Churchill



^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2022-10-17 18:34 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-09-05 20:51 Comparison of tools to search for related files Damien Cassou
2022-09-06  4:26 ` Stefan Monnier
2022-09-06  4:45   ` Emanuel Berg
2022-09-06 12:52     ` Stefan Monnier
2022-09-06  7:22   ` Rudolf Schlatte
2022-09-06 13:00   ` Eli Zaretskii
2022-09-06 12:59 ` Eli Zaretskii
2022-10-06  6:37 ` Damien Cassou
2022-10-06 11:16   ` Eli Zaretskii
2022-10-06 12:10     ` Lars Ingebrigtsen
2022-10-06 16:50       ` Felician Nemeth
2022-10-13  7:20         ` Damien Cassou
2022-10-14 21:24           ` Richard Stallman
2022-10-17 18:34             ` Damien Cassou

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).