* Adding refactoring capabilities to Emacs
@ 2023-08-19 6:03 Eli Zaretskii
2023-08-19 10:58 ` Eshel Yaron
` (3 more replies)
0 siblings, 4 replies; 147+ messages in thread
From: Eli Zaretskii @ 2023-08-19 6:03 UTC (permalink / raw)
To: emacs-devel
I originally wrote the below in a discussion of a bug report, but it
really belongs here. So here's a repost:
> Okay, I'm convinced. I'll defer this functionality to the future
> refactoring support in Emacs, built with project.el and eglot no doubt.
Eglot can serve as the back-end, and it isn't the only one that comes
to mind (I sincerely hope that at least some of the simpler
refactoring jobs will not require an LSP, but could be done using
built-in capabilities).
But back-end is just one part of this. We should IMO begin by our own
research into the UI parts of this: how does the user specify the
requested refactoring? Several alternatives are possible, and we
should study them and decide what is best for Emacs.
Would someone please step forward and work on adding refactoring to
Emacs?
The main point of this is that it's high time Emacs had sophisticated
and flexible support for code refactoring. Let's start working on
this!
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-19 6:03 Adding refactoring capabilities to Emacs Eli Zaretskii
@ 2023-08-19 10:58 ` Eshel Yaron
2023-08-19 11:18 ` Eli Zaretskii
2023-08-20 1:19 ` Dmitry Gutov
` (2 subsequent siblings)
3 siblings, 1 reply; 147+ messages in thread
From: Eshel Yaron @ 2023-08-19 10:58 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: emacs-devel
Eli Zaretskii <eliz@gnu.org> writes:
> The main point of this is that it's high time Emacs had sophisticated
> and flexible support for code refactoring. Let's start working on
> this!
That'd be really great! I'd love to assist, if I can.
My initial thinking is that it may be useful to consider two categories
of refactoring operations:
1. Common transformations that make sense in most languages. These
include renaming identifiers, reordering definitions/directives (such as
import statements), extracting blocks of code as standalone functions
and probably a few more. IMO it'd be great if Emacs had standard
commands and user options for these refactor operations across major
modes. For some languages, it might be difficult to provide some of
these transformations even though they're clearly useful, so some major
mode might want to indicate that they do not support some of these
transformations. For instance, renaming identifiers requires very
precise knowledge of scoping and namespacing that might not be available
to some major modes (at least not without a lot more work).
2. Transformations that only make sense for a specific set of languages.
For example, in Prolog we may want to move the unification of some term
from the head of a clause to the start of its body. That's a useful
transformation that doesn't alter the program's semantics, but I can't
think of a corresponding transformation in functional/imperative
languages. Perhaps for such operations Emacs could allow major modes to
provide language-specific extensions to the refactoring facility.
--
Best,
Eshel
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-19 10:58 ` Eshel Yaron
@ 2023-08-19 11:18 ` Eli Zaretskii
0 siblings, 0 replies; 147+ messages in thread
From: Eli Zaretskii @ 2023-08-19 11:18 UTC (permalink / raw)
To: Eshel Yaron; +Cc: emacs-devel
> From: Eshel Yaron <me@eshelyaron.com>
> Cc: emacs-devel@gnu.org
> Date: Sat, 19 Aug 2023 12:58:00 +0200
>
> My initial thinking is that it may be useful to consider two categories
> of refactoring operations:
>
> 1. Common transformations that make sense in most languages. These
> include renaming identifiers, reordering definitions/directives (such as
> import statements), extracting blocks of code as standalone functions
> and probably a few more. IMO it'd be great if Emacs had standard
> commands and user options for these refactor operations across major
> modes. For some languages, it might be difficult to provide some of
> these transformations even though they're clearly useful, so some major
> mode might want to indicate that they do not support some of these
> transformations. For instance, renaming identifiers requires very
> precise knowledge of scoping and namespacing that might not be available
> to some major modes (at least not without a lot more work).
>
> 2. Transformations that only make sense for a specific set of languages.
> For example, in Prolog we may want to move the unification of some term
> from the head of a clause to the start of its body. That's a useful
> transformation that doesn't alter the program's semantics, but I can't
> think of a corresponding transformation in functional/imperative
> languages. Perhaps for such operations Emacs could allow major modes to
> provide language-specific extensions to the refactoring facility.
Yes, there's a place for both language-independent and
language-dependent refactoring. And I think more sub-categories are
in order, because some of them can be done with relatively simple
means which don't require intimate knowledge of the language syntax,
and others will require support from the likes of tree-sitter and LSP.
It would be good to start developing these capabilities, first for the
relatively simple transformations. Patches are welcome.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-19 6:03 Adding refactoring capabilities to Emacs Eli Zaretskii
2023-08-19 10:58 ` Eshel Yaron
@ 2023-08-20 1:19 ` Dmitry Gutov
2023-08-20 6:39 ` Eli Zaretskii
` (2 more replies)
2023-08-20 13:00 ` sbaugh
2023-09-07 14:39 ` João Távora
3 siblings, 3 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-08-20 1:19 UTC (permalink / raw)
To: Eli Zaretskii, emacs-devel
On 19/08/2023 09:03, Eli Zaretskii wrote:
> But back-end is just one part of this. We should IMO begin by our own
> research into the UI parts of this: how does the user specify the
> requested refactoring? Several alternatives are possible, and we
> should study them and decide what is best for Emacs.
If we had a better UI for renaming than query-replace, we could plug it
into project-find-regexp and xref-find-references' output buffers.
Where you currently can hit 'r' to switch to renaming action, it could
instead show the proposed operation (in some fashion) and how the text
will look "after". That would cover the regexp-replace and the
rename-symbol refactorings. Just the basics, but still. Those could also
be combined into separate commands (such as
xref-find-references-and-replace).
LSP clients, with their more sophisticated operations, could use the UI
as well, as long as it's possible to agree on the input instructions format.
And there could be some language-specific refactorings implemented in
Lisp as well.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-20 1:19 ` Dmitry Gutov
@ 2023-08-20 6:39 ` Eli Zaretskii
2023-08-20 6:42 ` Ihor Radchenko
2023-08-20 8:44 ` Yuri Khan
2023-09-04 17:15 ` Juri Linkov
2 siblings, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-08-20 6:39 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: emacs-devel
> Date: Sun, 20 Aug 2023 04:19:46 +0300
> From: Dmitry Gutov <dmitry@gutov.dev>
>
> On 19/08/2023 09:03, Eli Zaretskii wrote:
> > But back-end is just one part of this. We should IMO begin by our own
> > research into the UI parts of this: how does the user specify the
> > requested refactoring? Several alternatives are possible, and we
> > should study them and decide what is best for Emacs.
>
> If we had a better UI for renaming than query-replace, we could plug it
> into project-find-regexp and xref-find-references' output buffers.
I indeed think that these capabilities will need a better, novel UI,
and that developing it should be part of such an effort.
> Where you currently can hit 'r' to switch to renaming action, it could
> instead show the proposed operation (in some fashion) and how the text
> will look "after". That would cover the regexp-replace and the
> rename-symbol refactorings. Just the basics, but still. Those could also
> be combined into separate commands (such as
> xref-find-references-and-replace).
>
> LSP clients, with their more sophisticated operations, could use the UI
> as well, as long as it's possible to agree on the input instructions format.
>
> And there could be some language-specific refactorings implemented in
> Lisp as well.
Yup.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-20 6:39 ` Eli Zaretskii
@ 2023-08-20 6:42 ` Ihor Radchenko
0 siblings, 0 replies; 147+ messages in thread
From: Ihor Radchenko @ 2023-08-20 6:42 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Dmitry Gutov, emacs-devel
Eli Zaretskii <eliz@gnu.org> writes:
>> If we had a better UI for renaming than query-replace, we could plug it
>> into project-find-regexp and xref-find-references' output buffers.
>
> I indeed think that these capabilities will need a better, novel UI,
> and that developing it should be part of such an effort.
Just in case, leaving a link to
https://github.com/Wilfred/emacs-refactor that is an existing
implementation of some refactoring features.
It might be used as a source of ideas.
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-20 1:19 ` Dmitry Gutov
2023-08-20 6:39 ` Eli Zaretskii
@ 2023-08-20 8:44 ` Yuri Khan
2023-08-20 22:51 ` Dmitry Gutov
2023-09-04 17:15 ` Juri Linkov
2 siblings, 1 reply; 147+ messages in thread
From: Yuri Khan @ 2023-08-20 8:44 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Eli Zaretskii, emacs-devel
On Sun, 20 Aug 2023 at 08:20, Dmitry Gutov <dmitry@gutov.dev> wrote:
> If we had a better UI for renaming than query-replace, we could plug it
> into project-find-regexp and xref-find-references' output buffers.
>
> Where you currently can hit 'r' to switch to renaming action, it could
> instead show the proposed operation (in some fashion) and how the text
> will look "after". That would cover the regexp-replace and the
> rename-symbol refactorings. Just the basics, but still. Those could also
> be combined into separate commands (such as
> xref-find-references-and-replace).
Renaming is already possible in Eglot, with the following UI: You
stand on a symbol and invoke eglot-rename. It asks you for the new
name, then does the right thing.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-19 6:03 Adding refactoring capabilities to Emacs Eli Zaretskii
2023-08-19 10:58 ` Eshel Yaron
2023-08-20 1:19 ` Dmitry Gutov
@ 2023-08-20 13:00 ` sbaugh
2023-09-07 14:39 ` João Távora
3 siblings, 0 replies; 147+ messages in thread
From: sbaugh @ 2023-08-20 13:00 UTC (permalink / raw)
To: emacs-devel
Eli Zaretskii <eliz@gnu.org> writes:
> I originally wrote the below in a discussion of a bug report, but it
> really belongs here. So here's a repost:
>
> > Okay, I'm convinced. I'll defer this functionality to the future
> > refactoring support in Emacs, built with project.el and eglot no doubt.
>
> Eglot can serve as the back-end, and it isn't the only one that comes
> to mind (I sincerely hope that at least some of the simpler
> refactoring jobs will not require an LSP, but could be done using
> built-in capabilities).
>
> But back-end is just one part of this. We should IMO begin by our own
> research into the UI parts of this: how does the user specify the
> requested refactoring? Several alternatives are possible, and we
> should study them and decide what is best for Emacs.
>
> Would someone please step forward and work on adding refactoring to
> Emacs?
>
> The main point of this is that it's high time Emacs had sophisticated
> and flexible support for code refactoring. Let's start working on
> this!
I thought the UI in
https://www.masteringemacs.org/article/combobulate-editing-searching-new-query-builder
was quite interesting.
Something heavily based on tree-sitter is interesting because such
queries could easily be stored and used programmatically outside Emacs,
you simply need to link against the tree-sitter library. That's
somewhat more convenient than running Emacs as a subprocess to do bulk
automated refactoring, e.g. across 100k files or on every new file
that's committed.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-20 8:44 ` Yuri Khan
@ 2023-08-20 22:51 ` Dmitry Gutov
2023-08-29 10:53 ` João Távora
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-08-20 22:51 UTC (permalink / raw)
To: Yuri Khan; +Cc: Eli Zaretskii, emacs-devel
On 20/08/2023 11:44, Yuri Khan wrote:
> On Sun, 20 Aug 2023 at 08:20, Dmitry Gutov<dmitry@gutov.dev> wrote:
>
>> If we had a better UI for renaming than query-replace, we could plug it
>> into project-find-regexp and xref-find-references' output buffers.
>>
>> Where you currently can hit 'r' to switch to renaming action, it could
>> instead show the proposed operation (in some fashion) and how the text
>> will look "after". That would cover the regexp-replace and the
>> rename-symbol refactorings. Just the basics, but still. Those could also
>> be combined into separate commands (such as
>> xref-find-references-and-replace).
> Renaming is already possible in Eglot, with the following UI: You
> stand on a symbol and invoke eglot-rename. It asks you for the new
> name, then does the right thing.
Indeed: we do have access to a bunch of refactorings already through
Eglot. Some general, and some language-specific ones.
What we don't have is any advanced UI coming with that. Traditional IDEs
(and apparently even VS Code now:
https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp)
have been featuring the "preview changes" feature for years. One where
you could see which files will be affected, and even opt out from some
of the changes.
It seems like the LSP protocol provides enough information for this to
work (the response to the "rename" action is a list of changes to be
performed on the client), so the UI can definitely be extended there.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-20 22:51 ` Dmitry Gutov
@ 2023-08-29 10:53 ` João Távora
2023-08-29 11:35 ` Dr. Arne Babenhauserheide
2023-08-30 0:52 ` Dmitry Gutov
0 siblings, 2 replies; 147+ messages in thread
From: João Távora @ 2023-08-29 10:53 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Yuri Khan, Eli Zaretskii, emacs-devel, Philip K.
[-- Attachment #1: Type: text/plain, Size: 1369 bytes --]
On Sun, Aug 20, 2023, 23:52 Dmitry Gutov <dmitry@gutov.dev> wrote:
> On .
>
> What we don't have is any advanced UI coming with that. Traditional IDEs
> (and apparently even VS Code now:
>
> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp)
>
> have been featuring the "preview changes" feature for years. One where
> you could see which files will be affected, and even opt out from some
> of the changes.
>
> It seems like the LSP protocol provides enough information for this to
> work (the response to the "rename" action is a list of changes to be
> performed on the client), so the UI can definitely be extended there.
>
Philip K. has proposed a patch to Eglot that implements this in bug#60338.
It is not without problems, but was generally agreeable to me. Would you
have a look, Dmitry? We stalled while thinking about the user confirmation
model...
Anyway, are we aiming at making Eglot and LSP the only provider of
refactoring in Emacs? If we aren't, then I think we should be working on a
compatibility layer (which can be modeled after LSP's request/proposal
mechanism) even if -- for the time being -- LSP/Eglot is the only provider.
That move would inherit a lot of code from Eglot related to applying the
changes, confirming etc, meaning those details would already be solved.
João
>
[-- Attachment #2: Type: text/html, Size: 2166 bytes --]
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-29 10:53 ` João Távora
@ 2023-08-29 11:35 ` Dr. Arne Babenhauserheide
2023-08-30 0:52 ` Dmitry Gutov
1 sibling, 0 replies; 147+ messages in thread
From: Dr. Arne Babenhauserheide @ 2023-08-29 11:35 UTC (permalink / raw)
To: João Távora
Cc: Dmitry Gutov, Yuri Khan, Eli Zaretskii, Philip K., emacs-devel
[-- Attachment #1: Type: text/plain, Size: 1112 bytes --]
João Távora <joaotavora@gmail.com> writes:
> Anyway, are we aiming at making Eglot and LSP the only provider of refactoring in Emacs? If we aren't, then I think we should be working on a
> compatibility layer (which can be modeled after LSP's request/proposal mechanism) even if -- for the time being -- LSP/Eglot is the only
> provider. That move would inherit a lot of code from Eglot related to applying the changes, confirming etc, meaning those details would
> already be solved.
I also use js2-refactor, multi-cursor (mc/mark-all-symbols-like-this),
and helm-multi-swoop-projectile + C-c C-e for refactoring.
Is Python rope-mode still a thing?
https://github.com/python-rope/ropemacs
(there’s also an lsp for rope)
lispy--replace also provides refactoring, but locally.
And as far as i can tell projectile-replace-regexp does multi-file
refactoring, too.
Of these helm-swoop already gives a kind of preview (because it uses a "do
changes then apply with C-c C-c" model).
Best wishes,
Arne
--
Unpolitisch sein
heißt politisch sein,
ohne es zu merken.
draketo.de
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 1125 bytes --]
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-29 10:53 ` João Távora
2023-08-29 11:35 ` Dr. Arne Babenhauserheide
@ 2023-08-30 0:52 ` Dmitry Gutov
2023-08-30 18:46 ` Stefan Kangas
2023-08-30 20:37 ` João Távora
1 sibling, 2 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-08-30 0:52 UTC (permalink / raw)
To: João Távora; +Cc: Yuri Khan, Eli Zaretskii, emacs-devel, Philip K.
On 29/08/2023 13:53, João Távora wrote:
>
> On Sun, Aug 20, 2023, 23:52 Dmitry Gutov <dmitry@gutov.dev
> <mailto:dmitry@gutov.dev>> wrote:
>
> On .
>
> What we don't have is any advanced UI coming with that. Traditional
> IDEs
> (and apparently even VS Code now:
> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp <https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp>)
> have been featuring the "preview changes" feature for years. One where
> you could see which files will be affected, and even opt out from some
> of the changes.
>
> It seems like the LSP protocol provides enough information for this to
> work (the response to the "rename" action is a list of changes to be
> performed on the client), so the UI can definitely be extended there.
>
>
> Philip K. has proposed a patch to Eglot that implements this in
> bug#60338. It is not without problems, but was generally agreeable to
> me. Would you have a look, Dmitry? We stalled while thinking about the
> user confirmation model...
Hmmm. Some screenshots would go a long way, I haven't tried the patch
yet, but from what I can tell from the description, it's a pretty
power-user-ish approach to UI.
Similar to what we ended up doing with checkin-patch in VC -- powerful,
but no very obvious to a non-pro user in how it can be operated. It is
surely a good addition to Eglot, but the refactoring interface I was
thinking of would have been more graphical (very vaguely in the style of
Xref), looking a little closer to the VS Code screenshot I posted.
But those are just my expectations -- opinions welcome.
> Anyway, are we aiming at making Eglot and LSP the only provider of
> refactoring in Emacs? If we aren't, then I think we should be working on
> a compatibility layer (which can be modeled after LSP's request/proposal
> mechanism) even if -- for the time being -- LSP/Eglot is the only
> provider. That move would inherit a lot of code from Eglot related to
> applying the changes, confirming etc, meaning those details would
> already be solved.
We have refactorings in various places: as Arne mentioned, there are
some established third-party packages, of different degrees of
popularity. And from built-in ones we also have, at the very least, some
commands which present long lists of search results with Xref interface
(some plugged into by Eglot when it's enabled, and some not), those
could also use a better interface for global replacements.
Regarding compatibility layer, I'm not sure I see a request-response
mechanism here. I'd expect to see something synchronous, e.g. a call
(refact-start CHANGES)
where CHANGES are a list of changes in some pre-determined format (with
file names and buffer/byte positions or lines and columns). Then the UI
takes over, shows the user the proposed changes, allows paging through
them, maybe disabling certain ones (for all changes in a file, or all
files in certain dir, or individual changes too), and applying in bulk
after a confirmation.
Maybe a callback at the end could be useful, though, e.g. to update any
views that need to be updated. Could always be added later.
And here's a general question to such UIs: what happens if one of the
changes (in the middle of the list) becomes un-apply-able. At which step
the user finds out about this. I don't have this solved very well in
xref-query-replace-in-results, but an attempt was made.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-30 0:52 ` Dmitry Gutov
@ 2023-08-30 18:46 ` Stefan Kangas
2023-08-30 19:59 ` Dmitry Gutov
2023-08-30 20:37 ` João Távora
1 sibling, 1 reply; 147+ messages in thread
From: Stefan Kangas @ 2023-08-30 18:46 UTC (permalink / raw)
To: Dmitry Gutov
Cc: João Távora, Yuri Khan, Eli Zaretskii, emacs-devel,
Philip K.
Dmitry Gutov <dmitry@gutov.dev> writes:
> Similar to what we ended up doing with checkin-patch in VC -- powerful,
> but no very obvious to a non-pro user in how it can be operated. It is
> surely a good addition to Eglot, but the refactoring interface I was
> thinking of would have been more graphical (very vaguely in the style of
> Xref), looking a little closer to the VS Code screenshot I posted.
Do we need to choose between them, or could we support both?
IOW, could we have a nice clickable display that also comes with the
fast commands and well-thought-out key bindings?
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-30 18:46 ` Stefan Kangas
@ 2023-08-30 19:59 ` Dmitry Gutov
0 siblings, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-08-30 19:59 UTC (permalink / raw)
To: Stefan Kangas
Cc: João Távora, Yuri Khan, Eli Zaretskii, emacs-devel,
Philip K.
On 30/08/2023 21:46, Stefan Kangas wrote:
> Dmitry Gutov<dmitry@gutov.dev> writes:
>
>> Similar to what we ended up doing with checkin-patch in VC -- powerful,
>> but no very obvious to a non-pro user in how it can be operated. It is
>> surely a good addition to Eglot, but the refactoring interface I was
>> thinking of would have been more graphical (very vaguely in the style of
>> Xref), looking a little closer to the VS Code screenshot I posted.
> Do we need to choose between them, or could we support both?
>
> IOW, could we have a nice clickable display that also comes with the
> fast commands and well-thought-out key bindings?
Naturally, we could have a customization point that supports several
displays (like xref-show-xrefs-function), but in this case as well any
new display would have to reimplement almost all functionality (I guess
that's unavoidable), and the format of the input data (CHANGES) need to
be usable for such different displays.
I can roughly understand how to produce a diff from a list ((FILE
START-POS END-POS NEW-TEXT) ...), but it seems more difficult to do the
reverse. Though also possible, I suppose.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-30 0:52 ` Dmitry Gutov
2023-08-30 18:46 ` Stefan Kangas
@ 2023-08-30 20:37 ` João Távora
2023-08-30 21:49 ` Dmitry Gutov
1 sibling, 1 reply; 147+ messages in thread
From: João Távora @ 2023-08-30 20:37 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Yuri Khan, Eli Zaretskii, emacs-devel, Philip K.
Dmitry Gutov <dmitry@gutov.dev> writes:
> On 29/08/2023 13:53, João Távora wrote:
>> On Sun, Aug 20, 2023, 23:52 Dmitry Gutov <dmitry@gutov.dev
>> <mailto:dmitry@gutov.dev>> wrote:
>> On .
>> What we don't have is any advanced UI coming with
>> that. Traditional
>> IDEs
>> (and apparently even VS Code now:
>> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp <https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp>)
>> have been featuring the "preview changes" feature for years. One where
>> you could see which files will be affected, and even opt out from some
>> of the changes.
>> It seems like the LSP protocol provides enough information for
>> this to
>> work (the response to the "rename" action is a list of changes to be
>> performed on the client), so the UI can definitely be extended there.
>> Philip K. has proposed a patch to Eglot that implements this in
>> bug#60338. It is not without problems, but was generally agreeable
>> to me. Would you have a look, Dmitry? We stalled while thinking
>> about the user confirmation model...
>
> Hmmm. Some screenshots would go a long way,
Just imagine a diff like *vc-diff*.
> I haven't tried the patch yet, but from what I can tell from the
> description, it's a pretty power-user-ish approach to UI.
IMO showing a diff to a user such a is not a power-user-ish thing. Or
rather, it might be, but I don't see any better way to show potentially
complex code changes to users.
> Similar to what we ended up doing with checkin-patch in VC --
> powerful, but no very obvious to a non-pro user in how it can be
> operated. It is surely a good addition to Eglot, but the refactoring
> interface I was thinking of would have been more graphical (very
> vaguely in the style of Xref), looking a little closer to the VS Code
> screenshot I posted.
I don't know how VSCode does it, but refactorings -- at least the kind
provided by LSP servers -- aren't in general as trivial as simple
renamings. They are arbitrary sets of changes to code, like moving
whole functions from one file to another, adding new sections or new
files, removing sections or whole files, etc, etc.
In fact, they are just like patches.
And I don't know any better way today to display patches to users other
than diff.
> Regarding compatibility layer, I'm not sure I see a request-response
> mechanism here. I'd expect to see something synchronous, e.g. a call
Synchronous is doable (Eglot does it, and the user shouldn't be doing
changes to the code while the refactoring backend is computing the
changes). What I meant by request-proposal is that there is this
sequence
1. a request by the user selecting one of multiple offered
refactorings.
2. a synchronous response proposing changes
3. The decision by the user to apply some or all of these proposed
changes. This decision might be taken in advance in step 1, if the
user trusts the refactoring engine enough.
Note: Files are not saved automatically, because this is a different
concern.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-30 20:37 ` João Távora
@ 2023-08-30 21:49 ` Dmitry Gutov
2023-08-30 22:01 ` Stefan Kangas
` (2 more replies)
0 siblings, 3 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-08-30 21:49 UTC (permalink / raw)
To: João Távora; +Cc: Yuri Khan, Eli Zaretskii, emacs-devel, Philip K.
On 30/08/2023 23:37, João Távora wrote:
> Dmitry Gutov <dmitry@gutov.dev> writes:
>
>> On 29/08/2023 13:53, João Távora wrote:
>>> On Sun, Aug 20, 2023, 23:52 Dmitry Gutov <dmitry@gutov.dev
>>> <mailto:dmitry@gutov.dev>> wrote:
>>> On .
>>> What we don't have is any advanced UI coming with
>>> that. Traditional
>>> IDEs
>>> (and apparently even VS Code now:
>>> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp <https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp>)
>>> have been featuring the "preview changes" feature for years. One where
>>> you could see which files will be affected, and even opt out from some
>>> of the changes.
>>> It seems like the LSP protocol provides enough information for
>>> this to
>>> work (the response to the "rename" action is a list of changes to be
>>> performed on the client), so the UI can definitely be extended there.
>>> Philip K. has proposed a patch to Eglot that implements this in
>>> bug#60338. It is not without problems, but was generally agreeable
>>> to me. Would you have a look, Dmitry? We stalled while thinking
>>> about the user confirmation model...
>>
>> Hmmm. Some screenshots would go a long way,
>
> Just imagine a diff like *vc-diff*.
Sure.
>> I haven't tried the patch yet, but from what I can tell from the
>> description, it's a pretty power-user-ish approach to UI.
>
> IMO showing a diff to a user such a is not a power-user-ish thing. Or
> rather, it might be, but I don't see any better way to show potentially
> complex code changes to users.
>
>> Similar to what we ended up doing with checkin-patch in VC --
>> powerful, but no very obvious to a non-pro user in how it can be
>> operated. It is surely a good addition to Eglot, but the refactoring
>> interface I was thinking of would have been more graphical (very
>> vaguely in the style of Xref), looking a little closer to the VS Code
>> screenshot I posted.
>
> I don't know how VSCode does it, but refactorings -- at least the kind
> provided by LSP servers -- aren't in general as trivial as simple
> renamings. They are arbitrary sets of changes to code, like moving
> whole functions from one file to another, adding new sections or new
> files, removing sections or whole files, etc, etc.
I previously posted a link to a screenshot from VS Code, here it is
again:
https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp
Indeed, refactorings could be very arbitrary changes, though most of the
time they are classified in certain types where each changes has some
semantic meaning where the IDE previews knows how to render it (be it a
renaming of a file, or of a function, or extracting a variable, etc).
It's also helpful to show two related changes that are intermixed in the
diff (e.g. when renaming a class also renames the file it's defined in).
It might be useful to experiment with different changes (simpler and
more complex) in VS Code and see what kind of previews it managed to
show for them, naturally based on the data format returned by LSP.
> In fact, they are just like patches.
>
> And I don't know any better way today to display patches to users other
> than diff.
>
>> Regarding compatibility layer, I'm not sure I see a request-response
>> mechanism here. I'd expect to see something synchronous, e.g. a call
>
> Synchronous is doable (Eglot does it, and the user shouldn't be doing
> changes to the code while the refactoring backend is computing the
> changes).
It's possible that the backend malfunctions, or e.g. auto-revert-mode
applies some changes while the user is still considering the changeset.
> What I meant by request-proposal is that there is this
> sequence
>
> 1. a request by the user selecting one of multiple offered
> refactorings.
>
> 2. a synchronous response proposing changes
>
> 3. The decision by the user to apply some or all of these proposed
> changes. This decision might be taken in advance in step 1, if the
> user trusts the refactoring engine enough.
>
> Note: Files are not saved automatically, because this is a different
> concern.
"Not saving files automatically" is a power-user approach too.
We have that in query-replace and naturally in
xref-query-replace-in-results too, but having a large refactoring across
many files end up in a not-synced-to-disk condition is a complication.
Not everyone knows about save-some-buffers and auto-revert-mode.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-30 21:49 ` Dmitry Gutov
@ 2023-08-30 22:01 ` Stefan Kangas
2023-08-30 22:04 ` Dmitry Gutov
2023-09-04 6:03 ` Rudolf Schlatte
2023-08-31 5:03 ` Eli Zaretskii
2023-09-04 17:23 ` Juri Linkov
2 siblings, 2 replies; 147+ messages in thread
From: Stefan Kangas @ 2023-08-30 22:01 UTC (permalink / raw)
To: Dmitry Gutov
Cc: João Távora, Yuri Khan, Eli Zaretskii, emacs-devel,
Philip K.
Dmitry Gutov <dmitry@gutov.dev> writes:
> I previously posted a link to a screenshot from VS Code, here it is
> again:
> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp
So fundamentally, it is a one-line diff along the lines of "git diff
--word-diff", plus some folding, and check-boxes to select which diff
chunks to apply. Or is there more to it?
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-30 22:01 ` Stefan Kangas
@ 2023-08-30 22:04 ` Dmitry Gutov
2023-09-04 6:03 ` Rudolf Schlatte
1 sibling, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-08-30 22:04 UTC (permalink / raw)
To: Stefan Kangas
Cc: João Távora, Yuri Khan, Eli Zaretskii, emacs-devel,
Philip K.
On 31/08/2023 01:01, Stefan Kangas wrote:
> Dmitry Gutov<dmitry@gutov.dev> writes:
>
>> I previously posted a link to a screenshot from VS Code, here it is
>> again:
>> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp
> So fundamentally, it is a one-line diff along the lines of "git diff
> --word-diff", plus some folding, and check-boxes to select which diff
> chunks to apply. Or is there more to it?
I don't know, I haven't tried this feature in VS Code yet. I'm not
really using that editor.
It was actually a surprise for me that they do have some refactoring
preview, and I think it'll be a good idea to explore its limitations
experimentally.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-30 21:49 ` Dmitry Gutov
2023-08-30 22:01 ` Stefan Kangas
@ 2023-08-31 5:03 ` Eli Zaretskii
2023-08-31 8:02 ` João Távora
2023-09-04 17:23 ` Juri Linkov
2 siblings, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-08-31 5:03 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: joaotavora, yuri.v.khan, emacs-devel, philipk
> Date: Thu, 31 Aug 2023 00:49:53 +0300
> Cc: Yuri Khan <yuri.v.khan@gmail.com>, Eli Zaretskii <eliz@gnu.org>,
> emacs-devel <emacs-devel@gnu.org>, "Philip K." <philipk@posteo.net>
> From: Dmitry Gutov <dmitry@gutov.dev>
>
> > I don't know how VSCode does it, but refactorings -- at least the kind
> > provided by LSP servers -- aren't in general as trivial as simple
> > renamings. They are arbitrary sets of changes to code, like moving
> > whole functions from one file to another, adding new sections or new
> > files, removing sections or whole files, etc, etc.
>
> I previously posted a link to a screenshot from VS Code, here it is
> again:
> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp
Having never used VSCode, I have difficulty understanding what I see
there. Could you (or someone else) please post a detailed description
of what is shown there and what kind of refactoring is going on? TIA.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-31 5:03 ` Eli Zaretskii
@ 2023-08-31 8:02 ` João Távora
2023-09-04 15:45 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-08-31 8:02 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Dmitry Gutov, Yuri Khan, emacs-devel, Philip K.
[-- Attachment #1: Type: text/plain, Size: 1249 bytes --]
On Thu, Aug 31, 2023, 06:03 Eli Zaretskii <eliz@gnu.org> wrote:
> > Date: Thu, 31 Aug 2023 00:49:53 +0300
> > Cc: Yuri Khan <yuri.v.khan@gmail.com>, Eli Zaretskii <eliz@gnu.org>,
> > emacs-devel <emacs-devel@gnu.org>, "Philip K." <philipk@posteo.net>
> > From: Dmitry Gutov <dmitry@gutov.dev>
> >
> > > I don't know how VSCode does it, but refactorings -- at least the kind
> > > provided by LSP servers -- aren't in general as trivial as simple
> > > renamings. They are arbitrary sets of changes to code, like moving
> > > whole functions from one file to another, adding new sections or new
> > > files, removing sections or whole files, etc, etc.
> >
> > I previously posted a link to a screenshot from VS Code, here it is
> > again:
> >
> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp
>
> Having never used VSCode, I have difficulty understanding what I see
> there. Could you (or someone else) please post a detailed description
> of what is shown there and what kind of refactoring is going on? TIA.
>
I had seen this screenshot already. I think it is a very simple rename. If
like to see how it handles clangd's move function to out-of-line action,
for example.
João
>
[-- Attachment #2: Type: text/html, Size: 2405 bytes --]
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-30 22:01 ` Stefan Kangas
2023-08-30 22:04 ` Dmitry Gutov
@ 2023-09-04 6:03 ` Rudolf Schlatte
2023-09-04 11:04 ` João Távora
1 sibling, 1 reply; 147+ messages in thread
From: Rudolf Schlatte @ 2023-09-04 6:03 UTC (permalink / raw)
To: emacs-devel
Stefan Kangas <stefankangas@gmail.com> writes:
> Dmitry Gutov <dmitry@gutov.dev> writes:
>
>> I previously posted a link to a screenshot from VS Code, here it is
>> again:
>> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp
>
> So fundamentally, it is a one-line diff along the lines of "git diff
> --word-diff", plus some folding, and check-boxes to select which diff
> chunks to apply. Or is there more to it?
This sounds very similar to magit's staging interface to me, which is a
nice emacs-y way to pick and choose from changes files or individual
changes within files.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 6:03 ` Rudolf Schlatte
@ 2023-09-04 11:04 ` João Távora
2023-09-04 12:18 ` Rudolf Schlatte
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-04 11:04 UTC (permalink / raw)
To: Rudolf Schlatte; +Cc: emacs-devel
On Mon, Sep 4, 2023 at 11:48 AM Rudolf Schlatte <rudi@constantly.at> wrote:
>
> Stefan Kangas <stefankangas@gmail.com> writes:
>
> > Dmitry Gutov <dmitry@gutov.dev> writes:
> >
> >> I previously posted a link to a screenshot from VS Code, here it is
> >> again:
> >> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp
> >
> > So fundamentally, it is a one-line diff along the lines of "git diff
> > --word-diff", plus some folding, and check-boxes to select which diff
> > chunks to apply. Or is there more to it?
>
> This sounds very similar to magit's staging interface to me, which is a
> nice emacs-y way to pick and choose from changes files or individual
> changes within files.
Can you show a screenshot of that interface or give a recipe
to try it out? Is it very different from regular "diff-mode"?
I'm not a Magit user but I feel some of its UI is indeed
good, and maybe they could be reused without an explicit dependency
on broader Magit. (For example I'm still using a pretty good
version of git-rebase-mode.el before it was integrated into
Magit).
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 11:04 ` João Távora
@ 2023-09-04 12:18 ` Rudolf Schlatte
0 siblings, 0 replies; 147+ messages in thread
From: Rudolf Schlatte @ 2023-09-04 12:18 UTC (permalink / raw)
To: emacs-devel
João Távora <joaotavora@gmail.com> writes:
> On Mon, Sep 4, 2023 at 11:48 AM Rudolf Schlatte <rudi@constantly.at> wrote:
>>
>> Stefan Kangas <stefankangas@gmail.com> writes:
>>
>> > Dmitry Gutov <dmitry@gutov.dev> writes:
>> >
>> >> I previously posted a link to a screenshot from VS Code, here it is
>> >> again:
>> >> https://bobbyhadz.com/images/blog/rename-variable-vscode/refactor-preview.webp
>> >
>> > So fundamentally, it is a one-line diff along the lines of "git diff
>> > --word-diff", plus some folding, and check-boxes to select which diff
>> > chunks to apply. Or is there more to it?
>>
>> This sounds very similar to magit's staging interface to me, which is a
>> nice emacs-y way to pick and choose from changes files or individual
>> changes within files.
>
> Can you show a screenshot of that interface or give a recipe
> to try it out? Is it very different from regular "diff-mode"?
Sure--it's easy to try if you have a git repository checked out locally
that contains uncommitted changes. Here's how to navigate that part of
magit:
- Open the repository in magit (`M-x magit-status`)
- Depending on the local state of the repository, you will see multiple
sections in the resulting buffer ("Untracked files", "Stashes",
"Recent commits", etc.) The section we are interested in is called
"Unstaged Changes".
- You can use Tab to fold and unfold any of magit's sections, like in
outline-mode. Also, M-1 .. M-4 fold or unfold all sections in the
magit buffer to the specified level, and the keys 1 .. 4 fold/unfold
the current subtree to the specified level; it's easier to try this
out than to explain it succinctly :-)
- In "Unstaged chages", you will see the list of files that contain
changes. (Note that this list does not contain files whose buffers
contain unsaved changes, only on-disk state; a refactoring UI might
want to include modified unsaved buffers here.)
- You can use `magit-stage` (bound to "s") to stage ("accept") all
changes in the file that point is on. The file will vanish from
"Unstaged changes" and appear in a section "Staged changes". It can
be moved back via `magit-unstage` (bound to "u") with point on the
staged file.
- You can also use `magit-stage` with point on the "Unstaged changes"
section header to stage all changes in one go.
- You can use TAB (`magit-section-toggle`) to unfold the file (or use
the "4" key); this gives you a diff view with all unstaged changes.
Move point to a hunk and use "s" to stage that individual hunk. You
can observe the file will now appear both in the "Unstaged changes"
and "Staged changes" sections, with the entries showing the staged vs
committed / unstaged vs staged diffs, respectively. You can unstage
one hunk of a diff by expanding a file in the "Staged changes" section
and pressing "u" with point in the hunk.
- In the diff view, you can mark part of the diff and stage only that
part (pressing "s" when the region is active stages only the region).
The same goes for unstaging part of a diff.
... this last feature is where people who do not use Emacs become very
motivated to install and learn it, since this detailed control over
what source changes get committed is seemingly not available in other
tools. I believe a similar level of control would be beneficial for
source changes proposed by a refactoring tool, which is why I brought
up magit.
I hope that helped a bit; I'll be happy to explain more of course.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-31 8:02 ` João Távora
@ 2023-09-04 15:45 ` Dmitry Gutov
2023-09-04 23:34 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-04 15:45 UTC (permalink / raw)
To: João Távora, Eli Zaretskii; +Cc: Yuri Khan, emacs-devel, Philip K.
On 31/08/2023 11:02, João Távora wrote:
> I had seen this screenshot already. I think it is a very simple rename.
> If like to see how it handles clangd's move function to out-of-line
> action, for example.
Do you mean what's also commonly referred to as "Extract function"? Have
you seen it in practice?
I've tried to find a pieces of code in several C/C++ projects where
clangd would offer such action, but no such luck. Only "extract
variable" in some places. And renames, of course.
"Extract variable" doesn't seem to offer any preview either, opting for
a more snippet-like interactive UI where you're typing the name and it's
updated in both places on the fly. Maybe wherever "Extract function"
works (newer clangd? I have 15.0.7 installed), it would do the same.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-20 1:19 ` Dmitry Gutov
2023-08-20 6:39 ` Eli Zaretskii
2023-08-20 8:44 ` Yuri Khan
@ 2023-09-04 17:15 ` Juri Linkov
2023-09-04 18:02 ` Dmitry Gutov
2 siblings, 1 reply; 147+ messages in thread
From: Juri Linkov @ 2023-09-04 17:15 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Eli Zaretskii, emacs-devel
[-- Attachment #1: Type: text/plain, Size: 926 bytes --]
> If we had a better UI for renaming than query-replace, we could plug it
> into project-find-regexp and xref-find-references' output buffers.
Thanks for mentioning query-replace. I wished query-replace could do
something like what 'd' does for previewing changes before saving
the buffer with 'C-x s':
```
(?d ,(lambda (buf)
(if (null (buffer-file-name buf))
(message "Not applicable: no file")
(require 'diff) ;for diff-no-select.
(let ((diffbuf (diff-no-select (buffer-file-name buf) buf
nil 'noasync)))
```
And now Eglot does this for previewing renaming.
So below is a command that does the same for replace-string.
Instead of boringly typing a long sequence of y y y y y y y ...
to check if all replacements are correct, now it will be possible
to preview the diff buffer that will take much less time:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: replace-string-as-diff.patch --]
[-- Type: text/x-diff, Size: 3013 bytes --]
diff --git a/lisp/replace.el b/lisp/replace.el
index eeac734f3bd..a5704e6966f 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -691,6 +697,28 @@ replace-string
(use-region-noncontiguous-p))))
(perform-replace from-string to-string nil nil delimited nil nil start end backward region-noncontiguous-p))
+(defun replace-string-as-diff (from-string to-string &optional delimited start end backward region-noncontiguous-p)
+ (interactive (apply (cadr (interactive-form 'replace-string))))
+ (require 'diff)
+ (let ((file-name buffer-file-name)
+ (orig-buffer (current-buffer))
+ (diff-buffer (get-buffer-create "*replace-diff*")))
+ (with-current-buffer diff-buffer
+ (buffer-disable-undo (current-buffer))
+ (let ((inhibit-read-only t))
+ (erase-buffer))
+ (diff-mode))
+ (with-temp-buffer
+ (insert-buffer-substring orig-buffer)
+ (goto-char (point-min))
+ (perform-replace from-string to-string nil nil delimited nil nil start end backward region-noncontiguous-p)
+ (diff-no-select orig-buffer (current-buffer) nil t diff-buffer (concat file-name "~") file-name))
+ (with-current-buffer diff-buffer
+ (setq-local buffer-read-only t)
+ (buffer-enable-undo (current-buffer))
+ (font-lock-ensure))
+ (pop-to-buffer diff-buffer)))
+
(defun replace-regexp (regexp to-string &optional delimited start end backward region-noncontiguous-p)
"Replace things after point matching REGEXP with TO-STRING.
Preserve case in each match if `case-replace' and `case-fold-search'
diff --git a/lisp/vc/diff.el b/lisp/vc/diff.el
index a411d98da31..a682b88976f 100644
--- a/lisp/vc/diff.el
+++ b/lisp/vc/diff.el
@@ -149,7 +149,7 @@ diff-check-labels
(call-process diff-command nil t nil "--help"))
(if (search-backward "--label" nil t) t))))))
-(defun diff-no-select (old new &optional switches no-async buf)
+(defun diff-no-select (old new &optional switches no-async buf label-old label-new)
;; Noninteractive helper for creating and reverting diff buffers
"Compare the OLD and NEW file/buffer.
If the optional SWITCHES is nil, the switches specified in the
@@ -180,11 +180,13 @@ diff-no-select
(and (or old-alt new-alt)
(eq diff-use-labels t)
(list "--label"
- (if (stringp old) old
- (prin1-to-string old))
+ (cond ((stringp old) old)
+ ((stringp label-old) label-old)
+ ((prin1-to-string old)))
"--label"
- (if (stringp new) new
- (prin1-to-string new))))
+ (cond ((stringp new) new)
+ ((stringp label-new) label-new)
+ ((prin1-to-string new)))))
(list (or old-alt old)
(or new-alt new)))))
" "))
^ permalink raw reply related [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-30 21:49 ` Dmitry Gutov
2023-08-30 22:01 ` Stefan Kangas
2023-08-31 5:03 ` Eli Zaretskii
@ 2023-09-04 17:23 ` Juri Linkov
2023-09-04 17:53 ` Alfred M. Szmidt
` (2 more replies)
2 siblings, 3 replies; 147+ messages in thread
From: Juri Linkov @ 2023-09-04 17:23 UTC (permalink / raw)
To: Dmitry Gutov
Cc: João Távora, Yuri Khan, Eli Zaretskii, emacs-devel,
Philip K.
>> Note: Files are not saved automatically, because this is a different
>> concern.
>
> "Not saving files automatically" is a power-user approach too.
>
> We have that in query-replace and naturally in
> xref-query-replace-in-results too, but having a large refactoring across
> many files end up in a not-synced-to-disk condition is a complication. Not
> everyone knows about save-some-buffers and auto-revert-mode.
This is a real problem. Diff mode requires typing a long sequence of
'C-c C-a C-c C-a C-c C-a C-c C-a ...' to apply the whole diff.
A possible solution would be to support a region by 'C-c C-a'.
Then it will be possible to activate the region on the whole buffer
or on a few hunks, and type a single 'C-c C-a'.
Another problem that the changes are not saved automatically
on multiple files. This limitation forces to use tricks like
'M-| git apply RET' after selecting the whole diff buffer with 'C-x h'
or a region of the diff buffer. A "poor man's auto-save".
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 17:23 ` Juri Linkov
@ 2023-09-04 17:53 ` Alfred M. Szmidt
2023-09-05 6:38 ` Juri Linkov
2023-09-04 18:04 ` Dmitry Gutov
2023-09-04 20:49 ` Philip Kaludercic
2 siblings, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-04 17:53 UTC (permalink / raw)
To: Juri Linkov; +Cc: dmitry, joaotavora, yuri.v.khan, eliz, emacs-devel, philipk
>> Note: Files are not saved automatically, because this is a different
>> concern.
>
> "Not saving files automatically" is a power-user approach too.
>
> We have that in query-replace and naturally in
> xref-query-replace-in-results too, but having a large refactoring across
> many files end up in a not-synced-to-disk condition is a complication. Not
> everyone knows about save-some-buffers and auto-revert-mode.
This is a real problem. Diff mode requires typing a long sequence of
'C-c C-a C-c C-a C-c C-a C-c C-a ...' to apply the whole diff.
Can't that be solved using something like,
(goto-char (point-min))
(while (not (eobp))
(diff-apply-hunk))
Or some such and have it bound to something sensible, maybe collecting
the files it touched for a later save.
A possible solution would be to support a region by 'C-c C-a'.
A region might not be a valid thing to apply -- it is better to work
with hunks.
Then it will be possible to activate the region on the whole buffer
or on a few hunks, and type a single 'C-c C-a'.
Another problem that the changes are not saved automatically
on multiple files. This limitation forces to use tricks like
'M-| git apply RET' after selecting the whole diff buffer with 'C-x h'
or a region of the diff buffer. A "poor man's auto-save".
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 17:15 ` Juri Linkov
@ 2023-09-04 18:02 ` Dmitry Gutov
2023-09-05 13:56 ` Alexander Adolf
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-04 18:02 UTC (permalink / raw)
To: Juri Linkov; +Cc: Eli Zaretskii, emacs-devel
On 04/09/2023 20:15, Juri Linkov wrote:
> So below is a command that does the same for replace-string.
> Instead of boringly typing a long sequence of y y y y y y y ...
> to check if all replacements are correct, now it will be possible
> to preview the diff buffer that will take much less time:
A diff buffer for all the replacements combined? That's pretty cool.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 17:23 ` Juri Linkov
2023-09-04 17:53 ` Alfred M. Szmidt
@ 2023-09-04 18:04 ` Dmitry Gutov
2023-09-05 6:43 ` Juri Linkov
2023-09-04 20:49 ` Philip Kaludercic
2 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-04 18:04 UTC (permalink / raw)
To: Juri Linkov
Cc: João Távora, Yuri Khan, Eli Zaretskii, emacs-devel,
Philip K.
On 04/09/2023 20:23, Juri Linkov wrote:
> A possible solution would be to support a region by 'C-c C-a'.
> Then it will be possible to activate the region on the whole buffer
> or on a few hunks, and type a single 'C-c C-a'.
Another problem is trying to do an atomic revert if a large diff, across
multiple files, fails to apply somewhere in the middle.
> Another problem that the changes are not saved automatically
> on multiple files. This limitation forces to use tricks like
> 'M-| git apply RET' after selecting the whole diff buffer with 'C-x h'
> or a region of the diff buffer. A "poor man's auto-save".
This approach might help with the above, though.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 17:23 ` Juri Linkov
2023-09-04 17:53 ` Alfred M. Szmidt
2023-09-04 18:04 ` Dmitry Gutov
@ 2023-09-04 20:49 ` Philip Kaludercic
2 siblings, 0 replies; 147+ messages in thread
From: Philip Kaludercic @ 2023-09-04 20:49 UTC (permalink / raw)
To: Juri Linkov
Cc: Dmitry Gutov, João Távora, Yuri Khan, Eli Zaretskii,
emacs-devel
Juri Linkov <juri@linkov.net> writes:
>>> Note: Files are not saved automatically, because this is a different
>>> concern.
>>
>> "Not saving files automatically" is a power-user approach too.
>>
>> We have that in query-replace and naturally in
>> xref-query-replace-in-results too, but having a large refactoring across
>> many files end up in a not-synced-to-disk condition is a complication. Not
>> everyone knows about save-some-buffers and auto-revert-mode.
>
> This is a real problem. Diff mode requires typing a long sequence of
> 'C-c C-a C-c C-a C-c C-a C-c C-a ...' to apply the whole diff.
I had proposed adding a command to diff-mode, that would apply the
entire buffer. It appears that was not applied.
>
> A possible solution would be to support a region by 'C-c C-a'.
> Then it will be possible to activate the region on the whole buffer
> or on a few hunks, and type a single 'C-c C-a'.
>
> Another problem that the changes are not saved automatically
> on multiple files. This limitation forces to use tricks like
> 'M-| git apply RET' after selecting the whole diff buffer with 'C-x h'
> or a region of the diff buffer. A "poor man's auto-save".
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 15:45 ` Dmitry Gutov
@ 2023-09-04 23:34 ` Dmitry Gutov
0 siblings, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-04 23:34 UTC (permalink / raw)
To: João Távora, Eli Zaretskii; +Cc: Yuri Khan, emacs-devel, Philip K.
On 04/09/2023 18:45, Dmitry Gutov wrote:
> Maybe wherever "Extract function" works (newer clangd? I have 15.0.7
> installed), it would do the same.
Apparently not quite (there is a "Refactor with Preview..." action on
the video).
I found this gif with "Extract function":
https://i.stack.imgur.com/YLFvw.gif
I does look similar to an one-line diff, but lines are not truncated on
newline (multiple lines are folded into one instead with a special char
denoting newline, as long as they fit into the available width).
There is also something that implies a difference but is not: the top
node is not a file name, but I'm guessing that's only when the tab
(buffer?) is not saved to a file yet.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 17:53 ` Alfred M. Szmidt
@ 2023-09-05 6:38 ` Juri Linkov
2023-09-05 7:46 ` Alfred M. Szmidt
0 siblings, 1 reply; 147+ messages in thread
From: Juri Linkov @ 2023-09-05 6:38 UTC (permalink / raw)
To: Alfred M. Szmidt
Cc: dmitry, joaotavora, yuri.v.khan, eliz, emacs-devel, philipk
> Can't that be solved using something like,
>
> (goto-char (point-min))
> (while (not (eobp))
> (diff-apply-hunk))
It's basically what Philip proposed in bug#60338.
> Or some such and have it bound to something sensible, maybe collecting
> the files it touched for a later save.
Good idea, then with a prefix argument e.g. 'C-u C-c C-A' could save
the buffers after applying the entire patch.
> A possible solution would be to support a region by 'C-c C-a'.
>
> A region might not be a valid thing to apply -- it is better to work
> with hunks.
It's possible to detect hunk boundaries that start/end inside the selected region.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 18:04 ` Dmitry Gutov
@ 2023-09-05 6:43 ` Juri Linkov
0 siblings, 0 replies; 147+ messages in thread
From: Juri Linkov @ 2023-09-05 6:43 UTC (permalink / raw)
To: Dmitry Gutov
Cc: João Távora, Yuri Khan, Eli Zaretskii, emacs-devel,
Philip K.
>> A possible solution would be to support a region by 'C-c C-a'.
>> Then it will be possible to activate the region on the whole buffer
>> or on a few hunks, and type a single 'C-c C-a'.
>
> Another problem is trying to do an atomic revert if a large diff, across
> multiple files, fails to apply somewhere in the middle.
>
>> Another problem that the changes are not saved automatically
>> on multiple files. This limitation forces to use tricks like
>> 'M-| git apply RET' after selecting the whole diff buffer with 'C-x h'
>> or a region of the diff buffer. A "poor man's auto-save".
>
> This approach might help with the above, though.
Indeed, and an atomic revert in case of no errors (just when the
user changes the mind) is to do 'C-c C-r' ('diff-reverse-direction'),
and then 'M-| git apply RET' again.
But the drawback of this approach is that visited files will be out of sync
that requires reverting with losing their content.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-05 6:38 ` Juri Linkov
@ 2023-09-05 7:46 ` Alfred M. Szmidt
0 siblings, 0 replies; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-05 7:46 UTC (permalink / raw)
To: Juri Linkov; +Cc: dmitry, joaotavora, yuri.v.khan, eliz, emacs-devel, philipk
> Or some such and have it bound to something sensible, maybe collecting
> the files it touched for a later save.
Good idea, then with a prefix argument e.g. 'C-u C-c C-A' could save
the buffers after applying the entire patch.
That doesn't rhyme with the behaviour of C-c C-a which is to reverse
the hunk. It would make more sense to provide a "Save all files
touched by diff-mode" key, that lists the files, and you can answer
yes or now. This could then also be used when applying hunks in a
singular fashion.
> A possible solution would be to support a region by 'C-c C-a'.
>
> A region might not be a valid thing to apply -- it is better to work
> with hunks.
It's possible to detect hunk boundaries that start/end inside the
selected region.
Too much DWIM for my taste ... and might have weird behaviour.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-04 18:02 ` Dmitry Gutov
@ 2023-09-05 13:56 ` Alexander Adolf
2023-09-05 14:00 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: Alexander Adolf @ 2023-09-05 13:56 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Juri Linkov, Eli Zaretskii, emacs-devel
[-- Attachment #1.1: Type: text/plain, Size: 687 bytes --]
> On 4. Sep 2023, at 20:03, Dmitry Gutov <dmitry@gutov.dev> wrote:
>
> On 04/09/2023 20:15, Juri Linkov wrote:
>> So below is a command that does the same for replace-string.
>> Instead of boringly typing a long sequence of y y y y y y y ...
>> to check if all replacements are correct, now it will be possible
>> to preview the diff buffer that will take much less time:
>
> A diff buffer for all the replacements combined? That's pretty cool.
>
That’d be just like https://github.com/benma/visual-regexp.el and that’s why I’m using that. OTOH it’s for string replacement only; no code refactoring. But perhaps the UI could be used da source of inspiration?
[-- Attachment #1.2: Type: text/html, Size: 1255 bytes --]
[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 1944 bytes --]
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-05 13:56 ` Alexander Adolf
@ 2023-09-05 14:00 ` Dmitry Gutov
2023-09-06 13:25 ` Alexander Adolf
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-05 14:00 UTC (permalink / raw)
To: Alexander Adolf; +Cc: Juri Linkov, Eli Zaretskii, emacs-devel
On 05/09/2023 16:56, Alexander Adolf wrote:
> That’d be just like https://github.com/benma/visual-regexp.el
> <https://github.com/benma/visual-regexp.el> and that’s why I’m using
> that. OTOH it’s for string replacement only; no code refactoring. But
> perhaps the UI could be used da source of inspiration?
I don't know. One issue is that for a multi-file refactoring you would
want to see all the changes in one place.
OTOH, if we were talking about a more compact diff, 'git diff' has a
thing called "word diff" which doesn't take up two lines for one change
(the modification is shown in-line).
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-05 14:00 ` Dmitry Gutov
@ 2023-09-06 13:25 ` Alexander Adolf
0 siblings, 0 replies; 147+ messages in thread
From: Alexander Adolf @ 2023-09-06 13:25 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Juri Linkov, Eli Zaretskii, emacs-devel
Dmitry Gutov <dmitry@gutov.dev> writes:
> [...]
> I don't know. One issue is that for a multi-file refactoring you would
> want to see all the changes in one place.
Yes, one would want that indeed.
It would be similar to an indirect buffer, but based on a list of
(buffer . (region-beg region-end)) tuples.
> OTOH, if we were talking about a more compact diff, 'git diff' has a
> thing called "word diff" which doesn't take up two lines for one change
> (the modification is shown in-line).
That's the reason I name-dropped visual-regexp; the change is shown
in-line there, too.
--alexander
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-08-19 6:03 Adding refactoring capabilities to Emacs Eli Zaretskii
` (2 preceding siblings ...)
2023-08-20 13:00 ` sbaugh
@ 2023-09-07 14:39 ` João Távora
2023-09-07 16:20 ` Stefan Monnier
` (3 more replies)
3 siblings, 4 replies; 147+ messages in thread
From: João Távora @ 2023-09-07 14:39 UTC (permalink / raw)
To: Eli Zaretskii, Philip K., Dmitry Gutov, Stefan Monnier; +Cc: emacs-devel
> Let's start working on this!
I'm posting a top-level reply to Eli's email with the content
of a reply to Dmitry in the scope of bug#60338.
That which concerns a significant enhancement to Eglot's
refactoring capability first proposed by Philip and finished by
myself. It's closed. So it's better to consolidate the
discussion here.
Especially I think that, to answer Eli's request successfully, we
have to take a look at the forest, not just one particular tree.
By the way, Stefan I CC'ed you so you could comment on the feasibility
of using (elisp--local-variables) for refactoring purposes, in
this case renaming. Do we have source-tracking info there?
On Thu, Sep 7, 2023 at 2:00 AM Dmitry Gutov <dmitry@gutov.dev> wrote:
>
> On 02/09/2023 12:55, João Távora wrote:
> > Anyway I invite everyone to have a look and try to improve it, perhaps
> > moving it out of Eglot into the shiny new "refactoring interface" if
> > those ever become a thing.
>
> Regarding the diff approach vs. "shiny new", I've run a little
> comparison with VS Code: doing a rename of 'glyph_row' across the Emacs
> codebase (a moderately sized project) takes about ~1.44s to produce the
> diff.
FWIW, I got 0.85s on that same test on a GNU/Linux VM running on a 6
yo laptop with 4 cores assigned. IMO this is more than acceptable for
this contrived example which renames a symbol across many files.
A much more typical example of renaming a symbol in a single function
resolved in 0.02s. Most examples of applying quick fixes and moving
.hpp inlined member functions to out-of-line in .cpp resolve in similar
quasi-instantaneous fashion.
Now, let me clarify what I meant by "shiny new refactoring interface".
It's not what you think I meant, I believe. What I meant is a framework
for:
1. collecting 'potential sets of changes' -- for clarity let's call
"actions" after LSP nomenclature -- from a number of different
backends. Examples of actions: "rename thing at point", "organize
imports", "write as while loops as cl-loop"
2. presenting actions names to the user -- either via the minibuffer
or by annotating buffer position where these tweaks apply.
3. after the user chooses an action, develop it into a set of changes
-- again, for clarity and consonance with LSP nomenclature, we
may call these "edits".
4. presenting these edits to the user via a number of different
user-confirmation strategies.
For very common "rename" or "organize imports" actions, steps 1
and 2 may be coalesced and a special command may be provided that
goes directly to step 3. LSP supports these "shortcuts".
Regarding 4 (which seems to be the current focal point of the
discussion) Eglot has three main types of confirmation strategies
available. See eglot-confirm-server-edits for more.
* 'diff', which just presents the edits
* 'summary', which summarizes the edits in the minibuffer and prompts
to apply.
* nil, which means no confirmation at all
There is also 'maybe-diff' and 'maybe-summary' which behave like
nil if all the files in the change list are already visited buffers.
That said, it's the whole sequence 1 to 4, not just 4, that needs
to be generalized out of Eglot and into Emacs. Note that some parts
of 1..4, like the annotation of actions in buffers or the support for
file creation and deletion, aren't yet in Eglot, so there's good work
to be done. Some of the "annotation" logic already exists in Flymake,
and Flymake must be taken into the equation too, and early.
Also, it would be very good if we could have an early backend which is
*not* LSP. An obvious candidate is Elisp. I'd like to know what is
the minimal effort to write a lisp function based on the new
macroexpanding tricks that Stefan Monnier developed that says
precisely where a given symbol is used as a variable in a function.
As far as I understand, these techniques are currently being used for
accurate completion, but they could maybe be used for accurate
refactorings.
> Not to belittle the new addition, though - it's a good step for Eglot.
As someone who actually uses Eglot daily and is an avid consumer
of refactoring functionality, my opinion is that the "diff"
confirmation strategy that Philip proposed and implemented is freaking
great, even if the implementation is a bit contorted (though mostly
isolated).
IMO diff is the lingua franca for communicating changes to source
code around the world, even in those pretty web interfaces that
you and many others like. So it makes full sense to support it
and to support it well.
> - I would probably want to bind the originally proposed
> 'diff-apply-everything' to 'C-c C-c' (e.g. "commit the change to disk"),
> but that's already taken in diff-mode.
> - 'git diff' has a less-frequently used option called '--word-diff'
> which could reduce the length of the diff in the case I am testing (but
> I guess diff-mode would have to be updated to support that output). And
> another way in that direction would be to reduce the size of the diff
> context (e.g. to 0).
I'm not at all opposed to implementing other confirmation strategies
that look more like what VSCode or other editors show users. Or
augmenting the existing 'diff' strategy with new shortcuts and stuff.
But I wouldn't overthink UI details at this point in the game either.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 14:39 ` João Távora
@ 2023-09-07 16:20 ` Stefan Monnier
2023-09-07 16:49 ` João Távora
` (2 more replies)
2023-09-07 19:06 ` Felician Nemeth
` (2 subsequent siblings)
3 siblings, 3 replies; 147+ messages in thread
From: Stefan Monnier @ 2023-09-07 16:20 UTC (permalink / raw)
To: João Távora; +Cc: Eli Zaretskii, Philip K., Dmitry Gutov, emacs-devel
> Also, it would be very good if we could have an early backend which is
> *not* LSP. An obvious candidate is Elisp. I'd like to know what is
> the minimal effort to write a lisp function based on the new
> macroexpanding tricks that Stefan Monnier developed that says
> precisely where a given symbol is used as a variable in a function.
> As far as I understand, these techniques are currently being used for
> accurate completion, but they could maybe be used for accurate
> refactorings.
Hmm... the `elisp--local-variables` functionality (beside the
associated security issues and occasional errors) provides only
a (somewhat) reliable list of variables that are in-scope. So it could
potentially be extended to offer a way to jump to the declaration of
a local variable from a reference to it, but it doesn't know how to find
all (and only) the references to a given variable.
We could extend it to a full code-walker that can distinguish between
identifiers that refer to functions vs variables and which skips "data"
and obeys scope, and thus collect reliably all the references.
But `cconv-analyze-form` is probably a better starting point :-)
Going back from there to the actual source code can be a fair bit more
tricky, but Alan's symbols-with-positions should provide just what we need.
> IMO diff is the lingua franca for communicating changes to source
> code around the world, even in those pretty web interfaces that
> you and many others like. So it makes full sense to support it
> and to support it well.
+1, tho I think the general framework should be agnostic to the specific
way a change is presented to the user.
>> - I would probably want to bind the originally proposed
>> 'diff-apply-everything' to 'C-c C-c' (e.g. "commit the change to disk"),
Agreed.
>> but that's already taken in diff-mode.
I don't think the current `C-c C-c` binding in `diff-mode` should get in
the way. That command is available via different bindings already, and
this is a specific use of diff-mode where `diff-apply-everything` makes
a lot of sense (as opposed to `C-x v =` where the changes are usually
already applied anyway so `diff-apply-everything` is rarely what we want).
>> - 'git diff' has a less-frequently used option called '--word-diff'
>> which could reduce the length of the diff in the case I am testing (but
>> I guess diff-mode would have to be updated to support that output). And
>> another way in that direction would be to reduce the size of the diff
>> context (e.g. to 0).
[ Side note: we could also extend diff-mode to do such "rewrite" inside
Emacs. Hiding some of the context should be fairly easy, for example.
Also I've often wished for `diff-refine-hunk` to try and interlace
the lines so as to minimize the distance between the "before" and
"after" lines. ]
> But I wouldn't overthink UI details at this point in the game either.
+1
Stefan
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 16:20 ` Stefan Monnier
@ 2023-09-07 16:49 ` João Távora
2023-09-07 17:06 ` Stefan Monnier
2023-09-07 20:41 ` Dmitry Gutov
2023-09-07 22:18 ` João Távora
2 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-07 16:49 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Eli Zaretskii, Philip K., Dmitry Gutov, emacs-devel
On Thu, Sep 7, 2023 at 5:20 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> We could extend it to a full code-walker that can distinguish between
> identifiers that refer to functions vs variables and which skips "data"
> and obeys scope, and thus collect reliably all the references.
> But `cconv-analyze-form` is probably a better starting point :-)
But cconv-analyze-form takes a pre-read form, you've lost all source code
info by then.
> Going back from there to the actual source code can be a fair bit more
> tricky,
Exactly.
> but Alan's symbols-with-positions should provide just what we need.
Great! but how?
Some years ago I presented a full source-tracking reader for Common Lisp
with just Lisp to a conference ;-) Needs a programmable reader though :-(
As you may remember, I then paired it with a full code walker to create
a stepper.
Is lread.c used for symbols-with-positions, or is code read in some
other completely new way?
> > IMO diff is the lingua franca for communicating changes to source
> > code around the world, even in those pretty web interfaces that
> > you and many others like. So it makes full sense to support it
> > and to support it well.
>
> +1, tho I think the general framework should be agnostic to the specific
> way a change is presented to the user.
Of course, but I don't understand the "tho", since that's exactly
what I described. Presenting edits to the user is just the last step
after collecting them. We should have a goodinternal representation
for a change, which is easy to manipulate, easy to apply to buffers,
and easy to view from many formats. LSP's representation (a range
and a string with a null string for deletions) is not bad IMO, and
I see no reason to stray from it.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 16:49 ` João Távora
@ 2023-09-07 17:06 ` Stefan Monnier
2023-09-07 17:24 ` João Távora
2023-09-07 23:46 ` Lynn Winebarger
0 siblings, 2 replies; 147+ messages in thread
From: Stefan Monnier @ 2023-09-07 17:06 UTC (permalink / raw)
To: João Távora; +Cc: Eli Zaretskii, Philip K., Dmitry Gutov, emacs-devel
>> Going back from there to the actual source code can be a fair bit more
>> tricky,
> Exactly.
>> but Alan's symbols-with-positions should provide just what we need.
> Great! but how?
> Some years ago I presented a full source-tracking reader for Common Lisp
> with just Lisp to a conference ;-) Needs a programmable reader though :-(
> As you may remember, I then paired it with a full code walker to create
> a stepper.
We do have a "full source-tracking reader" writen in ELisp inside `edebug.el`.
It's not 100% faithful to `lread.c`, but it seems to work well enough
that we haven't heard too many bug reports about it over the years.
Still, can't be used with `cconv` because the the "sexp with
source-tracking info" don't have the shape expected by macros.
> Is lread.c used for symbols-with-positions, or is code read in some
> other completely new way?
Yes, the symbols-with-positions thingy was done by extending `lread.c`.
It keeps track of the source position only for symbols rather than for
all Lisp objects, but it does it in a way which can survive
macro-expansion.
It's what's used in the byte-compiler to provide position info in
the warnings.
> Of course, but I don't understand the "tho",
Yeah, it was probably not a correct usage. Please ignore it.
> since that's exactly what I described.
Yes, we agree.
Stefan
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 17:06 ` Stefan Monnier
@ 2023-09-07 17:24 ` João Távora
2023-09-07 17:54 ` Stefan Monnier
2023-09-07 23:46 ` Lynn Winebarger
1 sibling, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-07 17:24 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Eli Zaretskii, Philip K., Dmitry Gutov, emacs-devel
On Thu, Sep 7, 2023 at 6:06 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>
> >> Going back from there to the actual source code can be a fair bit more
> >> tricky,
> > Exactly.
> >> but Alan's symbols-with-positions should provide just what we need.
> > Great! but how?
> > Some years ago I presented a full source-tracking reader for Common Lisp
> > with just Lisp to a conference ;-) Needs a programmable reader though :-(
> > As you may remember, I then paired it with a full code walker to create
> > a stepper.
>
> We do have a "full source-tracking reader" writen in ELisp inside `edebug.el`.
> It's not 100% faithful to `lread.c`, but it seems to work well enough
> that we haven't heard too many bug reports about it over the years.
>
> Still, can't be used with `cconv` because the the "sexp with
> source-tracking info" don't have the shape expected by macros.
>
> > Is lread.c used for symbols-with-positions, or is code read in some
> > other completely new way?
>
> Yes, the symbols-with-positions thingy was done by extending `lread.c`.
> It keeps track of the source position only for symbols rather than for
> all Lisp objects, but it does it in a way which can survive
> macro-expansion.
Great! Indeed that's exactly what's needed. Might as well
plug my paper here: https://zenodo.org/record/3742759
where I gave it the pompous name of "mnesic macroexpansion".
There I used an existing codewalker with hook support and a
simple 'eq' lookup table.
Though when I used that for a stepper I run into some ambiguities
with atoms after macro expansion (described in section 4.1). Might
not be a problem here, as that problem was related to knowing
which manifestations a given atom is actually evaluated. And I'd
say that's not a problem for the "rename" refactoring action.
> It's what's used in the byte-compiler to provide position info in
> the warnings.
Hmmm, and we know it doesn't always get things right... :-/ Namely
it fails when there is more than one manifestation of the warning.
But then again, maybe that's a problem of compilation, not
reading, source-tracking or macro-expansion.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 17:24 ` João Távora
@ 2023-09-07 17:54 ` Stefan Monnier
2023-09-07 18:12 ` João Távora
0 siblings, 1 reply; 147+ messages in thread
From: Stefan Monnier @ 2023-09-07 17:54 UTC (permalink / raw)
To: João Távora; +Cc: Eli Zaretskii, Philip K., Dmitry Gutov, emacs-devel
> Though when I used that for a stepper I run into some ambiguities
> with atoms after macro expansion (described in section 4.1). Might
> not be a problem here, as that problem was related to knowing
> which manifestations a given atom is actually evaluated. And I'd
> say that's not a problem for the "rename" refactoring action.
The symbols-with-position approach avoids this problem (for symbols,
tho not for other data without identity list fixnums) because every
occurrence of a symbol returns a different "symbol with position" (and
then we need a hack to allow those different symbol-with-positions to
be `eq` nevertheless because that's what is needed at too many places
we can't control).
>> It's what's used in the byte-compiler to provide position info in
>> the warnings.
>
> Hmmm, and we know it doesn't always get things right... :-/ Namely
> it fails when there is more than one manifestation of the warning.
> But then again, maybe that's a problem of compilation, not
> reading, source-tracking or macro-expansion.
[ I can already hear Alan prepare his reply :-) ]
Seriously, tho, the position is pretty damn exactly right almost every
time nowadays. When it's not, it's not because the
"symbol-with-position" info is wrong but because it's missing, or
something else like that.
Stefan
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 17:54 ` Stefan Monnier
@ 2023-09-07 18:12 ` João Távora
2023-09-07 21:56 ` Stefan Monnier
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-07 18:12 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Eli Zaretskii, Philip K., Dmitry Gutov, emacs-devel
On Thu, Sep 7, 2023 at 6:54 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>
> > Though when I used that for a stepper I run into some ambiguities
> > with atoms after macro expansion (described in section 4.1). Might
> > not be a problem here, as that problem was related to knowing
> > which manifestations a given atom is actually evaluated. And I'd
> > say that's not a problem for the "rename" refactoring action.
>
> The symbols-with-position approach avoids this problem (for symbols,
> tho not for other data without identity list fixnums) because every
> occurrence of a symbol returns a different "symbol with position" (and
> then we need a hack to allow those different symbol-with-positions to
> be `eq` nevertheless because that's what is needed at too many places
> we can't control).
Making different things 'eq' is a possibility, but won't it
slow down 'eq'?
Again, I don't know if this is actually a problem specifically
when refactoring.
In that simple example
(lambda (x) x)
The ambiguity is a problem when stepping, but it's no problem when
refactoring.
A trickier problem is
(lambda (x) (let (x) x) x)
where renaming one of the symbols should not rename the others. But
I think I implemented a solution to that (at least in my model),
because symbols have parent forms, and the forms also have
source information.
Anyway, you seem to have envisioned a good strategy for this, so
I won't bother you more with my vague memories of alternatives.
> >> It's what's used in the byte-compiler to provide position info in
> >> the warnings.
> >
> > Hmmm, and we know it doesn't always get things right... :-/ Namely
> > it fails when there is more than one manifestation of the warning.
> > But then again, maybe that's a problem of compilation, not
> > reading, source-tracking or macro-expansion.
>
> [ I can already hear Alan prepare his reply :-) ]
> Seriously, tho, the position is pretty damn exactly right almost every
> time nowadays. When it's not, it's not because the
> "symbol-with-position" info is wrong but because it's missing, or
> something else like that.
I didn't say it was :-) I just meant cases like this (this is the
simplest one)
(defun foo () bar bar baz)
Only the first bar and the baz gets the warning. If there was a lot
of code between the two 'bar's, it's not easy for the user to spot
(say in a Flymake overlay) that the bar isn't defined.
In contrast, a code analyzer like clangd gets this case correctly
(in C/C++ of course) and highlights the two occurances of the
undeclared identifier.
But this is a "diagnostics" problem and here we're concerned with
refactorings. There, I'm really not sure at all it will be a problem.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 14:39 ` João Távora
2023-09-07 16:20 ` Stefan Monnier
@ 2023-09-07 19:06 ` Felician Nemeth
2023-09-07 19:19 ` João Távora
` (2 more replies)
2023-09-07 22:39 ` Dmitry Gutov
2023-09-08 12:46 ` Eshel Yaron
3 siblings, 3 replies; 147+ messages in thread
From: Felician Nemeth @ 2023-09-07 19:06 UTC (permalink / raw)
To: emacs-devel
Cc: João Távora, Eli Zaretskii, Philip K., Dmitry Gutov,
Stefan Monnier
I'm lacking the basics here, so sorry to butt in, but ...
>> 'diff-apply-everything'
How would a user undo such an operation in case of a multi-file edit?
Does the undo system support this?
Thanks.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 19:06 ` Felician Nemeth
@ 2023-09-07 19:19 ` João Távora
2023-09-07 19:25 ` Ihor Radchenko
2023-09-07 20:43 ` Dmitry Gutov
2 siblings, 0 replies; 147+ messages in thread
From: João Távora @ 2023-09-07 19:19 UTC (permalink / raw)
To: Felician Nemeth
Cc: emacs-devel, Eli Zaretskii, Philip K., Dmitry Gutov,
Stefan Monnier
[-- Attachment #1: Type: text/plain, Size: 410 bytes --]
On Thu, Sep 7, 2023, 20:06 Felician Nemeth <felician.nemeth@gmail.com>
wrote:
> I'm lacking the basics here, so sorry to butt in, but ...
>
> >> 'diff-apply-everything'
>
> How would a user undo such an operation in case of a multi-file edit?
> Does the undo system support this?
>
No, but someone suggested reversing the diff and applying again. It's not
really undo, but decent.
João
>
[-- Attachment #2: Type: text/html, Size: 999 bytes --]
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 19:06 ` Felician Nemeth
2023-09-07 19:19 ` João Távora
@ 2023-09-07 19:25 ` Ihor Radchenko
2023-09-07 19:28 ` Ihor Radchenko
2023-09-07 20:43 ` Dmitry Gutov
2 siblings, 1 reply; 147+ messages in thread
From: Ihor Radchenko @ 2023-09-07 19:25 UTC (permalink / raw)
To: Felician Nemeth
Cc: emacs-devel, João Távora, Eli Zaretskii, Philip K.,
Dmitry Gutov, Stefan Monnier
Felician Nemeth <felician.nemeth@gmail.com> writes:
> I'm lacking the basics here, so sorry to butt in, but ...
>
>>> 'diff-apply-everything'
>
> How would a user undo such an operation in case of a multi-file edit?
> Does the undo system support this?
No, but it is still possible. We do multi-file undo in Org agenda via
`org-with-remote-undo'.
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 19:25 ` Ihor Radchenko
@ 2023-09-07 19:28 ` Ihor Radchenko
2023-09-07 22:14 ` João Távora
0 siblings, 1 reply; 147+ messages in thread
From: Ihor Radchenko @ 2023-09-07 19:28 UTC (permalink / raw)
To: Felician Nemeth
Cc: emacs-devel, João Távora, Eli Zaretskii, Philip K.,
Dmitry Gutov, Stefan Monnier
Ihor Radchenko <yantar92@posteo.net> writes:
>> How would a user undo such an operation in case of a multi-file edit?
>> Does the undo system support this?
Actually, it might be possible:
In `buffer-undo-list', one entry type is
An entry (apply FUN-NAME . ARGS) means undo the change with
(apply FUN-NAME ARGS).
An entry (apply DELTA BEG END FUN-NAME . ARGS) supports selective undo
in the active region. BEG and END is the range affected by this entry
and DELTA is the number of characters added or deleted in that range by
this change.
This can be used to do anything for undo, including editing other files.
> No, but it is still possible. We do multi-file undo in Org agenda via
> `org-with-remote-undo'.
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 16:20 ` Stefan Monnier
2023-09-07 16:49 ` João Távora
@ 2023-09-07 20:41 ` Dmitry Gutov
2023-09-07 22:03 ` Stefan Monnier
2023-09-07 22:18 ` João Távora
2 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-07 20:41 UTC (permalink / raw)
To: Stefan Monnier, João Távora
Cc: Eli Zaretskii, Philip K., emacs-devel
On 07/09/2023 19:20, Stefan Monnier wrote:
>> Also, it would be very good if we could have an early backend which is
>> *not* LSP. An obvious candidate is Elisp. I'd like to know what is
>> the minimal effort to write a lisp function based on the new
>> macroexpanding tricks that Stefan Monnier developed that says
>> precisely where a given symbol is used as a variable in a function.
>> As far as I understand, these techniques are currently being used for
>> accurate completion, but they could maybe be used for accurate
>> refactorings.
>
> Hmm... the `elisp--local-variables` functionality (beside the
> associated security issues and occasional errors) provides only
> a (somewhat) reliable list of variables that are in-scope. So it could
> potentially be extended to offer a way to jump to the declaration of
> a local variable from a reference to it, but it doesn't know how to find
> all (and only) the references to a given variable.
>
> We could extend it to a full code-walker that can distinguish between
> identifiers that refer to functions vs variables and which skips "data"
> and obeys scope, and thus collect reliably all the references.
> But `cconv-analyze-form` is probably a better starting point :-)
I think the Helpful packages used some of the approach. Though I'm not
sure how precise/thorough it is, and combining the outputs of
xref-find-references and elisp--local-variables is likely to be faster.
As a first/initial implementation anyway.
If we're only talking about 'rename', at least.
>>> but that's already taken in diff-mode.
>
> I don't think the current `C-c C-c` binding in `diff-mode` should get in
> the way. That command is available via different bindings already, and
diff-apply-everything is a little destructive, though (there is no
'undo' across multiple files), so maybe a warning could help. Or make it
an initially-disabled command, for example.
> this is a specific use of diff-mode where `diff-apply-everything` makes
> a lot of sense (as opposed to `C-x v =` where the changes are usually
> already applied anyway so `diff-apply-everything` is rarely what we want).
So... the binding wouldn't be used in "regular" Diff buffers, it it just
would stop with a "hunk already applied" message? If it's the former,
we'd need to distinguish the "refactoring diff" buffers by look somehow.
>>> - 'git diff' has a less-frequently used option called '--word-diff'
>>> which could reduce the length of the diff in the case I am testing (but
>>> I guess diff-mode would have to be updated to support that output). And
>>> another way in that direction would be to reduce the size of the diff
>>> context (e.g. to 0).
>
> [ Side note: we could also extend diff-mode to do such "rewrite" inside
> Emacs. Hiding some of the context should be fairly easy, for example.
> Also I've often wished for `diff-refine-hunk` to try and interlace
> the lines so as to minimize the distance between the "before" and
> "after" lines. ]
Interesting.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 19:06 ` Felician Nemeth
2023-09-07 19:19 ` João Távora
2023-09-07 19:25 ` Ihor Radchenko
@ 2023-09-07 20:43 ` Dmitry Gutov
2 siblings, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-07 20:43 UTC (permalink / raw)
To: Felician Nemeth, emacs-devel
Cc: João Távora, Eli Zaretskii, Philip K., Stefan Monnier
On 07/09/2023 22:06, Felician Nemeth wrote:
> I'm lacking the basics here, so sorry to butt in, but ...
>
>>> 'diff-apply-everything'
> How would a user undo such an operation in case of a multi-file edit?
> Does the undo system support this?
'C-u C-c C-c', if we're only talking about the interface.
As others have pointed out, the function could also save the list of
affected buffers and undo points in them.
Finally, it might make sense to offer an option to undo the whole
changeset if somewhere in the middle a hunk fails to apply (because
that's a situation that can be difficult to fix otherwise).
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 18:12 ` João Távora
@ 2023-09-07 21:56 ` Stefan Monnier
0 siblings, 0 replies; 147+ messages in thread
From: Stefan Monnier @ 2023-09-07 21:56 UTC (permalink / raw)
To: João Távora; +Cc: Eli Zaretskii, Philip K., Dmitry Gutov, emacs-devel
> Making different things 'eq' is a possibility, but won't it
> slow down 'eq'?
No need to use the future tense: if you're using a recent enough Emacs
your `eq` is slowed down by this already.
> I didn't say it was :-) I just meant cases like this (this is the
> simplest one)
>
> (defun foo () bar bar baz)
>
> Only the first bar and the baz gets the warning.
AFAIK this is done on purpose to avoid repeating the same warnings over
and over again. If you want them all, it should be easy to tweak the
compiler to stop silencing the non-first ones.
Stefan
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 20:41 ` Dmitry Gutov
@ 2023-09-07 22:03 ` Stefan Monnier
2023-09-07 22:43 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: Stefan Monnier @ 2023-09-07 22:03 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: João Távora, Eli Zaretskii, Philip K., emacs-devel
>>>> but that's already taken in diff-mode.
>> I don't think the current `C-c C-c` binding in `diff-mode` should get in
>> the way. That command is available via different bindings already, and
> diff-apply-everything is a little destructive, though (there is no 'undo'
> across multiple files), so maybe a warning could help. Or make it an
> initially-disabled command, for example.
But in the context of a refactoring operation, it wouldn't make sense to
disable it.
>> this is a specific use of diff-mode where `diff-apply-everything` makes
>> a lot of sense (as opposed to `C-x v =` where the changes are usually
>> already applied anyway so `diff-apply-everything` is rarely what we want).
> So... the binding wouldn't be used in "regular" Diff buffers,
That's indeed a possible option (e.g. use a mode that's derived from
`diff-mode` but with a different `C-c C-c` binding, or activate
a special "refactoring minor mode" to provide that binding).
Stefan
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 19:28 ` Ihor Radchenko
@ 2023-09-07 22:14 ` João Távora
0 siblings, 0 replies; 147+ messages in thread
From: João Távora @ 2023-09-07 22:14 UTC (permalink / raw)
To: Ihor Radchenko
Cc: Felician Nemeth, emacs-devel, Eli Zaretskii, Philip K.,
Dmitry Gutov, Stefan Monnier
On Thu, Sep 7, 2023 at 8:27 PM Ihor Radchenko <yantar92@posteo.net> wrote:
>
> Ihor Radchenko <yantar92@posteo.net> writes:
>
> >> How would a user undo such an operation in case of a multi-file edit?
> >> Does the undo system support this?
>
> Actually, it might be possible:
>
> In `buffer-undo-list', one entry type is
>
> An entry (apply FUN-NAME . ARGS) means undo the change with
> (apply FUN-NAME ARGS).
>
> An entry (apply DELTA BEG END FUN-NAME . ARGS) supports selective undo
> in the active region. BEG and END is the range affected by this entry
> and DELTA is the number of characters added or deleted in that range by
> this change.
>
> This can be used to do anything for undo, including editing other files.
In which of the buffer-undo-list's of changed buffers would you place
the entry? And how would you handle redo, if at all? Hurts my brain
just to think about it, but I'd love to see a demo.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 16:20 ` Stefan Monnier
2023-09-07 16:49 ` João Távora
2023-09-07 20:41 ` Dmitry Gutov
@ 2023-09-07 22:18 ` João Távora
2023-09-07 22:39 ` Dmitry Gutov
2 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-07 22:18 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Eli Zaretskii, Philip K., Dmitry Gutov, emacs-devel
On Thu, Sep 7, 2023 at 5:20 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> >> but that's already taken in diff-mode.
>
> I don't think the current `C-c C-c` binding in `diff-mode` should get in
> the way. That command is available via different bindings already, and
I didn't notice this suggestion earlier. Please, let's not do this.
C-c C-c is "go to place mentioned in this hunk". It must not apply anything,
I have it most hardwired in my brain.
IOW, I see a diff about my code, I don't care if it was LSP or git or someone's
patch, I want the same interface always.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 22:18 ` João Távora
@ 2023-09-07 22:39 ` Dmitry Gutov
2023-09-08 6:18 ` Eli Zaretskii
2023-09-08 6:55 ` João Távora
0 siblings, 2 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-07 22:39 UTC (permalink / raw)
To: João Távora, Stefan Monnier
Cc: Eli Zaretskii, Philip K., emacs-devel
On 08/09/2023 01:18, João Távora wrote:
> On Thu, Sep 7, 2023 at 5:20 PM Stefan Monnier<monnier@iro.umontreal.ca> wrote:
>
>>>> but that's already taken in diff-mode.
>> I don't think the current `C-c C-c` binding in `diff-mode` should get in
>> the way. That command is available via different bindings already, and
> I didn't notice this suggestion earlier. Please, let's not do this.
> C-c C-c is "go to place mentioned in this hunk". It must not apply anything,
> I have it most hardwired in my brain.
Really? For me it's more like "finish this commit" or "send this email".
Or perhaps "kill process", which is somewhat close enough.
I'm not married to the particular key sequence, but it does have
precedent in other parts of Emacs. And there aren't too many great
alternatives.
> IOW, I see a diff about my code, I don't care if it was LSP or git or someone's
> patch, I want the same interface always.
diff-apply-everything could work with "someone's patches" just as well.
That's actually a reason to just add it to diff-mode.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 14:39 ` João Távora
2023-09-07 16:20 ` Stefan Monnier
2023-09-07 19:06 ` Felician Nemeth
@ 2023-09-07 22:39 ` Dmitry Gutov
2023-09-08 11:10 ` João Távora
2023-09-08 12:46 ` Eshel Yaron
3 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-07 22:39 UTC (permalink / raw)
To: João Távora, Eli Zaretskii, Philip K., Stefan Monnier
Cc: emacs-devel
On 07/09/2023 17:39, João Távora wrote:
> On Thu, Sep 7, 2023 at 2:00 AM Dmitry Gutov <dmitry@gutov.dev> wrote:
>>
>> On 02/09/2023 12:55, João Távora wrote:
>>> Anyway I invite everyone to have a look and try to improve it, perhaps
>>> moving it out of Eglot into the shiny new "refactoring interface" if
>>> those ever become a thing.
>>
>> Regarding the diff approach vs. "shiny new", I've run a little
>> comparison with VS Code: doing a rename of 'glyph_row' across the Emacs
>> codebase (a moderately sized project) takes about ~1.44s to produce the
>> diff.
>
> FWIW, I got 0.85s on that same test on a GNU/Linux VM running on a 6
> yo laptop with 4 cores assigned. IMO this is more than acceptable for
> this contrived example which renames a symbol across many files.
Not that many: these are 260 edits just across 3 files.
And I see nothing contrived about such an example. There exist much
bigger projects anyway, which we should ideally support well too.
> A much more typical example of renaming a symbol in a single function
> resolved in 0.02s. Most examples of applying quick fixes and moving
> .hpp inlined member functions to out-of-line in .cpp resolve in similar
> quasi-instantaneous fashion.
That's great, but for such small examples one could almost do without
advanced interfaces too, couldn't they?
> Now, let me clarify what I meant by "shiny new refactoring interface".
> It's not what you think I meant, I believe. What I meant is a framework
> for:
>
> 1. collecting 'potential sets of changes' -- for clarity let's call
> "actions" after LSP nomenclature -- from a number of different
> backends. Examples of actions: "rename thing at point", "organize
> imports", "write as while loops as cl-loop"
>
> 2. presenting actions names to the user -- either via the minibuffer
> or by annotating buffer position where these tweaks apply.
These could be split into two:
- A hook which would return the available actions at point. This seems
to be the primary mode of operations of LSP editors: first you choose
the location, and then find out which which operations apply to it.
- Some way (possibly also a hook) to find all the "points of interest"
in a buffer -- these could also be annotated with a lightbulb or etc in
the margin or fringe. Not sure which place this has when using LSP
(perhaps some diagnostics with edits attached?), but I vaguely remember
being suggested lists of refactorings by IDEs I tried in the past (<10
years ago).
Aside from "renames", which would probably apply almost everywhere
(though e.g. clangd doesn't know how to rename macros; I wonder at what
step that we would indicate that to the user).
> 3. after the user chooses an action, develop it into a set of changes
> -- again, for clarity and consonance with LSP nomenclature, we
> may call these "edits".
Sure. Possibly carrying more-or-less same information that LSP's edits
do. Though we could see whether it can be useful to annotate them with
additional info, e.g. name/type/etc (where we'd deduce that a function
called X is being renamed, or a file is being moved, or both; which
could be reflects in the changeset's display more intelligently).
> 4. presenting these edits to the user via a number of different
> user-confirmation strategies.
>
> For very common "rename" or "organize imports" actions, steps 1
> and 2 may be coalesced and a special command may be provided that
> goes directly to step 3. LSP supports these "shortcuts".
Sure. I wouldn't know what position "organize imports" should apply to
anyway. But to do with backends which don't support it?
> Regarding 4 (which seems to be the current focal point of the
> discussion) Eglot has three main types of confirmation strategies
> available. See eglot-confirm-server-edits for more.
>
> * 'diff', which just presents the edits
> * 'summary', which summarizes the edits in the minibuffer and prompts
> to apply.
> * nil, which means no confirmation at all
>
> There is also 'maybe-diff' and 'maybe-summary' which behave like
> nil if all the files in the change list are already visited buffers.
Not sure why the cutoff is there: and not for example "if all the
changes are in the current file", or "are all visible on the screen".
Anyway, the more the merrier, I suppose.
> That said, it's the whole sequence 1 to 4, not just 4, that needs
> to be generalized out of Eglot and into Emacs. Note that some parts
> of 1..4, like the annotation of actions in buffers or the support for
> file creation and deletion, aren't yet in Eglot, so there's good work
> to be done. Some of the "annotation" logic already exists in Flymake,
> and Flymake must be taken into the equation too, and early.
The reason for talking about 4 first is twofold:
- I understand 4 better than the rest at this point of time, and it
could be plugged into some existing bits of functionality already (e.g.
Eglot's refactorings and Xref/Project names).
- There will likely be two entry points to the new library, just like
with Xref we have xref-backend-functions and xref-show-xrefs. The former
depends on the latter. By choosing a good enough data model for step 4
(e.g. how changes are represented), we can better build requirements for
step 1, given that whatever hook(s) we add, they would already need to
be documented with the details about the data in/out flow.
> Also, it would be very good if we could have an early backend which is
> *not* LSP. An obvious candidate is Elisp. I'd like to know what is
> the minimal effort to write a lisp function based on the new
> macroexpanding tricks that Stefan Monnier developed that says
> precisely where a given symbol is used as a variable in a function.
> As far as I understand, these techniques are currently being used for
> accurate completion, but they could maybe be used for accurate
> refactorings.
Xref could easily be an early backend which supports renaming only.
Eglisp's xref-backend-references could make use of the macroexpanding
thing to include local variables too.
>> Not to belittle the new addition, though - it's a good step for Eglot.
>
> As someone who actually uses Eglot daily and is an avid consumer
> of refactoring functionality, my opinion is that the "diff"
> confirmation strategy that Philip proposed and implemented is freaking
> great, even if the implementation is a bit contorted (though mostly
> isolated).
>
> IMO diff is the lingua franca for communicating changes to source
> code around the world, even in those pretty web interfaces that
> you and many others like. So it makes full sense to support it
> and to support it well.
I'm okay with diffs myself obviously, and we should keep this UI option
if feasible, but I'd also prefer to have something more compact
available, for the "web interface lovers" of the world. Diffs do have
some barrier to understanding, even we are very much used to them. And
diff-with-context can be pretty long too.
>> - I would probably want to bind the originally proposed
>> 'diff-apply-everything' to 'C-c C-c' (e.g. "commit the change to disk"),
>> but that's already taken in diff-mode.
>
>> - 'git diff' has a less-frequently used option called '--word-diff'
>> which could reduce the length of the diff in the case I am testing (but
>> I guess diff-mode would have to be updated to support that output). And
>> another way in that direction would be to reduce the size of the diff
>> context (e.g. to 0).
>
> I'm not at all opposed to implementing other confirmation strategies
> that look more like what VSCode or other editors show users. Or
> augmenting the existing 'diff' strategy with new shortcuts and stuff.
> But I wouldn't overthink UI details at this point in the game either.
The first suggestion in particular looked like a modest enough tweak
that does not depend on the rest of this discussion (and it would likely
have a diff-specific implementation). But if we try to make it atomic,
that's an increase in complexity, of course.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 22:03 ` Stefan Monnier
@ 2023-09-07 22:43 ` Dmitry Gutov
0 siblings, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-07 22:43 UTC (permalink / raw)
To: Stefan Monnier
Cc: João Távora, Eli Zaretskii, Philip K., emacs-devel
On 08/09/2023 01:03, Stefan Monnier wrote:
>>>>> but that's already taken in diff-mode.
>>> I don't think the current `C-c C-c` binding in `diff-mode` should get in
>>> the way. That command is available via different bindings already, and
>> diff-apply-everything is a little destructive, though (there is no 'undo'
>> across multiple files), so maybe a warning could help. Or make it an
>> initially-disabled command, for example.
> But in the context of a refactoring operation, it wouldn't make sense to
> disable it.
We would if we keep the same major mode. And if we decide that it's
dangerous to set off accidentally.
>>> this is a specific use of diff-mode where `diff-apply-everything` makes
>>> a lot of sense (as opposed to `C-x v =` where the changes are usually
>>> already applied anyway so `diff-apply-everything` is rarely what we want).
>> So... the binding wouldn't be used in "regular" Diff buffers,
> That's indeed a possible option (e.g. use a mode that's derived from
> `diff-mode` but with a different `C-c C-c` binding, or activate
> a special "refactoring minor mode" to provide that binding).
But it would have to look different from diff-mode somehow, I suppose?
Or is having a different buffer name good enough?
Anyway, the same command would probably be useful when applying patches
received from others as well. So perhaps we should just always have it
available in diff-mode.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 17:06 ` Stefan Monnier
2023-09-07 17:24 ` João Távora
@ 2023-09-07 23:46 ` Lynn Winebarger
1 sibling, 0 replies; 147+ messages in thread
From: Lynn Winebarger @ 2023-09-07 23:46 UTC (permalink / raw)
To: Stefan Monnier
Cc: João Távora, Eli Zaretskii, Philip K., Dmitry Gutov,
emacs-devel
On Thu, Sep 7, 2023 at 1:08 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>
> >> Going back from there to the actual source code can be a fair bit more
> >> tricky,
> > Exactly.
> >> but Alan's symbols-with-positions should provide just what we need.
> > Great! but how?
> > Some years ago I presented a full source-tracking reader for Common Lisp
> > with just Lisp to a conference ;-) Needs a programmable reader though :-(
> > As you may remember, I then paired it with a full code walker to create
> > a stepper.
>
> We do have a "full source-tracking reader" writen in ELisp inside `edebug.el`.
> It's not 100% faithful to `lread.c`, but it seems to work well enough
> that we haven't heard too many bug reports about it over the years.
>
> Still, can't be used with `cconv` because the the "sexp with
> source-tracking info" don't have the shape expected by macros.
I have a package "rewriting-pcase" which contains the code I use to
textually rewrite some very specific, small sexps in packages so the
data files and subdirectories do not have to be located in a
particular location relative to the source library. The text is
rewritten to avoid dramatic changes in the formatting of the original
code, but it only works because the sexp patterns are not complicated,
and the replacement sexps are atoms.
To expand the functionality to be true to its name, I was planning to
augment the wrap the reader with an elisp function to create
"syntax-objects" (as they are called in Scheme macro expanders) that
augment the data produced by the reader with various metadata,
including things like source file, line number, position, as well as
lexical information for expansion hygiene. For rewriting-pcase, I'd
also track comments that should "attach" to the syntactic construct so
comments would move around with the code they describe when that code
is substituted while rewriting.
"symbol-with-position" appears to just be a handle on a symbol with a
position. Would it be acceptable to change this to a more generic
syntax-object, then factor the reader into an enhanced reader that
produces syntax-objects, and provide the traditional read function as
a wrapper that discards the syntax? Is the existence of position
information relied on in many places in the code? I would think those
places could use the syntax-object-producing version of the reader.
My current approach is to recursively use the reader to deduce the
required syntactic information, but in addition to being expensive,
it's also unreliable in many cases that seem like they would be corner
cases but do occur in the wild, where the same datum can be
represented in multiple ways and are tricky to navigate with the usual
syntax-traversing functions used in working with elisp buffers.
Lynn
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 22:39 ` Dmitry Gutov
@ 2023-09-08 6:18 ` Eli Zaretskii
2023-09-08 18:25 ` Dmitry Gutov
2023-09-08 6:55 ` João Távora
1 sibling, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-08 6:18 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: joaotavora, monnier, philipk, emacs-devel
> Date: Fri, 8 Sep 2023 01:39:43 +0300
> Cc: Eli Zaretskii <eliz@gnu.org>, "Philip K." <philipk@posteo.net>,
> emacs-devel@gnu.org
> From: Dmitry Gutov <dmitry@gutov.dev>
>
> On 08/09/2023 01:18, João Távora wrote:
> > On Thu, Sep 7, 2023 at 5:20 PM Stefan Monnier<monnier@iro.umontreal.ca> wrote:
> >
> >>>> but that's already taken in diff-mode.
> >> I don't think the current `C-c C-c` binding in `diff-mode` should get in
> >> the way. That command is available via different bindings already, and
> > I didn't notice this suggestion earlier. Please, let's not do this.
> > C-c C-c is "go to place mentioned in this hunk". It must not apply anything,
> > I have it most hardwired in my brain.
>
> Really? For me it's more like "finish this commit" or "send this email".
> Or perhaps "kill process", which is somewhat close enough.
"C-c C-c" in Emacs generally means "I'm done editing/typing input,
proceed with what needs to be done to complete this transaction".
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 22:39 ` Dmitry Gutov
2023-09-08 6:18 ` Eli Zaretskii
@ 2023-09-08 6:55 ` João Távora
2023-09-08 15:42 ` Stefan Monnier
1 sibling, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-08 6:55 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Stefan Monnier, Eli Zaretskii, Philip K., emacs-devel
On Thu, Sep 7, 2023 at 11:39 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
> > C-c C-c is "go to place mentioned in this hunk". It must not apply anything,
> > I have it most hardwired in my brain.
>
> Really?
Yes, really.
> For me it's more like "finish this commit" or "send this email".
That too of course. But these are other modes, no?
> > IOW, I see a diff about my code, I don't care if it was LSP or git or someone's
> > patch, I want the same interface always.
>
> diff-apply-everything could work with "someone's patches" just as well.
> That's actually a reason to just add it to diff-mode.
I never said there wasn't. But don't touch C-c C-c please.
João Távora
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 22:39 ` Dmitry Gutov
@ 2023-09-08 11:10 ` João Távora
2023-09-08 22:35 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-08 11:10 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Eli Zaretskii, Philip K., Stefan Monnier, emacs-devel
On Thu, Sep 7, 2023 at 11:39 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
> Not that many: these are 260 edits just across 3 files.
glyph_row? As in 'struct glyph_row' of src/dispextern.h? My clangd
suggested changes to 7 files. Maybe not contrived but certainly
not common either, and well worth the subsecond latency considering
the time you'd want to spend reviewing such a mammoth change.
> > A much more typical example of renaming ab symbol in a single function
> > resolved in 0.02s. Most examples of applying quick fixes and moving
> > .hpp inlined member functions to out-of-line in .cpp resolve in similar
> > quasi-instantaneous fashion.
>
> That's great, but for such small examples one could almost do without
> advanced interfaces too, couldn't they?
For local renames, yes, which is precisely why the reason why eglot-rename
has a special 'maybe-summary' confirmation method (I use maybe-diff)
whose point is to skips the confirmation if it detects the change to be "local
enough"
For others, like extracting methods, etc, not at all. They may be
simple, but you generally still want to have a look at what's being
especially if it targets on or
> > Now, let me clarify what I meant by "shiny new refactoring interface".
> > It's not what you think I meant, I believe. What I meant is a framework
> > for:
> >
> > 1. collecting 'potential sets of changes' -- for clarity let's call
> > "actions" after LSP nomenclature -- from a number of different
> > backends. Examples of actions: "rename thing at point", "organize
> > imports", "write as while loops as cl-loop"
> >
> > 2. presenting actions names to the user -- either via the minibuffer
> > or by annotating buffer position where these tweaks apply.
> - Some way (possibly also a hook) to find all the "points of interest"
> in a buffer -- these could also be annotated with a lightbulb or etc in
That's what I meant yes "annotate". But I'd leave the annotation
interface to a second phase. As you note, it's not obvious when to collect
these actions with special affinity to buffer positions . In LSP, some of
them are already being collected because of diagnostics.
Flymake is the main existing Emacs interface that periodically annotates
the buffer with pieces of information about your code gotten from a server.
It knows how to display things in the fringe, and is fairly customizable.
You can have multiple backends, etc, it works asynchronously and generally
has a lot of common logic for knowing how to update only parts of the
buffer etc.
It could be argued we should use it for this purpose, but then again, it
could be argued we shouldn't, especially if we suspect equating "localized
actions" to diagnostics is simply wrong. This feature request came up in the
past in the Eglot tracker and I gave it a go once or twice with Flymake.
But maybe I just didn't try hard enough.
> Sure. Possibly carrying more-or-less same information that LSP's edits
> do. Though we could see whether it can be useful to annotate them with
> additional info, e.g. name/type/etc (where we'd deduce that a function
> called X is being renamed, or a file is being moved, or both; which
> could be reflects in the changeset's display more intelligently).
That's not a bad idea, but is an implementation detail. We
should probably not expose this representation (at least not too early)
to conserve the freedom to change it.
> Sure. I wouldn't know what position "organize imports" should apply to
> anyway. But to do with backends which don't support it?
Maybe at least one of the backends will support it. Else issue an
error, that's not much more I can see. Some backends may
not even support rename. It's not like in xref where "find definitions"
and "find references" which are things that almost all xref backends
would be able to do.
> > Regarding 4 (which seems to be the current focal point of the
> > discussion) Eglot has three main types of confirmation strategies
> > available. See eglot-confirm-server-edits for more.
> >
> > * 'diff', which just presents the edits
> > * 'summary', which summarizes the edits in the minibuffer and prompts
> > to apply.
> > * nil, which means no confirmation at all
> >
> > There is also 'maybe-diff' and 'maybe-summary' which behave like
> > nil if all the files in the change list are already visited buffers.
>
> Not sure why the cutoff is there: and not for example "if all the
> changes are in the current file", or "are all visible on the screen".
>
> Anyway, the more the merrier, I suppose.
>
> > That said, it's the whole sequence 1 to 4, not just 4, that needs
> > to be generalized out of Eglot and into Emacs. Note that some parts
> > of 1..4, like the annotation of actions in buffers or the support for
> > file creation and deletion, aren't yet in Eglot, so there's good work
> > to be done. Some of the "annotation" logic already exists in Flymake,
> > and Flymake must be taken into the equation too, and early.
>
> The reason for talking about 4 first is twofold:
>
> - I understand 4 better than the rest at this point of time, and it
> could be plugged into some existing bits of functionality already (e.g.
> Eglot's refactorings and Xref/Project names).
>
> - There will likely be two entry points to the new library, just like
> with Xref we have xref-backend-functions and xref-show-xrefs. The former
> depends on the latter. By choosing a good enough data model for step 4
> (e.g. how changes are represented), we can better build requirements for
> step 1, given that whatever hook(s) we add, they would already need to
> be documented with the details about the data in/out flow.
>
> > Also, it would be very good if we could have an early backend which is
> > *not* LSP. An obvious candidate is Elisp. I'd like to know what is
> > the minimal effort to write a lisp function based on the new
> > macroexpanding tricks that Stefan Monnier developed that says
> > precisely where a given symbol is used as a variable in a function.
> > As far as I understand, these techniques are currently being used for
> > accurate completion, but they could maybe be used for accurate
> > refactorings.
>
> Xref could easily be an early backend which supports renaming only.
> Eglisp's xref-backend-references could make use of the macroexpanding
> thing to include local variables too.
>
> >> Not to belittle the new addition, though - it's a good step for Eglot.
> >
> > As someone who actually uses Eglot daily and is an avid consumer
> > of refactoring functionality, my opinion is that the "diff"
> > confirmation strategy that Philip proposed and implemented is freaking
> > great, even if the implementation is a bit contorted (though mostly
> > isolated).
> >
> > IMO diff is the lingua franca for communicating changes to source
> > code around the world, even in those pretty web interfaces that
> > you and many others like. So it makes full sense to support it
> > and to support it well.
>
> I'm okay with diffs myself obviously, and we should keep this UI option
> if feasible, but I'd also prefer to have something more compact
> available, for the "web interface lovers" of the world. Diffs do have
> some barrier to understanding, even we are very much used to them. And
> diff-with-context can be pretty long too.
>
> >> - I would probably want to bind the originally proposed
> >> 'diff-apply-everything' to 'C-c C-c' (e.g. "commit the change to disk"),
> >> but that's already taken in diff-mode.
> >
> >> - 'git diff' has a less-frequently used option called '--word-diff'
> >> which could reduce the length of the diff in the case I am testing (but
> >> I guess diff-mode would have to be updated to support that output). And
> >> another way in that direction would be to reduce the size of the diff
> >> context (e.g. to 0).
> >
> > I'm not at all opposed to implementing other confirmation strategies
> > that look more like what VSCode or other editors show users. Or
> > augmenting the existing 'diff' strategy with new shortcuts and stuff.
> > But I wouldn't overthink UI details at this point in the game either.
>
> The first suggestion in particular looked like a modest enough tweak
> that does not depend on the rest of this discussion (and it would likely
> have a diff-specific implementation). But if we try to make it atomic,
> that's an increase in complexity, of course.
--
João Távora
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-07 14:39 ` João Távora
` (2 preceding siblings ...)
2023-09-07 22:39 ` Dmitry Gutov
@ 2023-09-08 12:46 ` Eshel Yaron
2023-09-08 12:52 ` João Távora
3 siblings, 1 reply; 147+ messages in thread
From: Eshel Yaron @ 2023-09-08 12:46 UTC (permalink / raw)
To: João Távora
Cc: Eli Zaretskii, Philip K., Dmitry Gutov, Stefan Monnier,
emacs-devel
João Távora <joaotavora@gmail.com> writes:
> Also, it would be very good if we could have an early backend which is
> *not* LSP. An obvious candidate is Elisp.
FWIW, I think `sweeprolog`, my NonGNU ELPA package for SWI-Prolog can
also a good non-LSP backend. Elisp would be perfect, no doubt.
But `sweeprolog` is interesting because it does a lot of code analysis
that's useful for refactoring. Namely it provides precise project-wide
cross-reference data that can be used for renaming predicates. Renaming
local variables is already implemented, with a simple UI: you type `C-c
C-r`, it prompts you for a variable to rename in the current clause
(with completion), you hit `RET` to choose the variable at point, you
insert a new name, and it renames the variable at once. That's alright
for renaming local variables, but it would be great to simply plug in to
a generic refactoring UI.
So I can probably try and implement any "refactoring backend functions"
the new refactoring interface includes, and see how it goes.
Best,
Eshel
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 12:46 ` Eshel Yaron
@ 2023-09-08 12:52 ` João Távora
2023-09-08 13:18 ` Eshel Yaron
2023-09-08 13:30 ` [semi off topic] grep-based refactoring [was: Adding refactoring capabilities to Emacs] tomas
0 siblings, 2 replies; 147+ messages in thread
From: João Távora @ 2023-09-08 12:52 UTC (permalink / raw)
To: Eshel Yaron
Cc: Eli Zaretskii, Philip K., Dmitry Gutov, Stefan Monnier,
emacs-devel
On Fri, Sep 8, 2023 at 1:46 PM Eshel Yaron <me@eshelyaron.com> wrote:
>
> João Távora <joaotavora@gmail.com> writes:
>
> > Also, it would be very good if we could have an early backend which is
> > *not* LSP. An obvious candidate is Elisp.
>
> FWIW, I think `sweeprolog`, my NonGNU ELPA package for SWI-Prolog can
> also a good non-LSP backend. Elisp would be perfect, no doubt.
> But `sweeprolog` is interesting because it does a lot of code analysi
[...]
> insert a new name, and it renames the variable at once. That's alright
> for renaming local variables, but it would be great to simply plug in to
> a generic refactoring UI.
Great. Precise project-wide analysis (as opposed to more-or-less dumb
grep-based) is exactly the main thing we should be targeting IMO.
Is "rename" the only thing it does or can you, say, extract subexpressions
to variables, organize imports, etc?
> So I can probably try and implement any "refactoring backend functions"
> the new refactoring interface includes, and see how it goes.
Sounds like a plan!
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 12:52 ` João Távora
@ 2023-09-08 13:18 ` Eshel Yaron
2023-10-01 15:07 ` Extract to new definition (was: Adding refactoring capabilities to Emacs) Eshel Yaron
2023-09-08 13:30 ` [semi off topic] grep-based refactoring [was: Adding refactoring capabilities to Emacs] tomas
1 sibling, 1 reply; 147+ messages in thread
From: Eshel Yaron @ 2023-09-08 13:18 UTC (permalink / raw)
To: João Távora
Cc: Eli Zaretskii, Philip K., Dmitry Gutov, Stefan Monnier,
emacs-devel
João Távora <joaotavora@gmail.com> writes:
>> > Also, it would be very good if we could have an early backend which is
>> > *not* LSP. An obvious candidate is Elisp.
>>
>> FWIW, I think `sweeprolog`, my NonGNU ELPA package for SWI-Prolog can
>> also a good non-LSP backend. Elisp would be perfect, no doubt.
>> But `sweeprolog` is interesting because it does a lot of code analysi
> [...]
>> insert a new name, and it renames the variable at once. That's alright
>> for renaming local variables, but it would be great to simply plug in to
>> a generic refactoring UI.
>
> Great. Precise project-wide analysis (as opposed to more-or-less dumb
> grep-based) is exactly the main thing we should be targeting IMO.
> Is "rename" the only thing it does or can you, say, extract subexpressions
> to variables, organize imports, etc?
Yes, there are some other things already in place, like updating imports
and adding exports. I have a work-in-progress implementation for
extracting subexpressions (subterms, in Prolog), but nothing in terms of
existing commands. A relevant feature that's already in place is
creating a definition for an undefined predicate at point. Its relevant
because I had to consider where to put this new definition, which
applies also to extracting subexpressions. Currently there's a user
option that controls where to put new definitions, by default it's right
below the predicate at point (the one that references the new predicate).
^ permalink raw reply [flat|nested] 147+ messages in thread
* [semi off topic] grep-based refactoring [was: Adding refactoring capabilities to Emacs]
2023-09-08 12:52 ` João Távora
2023-09-08 13:18 ` Eshel Yaron
@ 2023-09-08 13:30 ` tomas
2023-09-08 17:53 ` João Távora
1 sibling, 1 reply; 147+ messages in thread
From: tomas @ 2023-09-08 13:30 UTC (permalink / raw)
To: emacs-devel
[-- Attachment #1: Type: text/plain, Size: 787 bytes --]
On Fri, Sep 08, 2023 at 01:52:53PM +0100, João Távora wrote:
[...]
> Great. Precise project-wide analysis (as opposed to more-or-less dumb
> grep-based) is exactly the main thing we should be targeting IMO.
> Is "rename" the only thing it does or can you, say, extract subexpressions
> to variables, organize imports, etc?
As someone who has done quite a bit of "grep based refactoring", one
observation: of course, this can only me made semi-manually. But then,
the process has found things for me a syntax based refactoring tool
wouldn't ever have, like a variable name's mention in a comment (or
docstring, or even more insidious: possibly temporarily un-commented
code!) where I went "oh, yes, I want to change that too".
Food for thought.
Cheers
--
t
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 6:55 ` João Távora
@ 2023-09-08 15:42 ` Stefan Monnier
2023-09-08 16:05 ` João Távora
0 siblings, 1 reply; 147+ messages in thread
From: Stefan Monnier @ 2023-09-08 15:42 UTC (permalink / raw)
To: João Távora; +Cc: Dmitry Gutov, Eli Zaretskii, Philip K., emacs-devel
>> > C-c C-c is "go to place mentioned in this hunk". It must not apply anything,
>> > I have it most hardwired in my brain.
>> Really?
> Yes, really.
Curious: I always use RET instead. I'm actually having a hard time
remembering/imagining how/why we ended up binding `C-c C-c` to
`diff-goto-source` in `diff-mode`.
>> For me it's more like "finish this commit" or "send this email".
> That too of course. But these are other modes, no?
To me the "show diff during refactoring" is a different situation from
cases like `vc-diff` or `C-x C-f foo.diff`: it's more like showing you
all the details of your order before you confirm that you really want to
do it.
>> diff-apply-everything could work with "someone's patches" just as well.
>> That's actually a reason to just add it to diff-mode.
> I never said there wasn't. But don't touch C-c C-c please.
Maybe we should start by removing that `C-c C-c` binding from
`diff-mode` (users like you who really like it can re-add it easily).
Stefan
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 15:42 ` Stefan Monnier
@ 2023-09-08 16:05 ` João Távora
2023-09-08 16:20 ` João Távora
2023-09-08 18:35 ` Dmitry Gutov
0 siblings, 2 replies; 147+ messages in thread
From: João Távora @ 2023-09-08 16:05 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Dmitry Gutov, Eli Zaretskii, Philip K., emacs-devel
On Fri, Sep 8, 2023 at 4:42 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>
> >> > C-c C-c is "go to place mentioned in this hunk". It must not apply anything,
> >> > I have it most hardwired in my brain.
> >> Really?
> > Yes, really.
>
> Curious: I always use RET instead.
> I'm actually having a hard time
> remembering/imagining how/why we ended up binding `C-c C-c` to
> `diff-goto-source` in `diff-mode`.
Seems some young hotshot added it back in the day
commit 610a6418564684d52f7490b8e00f92443abb3253
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Date: Sat Oct 9 23:52:39 1999 +0000
Initial revision, known outside of Emacs as version 1.8.
> >> For me it's more like "finish this commit" or "send this email".
> > That too of course. But these are other modes, no?
>
> To me the "show diff during refactoring" is a different situation from
> cases like `vc-diff` or `C-x C-f foo.diff`: it's more like showing you
> all the details of your order before you confirm that you really want to
> do it.
>
> >> diff-apply-everything could work with "someone's patches" just as well.
> >> That's actually a reason to just add it to diff-mode.
> > I never said there wasn't. But don't touch C-c C-c please.
>
> Maybe we should start by removing that `C-c C-c` binding from
> `diff-mode` (users like you who really like it can re-add it easily).
Strongly object to this. Remove a 20yo binding? Aren't there
really other alternatives?? Especially in a mode that's read only
much more often than not?
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 16:05 ` João Távora
@ 2023-09-08 16:20 ` João Távora
2023-09-25 23:11 ` Dmitry Gutov
2023-09-08 18:35 ` Dmitry Gutov
1 sibling, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-08 16:20 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Dmitry Gutov, Eli Zaretskii, Philip K., emacs-devel
On Fri, Sep 8, 2023 at 5:05 PM João Távora <joaotavora@gmail.com> wrote:
>
> On Fri, Sep 8, 2023 at 4:42 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> >
> > >> > C-c C-c is "go to place mentioned in this hunk". It must not apply anything,
> > >> > I have it most hardwired in my brain.
> > >> Really?
> > > Yes, really.
> >
> > Curious: I always use RET instead.
> > I'm actually having a hard time
> > remembering/imagining how/why we ended up binding `C-c C-c` to
> > `diff-goto-source` in `diff-mode`.
>
> Seems some young hotshot added it back in the day
More realistically, the reason may have been that
diff-mode isn't necessarily a read-only mode, and
so you need a command such as this which doesn't
imply modifying the buffer (RET is no good here).
There is also M-o and M-RET but these were (and
most importantly probably still are) harder to hit or
bind on some terminals.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [semi off topic] grep-based refactoring [was: Adding refactoring capabilities to Emacs]
2023-09-08 13:30 ` [semi off topic] grep-based refactoring [was: Adding refactoring capabilities to Emacs] tomas
@ 2023-09-08 17:53 ` João Távora
2023-09-08 18:24 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-08 17:53 UTC (permalink / raw)
To: tomas; +Cc: emacs-devel
On Fri, Sep 8, 2023 at 2:31 PM <tomas@tuxteam.de> wrote:
>
> On Fri, Sep 08, 2023 at 01:52:53PM +0100, João Távora wrote:
>
> [...]
>
> > Great. Precise project-wide analysis (as opposed to more-or-less dumb
> > grep-based) is exactly the main thing we should be targeting IMO.
> > Is "rename" the only thing it does or can you, say, extract subexpressions
> > to variables, organize imports, etc?
>
> As someone who has done quite a bit of "grep based refactoring", one
> observation: of course, this can only me made semi-manually. But then,
> the process has found things for me a syntax based refactoring tool
> wouldn't ever have,
Not sure about that. Clangd mentions this limitation specifically
in their web page, so they acknowledge it and possibly are looking
to fix it. It's not too wild to think that an LSP server might
to suggest additional edits beyond what it has from syntactic
analysis, who knows maybe even using language models or by using
a parser that understands doxygen or common types of documentation
systems using comments.
So the only thing we know for sure is that grep-based isn't enough.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [semi off topic] grep-based refactoring [was: Adding refactoring capabilities to Emacs]
2023-09-08 17:53 ` João Távora
@ 2023-09-08 18:24 ` Dmitry Gutov
2023-09-08 18:51 ` tomas
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-08 18:24 UTC (permalink / raw)
To: João Távora, tomas; +Cc: emacs-devel
On 08/09/2023 20:53, João Távora wrote:
> On Fri, Sep 8, 2023 at 2:31 PM<tomas@tuxteam.de> wrote:
>> On Fri, Sep 08, 2023 at 01:52:53PM +0100, João Távora wrote:
>>
>> [...]
>>
>>> Great. Precise project-wide analysis (as opposed to more-or-less dumb
>>> grep-based) is exactly the main thing we should be targeting IMO.
>>> Is "rename" the only thing it does or can you, say, extract subexpressions
>>> to variables, organize imports, etc?
>> As someone who has done quite a bit of "grep based refactoring", one
>> observation: of course, this can only me made semi-manually. But then,
>> the process has found things for me a syntax based refactoring tool
>> wouldn't ever have,
> Not sure about that. Clangd mentions this limitation specifically
> in their web page, so they acknowledge it and possibly are looking
> to fix it. It's not too wild to think that an LSP server might
> to suggest additional edits beyond what it has from syntactic
> analysis, who knows maybe even using language models or by using
> a parser that understands doxygen or common types of documentation
> systems using comments.
As long as the identifiers are referred to in the docstrings using the
proper markup. And they could also mention the same term in the
free-form text which one might want to see renamed.
> So the only thing we know for sure is that grep-based isn't enough.
Good thing we'll have access to both anyway.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 6:18 ` Eli Zaretskii
@ 2023-09-08 18:25 ` Dmitry Gutov
2023-09-08 18:35 ` João Távora
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-08 18:25 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: joaotavora, monnier, philipk, emacs-devel
On 08/09/2023 09:18, Eli Zaretskii wrote:
>> Date: Fri, 8 Sep 2023 01:39:43 +0300
>> Cc: Eli Zaretskii<eliz@gnu.org>, "Philip K."<philipk@posteo.net>,
>> emacs-devel@gnu.org
>> From: Dmitry Gutov<dmitry@gutov.dev>
>>
>> On 08/09/2023 01:18, João Távora wrote:
>>> On Thu, Sep 7, 2023 at 5:20 PM Stefan Monnier<monnier@iro.umontreal.ca> wrote:
>>>
>>>>>> but that's already taken in diff-mode.
>>>> I don't think the current `C-c C-c` binding in `diff-mode` should get in
>>>> the way. That command is available via different bindings already, and
>>> I didn't notice this suggestion earlier. Please, let's not do this.
>>> C-c C-c is "go to place mentioned in this hunk". It must not apply anything,
>>> I have it most hardwired in my brain.
>> Really? For me it's more like "finish this commit" or "send this email".
>> Or perhaps "kill process", which is somewhat close enough.
> "C-c C-c" in Emacs generally means "I'm done editing/typing input,
> proceed with what needs to be done to complete this transaction".
That seems to rhyme with my proposal. Except instead of "done editing"
it will be "done reviewing" (though some rare users might engage in
editing the diff as well).
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 16:05 ` João Távora
2023-09-08 16:20 ` João Távora
@ 2023-09-08 18:35 ` Dmitry Gutov
[not found] ` <CALDnm52Wtat24JFu=o6m_eJVamub+1H1BxNd5eELQ2j--7OetA@mail.gmail.com>
1 sibling, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-08 18:35 UTC (permalink / raw)
To: João Távora, Stefan Monnier
Cc: Eli Zaretskii, Philip K., emacs-devel
On 08/09/2023 19:05, João Távora wrote:
>>>> diff-apply-everything could work with "someone's patches" just as well.
>>>> That's actually a reason to just add it to diff-mode.
>>> I never said there wasn't. But don't touch C-c C-c please.
>> Maybe we should start by removing that `C-c C-c` binding from
>> `diff-mode` (users like you who really like it can re-add it easily).
> Strongly object to this. Remove a 20yo binding? Aren't there
> really other alternatives??
Obviously there are some, but can you suggest a good one?
Following the semantics of 'C-c C-c' of others modes can make the new
feature easier to use and discover too.
> Especially in a mode that's read only
> much more often than not?
When I simply visit a patch (which I might want to apply), it doesn't
open in read-only. Still, to visit the source I've always switched to
read-only and pressed RET too.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 18:25 ` Dmitry Gutov
@ 2023-09-08 18:35 ` João Távora
2023-09-08 18:38 ` Dmitry Gutov
2023-09-08 18:57 ` Eli Zaretskii
0 siblings, 2 replies; 147+ messages in thread
From: João Távora @ 2023-09-08 18:35 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Eli Zaretskii, monnier, philipk, emacs-devel
On Fri, Sep 8, 2023 at 7:25 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
> That seems to rhyme with my proposal. Except instead of "done editing"
> it will be "done reviewing" (though some rare users might engage in
> editing the diff as well).
It doesn't rhyme at all, unless you really twist your ears.
What's wrong with C-c RET, easily typed ad as C-c C-m? Or
just RET, for that matter?
Also why should a discussion on refactoring capabilities have
to kick off with the proposal for the destruction of one of
the most longstanding useful shortcuts in diff-mode?
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 18:35 ` João Távora
@ 2023-09-08 18:38 ` Dmitry Gutov
2023-09-08 18:44 ` João Távora
2023-09-08 18:57 ` Eli Zaretskii
1 sibling, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-08 18:38 UTC (permalink / raw)
To: João Távora; +Cc: Eli Zaretskii, monnier, philipk, emacs-devel
On 08/09/2023 21:35, João Távora wrote:
> On Fri, Sep 8, 2023 at 7:25 PM Dmitry Gutov<dmitry@gutov.dev> wrote:
>
>> That seems to rhyme with my proposal. Except instead of "done editing"
>> it will be "done reviewing" (though some rare users might engage in
>> editing the diff as well).
> It doesn't rhyme at all, unless you really twist your ears.
>
> What's wrong with C-c RET, easily typed ad as C-c C-m? Or
> just RET, for that matter?
RET is already taken. C-c RET is not as discoverable and doesn't match
any other mode.
> Also why should a discussion on refactoring capabilities have
> to kick off with the proposal for the destruction of one of
> the most longstanding useful shortcuts in diff-mode?
Because we have now a feature which uses diff-mode for confirming a
refactoring?
Anyway, I don't understand the strength of your reaction, but I'm not
going to push this.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 18:38 ` Dmitry Gutov
@ 2023-09-08 18:44 ` João Távora
2023-09-08 19:29 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-08 18:44 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Eli Zaretskii, monnier, philipk, emacs-devel
On Fri, Sep 8, 2023 at 7:38 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
> > What's wrong with C-c RET, easily typed ad as C-c C-m? Or
> > just RET, for that matter?
>
> RET is already taken.
So is C-c C-c !
> C-c RET is not as discoverable and doesn't match
> any other mode.
And how does "matching another mode" matter here as this is a
completely new command for applying all diff hunks? There aren't
any other modes to match!
> > Also why should a discussion on refactoring capabilities have
> > to kick off with the proposal for the destruction of one of
> > the most longstanding useful shortcuts in diff-mode?
>
> Because we have now a feature which uses diff-mode for confirming a
> refactoring?
A feature you don't use, right? In your new word-diff-based confirmation
mode, when it comes, feel free to bind C-c C-c there at will.
> Anyway, I don't understand the strength of your reaction,
It'd royally mess up my workflow, especially when using Emacs -Q
across versions.
> but I'm not going to push this.
Thanks.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [semi off topic] grep-based refactoring [was: Adding refactoring capabilities to Emacs]
2023-09-08 18:24 ` Dmitry Gutov
@ 2023-09-08 18:51 ` tomas
0 siblings, 0 replies; 147+ messages in thread
From: tomas @ 2023-09-08 18:51 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: João Távora, emacs-devel
[-- Attachment #1: Type: text/plain, Size: 1070 bytes --]
On Fri, Sep 08, 2023 at 09:24:12PM +0300, Dmitry Gutov wrote:
> On 08/09/2023 20:53, João Távora wrote:
> > On Fri, Sep 8, 2023 at 2:31 PM<tomas@tuxteam.de> wrote:
[identifiers in comments, etc.]
> > Not sure about that. Clangd mentions this limitation specifically
> > in their web page, so they acknowledge it and possibly are looking
> > to fix it. It's not too wild to think that an LSP server might
> > to suggest additional edits beyond what it has from syntactic
> > analysis, who knows maybe even using language models or by using
> > a parser that understands doxygen or common types of documentation
> > systems using comments.
>
> As long as the identifiers are referred to in the docstrings using the
> proper markup. And they could also mention the same term in the free-form
> text which one might want to see renamed.
>
> > So the only thing we know for sure is that grep-based isn't enough.
>
> Good thing we'll have access to both anyway.
And good thing in the first place that people are aware :-)
Cheers
--
t
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 18:35 ` João Távora
2023-09-08 18:38 ` Dmitry Gutov
@ 2023-09-08 18:57 ` Eli Zaretskii
2023-09-08 19:01 ` João Távora
1 sibling, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-08 18:57 UTC (permalink / raw)
To: João Távora; +Cc: dmitry, monnier, philipk, emacs-devel
> From: João Távora <joaotavora@gmail.com>
> Date: Fri, 8 Sep 2023 19:35:41 +0100
> Cc: Eli Zaretskii <eliz@gnu.org>, monnier@iro.umontreal.ca, philipk@posteo.net,
> emacs-devel@gnu.org
>
> On Fri, Sep 8, 2023 at 7:25 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
>
> > That seems to rhyme with my proposal. Except instead of "done editing"
> > it will be "done reviewing" (though some rare users might engage in
> > editing the diff as well).
>
> It doesn't rhyme at all, unless you really twist your ears.
Actually, yes, it does.
Mind you, I didn't say that we should rebind "C-c C-c" in diff-mode, I
just explained what we use that key sequence for in Emacs.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
[not found] ` <da4cb294-39eb-c4a1-a625-da5ee183170c@gutov.dev>
@ 2023-09-08 18:57 ` João Távora
0 siblings, 0 replies; 147+ messages in thread
From: João Távora @ 2023-09-08 18:57 UTC (permalink / raw)
To: Dmitry Gutov, emacs-devel
On Fri, Sep 8, 2023 at 7:46 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
>
> (This one arrived in private, BTW)
Thanks for noticing, hoping it's fine to re-add emacs-devel
> On 08/09/2023 21:39, João Távora wrote:
> > On Fri, Sep 8, 2023 at 7:35 PM Dmitry Gutov<dmitry@gutov.dev> wrote:
> >> On 08/09/2023 19:05, João Távora wrote:
> >>>>>> diff-apply-everything could work with "someone's patches" just as well.
> >>>>>> That's actually a reason to just add it to diff-mode.
> >>>>> I never said there wasn't. But don't touch C-c C-c please.
> >>>> Maybe we should start by removing that `C-c C-c` binding from
> >>>> `diff-mode` (users like you who really like it can re-add it easily).
> >>> Strongly object to this. Remove a 20yo binding? Aren't there
> >>> really other alternatives??
> >> Obviously there are some, but can you suggest a good one?
> > Just proposed C-c RET. C-c M-c is also good IMO, so many
> > good shortcuts.
> >
> >> Following the semantics of 'C-c C-c' of others modes can make the new
> >> feature easier to use and discover too.
> > It's not following any such "semantics", unless you bend them really
> > hard.
>
> When I finish a commit, I press 'C-c C-c'. Seems quite logical to me.
>
> Especially if we consider the case where the user edits the diff (e.g.
> with C-k) first.
>
> > C-c C-c means "compile current function" for all SLIME users
> > (and I suspect CIDER users too).
>
> But note that this also has the meaning of "I've updated a piece of
> work, proceed with it", conveyed to the compiler. Not too far off.
I guess, but in effect, nothing's "too far off" if you squint hard
enough.
> > If it has any semantics at all,
> > it's vaguely DWIM. And the longstanding "Meaning" in the DWIM here
> > is "goto source for this hunk".
>
> There's also change-log-mode which does this. And I think that's it.
>
> Ah, and there's also cc-mode which uses the same binding for
> comment-region. *shrug*
Yeah, it's a DWIM shortcut with "What I Mean" being determined by
historical usage.
> >>> Especially in a mode that's read only
> >>> much more often than not?
> >> When I simply visit a patch (which I might want to apply), it doesn't
> >> open in read-only. Still, to visit the source I've always switched to
> >> read-only and pressed RET too.
> > Wow, that's so much easier than typing C-c C-c which has existed
> > forever.
>
> It's not. But the switch to read-only is a one-time thing and jumping to
> different hunks is often done repeatedly anyways. So I'm probably saving
> on keys, at least in some cases.
OK. I'm not against that workflow, but it's not my workflow.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 18:57 ` Eli Zaretskii
@ 2023-09-08 19:01 ` João Távora
0 siblings, 0 replies; 147+ messages in thread
From: João Távora @ 2023-09-08 19:01 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: dmitry, monnier, philipk, emacs-devel
On Fri, Sep 8, 2023 at 7:57 PM Eli Zaretskii <eliz@gnu.org> wrote:
>
> > From: João Távora <joaotavora@gmail.com>
> > Date: Fri, 8 Sep 2023 19:35:41 +0100
> > Cc: Eli Zaretskii <eliz@gnu.org>, monnier@iro.umontreal.ca, philipk@posteo.net,
> > emacs-devel@gnu.org
> >
> > On Fri, Sep 8, 2023 at 7:25 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
> >
> > > That seems to rhyme with my proposal. Except instead of "done editing"
> > > it will be "done reviewing" (though some rare users might engage in
> > > editing the diff as well).
> >
> > It doesn't rhyme at all, unless you really twist your ears.
>
> Actually, yes, it does.
I guess rhyming is in the ears of the beholder.
It rhymes with "DWIM" for me, and that's a much broader spectrum.
> Mind you, I didn't say that we should rebind "C-c C-c" in diff-mode, I
> just explained what we use that key sequence for in Emacs.
OK. Dmitry and I gave some other examples that may or may not
rhyme depending on how you listen.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 18:44 ` João Távora
@ 2023-09-08 19:29 ` Dmitry Gutov
0 siblings, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-08 19:29 UTC (permalink / raw)
To: João Távora; +Cc: Eli Zaretskii, monnier, philipk, emacs-devel
On 08/09/2023 21:44, João Távora wrote:
>>> Also why should a discussion on refactoring capabilities have
>>> to kick off with the proposal for the destruction of one of
>>> the most longstanding useful shortcuts in diff-mode?
>> Because we have now a feature which uses diff-mode for confirming a
>> refactoring?
> A feature you don't use, right?
Correct. I would probably use the new command in diff-mode for applying
multi-file patches, though.
> In your new word-diff-based confirmation
> mode, when it comes, feel free to bind C-c C-c there at will.
Sure.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 11:10 ` João Távora
@ 2023-09-08 22:35 ` Dmitry Gutov
2023-09-08 23:17 ` João Távora
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-08 22:35 UTC (permalink / raw)
To: João Távora
Cc: Eli Zaretskii, Philip K., Stefan Monnier, emacs-devel
On 08/09/2023 14:10, João Távora wrote:
> On Thu, Sep 7, 2023 at 11:39 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
>
>> Not that many: these are 260 edits just across 3 files.
>
> glyph_row? As in 'struct glyph_row' of src/dispextern.h? My clangd
> suggested changes to 7 files. Maybe not contrived but certainly
> not common either, and well worth the subsecond latency considering
> the time you'd want to spend reviewing such a mammoth change.
Not the type but the identifier with the same name (struct glyph_row
*glyph_row). Anyway, 3 or 7, it might as well be 70 files in another case.
Although the impact somewhat depends on whether the current performance
is proportional to the number of files, or the number of edits.
>>> A much more typical example of renaming ab symbol in a single function
>>> resolved in 0.02s. Most examples of applying quick fixes and moving
>>> .hpp inlined member functions to out-of-line in .cpp resolve in similar
>>> quasi-instantaneous fashion.
>>
>> That's great, but for such small examples one could almost do without
>> advanced interfaces too, couldn't they?
>
> For local renames, yes, which is precisely why the reason why eglot-rename
> has a special 'maybe-summary' confirmation method (I use maybe-diff)
> whose point is to skips the confirmation if it detects the change to be "local
> enough"
But a rename can just as well be global. Which is simple in theory, but
it can be a good idea to double-check whether all identifiers are found
anyway (or check for false positives). Though perhaps it's my habit due
to working with Grep-based renames a lot.
> For others, like extracting methods, etc, not at all. They may be
> simple, but you generally still want to have a look at what's being
> especially if it targets on or
Sure.
>>> Now, let me clarify what I meant by "shiny new refactoring interface".
>>> It's not what you think I meant, I believe. What I meant is a framework
>>> for:
>>>
>>> 1. collecting 'potential sets of changes' -- for clarity let's call
>>> "actions" after LSP nomenclature -- from a number of different
>>> backends. Examples of actions: "rename thing at point", "organize
>>> imports", "write as while loops as cl-loop"
>>>
>>> 2. presenting actions names to the user -- either via the minibuffer
>>> or by annotating buffer position where these tweaks apply.
>> - Some way (possibly also a hook) to find all the "points of interest"
>> in a buffer -- these could also be annotated with a lightbulb or etc in
>
> That's what I meant yes "annotate". But I'd leave the annotation
> interface to a second phase. As you note, it's not obvious when to collect
> these actions with special affinity to buffer positions . In LSP, some of
> them are already being collected because of diagnostics.
Yes, when to collect and how to display. The collection method could
also be "pull" or "push": with hooks we usually do the "pull" thing, but
since flymake (and often other diagnostics) work asynchronously a "push"
mechanism might make more sense.
> Flymake is the main existing Emacs interface that periodically annotates
> the buffer with pieces of information about your code gotten from a server.
> It knows how to display things in the fringe, and is fairly customizable.
> You can have multiple backends, etc, it works asynchronously and generally
> has a lot of common logic for knowing how to update only parts of the
> buffer etc.
>
> It could be argued we should use it for this purpose, but then again, it
> could be argued we shouldn't, especially if we suspect equating "localized
> actions" to diagnostics is simply wrong. This feature request came up in the
> past in the Eglot tracker and I gave it a go once or twice with Flymake.
> But maybe I just didn't try hard enough.
We should probably abstract over Flymake either way. But I agree that
all this can be left until later.
>> Sure. Possibly carrying more-or-less same information that LSP's edits
>> do. Though we could see whether it can be useful to annotate them with
>> additional info, e.g. name/type/etc (where we'd deduce that a function
>> called X is being renamed, or a file is being moved, or both; which
>> could be reflects in the changeset's display more intelligently).
>
> That's not a bad idea, but is an implementation detail. We
> should probably not expose this representation (at least not too early)
> to conserve the freedom to change it.
You skipped over the remainder of my email where I explained why I liked
to start with step 4.
We can still want to be able to tweak it during Emacs 30's development,
of course, and maybe even later, but it's impossible not to discuss and
document if we want customizable/swappable UIs for confirmation anyway.
>> Sure. I wouldn't know what position "organize imports" should apply to
>> anyway. But to do with backends which don't support it?
>
> Maybe at least one of the backends will support it. Else issue an
> error, that's not much more I can see. Some backends may
> not even support rename. It's not like in xref where "find definitions"
> and "find references" which are things that almost all xref backends
> would be able to do.
Backends which don't support rename could fall back to xref which worst
case falls back to grep. Or something like that.
Anyway, I guess we'll implicitly decide that both "rename" and "organize
imports" are always available and create commands with dedicated
bindings for them?
Why the latter, BTW? Or are there more commands like that? From what I'm
reading, "organize imports" is not a part of the official LSP protocol,
though there are extensions.
>>> Regarding 4 (which seems to be the current focal point of the
>>> discussion) Eglot has three main types of confirmation strategies
>>> available. See eglot-confirm-server-edits for more.
>>>
>>> * 'diff', which just presents the edits
>>> * 'summary', which summarizes the edits in the minibuffer and prompts
>>> to apply.
>>> * nil, which means no confirmation at all
>>>
>>> There is also 'maybe-diff' and 'maybe-summary' which behave like
>>> nil if all the files in the change list are already visited buffers.
>>
>> Not sure why the cutoff is there: and not for example "if all the
>> changes are in the current file", or "are all visible on the screen".
>>
>> Anyway, the more the merrier, I suppose.
>>
>>> That said, it's the whole sequence 1 to 4, not just 4, that needs
>>> to be generalized out of Eglot and into Emacs. Note that some parts
>>> of 1..4, like the annotation of actions in buffers or the support for
>>> file creation and deletion, aren't yet in Eglot, so there's good work
>>> to be done. Some of the "annotation" logic already exists in Flymake,
>>> and Flymake must be taken into the equation too, and early.
>>
>> The reason for talking about 4 first is twofold:
>>
>> - I understand 4 better than the rest at this point of time, and it
>> could be plugged into some existing bits of functionality already (e.g.
>> Eglot's refactorings and Xref/Project names).
>>
>> - There will likely be two entry points to the new library, just like
>> with Xref we have xref-backend-functions and xref-show-xrefs. The former
>> depends on the latter. By choosing a good enough data model for step 4
>> (e.g. how changes are represented), we can better build requirements for
>> step 1, given that whatever hook(s) we add, they would already need to
>> be documented with the details about the data in/out flow.
>>
>>> Also, it would be very good if we could have an early backend which is
>>> *not* LSP. An obvious candidate is Elisp. I'd like to know what is
>>> the minimal effort to write a lisp function based on the new
>>> macroexpanding tricks that Stefan Monnier developed that says
>>> precisely where a given symbol is used as a variable in a function.
>>> As far as I understand, these techniques are currently being used for
>>> accurate completion, but they could maybe be used for accurate
>>> refactorings.
>>
>> Xref could easily be an early backend which supports renaming only.
>> Eglisp's xref-backend-references could make use of the macroexpanding
>> thing to include local variables too.
>>
>>>> Not to belittle the new addition, though - it's a good step for Eglot.
>>>
>>> As someone who actually uses Eglot daily and is an avid consumer
>>> of refactoring functionality, my opinion is that the "diff"
>>> confirmation strategy that Philip proposed and implemented is freaking
>>> great, even if the implementation is a bit contorted (though mostly
>>> isolated).
>>>
>>> IMO diff is the lingua franca for communicating changes to source
>>> code around the world, even in those pretty web interfaces that
>>> you and many others like. So it makes full sense to support it
>>> and to support it well.
>>
>> I'm okay with diffs myself obviously, and we should keep this UI option
>> if feasible, but I'd also prefer to have something more compact
>> available, for the "web interface lovers" of the world. Diffs do have
>> some barrier to understanding, even we are very much used to them. And
>> diff-with-context can be pretty long too.
>>
>>>> - I would probably want to bind the originally proposed
>>>> 'diff-apply-everything' to 'C-c C-c' (e.g. "commit the change to disk"),
>>>> but that's already taken in diff-mode.
>>>
>>>> - 'git diff' has a less-frequently used option called '--word-diff'
>>>> which could reduce the length of the diff in the case I am testing (but
>>>> I guess diff-mode would have to be updated to support that output). And
>>>> another way in that direction would be to reduce the size of the diff
>>>> context (e.g. to 0).
>>>
>>> I'm not at all opposed to implementing other confirmation strategies
>>> that look more like what VSCode or other editors show users. Or
>>> augmenting the existing 'diff' strategy with new shortcuts and stuff.
>>> But I wouldn't overthink UI details at this point in the game either.
>>
>> The first suggestion in particular looked like a modest enough tweak
>> that does not depend on the rest of this discussion (and it would likely
>> have a diff-specific implementation). But if we try to make it atomic,
>> that's an increase in complexity, of course.
>
>
>
> --
> João Távora
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 22:35 ` Dmitry Gutov
@ 2023-09-08 23:17 ` João Távora
0 siblings, 0 replies; 147+ messages in thread
From: João Távora @ 2023-09-08 23:17 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Eli Zaretskii, Philip K., Stefan Monnier, emacs-devel
Dmitry Gutov <dmitry@gutov.dev> writes:
> Although the impact somewhat depends on whether the current
> performance is proportional to the number of files, or the number of
> edits.
I think it depends on both, but a large number of edits is relatively
slow anyway. That's probably because you have to make lots of
arrangements to get correct undo behaviour and call the self-admittedly
"very slow" replace-buffer-contents C functions. Anyway, I never looked
at performance because noone ever complained until you (and it didn't
and still doesn't bother me). But maybe there's some low-hanging fruit
there.
> You skipped over the remainder of my email where I explained why I
> liked to start with step 4.
Probably didn't have anything useful to add. You can focus on whatever
you part you like, of course.
> We can still want to be able to tweak it during Emacs 30's
> development, of course, and maybe even later, but it's impossible not
> to discuss and document if we want customizable/swappable UIs for
> confirmation anyway.
I think everyone already agreed we want that.
> Anyway, I guess we'll implicitly decide that both "rename" and
> "organize imports" are always available and create commands with
> dedicated bindings for them?
At least for "rename". For the others, not so sure yet.
> Why the latter, BTW? Or are there more commands like that? From what
> I'm reading, "organize imports" is not a part of the official LSP
> protocol, though there are extensions.
It's a common code for an LSP action. Other common names:
"source.organizeImports"
"refactor.extract"
"refactor.inline"
"refactor.rewrite"
"quickfix"
>>> Not sure why the cutoff is there: and not for example "if all the
>>> changes are in the current file", or "are all visible on the
>>> screen".
Seemed reasonable and easy to implement, so I did it. Noone complained
and I quite like it. Your ideas are also quite good, so other cutoff
criteria welcome (even if just to Eglot right now) if you want to keep
shaving this interface yak :-)
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-08 16:20 ` João Távora
@ 2023-09-25 23:11 ` Dmitry Gutov
2023-09-25 23:32 ` Dmitry Gutov
2023-09-26 5:36 ` Alfred M. Szmidt
0 siblings, 2 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-25 23:11 UTC (permalink / raw)
To: João Távora, Stefan Monnier
Cc: Eli Zaretskii, Philip K., emacs-devel
On 08/09/2023 19:20, João Távora wrote:
> On Fri, Sep 8, 2023 at 5:05 PM João Távora<joaotavora@gmail.com> wrote:
>> On Fri, Sep 8, 2023 at 4:42 PM Stefan Monnier<monnier@iro.umontreal.ca> wrote:
>>>>>> C-c C-c is "go to place mentioned in this hunk". It must not apply anything,
>>>>>> I have it most hardwired in my brain.
>>>>> Really?
>>>> Yes, really.
>>> Curious: I always use RET instead.
>>> I'm actually having a hard time
>>> remembering/imagining how/why we ended up binding `C-c C-c` to
>>> `diff-goto-source` in `diff-mode`.
>> Seems some young hotshot added it back in the day
> More realistically, the reason may have been that
> diff-mode isn't necessarily a read-only mode, and
> so you need a command such as this which doesn't
> imply modifying the buffer (RET is no good here).
> There is also M-o and M-RET but these were (and
> most importantly probably still are) harder to hit or
> bind on some terminals.
(Sorry, for resurrecting this subthread, but...)
Should we make diff-mode always start in read-only-mode? It's currently
inconsistent: read-only in some cases (vc-diff) and writable in others
(visiting a patch file on disk).
Whereas, I think, in both cases editing the diff itself is a relatively
rare operation. Most of the time, I visit a patch, press some key (such
as n or p), curse slightly, press 'undo', turn on read-only-mode, and
then continue with the real work.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-25 23:11 ` Dmitry Gutov
@ 2023-09-25 23:32 ` Dmitry Gutov
2023-09-26 5:36 ` Alfred M. Szmidt
1 sibling, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-25 23:32 UTC (permalink / raw)
To: João Távora, Stefan Monnier
Cc: Eli Zaretskii, Philip K., emacs-devel
On 26/09/2023 02:11, Dmitry Gutov wrote:
> Should we make diff-mode always start in read-only-mode? It's currently
> inconsistent: read-only in some cases (vc-diff) and writable in others
> (visiting a patch file on disk).
Ah, there actually is a user option for that. And it's only 20 years young.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-25 23:11 ` Dmitry Gutov
2023-09-25 23:32 ` Dmitry Gutov
@ 2023-09-26 5:36 ` Alfred M. Szmidt
2023-09-26 8:06 ` João Távora
2023-09-26 10:55 ` Dmitry Gutov
1 sibling, 2 replies; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 5:36 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: joaotavora, monnier, eliz, philipk, emacs-devel
(Sorry, for resurrecting this subthread, but...)
Should we make diff-mode always start in read-only-mode? It's currently
inconsistent: read-only in some cases (vc-diff) and writable in others
(visiting a patch file on disk).
Does it need to be consitent? These are two I would think entierly
different use cases of diff-mode... and warrent different behaviour.
If you have a diff on file, you are most probobly going to apply it,
and also probobly going to remove a hunk or two or edit the diff in
some manner. (That this is "relatively rare" I disagree from my own
usage and experience). Not to mention that visiting a file on disk,
that is read-write, and Emacs making it read-only would be very
strange.
With vc-diff (similar, diff-buffer-with-file) you are diffing whatever
you have against VC (or file), there is little point to edit via the
diff, and you'd more likley just save this to file or an email. So in
those cases the buffer being read-only makes more sense.
Whereas, I think, in both cases editing the diff itself is a relatively
rare operation. Most of the time, I visit a patch, press some key (such
as n or p), curse slightly, press 'undo', turn on read-only-mode, and
then continue with the real work.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 5:36 ` Alfred M. Szmidt
@ 2023-09-26 8:06 ` João Távora
2023-09-26 10:57 ` Dmitry Gutov
2023-09-26 10:55 ` Dmitry Gutov
1 sibling, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-26 8:06 UTC (permalink / raw)
To: Alfred M. Szmidt; +Cc: Dmitry Gutov, monnier, eliz, philipk, emacs-devel
On Tue, Sep 26, 2023 at 6:36 AM Alfred M. Szmidt <ams@gnu.org> wrote:
> If you have a diff on file, you are most probobly going to apply it,
> and also probobly going to remove a hunk or two or edit the diff in
> some manner. (That this is "relatively rare" I disagree from my own
> usage and experience). Not to mention that visiting a file on disk,
> that is read-write, and Emacs making it read-only would be very
> strange.
I completely agree with these two points. Even non-file diff-mode
buffers, such as the ones provided by piping git diff into Emacs
(yes, I can do that :-) ) are generally better left read-write,
since I frequently edit them to kill hunks I'm not interested in.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 5:36 ` Alfred M. Szmidt
2023-09-26 8:06 ` João Távora
@ 2023-09-26 10:55 ` Dmitry Gutov
2023-09-26 12:03 ` Alfred M. Szmidt
1 sibling, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 10:55 UTC (permalink / raw)
To: Alfred M. Szmidt; +Cc: joaotavora, monnier, eliz, philipk, emacs-devel
On 26/09/2023 08:36, Alfred M. Szmidt wrote:
> With vc-diff (similar, diff-buffer-with-file) you are diffing whatever
> you have against VC (or file), there is little point to edit via the
> diff, and you'd more likley just save this to file or an email. So in
> those cases the buffer being read-only makes more sense.
Sounds like you missed the new feature: committing a patch (C-v C-v in a
vc-diff buffer). You would usually edit it as well.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 8:06 ` João Távora
@ 2023-09-26 10:57 ` Dmitry Gutov
2023-09-26 11:24 ` João Távora
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 10:57 UTC (permalink / raw)
To: João Távora, Alfred M. Szmidt
Cc: monnier, eliz, philipk, emacs-devel
On 26/09/2023 11:06, João Távora wrote:
> On Tue, Sep 26, 2023 at 6:36 AM Alfred M. Szmidt<ams@gnu.org> wrote:
>
>> If you have a diff on file, you are most probobly going to apply it,
>> and also probobly going to remove a hunk or two or edit the diff in
>> some manner. (That this is "relatively rare" I disagree from my own
>> usage and experience). Not to mention that visiting a file on disk,
>> that is read-write, and Emacs making it read-only would be very
>> strange.
> I completely agree with these two points. Even non-file diff-mode
> buffers, such as the ones provided by piping git diff into Emacs
> (yes, I can do that 😄 ) are generally better left read-write,
> since I frequently edit them to kill hunks I'm not interested in.
'k' (or M-k), 'C-c C-s' and 'C-_' all work fine in a read-only diff-mode
buffer. 'C-x C-s' also works, of course.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 10:57 ` Dmitry Gutov
@ 2023-09-26 11:24 ` João Távora
2023-09-26 11:33 ` Alfred M. Szmidt
` (2 more replies)
0 siblings, 3 replies; 147+ messages in thread
From: João Távora @ 2023-09-26 11:24 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Alfred M. Szmidt, monnier, eliz, philipk, emacs-devel
On Tue, Sep 26, 2023 at 11:57 AM Dmitry Gutov <dmitry@gutov.dev> wrote:
>
> On 26/09/2023 11:06, João Távora wrote:
> > On Tue, Sep 26, 2023 at 6:36 AM Alfred M. Szmidt<ams@gnu.org> wrote:
> >
> >> If you have a diff on file, you are most probobly going to apply it,
> >> and also probobly going to remove a hunk or two or edit the diff in
> >> some manner. (That this is "relatively rare" I disagree from my own
> >> usage and experience). Not to mention that visiting a file on disk,
> >> that is read-write, and Emacs making it read-only would be very
> >> strange.
> > I completely agree with these two points. Even non-file diff-mode
> > buffers, such as the ones provided by piping git diff into Emacs
> > (yes, I can do that 😄 ) are generally better left read-write,
> > since I frequently edit them to kill hunks I'm not interested in.
>
> 'k' (or M-k), 'C-c C-s' and 'C-_' all work fine in a read-only diff-mode
> buffer. 'C-x C-s' also works, of course.
I think it's very inconsistent to have specialized commands to modify
a buffers contents and not allow all the other regular commands that
modify a buffer do their work. I don't have unlimited brain address
space for keybindings and I think C-SPC C-n a few times C-w does
the job just fine.
Opening regular files of a special type read-only mode would be a
spectacular failure in the basic ergonomics of an editor.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 11:24 ` João Távora
@ 2023-09-26 11:33 ` Alfred M. Szmidt
2023-09-26 11:34 ` Dmitry Gutov
2023-09-26 13:38 ` Philip Kaludercic
2 siblings, 0 replies; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 11:33 UTC (permalink / raw)
Cc: dmitry, monnier, eliz, philipk, emacs-devel
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1537 bytes --]
On Tue, Sep 26, 2023 at 11:57 AM Dmitry Gutov <dmitry@gutov.dev> wrote:
>
> On 26/09/2023 11:06, João Távora wrote:
> > On Tue, Sep 26, 2023 at 6:36 AM Alfred M. Szmidt<ams@gnu.org> wrote:
> >
> >> If you have a diff on file, you are most probobly going to apply it,
> >> and also probobly going to remove a hunk or two or edit the diff in
> >> some manner. (That this is "relatively rare" I disagree from my own
> >> usage and experience). Not to mention that visiting a file on disk,
> >> that is read-write, and Emacs making it read-only would be very
> >> strange.
> > I completely agree with these two points. Even non-file diff-mode
> > buffers, such as the ones provided by piping git diff into Emacs
> > (yes, I can do that 😄 ) are generally better left read-write,
> > since I frequently edit them to kill hunks I'm not interested in.
>
> 'k' (or M-k), 'C-c C-s' and 'C-_' all work fine in a read-only diff-mode
> buffer. 'C-x C-s' also works, of course.
I think it's very inconsistent to have specialized commands to modify
a buffers contents and not allow all the other regular commands that
modify a buffer do their work. I don't have unlimited brain address
space for keybindings and I think C-SPC C-n a few times C-w does
the job just fine.
Or fixing a typo, or renaming a variable, or some such ...
Opening regular files of a special type read-only mode would be a
spectacular failure in the basic ergonomics of an editor.
1+
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 11:24 ` João Távora
2023-09-26 11:33 ` Alfred M. Szmidt
@ 2023-09-26 11:34 ` Dmitry Gutov
2023-09-26 12:57 ` João Távora
2023-09-26 13:38 ` Philip Kaludercic
2 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 11:34 UTC (permalink / raw)
To: João Távora
Cc: Alfred M. Szmidt, monnier, eliz, philipk, emacs-devel
On 26/09/2023 14:24, João Távora wrote:
> On Tue, Sep 26, 2023 at 11:57 AM Dmitry Gutov<dmitry@gutov.dev> wrote:
>> On 26/09/2023 11:06, João Távora wrote:
>>> On Tue, Sep 26, 2023 at 6:36 AM Alfred M. Szmidt<ams@gnu.org> wrote:
>>>
>>>> If you have a diff on file, you are most probobly going to apply it,
>>>> and also probobly going to remove a hunk or two or edit the diff in
>>>> some manner. (That this is "relatively rare" I disagree from my own
>>>> usage and experience). Not to mention that visiting a file on disk,
>>>> that is read-write, and Emacs making it read-only would be very
>>>> strange.
>>> I completely agree with these two points. Even non-file diff-mode
>>> buffers, such as the ones provided by piping git diff into Emacs
>>> (yes, I can do that 😄 ) are generally better left read-write,
>>> since I frequently edit them to kill hunks I'm not interested in.
>> 'k' (or M-k), 'C-c C-s' and 'C-_' all work fine in a read-only diff-mode
>> buffer. 'C-x C-s' also works, of course.
> I think it's very inconsistent to have specialized commands to modify
> a buffers contents and not allow all the other regular commands that
> modify a buffer do their work. I don't have unlimited brain address
> space for keybindings and I think C-SPC C-n a few times C-w does
> the job just fine.
Is that better than typing 'k'?
Or being able to use hunk navigation with n/p?
> Opening regular files of a special type read-only mode would be a
> spectacular failure in the basic ergonomics of an editor.
Like you said: you edit both kinds of diff buffers (vc and files on
disk) in the same way. But we assign them different read-only status.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 10:55 ` Dmitry Gutov
@ 2023-09-26 12:03 ` Alfred M. Szmidt
2023-09-26 12:11 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 12:03 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: joaotavora, monnier, eliz, philipk, emacs-devel
> With vc-diff (similar, diff-buffer-with-file) you are diffing whatever
> you have against VC (or file), there is little point to edit via the
> diff, and you'd more likley just save this to file or an email. So in
> those cases the buffer being read-only makes more sense.
Sounds like you missed the new feature: committing a patch (C-v C-v in a
vc-diff buffer). You would usually edit it as well.
I really hope you typoed that, rebinding C-v to something other than
scrolling is a beyond terrible idea.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 12:03 ` Alfred M. Szmidt
@ 2023-09-26 12:11 ` Dmitry Gutov
2023-09-26 12:20 ` Alfred M. Szmidt
2023-09-29 6:52 ` Eli Zaretskii
0 siblings, 2 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 12:11 UTC (permalink / raw)
To: Alfred M. Szmidt; +Cc: joaotavora, monnier, eliz, philipk, emacs-devel
On 26/09/2023 15:03, Alfred M. Szmidt wrote:
> > With vc-diff (similar, diff-buffer-with-file) you are diffing whatever
> > you have against VC (or file), there is little point to edit via the
> > diff, and you'd more likley just save this to file or an email. So in
> > those cases the buffer being read-only makes more sense.
>
> Sounds like you missed the new feature: committing a patch (C-v C-v in a
> vc-diff buffer). You would usually edit it as well.
>
> I really hope you typoed that, rebinding C-v to something other than
> scrolling is a beyond terrible idea.
Correction: C-x v v.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 12:11 ` Dmitry Gutov
@ 2023-09-26 12:20 ` Alfred M. Szmidt
2023-09-29 6:52 ` Eli Zaretskii
1 sibling, 0 replies; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 12:20 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: joaotavora, monnier, eliz, philipk, emacs-devel
> > With vc-diff (similar, diff-buffer-with-file) you are diffing whatever
> > you have against VC (or file), there is little point to edit via the
> > diff, and you'd more likley just save this to file or an email. So in
> > those cases the buffer being read-only makes more sense.
>
> Sounds like you missed the new feature: committing a patch (C-v C-v in a
> vc-diff buffer). You would usually edit it as well.
>
> I really hope you typoed that, rebinding C-v to something other than
> scrolling is a beyond terrible idea.
Correction: C-x v v.
Thanks, and for making me jump from my seat, here is a bug report:
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=66211
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 11:34 ` Dmitry Gutov
@ 2023-09-26 12:57 ` João Távora
2023-09-26 13:09 ` Alfred M. Szmidt
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-26 12:57 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Alfred M. Szmidt, monnier, eliz, philipk, emacs-devel
On Tue, Sep 26, 2023 at 12:34 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
> Is that better than typing 'k'?
'k' inserts k.
> Or being able to use hunk navigation with n/p?
I use M-n sometimes when I remember it, but mostly I use C-s like
everywhere.
> > Opening regular files of a special type read-only mode would be a
> > spectacular failure in the basic ergonomics of an editor.
>
> Like you said: you edit both kinds of diff buffers (vc and files on
> disk) in the same way. But we assign them different read-only status.
When I pipe the results of `git diff`, `git log`, etc into Emacs,
I don't make them read only. And I use this more way more frequently
than vc-diff.
Frankly I don't care if you think it's "better" to use your
specialized keybindings. It's your right to think so. But I
do care about being able to use the keybindings I've always used
for such basic file and buffer-editing functionality.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 12:57 ` João Távora
@ 2023-09-26 13:09 ` Alfred M. Szmidt
2023-09-26 13:52 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 13:09 UTC (permalink / raw)
Cc: dmitry, monnier, eliz, philipk, emacs-devel
I can sorta see where Dimitry is coming from.
You, and I at least, consider diffs "files" -- so we prefer to keep
them as you'd normally C-x C-f on then.
But consider RMAIL, RMAIL handles the file specially to keep whatever
internal structure sane. So the only way to edit is to use whatever
mode bindings you have at your fingers.
The major difference here is that if you C-x C-f a RMAIL file, you get
the file (if I remeber correct, this might be a regression from when
the format was changed, since I do recall that BABYL files had a mode
line and the file would open up in RMAIL mode?). WHere as with diff,
if you name the file .diff or .patch or whatever, you get diff-mode
like you'd get c-mode or similar.
To open a RMAIL file in RMAIL mode you need M-x rmail, which puts the
burden on the user to decide what they want to do (break the rules of
the format or use the dedicated mode).
Now .. I don't personally favor this, and it seems that there is a
simple switch to make diff files read-only anyway, so maybe leave it
at that?
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 11:24 ` João Távora
2023-09-26 11:33 ` Alfred M. Szmidt
2023-09-26 11:34 ` Dmitry Gutov
@ 2023-09-26 13:38 ` Philip Kaludercic
2023-09-26 14:06 ` João Távora
2 siblings, 1 reply; 147+ messages in thread
From: Philip Kaludercic @ 2023-09-26 13:38 UTC (permalink / raw)
To: João Távora
Cc: Dmitry Gutov, Alfred M. Szmidt, monnier, eliz, emacs-devel
João Távora <joaotavora@gmail.com> writes:
> On Tue, Sep 26, 2023 at 11:57 AM Dmitry Gutov <dmitry@gutov.dev> wrote:
>>
>> On 26/09/2023 11:06, João Távora wrote:
>> > On Tue, Sep 26, 2023 at 6:36 AM Alfred M. Szmidt<ams@gnu.org> wrote:
>> >
>> >> If you have a diff on file, you are most probobly going to apply it,
>> >> and also probobly going to remove a hunk or two or edit the diff in
>> >> some manner. (That this is "relatively rare" I disagree from my own
>> >> usage and experience). Not to mention that visiting a file on disk,
>> >> that is read-write, and Emacs making it read-only would be very
>> >> strange.
>> > I completely agree with these two points. Even non-file diff-mode
>> > buffers, such as the ones provided by piping git diff into Emacs
>> > (yes, I can do that 😄 ) are generally better left read-write,
>> > since I frequently edit them to kill hunks I'm not interested in.
>>
>> 'k' (or M-k), 'C-c C-s' and 'C-_' all work fine in a read-only diff-mode
>> buffer. 'C-x C-s' also works, of course.
>
> I think it's very inconsistent to have specialized commands to modify
> a buffers contents and not allow all the other regular commands that
> modify a buffer do their work. I don't have unlimited brain address
> space for keybindings and I think C-SPC C-n a few times C-w does
> the job just fine.
While I get this perspective, I also think that being able to close a
diff using 'q' is a nice, ergonomic-wise.
> Opening regular files of a special type read-only mode would be a
> spectacular failure in the basic ergonomics of an editor.
>
> João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 13:09 ` Alfred M. Szmidt
@ 2023-09-26 13:52 ` Dmitry Gutov
0 siblings, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 13:52 UTC (permalink / raw)
To: Alfred M. Szmidt, João Távora
Cc: monnier, eliz, philipk, emacs-devel
On 26/09/2023 16:09, Alfred M. Szmidt wrote:
> But consider RMAIL, RMAIL handles the file specially to keep whatever
> internal structure sane. So the only way to edit is to use whatever
> mode bindings you have at your fingers.
And if you split and kill the hunks (in diff-mode) using the dedicated
commands, the format is indeed preserved better: e.g. the line numbers
and counters in the hunk headers.
To break the syntax and make a patch un-applyable is also very easy with
free-form editing.
> Now .. I don't personally favor this, and it seems that there is a
simple switch to make diff files read-only anyway, so maybe leave it
at that?
When I bring such questions up, it's usually to consider the standpoint
of some new-ish user. More consistency and fewer chances to mess things
up = better.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 13:38 ` Philip Kaludercic
@ 2023-09-26 14:06 ` João Távora
2023-09-26 14:31 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-26 14:06 UTC (permalink / raw)
To: Philip Kaludercic
Cc: Dmitry Gutov, Alfred M. Szmidt, monnier, eliz, emacs-devel
On Tue, Sep 26, 2023 at 2:38 PM Philip Kaludercic <philipk@posteo.net> wrote:
> While I get this perspective, I also think that being able to close a
> diff using 'q' is a nice, ergonomic-wise.
That would be nice for many types, I guess, if `q` wasn't already
much more useful and understood as a tool for inserting the letter
q in file-visiting buffers.
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 14:06 ` João Távora
@ 2023-09-26 14:31 ` Dmitry Gutov
2023-09-26 14:51 ` João Távora
2023-09-26 15:01 ` [External] : " Drew Adams
0 siblings, 2 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 14:31 UTC (permalink / raw)
To: João Távora, Philip Kaludercic
Cc: Alfred M. Szmidt, monnier, eliz, emacs-devel
On 26/09/2023 17:06, João Távora wrote:
> On Tue, Sep 26, 2023 at 2:38 PM Philip Kaludercic<philipk@posteo.net> wrote:
>
>> While I get this perspective, I also think that being able to close a
>> diff using 'q' is a nice, ergonomic-wise.
> That would be nice for many types, I guess, if `q` wasn't already
> much more useful and understood as a tool for inserting the letter
> q in file-visiting buffers.
C-x C-f etc/images/attach.xpm RET
q
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 14:31 ` Dmitry Gutov
@ 2023-09-26 14:51 ` João Távora
2023-09-26 14:54 ` Dmitry Gutov
2023-09-26 15:01 ` [External] : " Drew Adams
1 sibling, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-26 14:51 UTC (permalink / raw)
To: Dmitry Gutov
Cc: Philip Kaludercic, Alfred M. Szmidt, monnier, eliz, emacs-devel
On Tue, Sep 26, 2023 at 3:31 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
>
> On 26/09/2023 17:06, João Távora wrote:
> > On Tue, Sep 26, 2023 at 2:38 PM Philip Kaludercic<philipk@posteo.net> wrote:
> >
> >> While I get this perspective, I also think that being able to close a
> >> diff using 'q' is a nice, ergonomic-wise.
> > That would be nice for many types, I guess, if `q` wasn't already
> > much more useful and understood as a tool for inserting the letter
> > q in file-visiting buffers.
>
> C-x C-f etc/images/attach.xpm RET
> q
Yup, inserts the letter 'q' here.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 14:51 ` João Távora
@ 2023-09-26 14:54 ` Dmitry Gutov
2023-09-26 15:17 ` João Távora
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 14:54 UTC (permalink / raw)
To: João Távora
Cc: Philip Kaludercic, Alfred M. Szmidt, monnier, eliz, emacs-devel
On 26/09/2023 17:51, João Távora wrote:
> On Tue, Sep 26, 2023 at 3:31 PM Dmitry Gutov<dmitry@gutov.dev> wrote:
>> On 26/09/2023 17:06, João Távora wrote:
>>> On Tue, Sep 26, 2023 at 2:38 PM Philip Kaludercic<philipk@posteo.net> wrote:
>>>
>>>> While I get this perspective, I also think that being able to close a
>>>> diff using 'q' is a nice, ergonomic-wise.
>>> That would be nice for many types, I guess, if `q` wasn't already
>>> much more useful and understood as a tool for inserting the letter
>>> q in file-visiting buffers.
>> C-x C-f etc/images/attach.xpm RET
>> q
> Yup, inserts the letter 'q' here.
It quits the buffer here and with 'emacs -Q'.
^ permalink raw reply [flat|nested] 147+ messages in thread
* RE: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-26 14:31 ` Dmitry Gutov
2023-09-26 14:51 ` João Távora
@ 2023-09-26 15:01 ` Drew Adams
2023-09-26 15:22 ` Alfred M. Szmidt
2023-09-26 15:27 ` Alfred M. Szmidt
1 sibling, 2 replies; 147+ messages in thread
From: Drew Adams @ 2023-09-26 15:01 UTC (permalink / raw)
To: Dmitry Gutov, João Távora, Philip Kaludercic
Cc: Alfred M. Szmidt, monnier@iro.umontreal.ca, eliz@gnu.org,
emacs-devel@gnu.org
(Caveat: I'm not following this thread much.)
Diff output follows any of several formats,
OK. But it's nevertheless plain text, no? As
such, it makes sense to be able to use all of
the general text-editing commands/keys on it,
if you want to change it in arbitrary/whatever
ways.
Is this whole discussion, or even much of it,
really about whether to keep diff-mode buffers
read-only by default, and whether to provide
refactoring commands/keys that let you change
the content in special ways when the buffer is
read-only?
I don't really see a fundamental difference
between a diff buffer and, say, a grep or an
occur buffer. (But yes, you often _apply_ the
diff content, so you want to ensure it keeps to
a proper formatting.)
We already have, and are used to, the universal
idiom of `C-x C-q' to toggle a buffer read-only.
I use that in grep and occur buffers without a
second thought. Why isn't that "sufficient" for
diff buffers as well?
I can see that some might want commands/keys that
act on the buffer content, including to change it
in structured/"legitimate"/refactoring ways, while
keeping it read-only.
But for that, why not just add a new minor mode?
That way, by default, diff buffers would still be
read-only by default, quitable with `q', but also
modifiable in all the usual ways after `C-x C-q'.
And anyone who wants to could toggle the minor
mode ON, to act only in special, allowed ways
while in read-only mode, using keys defined for
that mode. The minor mode could ensure read-only.
(Maybe this or similar has already been proposed
in this thread? If so, mille excuses...)
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 14:54 ` Dmitry Gutov
@ 2023-09-26 15:17 ` João Távora
2023-09-26 15:35 ` Alfred M. Szmidt
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-26 15:17 UTC (permalink / raw)
To: Dmitry Gutov
Cc: Philip Kaludercic, Alfred M. Szmidt, Stefan Monnier,
Eli Zaretskii, emacs-devel
[-- Attachment #1: Type: text/plain, Size: 219 bytes --]
On .
> >> C-x C-f etc/images/attach.xpm RET
> >> q
> > Yup, inserts the letter 'q' here.
>
> It quits the buffer here and with 'emacs -Q'.
>
Also using Emacs -Q here. And using it as a text editor while I'm at it.
>
[-- Attachment #2: Type: text/html, Size: 706 bytes --]
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-26 15:01 ` [External] : " Drew Adams
@ 2023-09-26 15:22 ` Alfred M. Szmidt
2023-09-29 10:36 ` Eli Zaretskii
2023-09-26 15:27 ` Alfred M. Szmidt
1 sibling, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 15:22 UTC (permalink / raw)
To: Drew Adams; +Cc: dmitry, joaotavora, philipk, monnier, eliz, emacs-devel
Is this whole discussion, or even much of it, really about whether
to keep diff-mode buffers read-only by default, and whether to
provide refactoring commands/keys that let you change the content
in special ways when the buffer is read-only?
You need to define what a "diff buffer" is first. Is it a file you
open, is it the output from M-x diff-buffer-with-file, is it the
output from C-x v = ?
I don't really see a fundamental difference between a diff buffer
and, say, a grep or an occur buffer. (But yes, you often _apply_
the diff content, so you want to ensure it keeps to a proper
formatting.)
Occur and grep buffers are by default read-only (and there is a
regression in that too -- you can no longer edit a grep/occur buffer
easily due to strange font lock or other properties).
They are also not files, if you open a file (any file really) you will
expect to be able to edit it using normal commands not specific to the
mode (i.e. self-inser-command ...). vc-diff etc, are more akin to
occur and grep -- the user doesn't work against the file, but rather a
buffer.
We already have, and are used to, the universal idiom of `C-x C-q'
to toggle a buffer read-only. I use that in grep and occur buffers
without a second thought. Why isn't that "sufficient" for diff
buffers as well?
Because we are also talking about files on disk. If you save a
compilation buffer (essentially the same thing as M-x grep or M-x
occur) to disk, and re-open it, it will not be read-only -- and it
would make little sense for it to be so. Where as M-x compile _will_
be read-only.
I can see that some might want commands/keys that act on the buffer
content, including to change it in
structured/"legitimate"/refactoring ways, while keeping it
read-only.
One can have both, diff-mode already allows you to edit the file, and
act on it in a structure manner -- much like any programming mode.
That way, by default, diff buffers would still be read-only by
default, quitable with `q', but also modifiable in all the usual
ways after `C-x C-q'.
But diff buffers aren't read-only -- it depends on their context.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-26 15:01 ` [External] : " Drew Adams
2023-09-26 15:22 ` Alfred M. Szmidt
@ 2023-09-26 15:27 ` Alfred M. Szmidt
2023-09-29 10:40 ` Eli Zaretskii
1 sibling, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 15:27 UTC (permalink / raw)
To: Drew Adams; +Cc: dmitry, joaotavora, philipk, monnier, eliz, emacs-devel
To wit, the difference Dimitry is raising is:
C-x C-f ~/RMAIL RET Opens ~/RMAIL in Fundamental mode
C-x C-f ~/emacs-build.gcov RET Opens file in Compilation-mode
vs.
M-x rmail RET Opens ~/RMAIL using the RMAIL "program"
M-x compile RET make RET .. similar
The two later, the thing you are working is by "dedicated mode"; the
first ones you are working with the file in the specific mode. This
is similar to diff, occur, etc. The issue is that sometimes, a mode
might want more or less .. RMAIL is a good example where it wants
more.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 15:17 ` João Távora
@ 2023-09-26 15:35 ` Alfred M. Szmidt
2023-09-26 15:38 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 15:35 UTC (permalink / raw)
Cc: dmitry, philipk, monnier, eliz, emacs-devel
On .
>> C-x C-f etc/images/attach.xpm RET
>> q
> Yup, inserts the letter 'q' here.
Ditto, inserts a q -- this is master, ./src/emacs -Q.
I am guessing someone might be using a X11 or other GUI Emacs...
It quits the buffer here and with 'emacs -Q'.
Also using Emacs -Q here. And using it as a text editor while I'm at it.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 15:35 ` Alfred M. Szmidt
@ 2023-09-26 15:38 ` Dmitry Gutov
2023-09-26 15:47 ` Alfred M. Szmidt
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 15:38 UTC (permalink / raw)
To: Alfred M. Szmidt, João Távora
Cc: philipk, monnier, eliz, emacs-devel
On 26/09/2023 18:35, Alfred M. Szmidt wrote:
> On .
>
> >> C-x C-f etc/images/attach.xpm RET
> >> q
> > Yup, inserts the letter 'q' here.
>
> Ditto, inserts a q -- this is master, ./src/emacs -Q.
>
> I am guessing someone might be using a X11 or other GUI Emacs...
Seems like it.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 15:38 ` Dmitry Gutov
@ 2023-09-26 15:47 ` Alfred M. Szmidt
2023-09-26 16:01 ` Dmitry Gutov
2023-09-29 10:49 ` Eli Zaretskii
0 siblings, 2 replies; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 15:47 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: joaotavora, philipk, monnier, eliz, emacs-devel
On 26/09/2023 18:35, Alfred M. Szmidt wrote:
> On .
>
> >> C-x C-f etc/images/attach.xpm RET
> >> q
> > Yup, inserts the letter 'q' here.
>
> Ditto, inserts a q -- this is master, ./src/emacs -Q.
>
> I am guessing someone might be using a X11 or other GUI Emacs...
Seems like it.
So much for consistency ... :-)
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 15:47 ` Alfred M. Szmidt
@ 2023-09-26 16:01 ` Dmitry Gutov
2023-09-26 16:10 ` Alfred M. Szmidt
2023-09-26 16:31 ` Yuri Khan
2023-09-29 10:49 ` Eli Zaretskii
1 sibling, 2 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 16:01 UTC (permalink / raw)
To: Alfred M. Szmidt; +Cc: joaotavora, philipk, monnier, eliz, emacs-devel
On 26/09/2023 18:47, Alfred M. Szmidt wrote:
> On 26/09/2023 18:35, Alfred M. Szmidt wrote:
> > On .
> >
> > >> C-x C-f etc/images/attach.xpm RET
> > >> q
> > > Yup, inserts the letter 'q' here.
> >
> > Ditto, inserts a q -- this is master, ./src/emacs -Q.
> >
> > I am guessing someone might be using a X11 or other GUI Emacs...
>
> Seems like it.
>
> So much for consistency ... 😄
If we could do something for consistency for terminal users (e.g. render
xpms with pseudographics or somesuch), we should.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 16:01 ` Dmitry Gutov
@ 2023-09-26 16:10 ` Alfred M. Szmidt
2023-09-29 10:55 ` Eli Zaretskii
2023-09-26 16:31 ` Yuri Khan
1 sibling, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-26 16:10 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: joaotavora, philipk, monnier, eliz, emacs-devel
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 839 bytes --]
On 26/09/2023 18:47, Alfred M. Szmidt wrote:
> On 26/09/2023 18:35, Alfred M. Szmidt wrote:
> > On .
> >
> > >> C-x C-f etc/images/attach.xpm RET
> > >> q
> > > Yup, inserts the letter 'q' here.
> >
> > Ditto, inserts a q -- this is master, ./src/emacs -Q.
> >
> > I am guessing someone might be using a X11 or other GUI Emacs...
>
> Seems like it.
>
> So much for consistency ... 😄
If we could do something for consistency for terminal users (e.g. render
xpms with pseudographics or somesuch), we should.
Please, no. It does not make sense, specially for the case of XPM
files, they are fully editable using normal text and making the
display the content would make it worse since you loose out of that
ability.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 16:01 ` Dmitry Gutov
2023-09-26 16:10 ` Alfred M. Szmidt
@ 2023-09-26 16:31 ` Yuri Khan
2023-09-26 17:28 ` Dmitry Gutov
2023-09-29 11:10 ` Eli Zaretskii
1 sibling, 2 replies; 147+ messages in thread
From: Yuri Khan @ 2023-09-26 16:31 UTC (permalink / raw)
To: Dmitry Gutov
Cc: Alfred M. Szmidt, joaotavora, philipk, monnier, eliz, emacs-devel
On Tue, 26 Sept 2023 at 23:04, Dmitry Gutov <dmitry@gutov.dev> wrote:
> If we could do something for consistency for terminal users (e.g. render
> xpms with pseudographics or somesuch), we should.
Could do better than that. Could display actual graphics using the
protocol implemented in several terminal emulators.
https://sw.kovidgoyal.net/kitty/graphics-protocol/
(For toggling between previewing images and editing them as text,
there is ‘C-c C-c’ bound in ‘image-minor-mode’. I checked and it works
for both SVG and XPM images.)
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 16:31 ` Yuri Khan
@ 2023-09-26 17:28 ` Dmitry Gutov
2023-09-29 11:10 ` Eli Zaretskii
1 sibling, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-26 17:28 UTC (permalink / raw)
To: Yuri Khan
Cc: Alfred M. Szmidt, joaotavora, philipk, monnier, eliz, emacs-devel
On 26/09/2023 19:31, Yuri Khan wrote:
> On Tue, 26 Sept 2023 at 23:04, Dmitry Gutov<dmitry@gutov.dev> wrote:
>
>> If we could do something for consistency for terminal users (e.g. render
>> xpms with pseudographics or somesuch), we should.
> Could do better than that. Could display actual graphics using the
> protocol implemented in several terminal emulators.
>
> https://sw.kovidgoyal.net/kitty/graphics-protocol/
Indeed.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 12:11 ` Dmitry Gutov
2023-09-26 12:20 ` Alfred M. Szmidt
@ 2023-09-29 6:52 ` Eli Zaretskii
2023-09-29 10:21 ` Dmitry Gutov
1 sibling, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 6:52 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: ams, joaotavora, monnier, philipk, emacs-devel
> Date: Tue, 26 Sep 2023 15:11:17 +0300
> Cc: joaotavora@gmail.com, monnier@iro.umontreal.ca, eliz@gnu.org,
> philipk@posteo.net, emacs-devel@gnu.org
> From: Dmitry Gutov <dmitry@gutov.dev>
>
> On 26/09/2023 15:03, Alfred M. Szmidt wrote:
> > > With vc-diff (similar, diff-buffer-with-file) you are diffing whatever
> > > you have against VC (or file), there is little point to edit via the
> > > diff, and you'd more likley just save this to file or an email. So in
> > > those cases the buffer being read-only makes more sense.
> >
> > Sounds like you missed the new feature: committing a patch (C-v C-v in a
> > vc-diff buffer). You would usually edit it as well.
> >
> > I really hope you typoed that, rebinding C-v to something other than
> > scrolling is a beyond terrible idea.
>
> Correction: C-x v v.
That functionality of "C-x v v" is only available for Git (and
basically is undocumented), so it's too early to declare victory.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-29 6:52 ` Eli Zaretskii
@ 2023-09-29 10:21 ` Dmitry Gutov
2023-09-29 15:20 ` Eli Zaretskii
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-29 10:21 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: ams, joaotavora, monnier, philipk, emacs-devel
On 29/09/2023 09:52, Eli Zaretskii wrote:
>> Date: Tue, 26 Sep 2023 15:11:17 +0300
>> Cc:joaotavora@gmail.com,monnier@iro.umontreal.ca,eliz@gnu.org,
>> philipk@posteo.net,emacs-devel@gnu.org
>> From: Dmitry Gutov<dmitry@gutov.dev>
>>
>> On 26/09/2023 15:03, Alfred M. Szmidt wrote:
>>> > With vc-diff (similar, diff-buffer-with-file) you are diffing whatever
>>> > you have against VC (or file), there is little point to edit via the
>>> > diff, and you'd more likley just save this to file or an email. So in
>>> > those cases the buffer being read-only makes more sense.
>>>
>>> Sounds like you missed the new feature: committing a patch (C-v C-v in a
>>> vc-diff buffer). You would usually edit it as well.
>>>
>>> I really hope you typoed that, rebinding C-v to something other than
>>> scrolling is a beyond terrible idea.
>> Correction: C-x v v.
> That functionality of "C-x v v" is only available for Git (and
> basically is undocumented), so it's too early to declare victory.
It's available for Git, for Hg (two separate dedicated implementations),
and for the other VCSes too on best-effort basis (see the function
vc-default-checkin-patch).
Here was me asking for feedback from SVN/CVS users:
https://lists.gnu.org/archive/html/emacs-devel/2022-10/msg01355.html
https://lists.gnu.org/archive/html/emacs-devel/2022-10/msg01954.html
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-26 15:22 ` Alfred M. Szmidt
@ 2023-09-29 10:36 ` Eli Zaretskii
2023-09-29 12:30 ` Robert Pluim
0 siblings, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 10:36 UTC (permalink / raw)
To: Alfred M. Szmidt
Cc: drew.adams, dmitry, joaotavora, philipk, monnier, emacs-devel
> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: dmitry@gutov.dev, joaotavora@gmail.com, philipk@posteo.net,
> monnier@iro.umontreal.ca, eliz@gnu.org, emacs-devel@gnu.org
> Date: Tue, 26 Sep 2023 11:22:20 -0400
>
> Occur and grep buffers are by default read-only (and there is a
> regression in that too
It is only a "regression" if you still have your muscle memory from 20
years ago, since it's when we started making the compilation-mode
buffers read-opnly.
> -- you can no longer edit a grep/occur buffer
> easily due to strange font lock or other properties).
Of course, you can: this is just one "C-x C-q" away (as in any other
read-only buffer). Let's not look for problems where there are none.
> They are also not files, if you open a file (any file really) you will
> expect to be able to edit it using normal commands not specific to the
> mode (i.e. self-inser-command ...). vc-diff etc, are more akin to
> occur and grep -- the user doesn't work against the file, but rather a
> buffer.
That depends on your workflows and preferences, of course. I can
easily imagine someone working with *.diff and *.patrh files a lot.
> We already have, and are used to, the universal idiom of `C-x C-q'
> to toggle a buffer read-only. I use that in grep and occur buffers
> without a second thought. Why isn't that "sufficient" for diff
> buffers as well?
>
> Because we are also talking about files on disk. If you save a
> compilation buffer (essentially the same thing as M-x grep or M-x
> occur) to disk, and re-open it, it will not be read-only -- and it
> would make little sense for it to be so. Where as M-x compile _will_
> be read-only.
I don't see how this is a problem.
There are kinds of files and buffers where sometimes it makes sense to
have them editable and sometimes not, sometimes it makes sense to
treat them as normal text files, and sometimes as specially-formatted
files supported by special modes. Emacs lets you handle these cases
in all of the above possibilities, and I see no reason to argue about
what is The Only Right Thing here, because there isn't one.
> I can see that some might want commands/keys that act on the buffer
> content, including to change it in
> structured/"legitimate"/refactoring ways, while keeping it
> read-only.
>
> One can have both, diff-mode already allows you to edit the file, and
> act on it in a structure manner -- much like any programming mode.
And "C-x C-q" or "M-x fundamental-mode" or "M-x text-mode" lets you
edit them if you need.
> That way, by default, diff buffers would still be read-only by
> default, quitable with `q', but also modifiable in all the usual
> ways after `C-x C-q'.
>
> But diff buffers aren't read-only -- it depends on their context.
The context depends on the use case and the workflow, and cannot be
reliably determined by Emacs. So we picked one possibility, and the
others are just one command away.
So let's please stop this futile dispute, which once again is entirely
about personal preferences.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-26 15:27 ` Alfred M. Szmidt
@ 2023-09-29 10:40 ` Eli Zaretskii
2023-09-29 12:36 ` Alfred M. Szmidt
0 siblings, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 10:40 UTC (permalink / raw)
To: Alfred M. Szmidt
Cc: drew.adams, dmitry, joaotavora, philipk, monnier, emacs-devel
> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: dmitry@gutov.dev, joaotavora@gmail.com, philipk@posteo.net,
> monnier@iro.umontreal.ca, eliz@gnu.org, emacs-devel@gnu.org
> Date: Tue, 26 Sep 2023 11:27:26 -0400
>
> To wit, the difference Dimitry is raising is:
>
> C-x C-f ~/RMAIL RET Opens ~/RMAIL in Fundamental mode
> C-x C-f ~/emacs-build.gcov RET Opens file in Compilation-mode
>
> vs.
>
> M-x rmail RET Opens ~/RMAIL using the RMAIL "program"
> M-x compile RET make RET .. similar
>
> The two later, the thing you are working is by "dedicated mode"; the
> first ones you are working with the file in the specific mode. This
> is similar to diff, occur, etc. The issue is that sometimes, a mode
> might want more or less .. RMAIL is a good example where it wants
> more.
I see no need for consistency in these matters. We sometimes let "C-x
C-f" open files in specialized modes, and sometimes not. If you are
unhappy with either default, you can always customize your Emacs to do
what you prefer.
So let's please stop this futile discussion about personal
preferences. It did nothing except raising the noise level on the
list by two orders of magnitude.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 15:47 ` Alfred M. Szmidt
2023-09-26 16:01 ` Dmitry Gutov
@ 2023-09-29 10:49 ` Eli Zaretskii
2023-09-29 12:36 ` Alfred M. Szmidt
1 sibling, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 10:49 UTC (permalink / raw)
To: Alfred M. Szmidt; +Cc: dmitry, joaotavora, philipk, monnier, emacs-devel
> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: joaotavora@gmail.com, philipk@posteo.net,
> monnier@iro.umontreal.ca, eliz@gnu.org, emacs-devel@gnu.org
> Date: Tue, 26 Sep 2023 11:47:24 -0400
>
>
> On 26/09/2023 18:35, Alfred M. Szmidt wrote:
> > On .
> >
> > >> C-x C-f etc/images/attach.xpm RET
> > >> q
> > > Yup, inserts the letter 'q' here.
> >
> > Ditto, inserts a q -- this is master, ./src/emacs -Q.
> >
> > I am guessing someone might be using a X11 or other GUI Emacs...
>
> Seems like it.
>
> So much for consistency ... :-)
THERE'S NO REASON TO BE CONSISTENT IN WHAT IS BASICALLY PERSONAL
PREFERENCES!!!
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 16:10 ` Alfred M. Szmidt
@ 2023-09-29 10:55 ` Eli Zaretskii
2023-09-29 12:36 ` Alfred M. Szmidt
0 siblings, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 10:55 UTC (permalink / raw)
To: Alfred M. Szmidt; +Cc: dmitry, joaotavora, philipk, monnier, emacs-devel
> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: joaotavora@gmail.com, philipk@posteo.net,
> monnier@iro.umontreal.ca, eliz@gnu.org, emacs-devel@gnu.org
> Date: Tue, 26 Sep 2023 12:10:45 -0400
>
>
> On 26/09/2023 18:47, Alfred M. Szmidt wrote:
> > On 26/09/2023 18:35, Alfred M. Szmidt wrote:
> > > On .
> > >
> > > >> C-x C-f etc/images/attach.xpm RET
> > > >> q
> > > > Yup, inserts the letter 'q' here.
> > >
> > > Ditto, inserts a q -- this is master, ./src/emacs -Q.
> > >
> > > I am guessing someone might be using a X11 or other GUI Emacs...
> >
> > Seems like it.
> >
> > So much for consistency ... 😄
>
> If we could do something for consistency for terminal users (e.g. render
> xpms with pseudographics or somesuch), we should.
>
> Please, no. It does not make sense, specially for the case of XPM
> files, they are fully editable using normal text and making the
> display the content would make it worse since you loose out of that
> ability.
This is again your personal preferences speaking, coupled with the
fact that you aren't using a GUI Emacs frequently enough. Next time
when you visit in a GUI Emacs an image file that can also be edited as
a text file, please make a point of reading what Emacs tells you right
away in the echo-area after you visit the file.
Once again, this whole discussion thread is completely useless.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-26 16:31 ` Yuri Khan
2023-09-26 17:28 ` Dmitry Gutov
@ 2023-09-29 11:10 ` Eli Zaretskii
1 sibling, 0 replies; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 11:10 UTC (permalink / raw)
To: Yuri Khan; +Cc: dmitry, ams, joaotavora, philipk, monnier, emacs-devel
> From: Yuri Khan <yuri.v.khan@gmail.com>
> Date: Tue, 26 Sep 2023 23:31:18 +0700
> Cc: "Alfred M. Szmidt" <ams@gnu.org>, joaotavora@gmail.com, philipk@posteo.net,
> monnier@iro.umontreal.ca, eliz@gnu.org, emacs-devel@gnu.org
>
> On Tue, 26 Sept 2023 at 23:04, Dmitry Gutov <dmitry@gutov.dev> wrote:
>
> > If we could do something for consistency for terminal users (e.g. render
> > xpms with pseudographics or somesuch), we should.
>
> Could do better than that. Could display actual graphics using the
> protocol implemented in several terminal emulators.
>
> https://sw.kovidgoyal.net/kitty/graphics-protocol/
Incorporating this into Emacs should be possible, but would need a
thorough surgery of the TTY part of the display engine, which
currently assumes that each "display element" on TTY frames is one
"pixel" wide and 1 "pixel" high.
(It is also not clear to me from a cursory reading of the spec how to
figure out how many text lines and text columns will a given image
need to be displayed unclipped. This is important for the layout to
work correctly. Since Emacs generally doesn't know the pixel
resolution of the terminal screen, it cannot easily compute that, and
probably needs some help from the terminal emulator/driver, but I saw
no commands for such a query. I probably missed something.)
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 10:36 ` Eli Zaretskii
@ 2023-09-29 12:30 ` Robert Pluim
2023-09-29 13:11 ` Stefan Monnier
2023-09-29 15:30 ` Eli Zaretskii
0 siblings, 2 replies; 147+ messages in thread
From: Robert Pluim @ 2023-09-29 12:30 UTC (permalink / raw)
To: Eli Zaretskii
Cc: Alfred M. Szmidt, drew.adams, dmitry, joaotavora, philipk,
monnier, emacs-devel
>>>>> On Fri, 29 Sep 2023 13:36:22 +0300, Eli Zaretskii <eliz@gnu.org> said:
>> From: "Alfred M. Szmidt" <ams@gnu.org>
>> Cc: dmitry@gutov.dev, joaotavora@gmail.com, philipk@posteo.net,
>> monnier@iro.umontreal.ca, eliz@gnu.org, emacs-devel@gnu.org
>> Date: Tue, 26 Sep 2023 11:22:20 -0400
>>
>> Occur and grep buffers are by default read-only (and there is a
>> regression in that too
Eli> It is only a "regression" if you still have your muscle memory from 20
Eli> years ago, since it's when we started making the compilation-mode
Eli> buffers read-opnly.
"C-x C-q" in an "occur" buffer still leaves some non-useful key
bindings around, like for "DEL". To usefully edit an "occur" buffer
you need to run `occur-edit-mode', bound to "e" by default. We could
fix that wart if we wanted to.
Robert
--
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-29 10:55 ` Eli Zaretskii
@ 2023-09-29 12:36 ` Alfred M. Szmidt
2023-09-29 15:32 ` Eli Zaretskii
0 siblings, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-29 12:36 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: dmitry, joaotavora, philipk, monnier, emacs-devel
> Please, no. It does not make sense, specially for the case of XPM
> files, they are fully editable using normal text and making the
> display the content would make it worse since you loose out of that
> ability.
This is again your personal preferences speaking,
Are users not allowed to raise a voice for objectional behaviour in
Emacs?
coupled with the
fact that you aren't using a GUI Emacs frequently enough.
You have no knowledge of that.
Once again, this whole discussion thread is completely useless.
Raising objections to behaviour that is annoying is not "completely
useless".
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 10:40 ` Eli Zaretskii
@ 2023-09-29 12:36 ` Alfred M. Szmidt
2023-09-29 15:34 ` Eli Zaretskii
0 siblings, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-29 12:36 UTC (permalink / raw)
To: Eli Zaretskii
Cc: drew.adams, dmitry, joaotavora, philipk, monnier, emacs-devel
So let's please stop this futile discussion about personal
preferences. It did nothing except raising the noise level on the
list by two orders of magnitude.
Can you please stop this condescending tone? Everything at the end of
the day is about personal preference, be it whatever the maintainers
add or what the users prefer.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-29 10:49 ` Eli Zaretskii
@ 2023-09-29 12:36 ` Alfred M. Szmidt
0 siblings, 0 replies; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-29 12:36 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: dmitry, joaotavora, philipk, monnier, emacs-devel
I suggest you go read
https://www.gnu.org/philosophy/kind-communication.html ... and go and
calm down
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 12:30 ` Robert Pluim
@ 2023-09-29 13:11 ` Stefan Monnier
2023-09-29 13:13 ` Alfred M. Szmidt
` (2 more replies)
2023-09-29 15:30 ` Eli Zaretskii
1 sibling, 3 replies; 147+ messages in thread
From: Stefan Monnier @ 2023-09-29 13:11 UTC (permalink / raw)
To: Robert Pluim
Cc: Eli Zaretskii, Alfred M. Szmidt, drew.adams, dmitry, joaotavora,
philipk, emacs-devel
> "C-x C-q" in an "occur" buffer still leaves some non-useful key
> bindings around, like for "DEL". To usefully edit an "occur" buffer
> you need to run `occur-edit-mode', bound to "e" by default. We could
> fix that wart if we wanted to.
We should "merge" `C-x C-q` and `e`, indeed, like we do for Dired.
Stefan
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 13:11 ` Stefan Monnier
@ 2023-09-29 13:13 ` Alfred M. Szmidt
2023-09-29 13:16 ` João Távora
2023-09-29 15:47 ` Drew Adams
2 siblings, 0 replies; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-29 13:13 UTC (permalink / raw)
To: Stefan Monnier
Cc: rpluim, eliz, drew.adams, dmitry, joaotavora, philipk,
emacs-devel
> "C-x C-q" in an "occur" buffer still leaves some non-useful key
> bindings around, like for "DEL". To usefully edit an "occur" buffer
> you need to run `occur-edit-mode', bound to "e" by default. We could
> fix that wart if we wanted to.
We should "merge" `C-x C-q` and `e`, indeed, like we do for Dired.
Sounds like a nice idea!
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 13:11 ` Stefan Monnier
2023-09-29 13:13 ` Alfred M. Szmidt
@ 2023-09-29 13:16 ` João Távora
2023-09-29 13:19 ` João Távora
2023-09-29 15:47 ` Drew Adams
2 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-29 13:16 UTC (permalink / raw)
To: Stefan Monnier
Cc: Robert Pluim, Eli Zaretskii, Alfred M. Szmidt, drew.adams, dmitry,
philipk, emacs-devel
On Fri, Sep 29, 2023 at 2:11 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>
> > "C-x C-q" in an "occur" buffer still leaves some non-useful key
> > bindings around, like for "DEL". To usefully edit an "occur" buffer
> > you need to run `occur-edit-mode', bound to "e" by default. We could
> > fix that wart if we wanted to.
>
> We should "merge" `C-x C-q` and `e`, indeed, like we do for Dired.
Yes, and isn't a buffer-local value for read-only-mode-hook the
suitable way to fix that?
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 13:16 ` João Távora
@ 2023-09-29 13:19 ` João Távora
2023-09-29 15:20 ` Stefan Monnier
0 siblings, 1 reply; 147+ messages in thread
From: João Távora @ 2023-09-29 13:19 UTC (permalink / raw)
To: Stefan Monnier
Cc: Robert Pluim, Eli Zaretskii, Alfred M. Szmidt, drew.adams, dmitry,
philipk, emacs-devel
On Fri, Sep 29, 2023 at 2:16 PM João Távora <joaotavora@gmail.com> wrote:
>
> On Fri, Sep 29, 2023 at 2:11 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> >
> > > "C-x C-q" in an "occur" buffer still leaves some non-useful key
> > > bindings around, like for "DEL". To usefully edit an "occur" buffer
> > > you need to run `occur-edit-mode', bound to "e" by default. We could
> > > fix that wart if we wanted to.
> >
> > We should "merge" `C-x C-q` and `e`, indeed, like we do for Dired.
>
> Yes, and isn't a buffer-local value for read-only-mode-hook the
> suitable way to fix that?
For context, I'm asking because I don't think rebinding `C-x C-q`
to a different command (like in the case of Dired) is as good
as using the existing hook. It should be much more consistent
to use the standard facilities of the existing minor mode.
Likewise, I don't think having "-read-only" or "-edit" variations
of each major mode is a good idea. We can activate and deactivate
keymaps on the fly right?
João
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 13:19 ` João Távora
@ 2023-09-29 15:20 ` Stefan Monnier
2023-10-01 12:07 ` Stefan Kangas
0 siblings, 1 reply; 147+ messages in thread
From: Stefan Monnier @ 2023-09-29 15:20 UTC (permalink / raw)
To: João Távora
Cc: Robert Pluim, Eli Zaretskii, Alfred M. Szmidt, drew.adams, dmitry,
philipk, emacs-devel
>> > We should "merge" `C-x C-q` and `e`, indeed, like we do for Dired.
>> Yes, and isn't a buffer-local value for read-only-mode-hook the
>> suitable way to fix that?
I must admit I haven't looked at what the implementation
would/should/could look like.
> For context, I'm asking because I don't think rebinding `C-x C-q`
> to a different command (like in the case of Dired) is as good
> as using the existing hook. It should be much more consistent
> to use the standard facilities of the existing minor mode.
In general, I agree. There are degrees, tho.
E.g. Dired doesn't touch `C-x C-q`, strictly speaking, instead it remaps
`read-only-mode` which is much cleaner already.
But admittedly, looking at the code of `dired-toggle-read-only` I can't
see an obvious technical reason why it couldn't use
`read-only-mode-hook` instead (tho maybe the interaction with
`view-read-only` could be a problem [I'd argue the problem is in
`view-read-only`, tho]). Yet, at the same time changing the minor mode
from within `read-only-mode-hook` doesn't sound super healthy (from
a purely philosophical standpoint, at least), so I think such a change
would probably make more sense if we were to change wdired so it's not
a wholly separate major mode.
> Likewise, I don't think having "-read-only" or "-edit" variations
> of each major mode is a good idea. We can activate and deactivate
> keymaps on the fly right?
Again, I'd tend to agree but I'd have to see the details to be sure.
In the case of Dired the two states are very different (completely
different key-bindings and sets of operations), so while I think the use
of a separate major mode is a historical accident, it's not too bad of
a choice.
In contrast in `diff-mode` I originally didn't even use
a `read-only-mode-hook`; instead I used
`minor-mode-overriding-map-alist` to dynamically activate/deactivate the
key bindings according to the value of `buffer-read-only`.
Stefan
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-29 10:21 ` Dmitry Gutov
@ 2023-09-29 15:20 ` Eli Zaretskii
2023-09-29 17:20 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 15:20 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: ams, joaotavora, monnier, philipk, emacs-devel
> Date: Fri, 29 Sep 2023 13:21:43 +0300
> Cc: ams@gnu.org, joaotavora@gmail.com, monnier@iro.umontreal.ca,
> philipk@posteo.net, emacs-devel@gnu.org
> From: Dmitry Gutov <dmitry@gutov.dev>
>
> >> Correction: C-x v v.
> > That functionality of "C-x v v" is only available for Git (and
> > basically is undocumented), so it's too early to declare victory.
>
> It's available for Git, for Hg (two separate dedicated implementations),
> and for the other VCSes too on best-effort basis (see the function
> vc-default-checkin-patch).
Yes, I found this out by now, thanks. Which makes it even worse that
no documentation of "C-x v v" mentions that, anywhere! (And many
things that "C-x v v" did for years aren't documented, either, sigh.)
We should do better than that.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 12:30 ` Robert Pluim
2023-09-29 13:11 ` Stefan Monnier
@ 2023-09-29 15:30 ` Eli Zaretskii
1 sibling, 0 replies; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 15:30 UTC (permalink / raw)
To: Robert Pluim
Cc: ams, drew.adams, dmitry, joaotavora, philipk, monnier,
emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: "Alfred M. Szmidt" <ams@gnu.org>, drew.adams@oracle.com,
> dmitry@gutov.dev, joaotavora@gmail.com, philipk@posteo.net,
> monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Fri, 29 Sep 2023 14:30:30 +0200
>
> >>>>> On Fri, 29 Sep 2023 13:36:22 +0300, Eli Zaretskii <eliz@gnu.org> said:
>
> >> From: "Alfred M. Szmidt" <ams@gnu.org>
> >> Cc: dmitry@gutov.dev, joaotavora@gmail.com, philipk@posteo.net,
> >> monnier@iro.umontreal.ca, eliz@gnu.org, emacs-devel@gnu.org
> >> Date: Tue, 26 Sep 2023 11:22:20 -0400
> >>
> >> Occur and grep buffers are by default read-only (and there is a
> >> regression in that too
>
> Eli> It is only a "regression" if you still have your muscle memory from 20
> Eli> years ago, since it's when we started making the compilation-mode
> Eli> buffers read-opnly.
>
> "C-x C-q" in an "occur" buffer still leaves some non-useful key
> bindings around, like for "DEL". To usefully edit an "occur" buffer
> you need to run `occur-edit-mode', bound to "e" by default. We could
> fix that wart if we wanted to.
I know that, right? My point was that if the mode doesn't give you a
special-purpose editing sub-mode (like Occur and Dired, etc.), then
"C-x C-q" should do.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-29 12:36 ` Alfred M. Szmidt
@ 2023-09-29 15:32 ` Eli Zaretskii
0 siblings, 0 replies; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 15:32 UTC (permalink / raw)
To: Alfred M. Szmidt; +Cc: dmitry, joaotavora, philipk, monnier, emacs-devel
> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: dmitry@gutov.dev, joaotavora@gmail.com, philipk@posteo.net,
> monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Fri, 29 Sep 2023 08:36:49 -0400
>
> > Please, no. It does not make sense, specially for the case of XPM
> > files, they are fully editable using normal text and making the
> > display the content would make it worse since you loose out of that
> > ability.
>
> This is again your personal preferences speaking,
>
> Are users not allowed to raise a voice for objectional behaviour in
> Emacs?
They are allowed to raise such a voice, but they are much less allowed
to impose their preferences on others where Emacs already have some
useful default behavior and ample possibilities to customize that for
someone who doesn't like the defaults.
> coupled with the
> fact that you aren't using a GUI Emacs frequently enough.
>
> You have no knowledge of that.
I can read, you know. And I understand what I read.
> Once again, this whole discussion thread is completely useless.
>
> Raising objections to behaviour that is annoying is not "completely
> useless".
Raising them once or twice isn't, but keeping pushing for them to be
the only Right Thing is.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 12:36 ` Alfred M. Szmidt
@ 2023-09-29 15:34 ` Eli Zaretskii
2023-09-29 15:40 ` Alfred M. Szmidt
0 siblings, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 15:34 UTC (permalink / raw)
To: Alfred M. Szmidt
Cc: drew.adams, dmitry, joaotavora, philipk, monnier, emacs-devel
> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: drew.adams@oracle.com, dmitry@gutov.dev, joaotavora@gmail.com,
> philipk@posteo.net, monnier@iro.umontreal.ca,
> emacs-devel@gnu.org
> Date: Fri, 29 Sep 2023 08:36:49 -0400
>
> So let's please stop this futile discussion about personal
> preferences. It did nothing except raising the noise level on the
> list by two orders of magnitude.
>
> Can you please stop this condescending tone?
Sorry, no. When a discussion is blown out of proportion and increases
the noise level too much, it is part of my job to step in and try to
lower the noise.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 15:34 ` Eli Zaretskii
@ 2023-09-29 15:40 ` Alfred M. Szmidt
2023-09-29 16:22 ` Eli Zaretskii
0 siblings, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-29 15:40 UTC (permalink / raw)
To: Eli Zaretskii
Cc: drew.adams, dmitry, joaotavora, philipk, monnier, emacs-devel
Up to now, before you bardged, in this discussion was entierly
amicable. You're entierly free to not participate, specially if you
consider yelling at people is somehow being a maintainer, or telling
that their opinions do not matter when they raised them _once_.
^ permalink raw reply [flat|nested] 147+ messages in thread
* RE: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 13:11 ` Stefan Monnier
2023-09-29 13:13 ` Alfred M. Szmidt
2023-09-29 13:16 ` João Távora
@ 2023-09-29 15:47 ` Drew Adams
2 siblings, 0 replies; 147+ messages in thread
From: Drew Adams @ 2023-09-29 15:47 UTC (permalink / raw)
To: Stefan Monnier, Robert Pluim
Cc: Eli Zaretskii, Alfred M. Szmidt, dmitry@gutov.dev,
joaotavora@gmail.com, philipk@posteo.net, emacs-devel@gnu.org
> > "C-x C-q" in an "occur" buffer still leaves some non-useful key
> > bindings around, like for "DEL". To usefully edit an "occur" buffer
> > you need to run `occur-edit-mode', bound to "e" by default. We could
> > fix that wart if we wanted to.
>
> We should "merge" `C-x C-q` and `e`, indeed, like we do for Dired.
+1
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 15:40 ` Alfred M. Szmidt
@ 2023-09-29 16:22 ` Eli Zaretskii
2023-09-29 16:32 ` Alfred M. Szmidt
0 siblings, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 16:22 UTC (permalink / raw)
To: Alfred M. Szmidt
Cc: drew.adams, dmitry, joaotavora, philipk, monnier, emacs-devel
> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: drew.adams@oracle.com, dmitry@gutov.dev, joaotavora@gmail.com,
> philipk@posteo.net, monnier@iro.umontreal.ca,
> emacs-devel@gnu.org
> Date: Fri, 29 Sep 2023 11:40:09 -0400
>
> Up to now, before you bardged, in this discussion was entierly
> amicable.
Not what I saw.
> You're entierly free to not participate, specially if you consider
> yelling at people is somehow being a maintainer, or telling that
> their opinions do not matter when they raised them _once_.
Now you are being unkind, even rude. Are GNU Kind Communications
Guidelines only for others to follow?
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 16:22 ` Eli Zaretskii
@ 2023-09-29 16:32 ` Alfred M. Szmidt
2023-09-29 16:51 ` Eli Zaretskii
0 siblings, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-29 16:32 UTC (permalink / raw)
To: Eli Zaretskii
Cc: drew.adams, dmitry, joaotavora, philipk, monnier, emacs-devel
> You're entierly free to not participate, specially if you consider
> yelling at people is somehow being a maintainer, or telling that
> their opinions do not matter when they raised them _once_.
Now you are being unkind, even rude. Are GNU Kind Communications
Guidelines only for others to follow?
None of the above is unkind or rude. It is pointing out of line
behaviour. So please, kindly, go get an ice cream and talk to you
later, keep the apology for someone else -- we all can have bad days.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 16:32 ` Alfred M. Szmidt
@ 2023-09-29 16:51 ` Eli Zaretskii
2023-09-29 17:32 ` Alfred M. Szmidt
2023-09-29 18:02 ` Stefan Monnier
0 siblings, 2 replies; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 16:51 UTC (permalink / raw)
To: Alfred M. Szmidt
Cc: drew.adams, dmitry, joaotavora, philipk, monnier, emacs-devel
> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: drew.adams@oracle.com, dmitry@gutov.dev, joaotavora@gmail.com,
> philipk@posteo.net, monnier@iro.umontreal.ca,
> emacs-devel@gnu.org
> Date: Fri, 29 Sep 2023 12:32:00 -0400
>
> > You're entierly free to not participate, specially if you consider
> > yelling at people is somehow being a maintainer, or telling that
> > their opinions do not matter when they raised them _once_.
>
> Now you are being unkind, even rude. Are GNU Kind Communications
> Guidelines only for others to follow?
>
> None of the above is unkind or rude.
Yeah, right. Suggest you ask a friend for a second opinion.
> It is pointing out of line behaviour. So please, kindly, go get an
> ice cream and talk to you later, keep the apology for someone else
> -- we all can have bad days.
So being condescending is okay for you, but not for others, I guess.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-29 15:20 ` Eli Zaretskii
@ 2023-09-29 17:20 ` Dmitry Gutov
2023-09-29 17:36 ` Eli Zaretskii
0 siblings, 1 reply; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-29 17:20 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: ams, joaotavora, monnier, philipk, emacs-devel
On 29/09/2023 18:20, Eli Zaretskii wrote:
>> Date: Fri, 29 Sep 2023 13:21:43 +0300
>> Cc: ams@gnu.org, joaotavora@gmail.com, monnier@iro.umontreal.ca,
>> philipk@posteo.net, emacs-devel@gnu.org
>> From: Dmitry Gutov <dmitry@gutov.dev>
>>
>>>> Correction: C-x v v.
>>> That functionality of "C-x v v" is only available for Git (and
>>> basically is undocumented), so it's too early to declare victory.
>>
>> It's available for Git, for Hg (two separate dedicated implementations),
>> and for the other VCSes too on best-effort basis (see the function
>> vc-default-checkin-patch).
>
> Yes, I found this out by now, thanks. Which makes it even worse that
> no documentation of "C-x v v" mentions that, anywhere! (And many
> things that "C-x v v" did for years aren't documented, either, sigh.)
>
> We should do better than that.
We should. But the problem started at the "no feedback" step.
When there is no interest even among the greybeards on this list, why
spend extra effort advertising something untested?
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 16:51 ` Eli Zaretskii
@ 2023-09-29 17:32 ` Alfred M. Szmidt
2023-09-29 17:56 ` Eli Zaretskii
2023-09-29 18:02 ` Stefan Monnier
1 sibling, 1 reply; 147+ messages in thread
From: Alfred M. Szmidt @ 2023-09-29 17:32 UTC (permalink / raw)
To: Eli Zaretskii
Cc: drew.adams, dmitry, joaotavora, philipk, monnier, emacs-devel
So being condescending is okay for you, but not for others, I guess.
I was not condescending. At this point, I expect to get an apology
from you.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-29 17:20 ` Dmitry Gutov
@ 2023-09-29 17:36 ` Eli Zaretskii
2023-09-29 17:44 ` Dmitry Gutov
0 siblings, 1 reply; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 17:36 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: ams, joaotavora, monnier, philipk, emacs-devel
> Date: Fri, 29 Sep 2023 20:20:46 +0300
> Cc: ams@gnu.org, joaotavora@gmail.com, monnier@iro.umontreal.ca,
> philipk@posteo.net, emacs-devel@gnu.org
> From: Dmitry Gutov <dmitry@gutov.dev>
>
> On 29/09/2023 18:20, Eli Zaretskii wrote:
> >> Date: Fri, 29 Sep 2023 13:21:43 +0300
> >> Cc: ams@gnu.org, joaotavora@gmail.com, monnier@iro.umontreal.ca,
> >> philipk@posteo.net, emacs-devel@gnu.org
> >> From: Dmitry Gutov <dmitry@gutov.dev>
> >>
> >>>> Correction: C-x v v.
> >>> That functionality of "C-x v v" is only available for Git (and
> >>> basically is undocumented), so it's too early to declare victory.
> >>
> >> It's available for Git, for Hg (two separate dedicated implementations),
> >> and for the other VCSes too on best-effort basis (see the function
> >> vc-default-checkin-patch).
> >
> > Yes, I found this out by now, thanks. Which makes it even worse that
> > no documentation of "C-x v v" mentions that, anywhere! (And many
> > things that "C-x v v" did for years aren't documented, either, sigh.)
> >
> > We should do better than that.
>
> We should. But the problem started at the "no feedback" step.
>
> When there is no interest even among the greybeards on this list, why
> spend extra effort advertising something untested?
I'm not sure I follow: the undocumented features I had in mind were
released with Emacs 29.1. So if it was untested, why did we release
it?
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: Adding refactoring capabilities to Emacs
2023-09-29 17:36 ` Eli Zaretskii
@ 2023-09-29 17:44 ` Dmitry Gutov
0 siblings, 0 replies; 147+ messages in thread
From: Dmitry Gutov @ 2023-09-29 17:44 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: ams, joaotavora, monnier, philipk, emacs-devel
On 29/09/2023 20:36, Eli Zaretskii wrote:
>> Date: Fri, 29 Sep 2023 20:20:46 +0300
>> Cc:ams@gnu.org,joaotavora@gmail.com,monnier@iro.umontreal.ca,
>> philipk@posteo.net,emacs-devel@gnu.org
>> From: Dmitry Gutov<dmitry@gutov.dev>
>>
>> On 29/09/2023 18:20, Eli Zaretskii wrote:
>>>> Date: Fri, 29 Sep 2023 13:21:43 +0300
>>>> Cc:ams@gnu.org,joaotavora@gmail.com,monnier@iro.umontreal.ca,
>>>> philipk@posteo.net,emacs-devel@gnu.org
>>>> From: Dmitry Gutov<dmitry@gutov.dev>
>>>>
>>>>>> Correction: C-x v v.
>>>>> That functionality of "C-x v v" is only available for Git (and
>>>>> basically is undocumented), so it's too early to declare victory.
>>>> It's available for Git, for Hg (two separate dedicated implementations),
>>>> and for the other VCSes too on best-effort basis (see the function
>>>> vc-default-checkin-patch).
>>> Yes, I found this out by now, thanks. Which makes it even worse that
>>> no documentation of "C-x v v" mentions that, anywhere! (And many
>>> things that "C-x v v" did for years aren't documented, either, sigh.)
>>>
>>> We should do better than that.
>> We should. But the problem started at the "no feedback" step.
>>
>> When there is no interest even among the greybeards on this list, why
>> spend extra effort advertising something untested?
> I'm not sure I follow: the undocumented features I had in mind were
> released with Emacs 29.1. So if it was untested, why did we release
> it?
Same as we do most other new features' interaction with old VCSes (CVS,
RCS, SCCS and the rest of the zoo): they had 9 months to "stabilize".
FWIW, if nobody's using it, it's not hurting anybody either.
Anyway, Juri did test it a little with Bzr, and I - with Hg, before the
latter grew a dedicated implementation, but there was no feedback
regarding any of the others. Would we document it as "definitely works
with Git/Hg, seemingly with Bzr, and probably with some of the others"?
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 17:32 ` Alfred M. Szmidt
@ 2023-09-29 17:56 ` Eli Zaretskii
0 siblings, 0 replies; 147+ messages in thread
From: Eli Zaretskii @ 2023-09-29 17:56 UTC (permalink / raw)
To: Alfred M. Szmidt; +Cc: emacs-devel
> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: drew.adams@oracle.com, dmitry@gutov.dev, joaotavora@gmail.com,
> philipk@posteo.net, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Fri, 29 Sep 2023 13:32:36 -0400
>
> So being condescending is okay for you, but not for others, I guess.
>
> I was not condescending. At this point, I expect to get an apology
> from you.
I see no reason to apologize. I'm just doing my job, according to all
the known good principles.
I have nothing more to say to you in this off-topic sub-sub-thread,
except that you should respect the opinions of the project maintainer
a bit more than you do, even if they seem to contradict yours.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 16:51 ` Eli Zaretskii
2023-09-29 17:32 ` Alfred M. Szmidt
@ 2023-09-29 18:02 ` Stefan Monnier
1 sibling, 0 replies; 147+ messages in thread
From: Stefan Monnier @ 2023-09-29 18:02 UTC (permalink / raw)
To: Eli Zaretskii
Cc: Alfred M. Szmidt, drew.adams, dmitry, joaotavora, philipk,
emacs-devel
Hi Eli,
Just a reminder that in the long run, you're always better off just
leaving a discussion when it becomes unpleasant, rather than try and
convince others that they were unpleasant.
[ I'm even tempted to say that seen from the outside, the one who stops
first is usually the one who was right, to start with. ]
Stefan
Eli Zaretskii [2023-09-29 19:51:47] wrote:
>> From: "Alfred M. Szmidt" <ams@gnu.org>
>> Cc: drew.adams@oracle.com, dmitry@gutov.dev, joaotavora@gmail.com,
>> philipk@posteo.net, monnier@iro.umontreal.ca,
>> emacs-devel@gnu.org
>> Date: Fri, 29 Sep 2023 12:32:00 -0400
>>
>> > You're entierly free to not participate, specially if you consider
>> > yelling at people is somehow being a maintainer, or telling that
>> > their opinions do not matter when they raised them _once_.
>>
>> Now you are being unkind, even rude. Are GNU Kind Communications
>> Guidelines only for others to follow?
>>
>> None of the above is unkind or rude.
>
> Yeah, right. Suggest you ask a friend for a second opinion.
>
>> It is pointing out of line behaviour. So please, kindly, go get an
>> ice cream and talk to you later, keep the apology for someone else
>> -- we all can have bad days.
>
> So being condescending is okay for you, but not for others, I guess.
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-09-29 15:20 ` Stefan Monnier
@ 2023-10-01 12:07 ` Stefan Kangas
2023-10-01 18:43 ` Howard Melman
0 siblings, 1 reply; 147+ messages in thread
From: Stefan Kangas @ 2023-10-01 12:07 UTC (permalink / raw)
To: Stefan Monnier, João Távora
Cc: Robert Pluim, Eli Zaretskii, Alfred M. Szmidt, drew.adams, dmitry,
philipk, emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>>> > We should "merge" `C-x C-q` and `e`, indeed, like we do for Dired.
>>> Yes, and isn't a buffer-local value for read-only-mode-hook the
>>> suitable way to fix that?
>
> I must admit I haven't looked at what the implementation
> would/should/could look like.
>
>> For context, I'm asking because I don't think rebinding `C-x C-q`
>> to a different command (like in the case of Dired) is as good
>> as using the existing hook. It should be much more consistent
>> to use the standard facilities of the existing minor mode.
>
> In general, I agree. There are degrees, tho.
> E.g. Dired doesn't touch `C-x C-q`, strictly speaking, instead it remaps
> `read-only-mode` which is much cleaner already.
Agreed. But until someone cleans that up, perhaps we're already making
progress if we install this simple change?
diff --git a/lisp/replace.el b/lisp/replace.el
index 6b06e48c384..b40843da141 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -1315,6 +1315,7 @@ occur-mode-map
(define-key map "r" 'occur-rename-buffer)
(define-key map "c" 'clone-buffer)
(define-key map "\C-c\C-f" 'next-error-follow-minor-mode)
+ (define-key map [remap read-only-mode] #'occur-edit-mode)
(bindings--define-key map [menu-bar occur] (cons "Occur" occur-menu-map))
map)
"Keymap for `occur-mode'.")
^ permalink raw reply related [flat|nested] 147+ messages in thread
* Extract to new definition (was: Adding refactoring capabilities to Emacs)
2023-09-08 13:18 ` Eshel Yaron
@ 2023-10-01 15:07 ` Eshel Yaron
0 siblings, 0 replies; 147+ messages in thread
From: Eshel Yaron @ 2023-10-01 15:07 UTC (permalink / raw)
To: João Távora
Cc: Eli Zaretskii, Philip K., Dmitry Gutov, Stefan Monnier,
emacs-devel
Hi,
>> ...can you, say, extract subexpressions to variables, organize
>> imports, etc?
>
> Yes, there are some other things already in place, like updating imports
> and adding exports. I have a work-in-progress implementation for
> extracting subexpressions (subterms, in Prolog), but nothing in terms of
> existing commands.
Since writing this message, I've added that "extract" command to
`sweeprolog`. I'm still working on some final tweaks, but I'm pretty
happy with the result so I thought I'd share some details and insights.
The new command is called `sweeprolog-extract-region-to-predicate`. You
call it with point and mark surrounding some code inside one definition
that you want to extract to a new, separate definition. You do this
either because you want to reuse this piece of computation somewhere
else or simply to break a large complicated definition into smaller
parts. For example, with the following code in a `sweeprolog-mode`
buffer, where ^ and $ denote the region:
--8<---------------cut here---------------start------------->8---
foo(X, Y, Z) :-
^bar1(X,A), bar2(A,B), bar3(C,Y)$,
baz(Y,Z).
--8<---------------cut here---------------end--------------->8---
Typing `M-x sweeprolog-extract-region-to-predicate RET bar RET` yields:
--8<---------------cut here---------------start------------->8---
foo(X, Y, Z) :-
bar(X,Y),
baz(Y,Z).
bar(X, Y) :-
bar1(X,A), bar2(A,B), bar3(C,Y).
--8<---------------cut here---------------end--------------->8---
The complex goal (expression) with `bar1`, `bar2` and `bar3` makes way
for a single call to `bar`, while a definition of `bar` is created in
the current buffer. Crucially, this command analyzes the selected goal
and its context to determine how many and which arguments the new
definition should have.
In the simplest case, you mark a piece of code, call the command, it
prompts you for the name of the new definition, and performs the
extraction at once. There are, however, some subtleties to consider:
- The selection may be invalid. Invalid means that the contents of the
region do not constitute a valid Prolog goal, that's a clear user
error, so this command complains and bails.
- Some extraction operations are unsafe. Unsafe means that extracting
the selected piece of code may change the semantics of the program.
(Un)safety is very language-specific, and it's more difficult to
determine than validity, since safety is a semantic property while
validity is syntactic. For Prolog, extracting a goal that contains a
"cut" can have a semantic effect, because the "cut" operates on the
defintion in which it occurs. In fact, it's not generally decidable
whether extraction will have an affect on the semantics of the program
or not. That's why `sweeprolog-extract-region-to-predicate` asks for
confirmation if it can't be certain that extracting the specified goal
preserves the semantics of the surrounding code.
- The name you give to the new definition might already be in use.
That's something `sweeprolog-extract-region-to-predicate` does not
currently protect you from, but I intend to address that soon.
Ideally, the command should detect this collision early, and bail or
ask for confirmation before changing the buffer.
My hope is that when we get that generic refactoring interface in Emacs,
it'll support these distinctions and handle them appropriately.
This command also has an extension on top of the basic local extraction
operation: If you call it with a prefix argument, then after performing
the extraction as usual, it searches the current buffer for other goals
that the extracted goal subsumes, and suggests replacing them one after
the other with calls to the newly defined predicate with appropriate
arguments. This is useful when you have several occurrences of some
complex idiom scattered around that you want to extract to a stand alone
definition.
In terms of user interface, there's also a user option that says where
to insert the new definition, and that's about it.
(A couple more details are mentioned in the manual:
https://eshelyaron.com/man/sweep/Extract-Goal.html)
Best,
Eshel
^ permalink raw reply [flat|nested] 147+ messages in thread
* Re: [External] : Re: Adding refactoring capabilities to Emacs
2023-10-01 12:07 ` Stefan Kangas
@ 2023-10-01 18:43 ` Howard Melman
0 siblings, 0 replies; 147+ messages in thread
From: Howard Melman @ 2023-10-01 18:43 UTC (permalink / raw)
To: emacs-devel
Stefan Kangas <stefankangas@gmail.com> writes:
>> In general, I agree. There are degrees, tho.
>> E.g. Dired doesn't touch `C-x C-q`, strictly speaking, instead it remaps
>> `read-only-mode` which is much cleaner already.
>
> Agreed. But until someone cleans that up, perhaps we're already making
> progress if we install this simple change?
I'm all for progress via simple changes.
FWIW, Emacs bug#16214 has a bunch more on the
inconsistencies of wdired, woccur, and wgrep.
--
Howard
^ permalink raw reply [flat|nested] 147+ messages in thread
end of thread, other threads:[~2023-10-01 18:43 UTC | newest]
Thread overview: 147+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-19 6:03 Adding refactoring capabilities to Emacs Eli Zaretskii
2023-08-19 10:58 ` Eshel Yaron
2023-08-19 11:18 ` Eli Zaretskii
2023-08-20 1:19 ` Dmitry Gutov
2023-08-20 6:39 ` Eli Zaretskii
2023-08-20 6:42 ` Ihor Radchenko
2023-08-20 8:44 ` Yuri Khan
2023-08-20 22:51 ` Dmitry Gutov
2023-08-29 10:53 ` João Távora
2023-08-29 11:35 ` Dr. Arne Babenhauserheide
2023-08-30 0:52 ` Dmitry Gutov
2023-08-30 18:46 ` Stefan Kangas
2023-08-30 19:59 ` Dmitry Gutov
2023-08-30 20:37 ` João Távora
2023-08-30 21:49 ` Dmitry Gutov
2023-08-30 22:01 ` Stefan Kangas
2023-08-30 22:04 ` Dmitry Gutov
2023-09-04 6:03 ` Rudolf Schlatte
2023-09-04 11:04 ` João Távora
2023-09-04 12:18 ` Rudolf Schlatte
2023-08-31 5:03 ` Eli Zaretskii
2023-08-31 8:02 ` João Távora
2023-09-04 15:45 ` Dmitry Gutov
2023-09-04 23:34 ` Dmitry Gutov
2023-09-04 17:23 ` Juri Linkov
2023-09-04 17:53 ` Alfred M. Szmidt
2023-09-05 6:38 ` Juri Linkov
2023-09-05 7:46 ` Alfred M. Szmidt
2023-09-04 18:04 ` Dmitry Gutov
2023-09-05 6:43 ` Juri Linkov
2023-09-04 20:49 ` Philip Kaludercic
2023-09-04 17:15 ` Juri Linkov
2023-09-04 18:02 ` Dmitry Gutov
2023-09-05 13:56 ` Alexander Adolf
2023-09-05 14:00 ` Dmitry Gutov
2023-09-06 13:25 ` Alexander Adolf
2023-08-20 13:00 ` sbaugh
2023-09-07 14:39 ` João Távora
2023-09-07 16:20 ` Stefan Monnier
2023-09-07 16:49 ` João Távora
2023-09-07 17:06 ` Stefan Monnier
2023-09-07 17:24 ` João Távora
2023-09-07 17:54 ` Stefan Monnier
2023-09-07 18:12 ` João Távora
2023-09-07 21:56 ` Stefan Monnier
2023-09-07 23:46 ` Lynn Winebarger
2023-09-07 20:41 ` Dmitry Gutov
2023-09-07 22:03 ` Stefan Monnier
2023-09-07 22:43 ` Dmitry Gutov
2023-09-07 22:18 ` João Távora
2023-09-07 22:39 ` Dmitry Gutov
2023-09-08 6:18 ` Eli Zaretskii
2023-09-08 18:25 ` Dmitry Gutov
2023-09-08 18:35 ` João Távora
2023-09-08 18:38 ` Dmitry Gutov
2023-09-08 18:44 ` João Távora
2023-09-08 19:29 ` Dmitry Gutov
2023-09-08 18:57 ` Eli Zaretskii
2023-09-08 19:01 ` João Távora
2023-09-08 6:55 ` João Távora
2023-09-08 15:42 ` Stefan Monnier
2023-09-08 16:05 ` João Távora
2023-09-08 16:20 ` João Távora
2023-09-25 23:11 ` Dmitry Gutov
2023-09-25 23:32 ` Dmitry Gutov
2023-09-26 5:36 ` Alfred M. Szmidt
2023-09-26 8:06 ` João Távora
2023-09-26 10:57 ` Dmitry Gutov
2023-09-26 11:24 ` João Távora
2023-09-26 11:33 ` Alfred M. Szmidt
2023-09-26 11:34 ` Dmitry Gutov
2023-09-26 12:57 ` João Távora
2023-09-26 13:09 ` Alfred M. Szmidt
2023-09-26 13:52 ` Dmitry Gutov
2023-09-26 13:38 ` Philip Kaludercic
2023-09-26 14:06 ` João Távora
2023-09-26 14:31 ` Dmitry Gutov
2023-09-26 14:51 ` João Távora
2023-09-26 14:54 ` Dmitry Gutov
2023-09-26 15:17 ` João Távora
2023-09-26 15:35 ` Alfred M. Szmidt
2023-09-26 15:38 ` Dmitry Gutov
2023-09-26 15:47 ` Alfred M. Szmidt
2023-09-26 16:01 ` Dmitry Gutov
2023-09-26 16:10 ` Alfred M. Szmidt
2023-09-29 10:55 ` Eli Zaretskii
2023-09-29 12:36 ` Alfred M. Szmidt
2023-09-29 15:32 ` Eli Zaretskii
2023-09-26 16:31 ` Yuri Khan
2023-09-26 17:28 ` Dmitry Gutov
2023-09-29 11:10 ` Eli Zaretskii
2023-09-29 10:49 ` Eli Zaretskii
2023-09-29 12:36 ` Alfred M. Szmidt
2023-09-26 15:01 ` [External] : " Drew Adams
2023-09-26 15:22 ` Alfred M. Szmidt
2023-09-29 10:36 ` Eli Zaretskii
2023-09-29 12:30 ` Robert Pluim
2023-09-29 13:11 ` Stefan Monnier
2023-09-29 13:13 ` Alfred M. Szmidt
2023-09-29 13:16 ` João Távora
2023-09-29 13:19 ` João Távora
2023-09-29 15:20 ` Stefan Monnier
2023-10-01 12:07 ` Stefan Kangas
2023-10-01 18:43 ` Howard Melman
2023-09-29 15:47 ` Drew Adams
2023-09-29 15:30 ` Eli Zaretskii
2023-09-26 15:27 ` Alfred M. Szmidt
2023-09-29 10:40 ` Eli Zaretskii
2023-09-29 12:36 ` Alfred M. Szmidt
2023-09-29 15:34 ` Eli Zaretskii
2023-09-29 15:40 ` Alfred M. Szmidt
2023-09-29 16:22 ` Eli Zaretskii
2023-09-29 16:32 ` Alfred M. Szmidt
2023-09-29 16:51 ` Eli Zaretskii
2023-09-29 17:32 ` Alfred M. Szmidt
2023-09-29 17:56 ` Eli Zaretskii
2023-09-29 18:02 ` Stefan Monnier
2023-09-26 10:55 ` Dmitry Gutov
2023-09-26 12:03 ` Alfred M. Szmidt
2023-09-26 12:11 ` Dmitry Gutov
2023-09-26 12:20 ` Alfred M. Szmidt
2023-09-29 6:52 ` Eli Zaretskii
2023-09-29 10:21 ` Dmitry Gutov
2023-09-29 15:20 ` Eli Zaretskii
2023-09-29 17:20 ` Dmitry Gutov
2023-09-29 17:36 ` Eli Zaretskii
2023-09-29 17:44 ` Dmitry Gutov
2023-09-08 18:35 ` Dmitry Gutov
[not found] ` <CALDnm52Wtat24JFu=o6m_eJVamub+1H1BxNd5eELQ2j--7OetA@mail.gmail.com>
[not found] ` <da4cb294-39eb-c4a1-a625-da5ee183170c@gutov.dev>
2023-09-08 18:57 ` João Távora
2023-09-07 19:06 ` Felician Nemeth
2023-09-07 19:19 ` João Távora
2023-09-07 19:25 ` Ihor Radchenko
2023-09-07 19:28 ` Ihor Radchenko
2023-09-07 22:14 ` João Távora
2023-09-07 20:43 ` Dmitry Gutov
2023-09-07 22:39 ` Dmitry Gutov
2023-09-08 11:10 ` João Távora
2023-09-08 22:35 ` Dmitry Gutov
2023-09-08 23:17 ` João Távora
2023-09-08 12:46 ` Eshel Yaron
2023-09-08 12:52 ` João Távora
2023-09-08 13:18 ` Eshel Yaron
2023-10-01 15:07 ` Extract to new definition (was: Adding refactoring capabilities to Emacs) Eshel Yaron
2023-09-08 13:30 ` [semi off topic] grep-based refactoring [was: Adding refactoring capabilities to Emacs] tomas
2023-09-08 17:53 ` João Távora
2023-09-08 18:24 ` Dmitry Gutov
2023-09-08 18:51 ` tomas
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).