unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* next-error use cases
@ 2018-04-07 21:47 Juri Linkov
  2018-04-08 13:48 ` Eli Zaretskii
  2018-04-12 20:27 ` Juri Linkov
  0 siblings, 2 replies; 44+ messages in thread
From: Juri Linkov @ 2018-04-07 21:47 UTC (permalink / raw)
  To: emacs-devel

Several bug reports such as bug#20489 and bug#30674 revolve around
the uncertainty caused by unclear requirements for the next-error framework.
It would be helpful to identify possible scenarios to get a clearer picture of
what it's supposed to do.

The cornerstone of the whole feature is the function next-error-find-buffer
that returns a next-error capable buffer that defines next-error-function
to navigate to the next location.

Most fallbacks in next-error-find-buffer are fine in case the first condition
fails, but the main question is about the first condition itself: What is the
best default behavior for it?  What other useful options it should provide?
What context should be used to select the right next-error-function buffer.

There are several alternatives of what buffer with next-error-function
should be selected after running next-error:

1. last next-error-function used anywhere globally
Pros: context-free, thus easier to understand
Cons: not WYSIWYG, i.e. in some cases produces unexpected results:
      for example, after switching to another next-error-function buffer
      will still continue the previous navigation from the hidden buffer
      with last used next-error-function

2. next-error-function found in the current buffer
Cons: unexpected results when navigation visits another buffer with next-error-function,
      e.g. when a ChangeLog file is visited by next-error from the *grep* buffer,
      the next next-error should continue visiting grep hits, not ChangeLog entries.
      (But when a next-error navigation never visited a next-error-function buffer, then
      running `next-error' in a next-error-function buffer should use it unconditionally,
      e.g. switching to a *compilation* buffer and running next-error should use it.)

3. next-error-function that visited the current buffer,
   i.e. buffer-local value of next-error-last-buffer remembers the last used
   next-error-function buffer in each visited buffer, and uses it for the next
   next-error.
Cons: unexpected results when the same buffer is visited in different windows
      from different next-error-function buffers

4. next-error-function that visited the buffer in the selected window
Pros: window-based logic gives more expected results

5. buffer with next-error-function visible in one of adjacent windows on the same frame
Pros: WYSIWYG
Cons: ambiguous when there are more than one window with next-error-function on the frame

What complicates matter more is that the value of next-error-function might
come from the same buffer where navigation occurs, i.e. unlike these cases
where next-error-function is defined in a special separate buffer:

compilation-next-error-function
xref--next-error-function
occur-next-error
change-log-next-error
diff-next-error

next-error-function can be defined in the same buffer, for example for:

flymake-goto-next-error
flyspell-goto-next-error

where the list of locations comes from the same buffer where next-error
navigates.

So the question is how one buffer can provide many next-error functions
by such different major/minor modes (flymake, flyspell) enabled in it
at the same time?



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

* Re: next-error use cases
  2018-04-07 21:47 next-error use cases Juri Linkov
@ 2018-04-08 13:48 ` Eli Zaretskii
  2018-04-08 19:56   ` Juri Linkov
  2018-04-08 20:36   ` Dmitry Gutov
  2018-04-12 20:27 ` Juri Linkov
  1 sibling, 2 replies; 44+ messages in thread
From: Eli Zaretskii @ 2018-04-08 13:48 UTC (permalink / raw)
  To: Juri Linkov; +Cc: emacs-devel

> From: Juri Linkov <juri@linkov.net>
> Date: Sun, 08 Apr 2018 00:47:42 +0300
> 
> So the question is how one buffer can provide many next-error functions
> by such different major/minor modes (flymake, flyspell) enabled in it
> at the same time?

Define some kind of priority between them?  And if two or more
functions have the same priority, ask the user?



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

* Re: next-error use cases
  2018-04-08 13:48 ` Eli Zaretskii
@ 2018-04-08 19:56   ` Juri Linkov
  2018-04-08 20:26     ` Clément Pit-Claudel
  2018-04-08 20:36   ` Dmitry Gutov
  1 sibling, 1 reply; 44+ messages in thread
From: Juri Linkov @ 2018-04-08 19:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

>> So the question is how one buffer can provide many next-error functions
>> by such different major/minor modes (flymake, flyspell) enabled in it
>> at the same time?
>
> Define some kind of priority between them?  And if two or more
> functions have the same priority, ask the user?

We could try to define priorities by ‘add-function’.



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

* Re: next-error use cases
  2018-04-08 19:56   ` Juri Linkov
@ 2018-04-08 20:26     ` Clément Pit-Claudel
  2018-04-08 20:35       ` Dmitry Gutov
  2018-04-09  2:24       ` Eli Zaretskii
  0 siblings, 2 replies; 44+ messages in thread
From: Clément Pit-Claudel @ 2018-04-08 20:26 UTC (permalink / raw)
  To: emacs-devel

On 2018-04-08 15:56, Juri Linkov wrote:
>>> So the question is how one buffer can provide many next-error functions
>>> by such different major/minor modes (flymake, flyspell) enabled in it
>>> at the same time?
>>
>> Define some kind of priority between them?  And if two or more
>> functions have the same priority, ask the user?
> 
> We could try to define priorities by ‘add-function’.

Or we could query all backends and go to the closest location.  It would match with what the user sees on the screen: if I have a flyspell underline followed by a FlyCheck error, it would visit one then the other.



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

* Re: next-error use cases
  2018-04-08 20:26     ` Clément Pit-Claudel
@ 2018-04-08 20:35       ` Dmitry Gutov
  2018-04-10  4:19         ` Stephen Leake
  2018-04-09  2:24       ` Eli Zaretskii
  1 sibling, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2018-04-08 20:35 UTC (permalink / raw)
  To: Clément Pit-Claudel, emacs-devel

On 4/8/18 11:26 PM, Clément Pit-Claudel wrote:

> Or we could query all backends and go to the closest location.  It would match with what the user sees on the screen: if I have a flyspell underline followed by a FlyCheck error, it would visit one then the other.

I'm afraid that won't match the user's intention: if I just run Grep, I 
probably want to jump between its results, and not between Flyspell markers.




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

* Re: next-error use cases
  2018-04-08 13:48 ` Eli Zaretskii
  2018-04-08 19:56   ` Juri Linkov
@ 2018-04-08 20:36   ` Dmitry Gutov
  2018-04-09 14:48     ` Eli Zaretskii
  1 sibling, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2018-04-08 20:36 UTC (permalink / raw)
  To: Eli Zaretskii, Juri Linkov; +Cc: emacs-devel

On 4/8/18 4:48 PM, Eli Zaretskii wrote:
>> From: Juri Linkov <juri@linkov.net>
>> Date: Sun, 08 Apr 2018 00:47:42 +0300
>>
>> So the question is how one buffer can provide many next-error functions
>> by such different major/minor modes (flymake, flyspell) enabled in it
>> at the same time?
> 
> Define some kind of priority between them?
I really doubt we can define priorities such that the user will always 
want to see the errors of some "kind" before the others.



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

* Re: next-error use cases
  2018-04-08 20:26     ` Clément Pit-Claudel
  2018-04-08 20:35       ` Dmitry Gutov
@ 2018-04-09  2:24       ` Eli Zaretskii
  1 sibling, 0 replies; 44+ messages in thread
From: Eli Zaretskii @ 2018-04-09  2:24 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

> From: Clément Pit-Claudel <cpitclaudel@gmail.com>
> Date: Sun, 8 Apr 2018 16:26:59 -0400
> 
> > We could try to define priorities by ‘add-function’.
> 
> Or we could query all backends and go to the closest location.  It would match with what the user sees on the screen: if I have a flyspell underline followed by a FlyCheck error, it would visit one then the other.

I don't think "closest location" is a reliable indicator in this
case.  next-error exists to go to the next/previous locus, which could
be far away.




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

* Re: next-error use cases
  2018-04-08 20:36   ` Dmitry Gutov
@ 2018-04-09 14:48     ` Eli Zaretskii
  2018-04-09 18:44       ` Charles A. Roelli
  2018-04-10 23:06       ` Dmitry Gutov
  0 siblings, 2 replies; 44+ messages in thread
From: Eli Zaretskii @ 2018-04-09 14:48 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: emacs-devel, juri

> From: Dmitry Gutov <dgutov@yandex.ru>
> Date: Sun, 8 Apr 2018 23:36:37 +0300
> Cc: emacs-devel@gnu.org
> 
> > Define some kind of priority between them?
> I really doubt we can define priorities such that the user will always 
> want to see the errors of some "kind" before the others.

Then maybe this problem has no workable solution at all, and we
shouldn't try running all those features from the same command.



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

* Re: next-error use cases
  2018-04-09 14:48     ` Eli Zaretskii
@ 2018-04-09 18:44       ` Charles A. Roelli
  2018-04-09 20:47         ` Juri Linkov
  2018-04-10 23:06       ` Dmitry Gutov
  1 sibling, 1 reply; 44+ messages in thread
From: Charles A. Roelli @ 2018-04-09 18:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: juri, emacs-devel, dgutov

> Date: Mon, 09 Apr 2018 17:48:20 +0300
> From: Eli Zaretskii <eliz@gnu.org>
>
> > > Define some kind of priority between them?
> > I really doubt we can define priorities such that the user will always 
> > want to see the errors of some "kind" before the others.
> 
> Then maybe this problem has no workable solution at all, and we
> shouldn't try running all those features from the same command.

We could try, but in cases of doubt, ask the user what "next-error"
function he wants to use (and provide some command for actively
switching between them).  For example, after calling "next-error" in
some dubious case, the user could be offered a list of functions to
choose between:

- next Compile error from *compile*<dir>
- next Occur result from *scratch*
- next Grep result from *grep*<dir2>
...

There could also be other interfaces to pick a next-error function (a
menu, or something like M-x list-buffers).



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

* Re: next-error use cases
  2018-04-09 18:44       ` Charles A. Roelli
@ 2018-04-09 20:47         ` Juri Linkov
  2018-04-10  4:24           ` Stephen Leake
  0 siblings, 1 reply; 44+ messages in thread
From: Juri Linkov @ 2018-04-09 20:47 UTC (permalink / raw)
  To: Charles A. Roelli; +Cc: Eli Zaretskii, emacs-devel, dgutov

>> > > Define some kind of priority between them?
>> > I really doubt we can define priorities such that the user will always
>> > want to see the errors of some "kind" before the others.
>>
>> Then maybe this problem has no workable solution at all, and we
>> shouldn't try running all those features from the same command.
>
> We could try, but in cases of doubt, ask the user what "next-error"
> function he wants to use (and provide some command for actively
> switching between them).  For example, after calling "next-error" in
> some dubious case, the user could be offered a list of functions to
> choose between:
>
> - next Compile error from *compile*<dir>
> - next Occur result from *scratch*
> - next Grep result from *grep*<dir2>
> ...

Answering this after every next-error command would be too tedious for users,
and it's not clear how to reduce the frequency of such questions, i.e.
how to detect only dubious cases.

> There could also be other interfaces to pick a next-error function (a
> menu, or something like M-x list-buffers).

Recently we created such command with the name ‘next-error-select-buffer’.
Still too inconvenient for users to run this command explicitly.
We need next-error to be more DWIM.



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

* Re: next-error use cases
  2018-04-08 20:35       ` Dmitry Gutov
@ 2018-04-10  4:19         ` Stephen Leake
  2018-04-10 14:28           ` Drew Adams
  0 siblings, 1 reply; 44+ messages in thread
From: Stephen Leake @ 2018-04-10  4:19 UTC (permalink / raw)
  To: emacs-devel

Dmitry Gutov <dgutov@yandex.ru> writes:

> On 4/8/18 11:26 PM, Clément Pit-Claudel wrote:
>
>> Or we could query all backends and go to the closest location. It
>> would match with what the user sees on the screen: if I have a
>> flyspell underline followed by a FlyCheck error, it would visit one
>> then the other.
>
> I'm afraid that won't match the user's intention: if I just run Grep,
> I probably want to jump between its results, and not between Flyspell
> markers.

+1. I often have several compilation-mode buffers active (one from a
compile, one from a cross-reference tool, one from grep), and I expect
next-error to use the one I last chose.

I chose one by visiting the buffer, and using <ret> to go to an error.

So just be sure the user has a way to indicate which buffer/location
list is "current".

-- 
-- Stephe



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

* Re: next-error use cases
  2018-04-09 20:47         ` Juri Linkov
@ 2018-04-10  4:24           ` Stephen Leake
  2018-04-10 20:06             ` Juri Linkov
  0 siblings, 1 reply; 44+ messages in thread
From: Stephen Leake @ 2018-04-10  4:24 UTC (permalink / raw)
  To: emacs-devel

Juri Linkov <juri@linkov.net> writes:

>>> > > Define some kind of priority between them?
>>> > I really doubt we can define priorities such that the user will always
>>> > want to see the errors of some "kind" before the others.
>>>
>>> Then maybe this problem has no workable solution at all, and we
>>> shouldn't try running all those features from the same command.
>>
>> We could try, but in cases of doubt, ask the user what "next-error"
>> function he wants to use (and provide some command for actively
>> switching between them).  For example, after calling "next-error" in
>> some dubious case, the user could be offered a list of functions to
>> choose between:
>>
>> - next Compile error from *compile*<dir>
>> - next Occur result from *scratch*
>> - next Grep result from *grep*<dir2>
>> ...
>
> Answering this after every next-error command would be too tedious for users,
> and it's not clear how to reduce the frequency of such questions, i.e.
> how to detect only dubious cases.
>
>> There could also be other interfaces to pick a next-error function (a
>> menu, or something like M-x list-buffers).
>
> Recently we created such command with the name ‘next-error-select-buffer’.
> Still too inconvenient for users to run this command explicitly.
> We need next-error to be more DWIM.

That's what 'compilation-last-buffer' is for; it indicates the buffer
containing the location list that is current.

As long as the user has a convenient way to set that, there's no
problem. In all my current use cases, it is first set by the command
that generated the location list. I can reset it by navigating to a
buffer, and using <return> to goto a location; after that, 'next-error'
continues using that list.

-- 
-- Stephe



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

* RE: next-error use cases
  2018-04-10  4:19         ` Stephen Leake
@ 2018-04-10 14:28           ` Drew Adams
  0 siblings, 0 replies; 44+ messages in thread
From: Drew Adams @ 2018-04-10 14:28 UTC (permalink / raw)
  To: Stephen Leake, emacs-devel

> just be sure the user has a way to indicate which buffer/location
> list is "current".

+1.  Any "handy DWIM" needs to also give users an easy
way to control things when they want to.

Smart software doesn't think it is smarter than its user
or that she never wants to express her will on the fly.



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

* Re: next-error use cases
  2018-04-10  4:24           ` Stephen Leake
@ 2018-04-10 20:06             ` Juri Linkov
       [not found]               ` <86woxe1l0l.fsf@stephe-leake.org>
  0 siblings, 1 reply; 44+ messages in thread
From: Juri Linkov @ 2018-04-10 20:06 UTC (permalink / raw)
  To: Stephen Leake; +Cc: emacs-devel

>> Recently we created such command with the name ‘next-error-select-buffer’.
>> Still too inconvenient for users to run this command explicitly.
>> We need next-error to be more DWIM.
>
> That's what 'compilation-last-buffer' is for; it indicates the buffer
> containing the location list that is current.

I don't understand what do you mean by indication?  Is it a visual
indication somewhere?  I grepped for 'compilation-last-buffer', but in
compile.el 'compilation-last-buffer' is an alias for 'next-error-last-buffer',
and grep.el contains commented out definition whose purpose I don't know:

  ;;;; TODO --- refine this!!
  ;; (defcustom grep-use-compilation-buffer t
  ;;   "When non-nil, grep specific commands update `compilation-last-buffer'.
  ;; This means that standard compile commands like \\[next-error] and \\[compile-goto-error]
  ;; can be used to navigate between grep matches (the default).
  ;; Otherwise, the grep specific commands like \\[grep-next-match] must
  ;; be used to navigate between grep matches."
  ;;   :type 'boolean
  ;;   :group 'grep)
  ;; override compilation-last-buffer
  (defvar grep-last-buffer nil
    "The most recent grep buffer.
  A grep buffer becomes most recent when you select Grep mode in it.
  Notice that using \\[next-error] or \\[compile-goto-error] modifies
  `compilation-last-buffer' rather than `grep-last-buffer'.")

> As long as the user has a convenient way to set that, there's no
> problem. In all my current use cases, it is first set by the command
> that generated the location list. I can reset it by navigating to a
> buffer, and using <return> to goto a location; after that, 'next-error'
> continues using that list.

But how can you reset it when the location list is in the same buffer
like in case of flyspell where locations of misspelled words are
in the same buffer where next-error navigates, or flymake where
locations of errors/warnings are in the same buffer?



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

* Re: next-error use cases
  2018-04-09 14:48     ` Eli Zaretskii
  2018-04-09 18:44       ` Charles A. Roelli
@ 2018-04-10 23:06       ` Dmitry Gutov
  1 sibling, 0 replies; 44+ messages in thread
From: Dmitry Gutov @ 2018-04-10 23:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, juri

On 4/9/18 5:48 PM, Eli Zaretskii wrote:
>> From: Dmitry Gutov <dgutov@yandex.ru>
>> Date: Sun, 8 Apr 2018 23:36:37 +0300
>> Cc: emacs-devel@gnu.org
>>
>>> Define some kind of priority between them?
>> I really doubt we can define priorities such that the user will always
>> want to see the errors of some "kind" before the others.
> 
> Then maybe this problem has no workable solution at all, and we
> shouldn't try running all those features from the same command.

We already do, though. So far we've come up with a manual switching 
solution (see next-error-select-buffer in master), and it's fine to a 
degree.

Having Flymake and Flyspell use the same mechanism shows its 
inefficiencies, however, so that's what I think this discussion is 
mostly about.



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

* Re: next-error use cases
       [not found]               ` <86woxe1l0l.fsf@stephe-leake.org>
@ 2018-04-11  7:29                 ` Dmitry Gutov
  2018-04-11 20:46                   ` Juri Linkov
  2018-04-12 15:25                   ` Stephen Leake
  0 siblings, 2 replies; 44+ messages in thread
From: Dmitry Gutov @ 2018-04-11  7:29 UTC (permalink / raw)
  To: Stephen Leake, emacs-devel

On 4/11/18 6:26 AM, Stephen Leake wrote:

>> But how can you reset it when the location list is in the same buffer
>> like in case of flyspell where locations of misspelled words are
>> in the same buffer where next-error navigates, or flymake where
>> locations of errors/warnings are in the same buffer?
> 
> Position point on an error message, hit enter.

The error message is usually visible only in the minibuffer, and only 
when point is over the error.



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

* Re: next-error use cases
  2018-04-11  7:29                 ` Dmitry Gutov
@ 2018-04-11 20:46                   ` Juri Linkov
  2018-04-12 15:31                     ` Stephen Leake
  2018-04-12 15:25                   ` Stephen Leake
  1 sibling, 1 reply; 44+ messages in thread
From: Juri Linkov @ 2018-04-11 20:46 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Stephen Leake, emacs-devel

>>> But how can you reset it when the location list is in the same buffer
>>> like in case of flyspell where locations of misspelled words are
>>> in the same buffer where next-error navigates, or flymake where
>>> locations of errors/warnings are in the same buffer?
>>
>> Position point on an error message, hit enter.
>
> The error message is usually visible only in the minibuffer, and only when
> point is over the error.

If it's impossible to reset it by hitting enter, then I think we have
only these remaining options:

1. If next-error can't work without the requirement to have a list of
Flyspell mistakes or Flycheck/Flymake errors/warnings printed in a separate
buffer (like "*Occur*"), then such buffer can be possibly implemented
as a hidden buffer with a leading space in its name like for example
" *Flycheck locations*".  ‘next-error-select-buffer’ still should
propose it as a candidate for selection.

2. Flycheck provides its own keybinding ‘C-c ! n’ for ‘flycheck-next-error’
that can be used to reset the navigation.  There are also analogous functions
‘flymake-goto-next-error’ and ‘flyspell-goto-next-error’.

3. Maybe providing only the command next-error-select-buffer to switch
the current navigation is enough even in case when next-error-function
is defined in the same buffer that will be proposed as a candidate.

4. Otherwise, if all else fails, try harder to use visibility as DWIM,
i.e. hide all other navigation windows to start using Flycheck
navigation from the current buffer.



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

* Re: next-error use cases
  2018-04-11  7:29                 ` Dmitry Gutov
  2018-04-11 20:46                   ` Juri Linkov
@ 2018-04-12 15:25                   ` Stephen Leake
  2018-04-12 16:51                     ` Dmitry Gutov
  1 sibling, 1 reply; 44+ messages in thread
From: Stephen Leake @ 2018-04-12 15:25 UTC (permalink / raw)
  To: emacs-devel

Dmitry Gutov <dgutov@yandex.ru> writes:

> On 4/11/18 6:26 AM, Stephen Leake wrote:
>
>>> But how can you reset it when the location list is in the same buffer
>>> like in case of flyspell where locations of misspelled words are
>>> in the same buffer where next-error navigates, or flymake where
>>> locations of errors/warnings are in the same buffer?
>>
>> Position point on an error message, hit enter.
>
> The error message is usually visible only in the minibuffer, and only
> when point is over the error.

Ok. So add a keybinding that says "there is an error under point; use
the list it is part of as the current error list".

Presumably you already have "goto error under point"; that should also
set the current list.

(How do you notice there is an error there, so you know to position point?
a marker in the margin?)

I gather there might be more than one such list in a single buffer, so
compilation-last-buffer is insufficient.

You might be able to extend that; if it is a cons, the car is the
buffer, the car the root list element, or the list type tag, or
something.

-- 
-- Stephe



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

* Re: next-error use cases
  2018-04-11 20:46                   ` Juri Linkov
@ 2018-04-12 15:31                     ` Stephen Leake
  0 siblings, 0 replies; 44+ messages in thread
From: Stephen Leake @ 2018-04-12 15:31 UTC (permalink / raw)
  To: emacs-devel

Juri Linkov <juri@linkov.net> writes:

>>>> But how can you reset it when the location list is in the same buffer
>>>> like in case of flyspell where locations of misspelled words are
>>>> in the same buffer where next-error navigates, or flymake where
>>>> locations of errors/warnings are in the same buffer?
>>>
>>> Position point on an error message, hit enter.
>>
>> The error message is usually visible only in the minibuffer, and only when
>> point is over the error.
>
> If it's impossible to reset it by hitting enter, then I think we have
> only these remaining options:
>
> 1. If next-error can't work without the requirement to have a list of
> Flyspell mistakes or Flycheck/Flymake errors/warnings printed in a separate
> buffer (like "*Occur*"), then such buffer can be possibly implemented
> as a hidden buffer with a leading space in its name like for example
> " *Flycheck locations*".  ‘next-error-select-buffer’ still should
> propose it as a candidate for selection.

That can work, as long as the buffer is truly hidden. The leading space
disables font-lock, so errors don't look like errors. And the leading
space may have other surprising consequences.

> 2. Flycheck provides its own keybinding ‘C-c ! n’ for ‘flycheck-next-error’
> that can be used to reset the navigation.  There are also analogous functions
> ‘flymake-goto-next-error’ and ‘flyspell-goto-next-error’.

It is not "goto-next-error" that should set the list, but rather
"goto-error-at-point". That's what "enter" does in a compilation-mode buffer.

"goto-next-error" can be invoked from some far away place, but must
refer to the current error list.

-- 
-- Stephe



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

* Re: next-error use cases
  2018-04-12 15:25                   ` Stephen Leake
@ 2018-04-12 16:51                     ` Dmitry Gutov
  2018-04-13 16:22                       ` Stephen Leake
  0 siblings, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2018-04-12 16:51 UTC (permalink / raw)
  To: Stephen Leake, emacs-devel

On 4/12/18 6:25 PM, Stephen Leake wrote:

> Ok. So add a keybinding that says "there is an error under point; use
> the list it is part of as the current error list".

A new key binding or several is an obvious solution. It's also the 
clunkiest one (one: key bindings are precious, two: that means extra key 
presses to use, and three: extra stuff for the users to memorize).

So of course we can fall back to this approach, but it would be great to 
discuss something less obvious first.

> Presumably you already have "goto error under point"; that should also
> set the current list.
> 
> (How do you notice there is an error there, so you know to position point?
> a marker in the margin?)

The error is not always near point, or even visible in the window. To 
get to it, we need a key binding. So, next-error or previous-error 
working already would be helpful.

> I gather there might be more than one such list in a single buffer, so
> compilation-last-buffer is insufficient.

That's a problem for another day, I think. Lists in the same buffer can 
probably be combined anyway.



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

* Re: next-error use cases
  2018-04-07 21:47 next-error use cases Juri Linkov
  2018-04-08 13:48 ` Eli Zaretskii
@ 2018-04-12 20:27 ` Juri Linkov
  2018-04-13  7:45   ` Eli Zaretskii
  1 sibling, 1 reply; 44+ messages in thread
From: Juri Linkov @ 2018-04-12 20:27 UTC (permalink / raw)
  To: emacs-devel

Since we removed the rule of visibility of next-error-function buffers
as a criteria for deciding what navigation to use for next-error,
so e.g. next-error in *Occur* or *Diff* that is the current buffer
and a single visible buffer on the frame will still use the last next-error
buffer that might be e.g. *compilation* or *grep* buffer buried long ago,
now we need to support the same way to switch next-error navigation as
already is possible in *compilation* and *grep* by typing RET or ‘C-c C-c’
that sets next-error-last-buffer in next-error-internal among other things.

Tried to pass goto-source commands thru next-error-internal that works fine
for change-log-goto-source but has problems in diff-goto-source
because next-error-internal has no arguments but diff-goto-source
expects ‘other-file’ as an arg.

Another solution is to call a special function like next-error-internal
explicitly from all such goto-source commands.  This function could also
set next-error-last-buffer to the current buffer.

Anyway here is the patch that shows the problem with the first solution:

diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el
index 175c82f..671f971 100644
--- a/lisp/vc/add-log.el
+++ b/lisp/vc/add-log.el
@@ -471,6 +471,9 @@ change-log-goto-source
 comma-separated list.  If no suitable tag can be found nearby,
 try to visit the file for the change under `point' instead."
   (interactive)
+  (next-error-internal))
+
+(defun change-log-goto-source-internal ()
   (if (and (eq last-command 'change-log-goto-source)
 	   change-log-find-tail)
       (setq change-log-find-tail
@@ -539,7 +542,7 @@ change-log-next-error
   ;; if we found a place to visit...
   (when (looking-at change-log-file-names-re)
     (let (change-log-find-window)
-      (change-log-goto-source)
+      (change-log-goto-source-internal)
       (when change-log-find-window
 	;; Select window displaying source file.
 	(select-window change-log-find-window)))))
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index ef13f55..2a70563 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -1349,7 +1349,7 @@ diff-next-error
   (pop-to-buffer (current-buffer))
   (if reset (goto-char (point-min)))
   (diff-hunk-next arg)
-  (diff-goto-source))
+  (diff-goto-source-internal))
 
 (defvar whitespace-style)
 (defvar whitespace-trailing-regexp)
@@ -1874,6 +1874,11 @@ diff-goto-source
   ;; the old location, and else to the new (i.e. as if reverting).
   ;; This is a convenient detail when using smerge-diff.
   (if event (posn-set-point (event-end event)))
+  (if other-file
+      (diff-goto-source-internal other-file)
+    (next-error-internal)))
+
+(defun diff-goto-source-internal (&optional other-file)
   (let ((rev (not (save-excursion (beginning-of-line) (looking-at "[-<]")))))
     (pcase-let ((`(,buf ,line-offset ,pos ,src ,_dst ,switched)
                  (diff-find-source-location other-file rev)))



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

* Re: next-error use cases
  2018-04-12 20:27 ` Juri Linkov
@ 2018-04-13  7:45   ` Eli Zaretskii
  2018-04-13 19:48     ` Juri Linkov
  0 siblings, 1 reply; 44+ messages in thread
From: Eli Zaretskii @ 2018-04-13  7:45 UTC (permalink / raw)
  To: Juri Linkov; +Cc: emacs-devel

> From: Juri Linkov <juri@linkov.net>
> Date: Thu, 12 Apr 2018 23:27:16 +0300
> 
> Since we removed the rule of visibility of next-error-function buffers
> as a criteria for deciding what navigation to use for next-error,
> so e.g. next-error in *Occur* or *Diff* that is the current buffer
> and a single visible buffer on the frame will still use the last next-error
> buffer that might be e.g. *compilation* or *grep* buffer buried long ago,
> now we need to support the same way to switch next-error navigation as
> already is possible in *compilation* and *grep* by typing RET or ‘C-c C-c’
> that sets next-error-last-buffer in next-error-internal among other things.

Sorry, I don't understand what kind of solution are you proposing in
user terms.  Can you please describe what the user should do under the
proposed solution in various cases, such as if they need to invoke
navigation in the current Occur buffer or in a Compilation/Grep
buffer, either shown or not shown?



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

* Re: next-error use cases
  2018-04-12 16:51                     ` Dmitry Gutov
@ 2018-04-13 16:22                       ` Stephen Leake
  2018-04-13 16:26                         ` Dmitry Gutov
  0 siblings, 1 reply; 44+ messages in thread
From: Stephen Leake @ 2018-04-13 16:22 UTC (permalink / raw)
  To: emacs-devel

Dmitry Gutov <dgutov@yandex.ru> writes:

> On 4/12/18 6:25 PM, Stephen Leake wrote:
>
>> Presumably you already have "goto error under point"; that should also
>> set the current list.
>>
>> (How do you notice there is an error there, so you know to position point?
>> a marker in the margin?)
>
> The error is not always near point, or even visible in the window. To
> get to it, we need a key binding. So, next-error or previous-error
> working already would be helpful.

The command that created the error list can set compilation-last-buffer;
that's what grep does.


-- 
-- Stephe



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

* Re: next-error use cases
  2018-04-13 16:22                       ` Stephen Leake
@ 2018-04-13 16:26                         ` Dmitry Gutov
  0 siblings, 0 replies; 44+ messages in thread
From: Dmitry Gutov @ 2018-04-13 16:26 UTC (permalink / raw)
  To: Stephen Leake, emacs-devel

On 4/13/18 7:22 PM, Stephen Leake wrote:

>> The error is not always near point, or even visible in the window. To
>> get to it, we need a key binding. So, next-error or previous-error
>> working already would be helpful.
> 
> The command that created the error list can set compilation-last-buffer;
> that's what grep does.

Of course it can. When will it do that? Every time a buffer is opened or 
saved? That's when Flymake runs.

What if the user want to continue navigation through their Grep results 
instead?

BTW, please take a look at 
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=30674, for some previous 
discussion.



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

* Re: next-error use cases
  2018-04-13  7:45   ` Eli Zaretskii
@ 2018-04-13 19:48     ` Juri Linkov
  2020-05-19  1:10       ` Dmitry Gutov
  0 siblings, 1 reply; 44+ messages in thread
From: Juri Linkov @ 2018-04-13 19:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1497 bytes --]

>> Since we removed the rule of visibility of next-error-function buffers
>> as a criteria for deciding what navigation to use for next-error,
>> so e.g. next-error in *Occur* or *Diff* that is the current buffer
>> and a single visible buffer on the frame will still use the last next-error
>> buffer that might be e.g. *compilation* or *grep* buffer buried long ago,
>> now we need to support the same way to switch next-error navigation as
>> already is possible in *compilation* and *grep* by typing RET or ‘C-c C-c’
>> that sets next-error-last-buffer in next-error-internal among other things.
>
> Sorry, I don't understand what kind of solution are you proposing in
> user terms.  Can you please describe what the user should do under the
> proposed solution in various cases, such as if they need to invoke
> navigation in the current Occur buffer or in a Compilation/Grep
> buffer, either shown or not shown?

I propose to set the global value of next-error-last-buffer after typing
one of the following keybindings in the corresponding buffers:

in *xref* xref-goto-xref: RET
in *Diff* diff-goto-source: RET, C-c C-c, o
in ChangeLogs change-log-goto-source: C-c C-c
in *Occur* occur-mode-goto-occurrence: RET, C-c C-c,
           occur-mode-goto-occurrence-other-window: o
           occur-mode-display-occurrence: C-o

IOW, doing the same what RET and C-c C-c in *compilation* and *grep* already do.

Here is the final tested patch with these changes:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: next-error.2.patch --]
[-- Type: text/x-diff, Size: 12070 bytes --]

diff --git a/lisp/simple.el b/lisp/simple.el
index efe5406..272905e 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -122,11 +122,13 @@ next-error-last-buffer
 similar mode is started, or when it is used with \\[next-error]
 or \\[compile-goto-error].")
 
-;; next-error-last-buffer is made buffer-local to keep the reference
+(defvar next-error-buffer nil
+  "The buffer-local value of the most recent `next-error' buffer.")
+;; next-error-buffer is made buffer-local to keep the reference
 ;; to the parent buffer used to navigate to the current buffer, so the
 ;; next call of next-buffer will use the same parent buffer to
 ;; continue navigation from it.
-(make-variable-buffer-local 'next-error-last-buffer)
+(make-variable-buffer-local 'next-error-buffer)
 
 (defvar next-error-function nil
   "Function to use to find the next error in the current buffer.
@@ -184,6 +186,15 @@ next-error-find-buffer-function
   :group 'next-error
   :version "27.1")
 
+(defcustom next-error-found-function #'ignore
+  "Function called when a next locus is found and displayed.
+Function is called with two arguments: a FROM-BUFFER buffer
+from which next-error navigated, and a target buffer TO-BUFFER."
+  :type '(choice (const :tag "No default" ignore)
+                 (function :tag "Other function"))
+  :group 'next-error
+  :version "27.1")
+
 (defun next-error-buffer-on-selected-frame (&optional avoid-current
                                                       extra-test-inclusive
                                                       extra-test-exclusive)
@@ -220,6 +231,14 @@ next-error-find-buffer
    (funcall next-error-find-buffer-function avoid-current
                                             extra-test-inclusive
                                             extra-test-exclusive)
+   ;; 1a. If next-error-buffer has no buffer-local value
+   ;; (i.e. never navigated to the current buffer from another),
+   ;; and the current buffer is a `next-error' capable buffer,
+   ;; use it unconditionally, so next-error will always use it.
+   (if (and (not (local-variable-p 'next-error-buffer))
+            (next-error-buffer-p (current-buffer) avoid-current
+			         extra-test-inclusive extra-test-exclusive))
+       (current-buffer))
    ;; 2. If next-error-last-buffer is an acceptable buffer, use that.
    (if (and next-error-last-buffer
             (next-error-buffer-p next-error-last-buffer avoid-current
@@ -284,37 +303,35 @@ next-error
     (when buffer
       ;; We know here that next-error-function is a valid symbol we can funcall
       (with-current-buffer buffer
-        ;; Allow next-error to be used from the next-error capable buffer.
-        (setq next-error-last-buffer buffer)
         (funcall next-error-function (prefix-numeric-value arg) reset)
-        ;; Override possible change of next-error-last-buffer in next-error-function
-        (setq next-error-last-buffer buffer)
-        (setq-default next-error-last-buffer buffer)
-        (when next-error-recenter
-          (recenter next-error-recenter))
-        (message "%s error from %s"
+        (next-error-found buffer (current-buffer))
+        (message "%s locus from %s"
                  (cond (reset                             "First")
                        ((eq (prefix-numeric-value arg) 0) "Current")
                        ((< (prefix-numeric-value arg) 0)  "Previous")
                        (t                                 "Next"))
-                 next-error-last-buffer)
-        (run-hooks 'next-error-hook)))))
+                 next-error-last-buffer)))))
 
 (defun next-error-internal ()
   "Visit the source code corresponding to the `next-error' message at point."
   (let ((buffer (current-buffer)))
     ;; We know here that next-error-function is a valid symbol we can funcall
-    (with-current-buffer buffer
-      ;; Allow next-error to be used from the next-error capable buffer.
-      (setq next-error-last-buffer buffer)
-      (funcall next-error-function 0 nil)
-      ;; Override possible change of next-error-last-buffer in next-error-function
-      (setq next-error-last-buffer buffer)
-      (setq-default next-error-last-buffer buffer)
-      (when next-error-recenter
-        (recenter next-error-recenter))
-      (message "Current error from %s" next-error-last-buffer)
-      (run-hooks 'next-error-hook))))
+    (funcall next-error-function 0 nil)
+    (next-error-found buffer (current-buffer))
+    (message "Current locus from %s" next-error-last-buffer)))
+
+(defun next-error-found (&optional from-buffer to-buffer)
+  "Function to call when the next locus is found and displayed.
+FROM-BUFFER is a buffer from which next-error navigated,
+and TO-BUFFER is a target buffer."
+  (setq next-error-last-buffer (or from-buffer (current-buffer)))
+  (when to-buffer
+    (with-current-buffer to-buffer
+      (setq next-error-buffer from-buffer)))
+  (when next-error-recenter
+    (recenter next-error-recenter))
+  (funcall next-error-found-function from-buffer to-buffer)
+  (run-hooks 'next-error-hook))
 
 (defun next-error-select-buffer (buffer)
   "Select a `next-error' capable buffer and set it as the last used."
@@ -322,8 +339,7 @@ next-error-select-buffer
    (list (get-buffer
           (read-buffer "Select next-error buffer: " nil nil
                        (lambda (b) (next-error-buffer-p (cdr b)))))))
-  (setq next-error-last-buffer buffer)
-  (setq-default next-error-last-buffer buffer))
+  (setq next-error-last-buffer buffer))
 
 (defalias 'goto-next-locus 'next-error)
 (defalias 'next-match 'next-error)
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 5a9a7a9..9a437b6 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -540,9 +540,11 @@ xref-goto-xref
 Non-interactively, non-nil QUIT means to first quit the *xref*
 buffer."
   (interactive)
-  (let ((xref (or (xref--item-at-point)
+  (let ((buffer (current-buffer))
+        (xref (or (xref--item-at-point)
                   (user-error "No reference at point"))))
-    (xref--show-location (xref-item-location xref) (if quit 'quit t))))
+    (xref--show-location (xref-item-location xref) (if quit 'quit t))
+    (next-error-found buffer (current-buffer))))
 
 (defun xref-quit-and-goto-xref ()
   "Quit *xref* buffer, then jump to xref on current line."
diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el
index 175c82f..d423706 100644
--- a/lisp/vc/add-log.el
+++ b/lisp/vc/add-log.el
@@ -471,6 +471,11 @@ change-log-goto-source
 comma-separated list.  If no suitable tag can be found nearby,
 try to visit the file for the change under `point' instead."
   (interactive)
+  (let ((buffer (current-buffer)))
+    (change-log-goto-source-internal)
+    (next-error-found buffer (current-buffer))))
+
+(defun change-log-goto-source-internal ()
   (if (and (eq last-command 'change-log-goto-source)
 	   change-log-find-tail)
       (setq change-log-find-tail
@@ -539,7 +545,7 @@ change-log-next-error
   ;; if we found a place to visit...
   (when (looking-at change-log-file-names-re)
     (let (change-log-find-window)
-      (change-log-goto-source)
+      (change-log-goto-source-internal)
       (when change-log-find-window
 	;; Select window displaying source file.
 	(select-window change-log-find-window)))))
@@ -1067,8 +1073,7 @@ change-log-mode
   (set (make-local-variable 'end-of-defun-function)
        'change-log-end-of-defun)
   ;; next-error function glue
-  (setq next-error-function 'change-log-next-error)
-  (setq next-error-last-buffer (current-buffer)))
+  (setq next-error-function 'change-log-next-error))
 
 (defun change-log-next-buffer (&optional buffer wrap)
   "Return the next buffer in the series of ChangeLog file buffers.
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index ef13f55..1e2fbb9 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -1874,11 +1874,13 @@ diff-goto-source
   ;; the old location, and else to the new (i.e. as if reverting).
   ;; This is a convenient detail when using smerge-diff.
   (if event (posn-set-point (event-end event)))
-  (let ((rev (not (save-excursion (beginning-of-line) (looking-at "[-<]")))))
+  (let ((buffer (when event (current-buffer)))
+        (rev (not (save-excursion (beginning-of-line) (looking-at "[-<]")))))
     (pcase-let ((`(,buf ,line-offset ,pos ,src ,_dst ,switched)
                  (diff-find-source-location other-file rev)))
       (pop-to-buffer buf)
       (goto-char (+ (car pos) (cdr src)))
+      (when buffer (next-error-found buffer (current-buffer)))
       (diff-hunk-status-msg line-offset (diff-xor rev switched) t))))
 
 
diff --git a/lisp/replace.el b/lisp/replace.el
index 4916cb1..5835c9c 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -1192,7 +1194,8 @@ 'occur-mode-mouse-goto
 (defun occur-mode-goto-occurrence (&optional event)
   "Go to the occurrence on the current line."
   (interactive (list last-nonmenu-event))
-  (let ((pos
+  (let ((buffer (when event (current-buffer)))
+        (pos
          (if (null event)
              ;; Actually `event-end' works correctly with a nil argument as
              ;; well, so we could dispense with this test, but let's not
@@ -1204,26 +1207,31 @@ occur-mode-goto-occurrence
                (occur-mode-find-occurrence))))))
     (pop-to-buffer (marker-buffer pos))
     (goto-char pos)
+    (when buffer (next-error-found buffer (current-buffer)))
     (run-hooks 'occur-mode-find-occurrence-hook)))
 
 (defun occur-mode-goto-occurrence-other-window ()
   "Go to the occurrence the current line describes, in another window."
   (interactive)
-  (let ((pos (occur-mode-find-occurrence)))
+  (let ((buffer (current-buffer))
+        (pos (occur-mode-find-occurrence)))
     (switch-to-buffer-other-window (marker-buffer pos))
     (goto-char pos)
+    (next-error-found buffer (current-buffer))
     (run-hooks 'occur-mode-find-occurrence-hook)))
 
 (defun occur-mode-display-occurrence ()
   "Display in another window the occurrence the current line describes."
   (interactive)
-  (let ((pos (occur-mode-find-occurrence))
+  (let ((buffer (current-buffer))
+        (pos (occur-mode-find-occurrence))
 	window)
     (setq window (display-buffer (marker-buffer pos) t))
     ;; This is the way to set point in the proper window.
     (save-selected-window
       (select-window window)
       (goto-char pos)
+      (next-error-found buffer (current-buffer))
       (run-hooks 'occur-mode-find-occurrence-hook))))
 
 (defun occur-find-match (n search message)
@@ -1254,28 +1262,20 @@ occur-next-error
 Compatibility function for \\[next-error] invocations."
   (interactive "p")
   ;; we need to run occur-find-match from within the Occur buffer
-  (with-current-buffer
-      ;; Choose the buffer and make it current.
-      (if (next-error-buffer-p (current-buffer))
-	  (current-buffer)
-	(next-error-find-buffer nil nil
-				(lambda ()
-				  (eq major-mode 'occur-mode))))
-
-    (goto-char (cond (reset (point-min))
-		     ((< argp 0) (line-beginning-position))
-		     ((> argp 0) (line-end-position))
-		     ((point))))
-    (occur-find-match
-     (abs argp)
-     (if (> 0 argp)
-	 #'previous-single-property-change
-       #'next-single-property-change)
-     "No more matches")
-    ;; In case the *Occur* buffer is visible in a nonselected window.
-    (let ((win (get-buffer-window (current-buffer) t)))
-      (if win (set-window-point win (point))))
-    (occur-mode-goto-occurrence)))
+  (goto-char (cond (reset (point-min))
+		   ((< argp 0) (line-beginning-position))
+		   ((> argp 0) (line-end-position))
+		   ((point))))
+  (occur-find-match
+   (abs argp)
+   (if (> 0 argp)
+       #'previous-single-property-change
+     #'next-single-property-change)
+   "No more matches")
+  ;; In case the *Occur* buffer is visible in a nonselected window.
+  (let ((win (get-buffer-window (current-buffer) t)))
+    (if win (set-window-point win (point))))
+  (occur-mode-goto-occurrence))
 \f
 (defface match
   '((((class color) (min-colors 88) (background light))

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

* Re: next-error use cases
  2018-04-13 19:48     ` Juri Linkov
@ 2020-05-19  1:10       ` Dmitry Gutov
  2020-05-19 22:12         ` Juri Linkov
  0 siblings, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2020-05-19  1:10 UTC (permalink / raw)
  To: Juri Linkov; +Cc: emacs-devel

Hi Juri,

On 13.04.2018 22:48, Juri Linkov wrote:
> in*xref*  xref-goto-xref: RET
> in*Diff*  diff-goto-source: RET, C-c C-c, o
> in ChangeLogs change-log-goto-source: C-c C-c
> in*Occur*  occur-mode-goto-occurrence: RET, C-c C-c,
>             occur-mode-goto-occurrence-other-window: o
>             occur-mode-display-occurrence: C-o

Only 2 years passed, and I finally read the new code.

I have to say it's a solid improvement over the previous related change.

And one peculiarity: if I'm not mistaken, the value of next-error-buffer 
itself is never used in the current code, there's only the check 
(local-variable-p 'next-error-buffer) that references it, effectively 
turning it into a buffer-local boolean.

But it could probably still be used in custom values of 
next-error-find-buffer-function.

Too bad it didn't solve the flymake+next-error-function problem, but 
that seems more difficult.

Some rough idea: pick some similar keybinding in flymake-supported 
buffers ('C-c C-c'? wouldn't it be too presumptuous to take over?)... 
and make it, I don't know, echo the error text? Or (!) show the 
diagnostics buffer, for which there's no default key binding still. And 
in the end, call next-error-found.



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

* Re: next-error use cases
  2020-05-19  1:10       ` Dmitry Gutov
@ 2020-05-19 22:12         ` Juri Linkov
  2020-05-21  1:57           ` Dmitry Gutov
  0 siblings, 1 reply; 44+ messages in thread
From: Juri Linkov @ 2020-05-19 22:12 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: emacs-devel

> I have to say it's a solid improvement over the previous related change.
>
> And one peculiarity: if I'm not mistaken, the value of next-error-buffer
> itself is never used in the current code, there's only the check 
> (local-variable-p 'next-error-buffer) that references it, effectively
> turning it into a buffer-local boolean.
>
> But it could probably still be used in custom values of
> next-error-find-buffer-function.
>
> Too bad it didn't solve the flymake+next-error-function problem, but that
> seems more difficult.
>
> Some rough idea: pick some similar keybinding in flymake-supported buffers
> ('C-c C-c'? wouldn't it be too presumptuous to take over?)... and make it,

And bind it to next-error-select-buffer.

> I don't know, echo the error text? Or (!) show the diagnostics buffer, for
> which there's no default key binding still. And in the end, call
> next-error-found.

Indeed, using the diagnostics buffer is a good idea (even without showing it).



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

* Re: next-error use cases
  2020-05-19 22:12         ` Juri Linkov
@ 2020-05-21  1:57           ` Dmitry Gutov
  2020-05-21 20:33             ` Vladimir Sedach
  0 siblings, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2020-05-21  1:57 UTC (permalink / raw)
  To: Juri Linkov; +Cc: emacs-devel

On 20.05.2020 01:12, Juri Linkov wrote:

>> Some rough idea: pick some similar keybinding in flymake-supported buffers
>> ('C-c C-c'? wouldn't it be too presumptuous to take over?)... and make it,
> 
> And bind it to next-error-select-buffer.
> 
>> I don't know, echo the error text? Or (!) show the diagnostics buffer, for
>> which there's no default key binding still. And in the end, call
>> next-error-found.
> 
> Indeed, using the diagnostics buffer is a good idea (even without showing it).

We could use the diagnostics in a similar fashion to compilation, xref, 
occur, etc, buffers to detect that the user definitely wants 
next-error-last-buffer changed.

And either set that variable when the user displays the diagnostics 
buffer, or when they use one of the "buttons" inside (but IME it's a 
very rare even, I never use them, unlike Compilation or Grep "buttons").

That would require showing it, however. But otherwise could enable a 
streamlined approach to all next-error-function enabled buffers, where 
the behavior of Flymake based ones doesn't much differ from others.

In all this, I'm most concerned about the keybinding: 'C-c C-c' would 
follow an existing example, but it's seems too valuable to take over in 
all programming major modes.

It calls comment-region in c-mode (and a few others), but that 
duplicates an existing binding.

In prolog-mode, ps-mode, sql-mode it invokes some unique commands, however.



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

* Re: next-error use cases
  2020-05-21  1:57           ` Dmitry Gutov
@ 2020-05-21 20:33             ` Vladimir Sedach
  2020-05-21 21:02               ` Stefan Monnier
  2020-05-21 21:53               ` Dmitry Gutov
  0 siblings, 2 replies; 44+ messages in thread
From: Vladimir Sedach @ 2020-05-21 20:33 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: emacs-devel, Juri Linkov


Dmitry Gutov <dgutov@yandex.ru> writes:
> In all this, I'm most concerned about the keybinding: 'C-c C-c' would
> follow an existing example, but it's seems too valuable to take over
> in all programming major modes.
>
> It calls comment-region in c-mode (and a few others), but that
> duplicates an existing binding.
>
> In prolog-mode, ps-mode, sql-mode it invokes some unique commands, however.

C-c C-c is also already used for the various Lisp language modes. Is
there even a prog-mode that does not use C-c C-c for something?

Why put this under the C-c prefix at all? C-c is for
mode-specific-map. This is not specific to a major mode. There are
next-error bindings already in M-g goto-map; that seems like the
appropriate place, and it is not very busy right now. In the keymap,
the binding itself should also be more mnemonic than C-c.

--
Vladimir Sedach
Software engineering services in Los Angeles https://oneofus.la



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

* Re: next-error use cases
  2020-05-21 20:33             ` Vladimir Sedach
@ 2020-05-21 21:02               ` Stefan Monnier
  2020-05-21 21:53               ` Dmitry Gutov
  1 sibling, 0 replies; 44+ messages in thread
From: Stefan Monnier @ 2020-05-21 21:02 UTC (permalink / raw)
  To: Vladimir Sedach; +Cc: Juri Linkov, emacs-devel, Dmitry Gutov

> C-c C-c is also already used for the various Lisp language modes. Is
> there even a prog-mode that does not use C-c C-c for something?

IMO, `C-c C-c` should be bound to the command "OK, I'm done for now, please
use it".  That's what it does in things like `message-mode` and `log-edit-mode`.
In programming modes, that would map to something like `compile` or
"send to repl"; and that's indeed what it does in AUCTeX and in tex-mode.el.


        Stefan




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

* Re: next-error use cases
  2020-05-21 20:33             ` Vladimir Sedach
  2020-05-21 21:02               ` Stefan Monnier
@ 2020-05-21 21:53               ` Dmitry Gutov
  2020-05-21 22:06                 ` Juri Linkov
  1 sibling, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2020-05-21 21:53 UTC (permalink / raw)
  To: Vladimir Sedach; +Cc: emacs-devel, Juri Linkov

On 21.05.2020 23:33, Vladimir Sedach wrote:
> There are
> next-error bindings already in M-g goto-map; that seems like the
> appropriate place, and it is not very busy right now.

A binding for flymake-show-diagnostics-buffer in goto-map?

The only mnemonic I can suggest is Flycheck's "C-c !". The latter uses 
it for the whole map, though.

The corresponding binding there is "C-c ! l".



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

* Re: next-error use cases
  2020-05-21 21:53               ` Dmitry Gutov
@ 2020-05-21 22:06                 ` Juri Linkov
  2020-05-21 22:49                   ` Dmitry Gutov
  0 siblings, 1 reply; 44+ messages in thread
From: Juri Linkov @ 2020-05-21 22:06 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: emacs-devel

> A binding for flymake-show-diagnostics-buffer in goto-map?

Good idea, not only for flymake, but for all next-error capable buffers:
a keybinding in goto-map to show the buffer with a list of errors/matches.
For example, the user is navigating using 'M-g M-n' when the next-errors buffer
is not visible, then wants to see all errors/matches, so the user needs to type
some M-g key to show it.



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

* Re: next-error use cases
  2020-05-21 22:06                 ` Juri Linkov
@ 2020-05-21 22:49                   ` Dmitry Gutov
  2020-05-22  1:31                     ` Clément Pit-Claudel
  0 siblings, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2020-05-21 22:49 UTC (permalink / raw)
  To: Juri Linkov; +Cc: emacs-devel

On 22.05.2020 01:06, Juri Linkov wrote:
>> A binding for flymake-show-diagnostics-buffer in goto-map?
> Good idea, not only for flymake, but for all next-error capable buffers:
> a keybinding in goto-map to show the buffer with a list of errors/matches.
> For example, the user is navigating using 'M-g M-n' when the next-errors buffer
> is not visible, then wants to see all errors/matches, so the user needs to type
> some M-g key to show it.

So we'll have 'M-g l' to pop up the current 'next-error-last-buffer'.

And 'C-c ! l' to pop Flymake's diagnostics buffer specifically (and 
change next-error-last-buffer's value appropriately). 'C-c ! n' and 'C-c 
! p' could work along the same idea.



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

* Re: next-error use cases
  2020-05-21 22:49                   ` Dmitry Gutov
@ 2020-05-22  1:31                     ` Clément Pit-Claudel
  2020-05-22 19:10                       ` Vladimir Sedach
  2020-05-22 23:50                       ` Dmitry Gutov
  0 siblings, 2 replies; 44+ messages in thread
From: Clément Pit-Claudel @ 2020-05-22  1:31 UTC (permalink / raw)
  To: emacs-devel

On 21/05/2020 18.49, Dmitry Gutov wrote:
> On 22.05.2020 01:06, Juri Linkov wrote:
>>> A binding for flymake-show-diagnostics-buffer in goto-map?
>> Good idea, not only for flymake, but for all next-error capable buffers:
>> a keybinding in goto-map to show the buffer with a list of errors/matches.
>> For example, the user is navigating using 'M-g M-n' when the next-errors buffer
>> is not visible, then wants to see all errors/matches, so the user needs to type
>> some M-g key to show it.
> 
> So we'll have 'M-g l' to pop up the current 'next-error-last-buffer'.
> 
> And 'C-c ! l' to pop Flymake's diagnostics buffer specifically (and change next-error-last-buffer's value appropriately). 'C-c ! n' and 'C-c ! p' could work along the same idea.

Does this mean that Flycheck should override M-g l too, or will that work automatically (how will M-g l know which one to pick?)

These are the relevant bits of Flycheck's map, I think:

    (define-key map "c"         #'flycheck-buffer)
    (define-key map "C"         #'flycheck-clear)
    (define-key map "n"         #'flycheck-next-error)
    (define-key map "p"         #'flycheck-previous-error)
    (define-key map "l"         #'flycheck-list-errors)
    (define-key map (kbd "C-w") #'flycheck-copy-errors-as-kill)
    (define-key map "s"         #'flycheck-select-checker)
    (define-key map "h"         #'flycheck-display-error-at-point)
    (define-key map "H"         #'display-local-help)



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

* Re: next-error use cases
  2020-05-22  1:31                     ` Clément Pit-Claudel
@ 2020-05-22 19:10                       ` Vladimir Sedach
  2020-05-23  1:22                         ` Clément Pit-Claudel
  2020-05-22 23:50                       ` Dmitry Gutov
  1 sibling, 1 reply; 44+ messages in thread
From: Vladimir Sedach @ 2020-05-22 19:10 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel


Clément Pit-Claudel <cpitclaudel@gmail.com> writes:
> Does this mean that Flycheck should override M-g l too, or will
> that work automatically (how will M-g l know which one to pick?)

next-error-last-buffer, if I understand things correctly.

--
Vladimir Sedach
Software engineering services in Los Angeles https://oneofus.la



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

* Re: next-error use cases
  2020-05-22  1:31                     ` Clément Pit-Claudel
  2020-05-22 19:10                       ` Vladimir Sedach
@ 2020-05-22 23:50                       ` Dmitry Gutov
  2020-05-23  1:25                         ` Clément Pit-Claudel
  1 sibling, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2020-05-22 23:50 UTC (permalink / raw)
  To: Clément Pit-Claudel, emacs-devel

On 22.05.2020 04:31, Clément Pit-Claudel wrote:
> On 21/05/2020 18.49, Dmitry Gutov wrote:
>> On 22.05.2020 01:06, Juri Linkov wrote:
>>>> A binding for flymake-show-diagnostics-buffer in goto-map?
>>> Good idea, not only for flymake, but for all next-error capable buffers:
>>> a keybinding in goto-map to show the buffer with a list of errors/matches.
>>> For example, the user is navigating using 'M-g M-n' when the next-errors buffer
>>> is not visible, then wants to see all errors/matches, so the user needs to type
>>> some M-g key to show it.
>>
>> So we'll have 'M-g l' to pop up the current 'next-error-last-buffer'.
>>
>> And 'C-c ! l' to pop Flymake's diagnostics buffer specifically (and change next-error-last-buffer's value appropriately). 'C-c ! n' and 'C-c ! p' could work along the same idea.
> 
> Does this mean that Flycheck should override M-g l too, or will that work automatically (how will M-g l know which one to pick?)

I think this will work simply like:

(defun next-error-show-list ()
   (interactive)
   (pop-to-buffer next-error-last-buffer))

But for this to be okay, we'd have to decide on a principle, and 
Flycheck would have to agree, that next-error-function is set in 
flycheck-error-list-mode, and not in flycheck-mode.

> These are the relevant bits of Flycheck's map, I think:
> 
>      (define-key map "c"         #'flycheck-buffer)
>      (define-key map "C"         #'flycheck-clear)
>      (define-key map "n"         #'flycheck-next-error)
>      (define-key map "p"         #'flycheck-previous-error)
>      (define-key map "l"         #'flycheck-list-errors)
>      (define-key map (kbd "C-w") #'flycheck-copy-errors-as-kill)
>      (define-key map "s"         #'flycheck-select-checker)
>      (define-key map "h"         #'flycheck-display-error-at-point)
>      (define-key map "H"         #'display-local-help)

The copy-errors-as-kill command sounds nice. Not sure if any others can 
easily apply to Flymake too.



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

* Re: next-error use cases
  2020-05-22 19:10                       ` Vladimir Sedach
@ 2020-05-23  1:22                         ` Clément Pit-Claudel
  2020-05-23  1:27                           ` Dmitry Gutov
  0 siblings, 1 reply; 44+ messages in thread
From: Clément Pit-Claudel @ 2020-05-23  1:22 UTC (permalink / raw)
  To: Vladimir Sedach; +Cc: emacs-devel

On 22/05/2020 15.10, Vladimir Sedach wrote:
> 
> Clément Pit-Claudel <cpitclaudel@gmail.com> writes:
>> Does this mean that Flycheck should override M-g l too, or will
>> that work automatically (how will M-g l know which one to pick?)
> 
> next-error-last-buffer, if I understand things correctly.

That doesn't sound right: next-error-last-buffer should be the source buffer, not the error list, shouldn't it?




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

* Re: next-error use cases
  2020-05-22 23:50                       ` Dmitry Gutov
@ 2020-05-23  1:25                         ` Clément Pit-Claudel
  2020-05-23  1:29                           ` Dmitry Gutov
  0 siblings, 1 reply; 44+ messages in thread
From: Clément Pit-Claudel @ 2020-05-23  1:25 UTC (permalink / raw)
  To: Dmitry Gutov, emacs-devel

On 22/05/2020 19.50, Dmitry Gutov wrote:
> On 22.05.2020 04:31, Clément Pit-Claudel wrote:
>> On 21/05/2020 18.49, Dmitry Gutov wrote:
>>> On 22.05.2020 01:06, Juri Linkov wrote:
>>>>> A binding for flymake-show-diagnostics-buffer in goto-map?
>>>> Good idea, not only for flymake, but for all next-error capable buffers:
>>>> a keybinding in goto-map to show the buffer with a list of errors/matches.
>>>> For example, the user is navigating using 'M-g M-n' when the next-errors buffer
>>>> is not visible, then wants to see all errors/matches, so the user needs to type
>>>> some M-g key to show it.
>>>
>>> So we'll have 'M-g l' to pop up the current 'next-error-last-buffer'.
>>>
>>> And 'C-c ! l' to pop Flymake's diagnostics buffer specifically (and change next-error-last-buffer's value appropriately). 'C-c ! n' and 'C-c ! p' could work along the same idea.
>>
>> Does this mean that Flycheck should override M-g l too, or will that work automatically (how will M-g l know which one to pick?)
> 
> I think this will work simply like:
> 
> (defun next-error-show-list ()
>   (interactive)
>   (pop-to-buffer next-error-last-buffer))
> 
> But for this to be okay, we'd have to decide on a principle, and Flycheck would have to agree, that next-error-function is set in flycheck-error-list-mode, and not in flycheck-mode.

Ah, how surprising.  Currently we set next-error-function in the main buffer, not in the error list, in part because the error list is built lazily (we don't construct the error list buffer until you've requested it, so next-error-last-buffer would be nil most of the time)



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

* Re: next-error use cases
  2020-05-23  1:22                         ` Clément Pit-Claudel
@ 2020-05-23  1:27                           ` Dmitry Gutov
       [not found]                             ` <b386929f-4412-860d-343f-a728d6d7e816@gmail.com>
  0 siblings, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2020-05-23  1:27 UTC (permalink / raw)
  To: Clément Pit-Claudel, Vladimir Sedach; +Cc: emacs-devel

On 23.05.2020 04:22, Clément Pit-Claudel wrote:
> On 22/05/2020 15.10, Vladimir Sedach wrote:
>>
>> Clément Pit-Claudel <cpitclaudel@gmail.com> writes:
>>> Does this mean that Flycheck should override M-g l too, or will
>>> that work automatically (how will M-g l know which one to pick?)
>>
>> next-error-last-buffer, if I understand things correctly.
> 
> That doesn't sound right: next-error-last-buffer should be the source buffer, not the error list, shouldn't it?

Not if we try to streamline the next-error navigation and try to make it 
work (almost) the same way across different next-error sources.



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

* Re: next-error use cases
  2020-05-23  1:25                         ` Clément Pit-Claudel
@ 2020-05-23  1:29                           ` Dmitry Gutov
  0 siblings, 0 replies; 44+ messages in thread
From: Dmitry Gutov @ 2020-05-23  1:29 UTC (permalink / raw)
  To: Clément Pit-Claudel, emacs-devel

On 23.05.2020 04:25, Clément Pit-Claudel wrote:
> Ah, how surprising.  Currently we set next-error-function in the main buffer, not in the error list, in part because the error list is built lazily (we don't construct the error list buffer until you've requested it, so next-error-last-buffer would be nil most of the time)

Yeah, so then next-error navigation won't work before the user calls 
flycheck-error-list explicitly.

I agree that might be suboptimal, so maybe some more advanced design is 
required.



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

* RE: next-error use cases
       [not found]                                 ` <152f1200-a2d0-e137-418f-18ceb14fbbe3@gmail.com>
@ 2020-05-23 15:29                                   ` Drew Adams
  2020-05-24  1:36                                   ` Dmitry Gutov
  1 sibling, 0 replies; 44+ messages in thread
From: Drew Adams @ 2020-05-23 15:29 UTC (permalink / raw)
  To: Clément Pit-Claudel, Dmitry Gutov, Vladimir Sedach; +Cc: emacs-devel

> Hopefully the following isn't too silly.  Right now we use C-x ` for
> two fairly different purposes:
> 
> 1. We have a list of locations (typically lines and columns), and we
> want jump from one to the next, opening files and buffers as needed
> (that's the grep, occur, and compilation-mode cases).
> 2. We have a buffer with interesting locations, and we want to cycle
> through them (that's the flyspell, flymake, flycheck cases).
> 
> This sounds quite similar to what happens with the global and the 
> local mark rings, actually.  To cycle through marks in the current 
> buffer you use C-u C-SPC; to cycle through global marks you use
> C-x C-SPC.  So I wonder if it would make sense to have C-x ` cycle 
> through locations that come from "location lists" (grep) and
> having, say, C-c ` cycle through locations that come from the
> current buffer (flyspell).
> 
> That doesn't fully solve the problem of picking which location
> list to cycle through, but it eliminates the confusion between
> local and global locations (as a logical consequence, I imagine
> C-c ` in a location list would most of the time just move to the
> next line, though in an occur or grep buffer with multiple lines
> of context it would jump to the next match)

Sorry to barge in here, especially having not read
the thread till here.

Just thought I'd mention what I do in Bookmark+ and
zones.el, in this regard.  There too you can cycle
among things: bookmarks, buffer zones (regions/areas).

In each case, you can have a list of same-buffer
thingies to cycle among or a list of multiple-buffer
thingies to cycle among.

In each case, there are default lists of same-buffer
and multiple-buffer thingies, and you can define
other, named lists.

In each case, it's easy to switch among such lists.
For navigation purposes (such lists/sets can be used
for other purposes too), call them "navigation lists".

So in each case there are various ways to choose a
navigation list, to make it current.

In the case of Bookmark+:

* You can pick a set of bookmarks that are all of a
  given type (e.g. Info, Dired, EWW)

* You can pick them by picking a bookmark-list bookmark.

* You can pick them by choosing the current bookmark
  list (as displayed: sorted, respecting omissions etc.).

* You can use the currently defined global bookmark
  list (ignoring what's in the displayed bookmark list).

* There are separate keys for cycling among bookmarks
  for the current file/buffer and for cycling among
  another chosen navigation list.  IOW, you can do the
  former without unchoosing the current navigation list.

In the case of zones.el, you choose a zone-set variable.
Such a variable can be buffer-local, so its zones are
only for the current buffer, or it can be global, i.e.,
across buffers.

So the ways of picking navigation lists are different
for bookmarks and zones, as they should be.  As I said,
such sets serve other purposes, besides just navigation,
and those purposes are very different for zones and
bookmarks.

Likewise, the keys for cycling are different for zones
and bookmarks.  The keys for each fit in with the other
keys (other zone keys, other bookmark keys).

Dunno whether this info helps at all, either as food
for thought (e.g., generalizing the view) or as an
argument that it does not necessarily make sense to
search for a single way to use such things (e.g. single
set of cycling keys, or even similar cycling keys).

Note: "not necessarily".  Other things being equal, of
course it helps users if the same or similar keys do
the same or similar things in different contexts.  But
other things might well not be equal (they are not
equal in the case of zones and bookmarks).  Different
kinds of thing-sets offer different possibilities.

Bookmark+ description of this:

https://www.emacswiki.org/emacs/BookmarkPlus#CyclingNavlist

zones.el description:

https://www.emacswiki.org/emacs/Zones



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

* Re: next-error use cases
       [not found]                                 ` <152f1200-a2d0-e137-418f-18ceb14fbbe3@gmail.com>
  2020-05-23 15:29                                   ` Drew Adams
@ 2020-05-24  1:36                                   ` Dmitry Gutov
  2020-05-24  1:41                                     ` Clément Pit-Claudel
  1 sibling, 1 reply; 44+ messages in thread
From: Dmitry Gutov @ 2020-05-24  1:36 UTC (permalink / raw)
  To: Clément Pit-Claudel, Vladimir Sedach; +Cc: emacs-devel

On 23.05.2020 05:26, Clément Pit-Claudel wrote:

>> Oh, its beginning was only a tiny bit earlier:
>>
>> https://lists.gnu.org/archive/html/emacs-devel/2018-04/msg00207.html
> 
> Thanks a lot.  I think I understand the issue better.
> 
> Hopefully the following isn't too silly.  Right now we use C-x ` for two fairly different purposes:
> 
> 1. We have a list of locations (typically lines and columns), and we want jump from one to the next, opening files and buffers as needed (that's the grep, occur, and compilation-mode cases).
> 2. We have a buffer with interesting locations, and we want to cycle through them (that's the flyspell, flymake, flycheck cases).
> 
> This sounds quite similar to what happens with the global and the local mark rings, actually.  To cycle through marks in the current buffer you use C-u C-SPC; to cycle through global marks you use C-x C-SPC.  So I wonder if it would make sense to have C-x ` cycle through locations that come from "location lists" (grep) and having, say, C-c ` cycle through locations that come from the current buffer (flyspell).
> 
> That doesn't fully solve the problem of picking which location list to cycle through, but it eliminates the confusion between local and global locations (as a logical consequence, I imagine C-c ` in a location list would most of the time just move to the next line, though in an occur or grep buffer with multiple lines of context it would jump to the next match)
> 
> Does this make sense?

I'm not a big fan of mark rings, personally. Never use them, and if they 
were good enough, would we still have the xref marker ring? Formerly 
known as find-tag marker ring.

For error navigation, it /could/ be a better idea, but IMHO it's like 
we'd be giving up and creating a parallel set of variables and commands 
for "local" errors. And necessitate a "muscle memory" context switch 
when one goes from "local" errors to "global" or back. One set of 
bindings would also have to be more awkward than the other.

How to evaluate this option objectively, though? Maybe we should ask 
what kind of user behavior we expect most of the time.

If, when working with local errors, we expect the user to go between 
them, then use the "global" navigation commands to jump between 
locations from e.g. Compilation, then back to "local" errors, in a short 
period of time, then having two sets of commands might be optimal.

If, on the other hand, we rather expect the user not to interleave the 
uses of "local" and "global" location lists as often, that the switches 
between sources of errors would be mostly performed automatically (e.g. 
when one calls 'M-x rgrep'), and that the necessary manual invocations 
of next-error-select-buffer would be infrequent enough. Or that the user 
would be switching between "global" sources of errors at least as often 
as between "local" and "global" ones, we should probably optimize for 
having just one set of commands.

There's also another wrinkle: I think there was a proposed feature for 
Flycheck to list errors for multiple files (or the whole project) 
together? 'next-error' could be handy for jumping between those too.



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

* Re: next-error use cases
  2020-05-24  1:36                                   ` Dmitry Gutov
@ 2020-05-24  1:41                                     ` Clément Pit-Claudel
  2020-05-24 14:25                                       ` Dmitry Gutov
  0 siblings, 1 reply; 44+ messages in thread
From: Clément Pit-Claudel @ 2020-05-24  1:41 UTC (permalink / raw)
  To: Dmitry Gutov, Vladimir Sedach; +Cc: emacs-devel

On 23/05/2020 21.36, Dmitry Gutov wrote:

> For error navigation, it /could/ be a better idea, but IMHO it's like we'd be giving up and creating a parallel set of variables and commands for "local" errors. And necessitate a "muscle memory" context switch when one goes from "local" errors to "global" or back. One set of bindings would also have to be more awkward than the other.

Good points all around, and I don't have much more to contribute :)

> There's also another wrinkle: I think there was a proposed feature for Flycheck to list errors for multiple files (or the whole project) together? 'next-error' could be handy for jumping between those too.
We do this currently already, and the idea is that all external errors are converted into local errors on line 1.
In the error list they appear with a file name and a line number in that file, so if you were to cycle errors relative to that list you would visit files one by one, and if you were to visit errors relative to the buffer you'd go through all local errors then jump to another file with errors, if any.



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

* Re: next-error use cases
  2020-05-24  1:41                                     ` Clément Pit-Claudel
@ 2020-05-24 14:25                                       ` Dmitry Gutov
  0 siblings, 0 replies; 44+ messages in thread
From: Dmitry Gutov @ 2020-05-24 14:25 UTC (permalink / raw)
  To: Clément Pit-Claudel, Vladimir Sedach; +Cc: emacs-devel

On 24.05.2020 04:41, Clément Pit-Claudel wrote:
> On 23/05/2020 21.36, Dmitry Gutov wrote:
> 
>> For error navigation, it /could/ be a better idea, but IMHO it's like we'd be giving up and creating a parallel set of variables and commands for "local" errors. And necessitate a "muscle memory" context switch when one goes from "local" errors to "global" or back. One set of bindings would also have to be more awkward than the other.
> 
> Good points all around, and I don't have much more to contribute :)

Perhaps you have thoughts on which particular usage pattern is more 
prevalent?

I should add that we're currently defaulting to approach #1. Even if 
Flymake doesn't have bindings by default, we will add some, and they'll 
mirror Flycheck's ones by default.

As a result, we'll already have two parallel sets of bindings for 
"local" and other errors: next/previous-error and 
flymake-next/previous-error.

So the question is, is there a reasonable scheme to use 
next-error/previous-error for Flymake's errors without severe 
side-effects, or we should stay with the current situation.

Whereby I'll bind M-n and M-p to Flymake's commands locally and leave 
next-error/previous-error on M-g M-n/p.

>> There's also another wrinkle: I think there was a proposed feature for Flycheck to list errors for multiple files (or the whole project) together? 'next-error' could be handy for jumping between those too.
> We do this currently already, and the idea is that all external errors are converted into local errors on line 1.
> In the error list they appear with a file name and a line number in that file, so if you were to cycle errors relative to that list you would visit files one by one, and if you were to visit errors relative to the buffer you'd go through all local errors then jump to another file with errors, if any.

In that case, maybe one could say that Flycheck errors are not always 
"local" either?



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

end of thread, other threads:[~2020-05-24 14:25 UTC | newest]

Thread overview: 44+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-07 21:47 next-error use cases Juri Linkov
2018-04-08 13:48 ` Eli Zaretskii
2018-04-08 19:56   ` Juri Linkov
2018-04-08 20:26     ` Clément Pit-Claudel
2018-04-08 20:35       ` Dmitry Gutov
2018-04-10  4:19         ` Stephen Leake
2018-04-10 14:28           ` Drew Adams
2018-04-09  2:24       ` Eli Zaretskii
2018-04-08 20:36   ` Dmitry Gutov
2018-04-09 14:48     ` Eli Zaretskii
2018-04-09 18:44       ` Charles A. Roelli
2018-04-09 20:47         ` Juri Linkov
2018-04-10  4:24           ` Stephen Leake
2018-04-10 20:06             ` Juri Linkov
     [not found]               ` <86woxe1l0l.fsf@stephe-leake.org>
2018-04-11  7:29                 ` Dmitry Gutov
2018-04-11 20:46                   ` Juri Linkov
2018-04-12 15:31                     ` Stephen Leake
2018-04-12 15:25                   ` Stephen Leake
2018-04-12 16:51                     ` Dmitry Gutov
2018-04-13 16:22                       ` Stephen Leake
2018-04-13 16:26                         ` Dmitry Gutov
2018-04-10 23:06       ` Dmitry Gutov
2018-04-12 20:27 ` Juri Linkov
2018-04-13  7:45   ` Eli Zaretskii
2018-04-13 19:48     ` Juri Linkov
2020-05-19  1:10       ` Dmitry Gutov
2020-05-19 22:12         ` Juri Linkov
2020-05-21  1:57           ` Dmitry Gutov
2020-05-21 20:33             ` Vladimir Sedach
2020-05-21 21:02               ` Stefan Monnier
2020-05-21 21:53               ` Dmitry Gutov
2020-05-21 22:06                 ` Juri Linkov
2020-05-21 22:49                   ` Dmitry Gutov
2020-05-22  1:31                     ` Clément Pit-Claudel
2020-05-22 19:10                       ` Vladimir Sedach
2020-05-23  1:22                         ` Clément Pit-Claudel
2020-05-23  1:27                           ` Dmitry Gutov
     [not found]                             ` <b386929f-4412-860d-343f-a728d6d7e816@gmail.com>
     [not found]                               ` <c6c941bb-a160-f767-b266-6a17f4b4c2ca@yandex.ru>
     [not found]                                 ` <152f1200-a2d0-e137-418f-18ceb14fbbe3@gmail.com>
2020-05-23 15:29                                   ` Drew Adams
2020-05-24  1:36                                   ` Dmitry Gutov
2020-05-24  1:41                                     ` Clément Pit-Claudel
2020-05-24 14:25                                       ` Dmitry Gutov
2020-05-22 23:50                       ` Dmitry Gutov
2020-05-23  1:25                         ` Clément Pit-Claudel
2020-05-23  1:29                           ` Dmitry Gutov

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).