unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Dmitry Gutov <dgutov@yandex.ru>
To: Toby Cubitt <toby-dated-1389913126.e060fb@dr-qubit.org>
Cc: emacs-devel@gnu.org
Subject: Re: Emacs completion matches selection UI
Date: Sat, 04 Jan 2014 06:39:11 +0400	[thread overview]
Message-ID: <52C7744F.3000906@yandex.ru> (raw)
In-Reply-To: <20140102225831.GA19682@c3po>

On 03.01.2014 02:58, Toby Cubitt wrote:
> No, definitely not a wrapper. I was proposing using it as an Elisp
> utility library. If anything, it's Company et al. that would build on top
> of and wrap around a generic Emacs completion UI, rather than the other
> way around.

Ah, that sounds good.

>> although I'd have to look into fitting any of them inside the Company's
>> interaction with the command loop,
>
> ...which BTW is why I suspect the full Company framework isn't suitable
> as a generic Emacs completion UI.

Yes, you could say that. Company is flexible, but could be not "general" 
enough.

> Sure, but as far as I understand (I could well be wrong - I've never used
> it in anger) you use Company by enabling company-mode in your buffer as a
> user, and this minor-mode changes how you interact with Emacs. Whereas
> you use Completion-UI by calling its functions from Elisp when coding a
> new Emacs package. It's really aimed at a "lower" level.

That's normally how it works, yes.

> If Company backend definitions should live in the completion package
> rather than Company, I could add it to Predictive instead.

They can, and they often do. A backend definition is just a function 
that can respond to a variable number of arguments with somewhat 
predetermined values.

> Well, I believe Completion-UI predates at least Company, anything, and
> auto-complete. So "yet-another-completion-package" is misleading. Had
> those packages existed when I coded Predictive, I doubt I'd have bothered
> coding Completion-UI.

I didn't know that. Indeed, it seems to predate Company by a year or so.

> It's a shame Company et al. didn't build on and contribute to
> Completion-UI, and instead chose to (each) reinvent the wheel. But that's
> the usual messy history of code (which maybe we're finally going to do
> something to tidy up?).

Maybe the widget APIs weren't particularly fitting, though. See my 
response to your proposal below.

> Do you want fast predictive completion of plain text, or
> text markup languages like LaTeX?

It could be a decent replacement for dabbrev (I mostly use it to quickly 
complete to some symbol already present before point in the same 
buffer), but the problem with "smart" algorithms that keep history is 
that often enough you can't predict the first option it will offer you. 
That can be annoying, so maybe I don't.

>>> I'd be very happy to see the UI parts of Company stripped out and made
>>> into a simple, generic completion UI package and added to Emacs.
>>
>> Would you like to propose an API for it? Same as popup.el?
>
> As a first attempt, I'd propose something like
>
>    (complete-in-buffer COMPLETION-SOURCE &optional PREFIX-FUNCTION)
>
> where COMPLETION-SOURCE is a function to call to obtain completions, and
> PREFIX-FUNCTION is an optional function to call to determine what to
> complete.

But what if we have a list of completion sources (see the description 
down below<*>)? Some of them can have a different notion of the prefix. 
In Company, we try to remember which backend we're working with at the 
moment, so that we only ask it for completions, candidate metadata, etc.

Though maybe it could work if PREFIX-FUNCTION iterated though backends, 
saved which one responded, and then we could use that value in 
COMPLETION-SOURCE, as well as when implementing the commands providing 
the additional info. In this case, we'll at least need to have a way to 
know when the widget was dismissed or refreshed to erase the saved 
backend value.

In `company-capf', we iterate though the completion-at-point-functions 
each time. This works, and works well enough, since the "does it fit" 
code is usually fast, but it looks fairly bizarre to me, logically.

Ideally, though, the widget interface would be a drawing API of sorts: 
"display these candidates at this point with this current index", 
"update index", "hide", since we have everything else implemented already.

> Calling this would invoke whatever completion widgets the user had
> enabled in customize (with sensible defaults - maybe the popup.el
> interface or similar, or perhaps the default should be the usual
> *Completions* buffer).

I'd still like to a natural way to extend such widgets with new 
commands. Passing a keymap as argument, or rebinding a dynamic variable 
that points to keymap works, I guess, but it's not very nice.

>> A mouse-only menu won't fit Company because it won't work for idle
>> completion, as I mentioned elsewhere in this thread, and we generally
>> want to provide a consistent keyboard interface. There'll also be issues
>> with implementation related to that.
>
> When you register a new UI with Completion-UI, you tell it whether the UI
> is suitable for idle completion. If it is, it becomes one of the
> customization options you can select for the idle completion UI.

Ok, it's reasonable approach, but that means that the UIs can't be 
treated uniformly, which is sort of a bummer. Ideally, we'd have a 
widget that's as useful as a menu when interacted with with a mouse, and 
works with keyboard, and doesn't interrupt the user's typing when 
displayed during idle completion.

If I were to implement something like this for Company, it would mean 
users who like this kind of menu would either have to forgo idle 
completion, or see different kind of UIs whether completion is idle or 
triggered manually. Which sounds weird, at least.

> Sounds like adding it to `company-backends' is more analogous registering
> it with `completion-ui-register-source'.

<*>

Not really. `company-backends' corresponds directly to 
`auto-completion-source', only instead of one function we have a list of 
them (which can also be nested one level deep, but that's an extra feature).

It's similar to `completion-at-point-functions' this way. First, each 
backend knows whether it will be applicable at point (whether the 
buffer's major mode fits, whether the syntax status at point fits, e.g. 
some backends work in strings, others only work outside, etc). So 
instead of calling an analog of `auto-completion-source', Company polls 
all configured backends until it gets a response, then saves the name of 
the backend thus found for the current completion invocation, and calls 
it again for the list of completions. After that, it can call the 
backend for calltips, candidate docs, et cetera.

> Customizing
> `auto-completion-source' is something the user would do, not the Elisp
> package coder.

Same with `company-backends', although we provide a reasonable default. 
But the user can change the global list, of change its local values, for 
example set it to a single-item value in some major mode hook.

> In fact, it sounds like the two APIs are rather similar:

> 2. Pass it to `completion-ui-register-source' (Completion-UI) or add it
>     to `company-backends' (Company) to let them know about it.

Guess the main difference is that, since we definine new backends with 
`defun', there's no way to update the list of available values, visible 
to the `defcustom' interface.

It makes matters a bit worse for third-party backends, but not by much, 
I think.

> At some point in the distant past, you used to just set a variable to
> tell Completion-UI about a new completion function. It became a macro
> call when I made Completion-UI more generic, and there needed to be a way
> of optionally supplying additional information about what the completion
> function does (e.g. if it does something other than standard prefix
> completion), and of defining optional call-back functions, etc.

We solve this problem by requiring backend functions to take the type of 
question it's going to answer as the first argument. Function calls are 
fast enough for our purpose, and this makes definitions quite succinct, 
especially for simple backends.

This pattern is used in many places in Emacs core, too.



  parent reply	other threads:[~2014-01-04  2:39 UTC|newest]

Thread overview: 258+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-18 16:13 Emacs completion matches selection UI Ted Zlatanov
2013-11-18 20:00 ` Bozhidar Batsov
2013-11-18 20:54   ` Andreas Röhler
2013-11-18 21:15   ` Ted Zlatanov
2013-11-19  0:43     ` Stefan Monnier
2013-11-19  9:52       ` Dmitry Gutov
2013-11-19 13:41         ` Stefan Monnier
2013-11-19 14:00           ` Dmitry Gutov
2013-11-19 14:58             ` Ted Zlatanov
2013-11-19 17:50               ` Stefan Monnier
2013-11-19 21:07                 ` Ted Zlatanov
2013-11-20  0:28                   ` Stefan Monnier
2013-11-20  1:30                     ` Ted Zlatanov
2013-11-20  3:22                       ` Stefan Monnier
2013-11-20 17:52                         ` Ted Zlatanov
2013-11-20 19:10                           ` Stefan Monnier
2013-11-20 20:00                             ` Ted Zlatanov
2013-11-20 15:57                     ` Josh
2013-11-21  0:52                       ` Juri Linkov
2013-11-21  3:48                         ` Eli Zaretskii
2013-11-22  0:10                           ` Juri Linkov
2013-11-22  7:36                             ` Eli Zaretskii
2013-11-22 12:33                               ` Ted Zlatanov
2013-11-25 13:28                                 ` Ted Zlatanov
2013-11-25 15:18                                   ` Stefan Monnier
2013-12-16 15:17                                     ` Ted Zlatanov
2013-12-16 18:35                                       ` Stefan Monnier
2013-12-16 22:15                                         ` Ted Zlatanov
2013-12-17  2:10                                           ` Stefan Monnier
2013-12-17 10:49                                             ` Ted Zlatanov
2013-12-17 18:29                                               ` Stefan Monnier
2013-12-17 20:59                                                 ` Ted Zlatanov
2013-12-18  1:58                                                   ` Stephen J. Turnbull
2013-12-18  3:09                                                     ` Ted Zlatanov
2013-12-18  4:47                                                       ` Stephen J. Turnbull
2013-12-18 14:43                                                         ` Ted Zlatanov
2013-12-18 15:51                                                           ` Eli Zaretskii
2013-12-18 16:38                                                             ` Ted Zlatanov
2013-12-18 17:05                                                               ` Eli Zaretskii
2013-12-18 17:18                                                                 ` Ted Zlatanov
2013-12-18 17:37                                                           ` Stephen J. Turnbull
2013-12-18 19:05                                                             ` Ted Zlatanov
2013-12-18 21:11                                                               ` chad
2013-12-19  3:40                                                                 ` Stefan Monnier
2013-12-19 15:49                                                                   ` Ted Zlatanov
2013-12-19 17:30                                                                     ` Dmitry Gutov
2013-12-19 18:44                                                                       ` Ted Zlatanov
2013-12-19 21:44                                                                         ` Dmitry Gutov
2013-12-20  1:15                                                                           ` Ted Zlatanov
2013-12-20  3:06                                                                             ` Stephen J. Turnbull
2013-12-20  3:08                                                                             ` Dmitry Gutov
2013-12-20 11:49                                                                               ` Ted Zlatanov
2013-12-20 13:18                                                                                 ` Dmitry Gutov
2013-12-20 14:59                                                                                   ` Ted Zlatanov
2013-12-22  1:45                                                                                     ` Stefan Monnier
2013-12-22  2:29                                                                                       ` Dmitry Gutov
2013-12-22 11:07                                                                                         ` Stefan Monnier
2013-12-22 16:07                                                                                           ` Dmitry Gutov
2013-12-22 22:50                                                                                             ` enabling company-capf support in cfengine.el (was: Emacs completion matches selection UI) Ted Zlatanov
2013-12-23  0:17                                                                                               ` enabling company-capf support in cfengine.el Dmitry Gutov
2013-12-23  1:11                                                                                                 ` Ted Zlatanov
2013-12-23  1:32                                                                                                   ` Dmitry Gutov
2014-01-16 13:12                                                                                                 ` Dmitry Gutov
2014-01-16 16:06                                                                                                   ` Stefan Monnier
2014-01-16 17:39                                                                                                     ` Dmitry Gutov
2014-01-17 13:04                                                                                                       ` Stefan Monnier
2014-01-18 14:13                                                                                                         ` Dmitry Gutov
2014-01-19  2:37                                                                                                           ` Stefan Monnier
2014-01-19 16:44                                                                                                             ` Dmitry Gutov
2014-01-19 20:19                                                                                                               ` Stefan Monnier
2014-01-19 20:44                                                                                                                 ` David Engster
2014-01-20  0:13                                                                                                                 ` Dmitry Gutov
2014-01-20  2:14                                                                                                                   ` Stephen J. Turnbull
2014-01-20  2:39                                                                                                                     ` John Yates
2014-01-20  3:22                                                                                                                       ` Stephen J. Turnbull
2014-01-20  7:10                                                                                                                         ` David Kastrup
2014-01-20 14:22                                                                                                                         ` John Yates
2014-01-20 14:55                                                                                                                           ` David Kastrup
2014-01-20 15:09                                                                                                                           ` clang vs free software (was: enabling company-capf support in cfengine.el) Stefan Monnier
2014-01-20 19:47                                                                                                                             ` clang vs free software David Engster
2014-01-21 14:42                                                                                                                               ` Richard Stallman
2014-01-21 15:02                                                                                                                                 ` David Kastrup
2014-01-21 15:20                                                                                                                                 ` Dmitry Gutov
2014-01-22 15:31                                                                                                                                   ` Richard Stallman
2014-01-22 17:24                                                                                                                                     ` Dmitry Gutov
2014-01-21 15:34                                                                                                                                 ` John Yates
2014-01-21 16:00                                                                                                                                   ` Rüdiger Sonderfeld
2014-01-21 16:25                                                                                                                                     ` joakim
2014-01-21 16:34                                                                                                                                       ` Rüdiger Sonderfeld
2014-01-21 16:38                                                                                                                                         ` joakim
2014-01-21 18:50                                                                                                                                           ` Rüdiger Sonderfeld
2014-01-21 18:00                                                                                                                                         ` Thien-Thi Nguyen
2014-01-21 18:44                                                                                                                                           ` Rüdiger Sonderfeld
2014-01-23 10:55                                                                                                                                   ` Richard Stallman
2014-01-23 11:01                                                                                                                                     ` David Kastrup
2014-01-23 14:26                                                                                                                                       ` Helmut Eller
2014-01-25 23:02                                                                                                                                         ` Richard Stallman
2014-01-25 23:28                                                                                                                                           ` Daniel Colascione
2014-01-26  1:35                                                                                                                                             ` Lennart Borgman
2014-01-26  6:45                                                                                                                                             ` David Kastrup
2014-01-26 12:13                                                                                                                                               ` Daniel Colascione
2014-01-26 12:35                                                                                                                                                 ` Lennart Borgman
2014-01-26 14:45                                                                                                                                                 ` David Kastrup
2014-01-26 20:06                                                                                                                                                 ` Richard Stallman
2014-01-26 20:06                                                                                                                                             ` Richard Stallman
2014-01-26 10:22                                                                                                                                           ` Helmut Eller
2014-01-26 11:12                                                                                                                                             ` David Kastrup
2014-01-26 12:36                                                                                                                                               ` Helmut Eller
2014-01-26 14:54                                                                                                                                                 ` David Kastrup
2014-01-26 20:06                                                                                                                                             ` Richard Stallman
2014-01-26 15:12                                                                                                                                           ` Stefan Monnier
2014-01-26 15:15                                                                                                                                             ` Lennart Borgman
2014-01-26 15:35                                                                                                                                               ` David Kastrup
2014-01-26 15:46                                                                                                                                                 ` Lennart Borgman
2014-01-23 16:35                                                                                                                                       ` Rüdiger Sonderfeld
2014-01-23 18:04                                                                                                                                         ` David Engster
2014-01-22  2:06                                                                                                                                 ` unic0rn
2014-01-20 15:57                                                                                                                           ` enabling company-capf support in cfengine.el Stephen J. Turnbull
2014-01-20  3:32                                                                                                                       ` Óscar Fuentes
2014-01-20 13:59                                                                                                                         ` John Yates
2014-01-20 14:30                                                                                                                           ` David Kastrup
2014-01-20 17:01                                                                                                                             ` John Yates
2014-01-20  2:17                                                                                                                   ` Stefan Monnier
2014-01-19 16:54                                                                                                             ` Dmitry Gutov
2014-01-19 20:21                                                                                                               ` Stefan Monnier
2014-01-19 23:57                                                                                                                 ` Dmitry Gutov
2014-01-20  2:20                                                                                                                   ` Stefan Monnier
2014-01-20  2:33                                                                                                                     ` Dmitry Gutov
2014-01-20 13:41                                                                                                                       ` Stefan Monnier
2013-12-23  1:36                                                                                             ` Emacs completion matches selection UI Stefan Monnier
2013-12-23  2:12                                                                                               ` Dmitry Gutov
2013-12-23 13:33                                                                                                 ` Stefan Monnier
2013-12-20  1:19                                                                         ` Stephen J. Turnbull
2013-12-20  1:17                                                                     ` Stephen J. Turnbull
2013-12-20 14:32                                                                     ` Stefan Monnier
2013-12-20 15:54                                                                       ` Ted Zlatanov
2013-12-21  3:32                                                                         ` Stephen J. Turnbull
2013-12-21  4:58                                                                           ` Ted Zlatanov
2013-12-22  2:05                                                                         ` Stefan Monnier
2013-12-22 23:15                                                                           ` Ted Zlatanov
2013-12-23  1:59                                                                             ` Stefan Monnier
2013-12-23 12:28                                                                               ` Ted Zlatanov
2013-12-23 13:42                                                                                 ` Stefan Monnier
2013-12-23 14:52                                                                                   ` Ted Zlatanov
2013-12-30 20:47                                                                                     ` Toby Cubitt
2013-12-31  0:20                                                                                       ` Leo Liu
2013-12-31  7:48                                                                                         ` joakim
2013-12-31 14:30                                                                                       ` Dmitry Gutov
2013-12-31 15:52                                                                                         ` Toby Cubitt
2013-12-31 17:45                                                                                           ` joakim
2014-01-02 18:54                                                                                             ` Dmitry Gutov
2014-01-02 18:10                                                                                           ` Stefan Monnier
2014-01-03 17:49                                                                                             ` Ted Zlatanov
2014-01-03 19:36                                                                                               ` Stefan Monnier
2014-01-04  0:48                                                                                               ` Toby Cubitt
2014-01-04  3:45                                                                                                 ` Stefan Monnier
2014-01-06  4:47                                                                                                   ` Toby Cubitt
2014-01-06 23:38                                                                                                 ` Ted Zlatanov
2014-01-07  3:57                                                                                                   ` Toby Cubitt
2014-01-04  9:21                                                                                               ` João Távora
2014-01-06 23:21                                                                                                 ` Ted Zlatanov
2014-01-02 20:20                                                                                           ` Dmitry Gutov
2014-01-02 22:58                                                                                             ` Toby Cubitt
2014-01-03  2:40                                                                                               ` Stefan Monnier
2014-01-03 14:30                                                                                                 ` Toby Cubitt
2014-01-03 16:23                                                                                                   ` Dmitry Gutov
2014-01-03 16:48                                                                                                     ` Toby Cubitt
2014-01-03 19:32                                                                                                       ` Stefan Monnier
2014-01-03 22:06                                                                                                         ` Toby Cubitt
2014-01-04  3:39                                                                                                           ` Stefan Monnier
2014-01-06  4:00                                                                                                             ` Toby Cubitt
2014-01-03 16:35                                                                                               ` Toby Cubitt
2014-01-03 17:46                                                                                                 ` Thierry Volpiatto
2014-01-04  2:39                                                                                               ` Dmitry Gutov [this message]
2014-01-04  3:54                                                                                                 ` Stefan Monnier
2014-01-05  4:08                                                                                                   ` Dmitry Gutov
2014-01-05 16:04                                                                                                     ` Stefan Monnier
2014-01-06  4:25                                                                                                       ` Dmitry Gutov
2014-01-06  5:25                                                                                                         ` Toby Cubitt
2014-01-06  2:39                                                                                                 ` Toby Cubitt
2014-01-06  4:03                                                                                                   ` Stefan Monnier
2014-01-06  5:35                                                                                                     ` Toby Cubitt
2014-01-06  5:55                                                                                                       ` Dmitry Gutov
2014-01-06 14:47                                                                                                       ` Stefan Monnier
2014-01-06 15:54                                                                                                         ` Toby Cubitt
2014-01-06 20:53                                                                                                           ` Stefan Monnier
2014-01-06 23:45                                                                                                     ` Ted Zlatanov
2014-01-06  7:36                                                                                                   ` Dmitry Gutov
2014-01-06 15:51                                                                                                     ` Toby Cubitt
2014-01-07  0:17                                                                                                       ` Dmitry Gutov
2014-01-07  3:32                                                                                                         ` Toby Cubitt
2014-01-07 23:23                                                                                                           ` Dmitry Gutov
2014-01-08  2:58                                                                                                             ` Toby Cubitt
2014-01-08  3:38                                                                                                               ` Bob Bobeck
2014-01-08  3:47                                                                                                                 ` Toby Cubitt
2014-01-08  9:27                                                                                                                 ` Richard Stallman
2014-01-08 15:37                                                                                                                 ` Ted Zlatanov
2014-01-08  4:49                                                                                                               ` Stefan Monnier
2014-01-08 15:33                                                                                                                 ` Ted Zlatanov
2014-01-08 16:11                                                                                                                   ` Toby Cubitt
2014-01-09  7:12                                                                                                               ` Dmitry Gutov
2013-12-23 13:45                                                                               ` John Yates
2013-12-23 16:02                                                                                 ` Stefan Monnier
2013-12-24  2:47                                                                                   ` John Yates
2013-12-28 14:02                                                                                     ` Stefan Monnier
2013-12-28 16:43                                                                                       ` John Yates
2013-12-30 12:55                                                                                         ` Stefan Monnier
2013-12-30 16:32                                                                                           ` João Távora
2014-01-04 23:02                                                                                             ` Stefan Monnier
2014-01-05  2:13                                                                                               ` João Távora
2014-01-05 16:11                                                                                                 ` Stefan Monnier
2014-01-06 23:48                                                                                                   ` Ted Zlatanov
2014-01-07  3:15                                                                                                     ` Stefan Monnier
2014-01-07 16:13                                                                                                       ` Ted Zlatanov
2014-01-07 17:18                                                                                                       ` João Távora
2014-01-07 18:10                                                                                                         ` Josh
2014-01-07 19:42                                                                                                           ` David Kastrup
2014-01-08  3:54                                                                                                             ` Josh
2014-01-07  3:16                                                                                                     ` Stefan Monnier
2014-01-07 16:12                                                                                                       ` Ted Zlatanov
2013-12-28 15:59                                                                                     ` João Távora
2013-12-28 17:00                                                                                       ` John Yates
2013-12-28 17:40                                                                                         ` Josh
2013-12-19  4:53                                                                 ` Stephen J. Turnbull
2013-12-19  5:45                                                                   ` chad
2013-12-19  7:03                                                                     ` Stephen J. Turnbull
2013-12-19  7:59                                                                       ` Aaron Ecay
2013-12-19 15:29                                                                         ` Stephen J. Turnbull
2013-12-19 17:41                                                                       ` Eli Zaretskii
2013-12-19 18:46                                                                         ` Ted Zlatanov
2013-12-20  0:53                                                                         ` Stephen J. Turnbull
2013-12-19  6:23                                                               ` Stephen J. Turnbull
2013-11-19 16:24             ` Eli Zaretskii
2013-11-21 10:17               ` Dmitry Gutov
2013-11-21 16:30                 ` Eli Zaretskii
2013-11-22  5:38                   ` Stephen J. Turnbull
2013-11-22 15:19                     ` Eli Zaretskii
2013-11-23 10:03                       ` Stephen J. Turnbull
2013-11-19 13:48       ` Ted Zlatanov
2013-11-19 18:03         ` Stefan Monnier
2013-11-20  0:10         ` Gregor Zattler
2013-11-20  1:25           ` Ted Zlatanov
2013-11-20 17:59             ` John Yates
2013-11-19  0:47     ` Juri Linkov
2013-11-19 11:18       ` Tom
2013-11-19 14:00         ` Stefan Monnier
2013-11-20  0:45           ` Juri Linkov
2013-11-20  7:34             ` martin rudalics
2013-11-20  7:50               ` Tom
2013-11-21  0:45               ` Juri Linkov
2013-11-21  7:41                 ` martin rudalics
2013-11-22  0:18                   ` Juri Linkov
2013-11-22 10:26                     ` martin rudalics
2013-11-19 19:44       ` Dmitry Gutov
2013-11-20  7:39         ` Eric Abrahamsen
2013-11-19 17:33 ` Sebastian Wiesner
  -- strict thread matches above, loose matches on Subject: below --
2013-12-30 20:35 Barry OReilly
2014-01-01 18:12 ` Stefan Monnier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52C7744F.3000906@yandex.ru \
    --to=dgutov@yandex.ru \
    --cc=emacs-devel@gnu.org \
    --cc=toby-dated-1389913126.e060fb@dr-qubit.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).