* Simplification of `affixation-function` @ 2021-04-24 17:35 Daniel Mendler 2021-04-24 20:22 ` Juri Linkov 0 siblings, 1 reply; 18+ messages in thread From: Daniel Mendler @ 2021-04-24 17:35 UTC (permalink / raw) To: emacs-devel; +Cc: juri The `affixation-function`, which can be specified in the completion table metadata is allowed to return a list with elements of either two or three elements depending on if you want to add only a suffix or both a prefix and a suffix. Would it make sense to use a simpler definition for this function? What is the downside of only allowing triples? In case you don't want to use a prefix or suffix, specify the empty string. Or is the idea to make the function extensible over time, such that completion UIs should ignore if more than three elements are specified? But if that is the case the current definition is problematic. The first element is always the candidate, the second element is either suffix or prefix and the third element if it exists is the suffix. It is kind of understandable that this definition has been chosen since suffix before prefix is confusing. Still, if extensibility is the goal it would be preferable if the position of the strings does not change depending on the length of the list. Daniel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-24 17:35 Simplification of `affixation-function` Daniel Mendler @ 2021-04-24 20:22 ` Juri Linkov 2021-04-24 21:17 ` Daniel Mendler 2021-04-24 22:34 ` Stefan Monnier 0 siblings, 2 replies; 18+ messages in thread From: Juri Linkov @ 2021-04-24 20:22 UTC (permalink / raw) To: Daniel Mendler; +Cc: emacs-devel > The `affixation-function`, which can be specified in the completion table > metadata is allowed to return a list with elements of either two or three > elements depending on if you want to add only a suffix or both a prefix and > a suffix. > > Would it make sense to use a simpler definition for this function? What is > the downside of only allowing triples? In case you don't want to use > a prefix or suffix, specify the empty string. If the logic of specifying the elements is too confusing, then such simplification is welcome. Please note that only the documentation could be changed to remove mentions of the ability to specify only suffix for `affixation-function`. But code will remain unchanged because internally it depends on the predefined order of elements: “completion + suffix” or “completion + prefix + suffix”. There is no backward-compatible way to change this order. > Or is the idea to make the function extensible over time, such that > completion UIs should ignore if more than three elements are specified? But > if that is the case the current definition is problematic. The first > element is always the candidate, the second element is either suffix or > prefix and the third element if it exists is the suffix. More than three elements are already supported since e.g. the total length is calculated as a sum of lengths of all strings: (apply #'+ (mapcar #'string-width str)) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-24 20:22 ` Juri Linkov @ 2021-04-24 21:17 ` Daniel Mendler 2021-04-24 21:41 ` Juri Linkov 2021-04-24 22:34 ` Stefan Monnier 1 sibling, 1 reply; 18+ messages in thread From: Daniel Mendler @ 2021-04-24 21:17 UTC (permalink / raw) To: Juri Linkov; +Cc: emacs-devel On 4/24/21 10:22 PM, Juri Linkov wrote: > If the logic of specifying the elements is too confusing, > then such simplification is welcome. > Please note that only the documentation could be changed > to remove mentions of the ability to specify only suffix > for `affixation-function`. But code will remain unchanged > because internally it depends on the predefined order of elements: > “completion + suffix” or “completion + prefix + suffix”. > There is no backward-compatible way to change this order. I think it is slightly confusing and unnecessarily complicated. But if you want to retain backward compatibility, there is no way back. However since the `affixation-function` has only been introduced recently, there should still be a time window to change the definition? There is no released version of Emacs with `affixation-function` support. (If it is decided to change the definition it should be feasible to go over all ELPA/MELPA and apply patches to all packages which already make use of the `affixation-function`.) > More than three elements are already supported since e.g. the > total length is calculated as a sum of lengths of all strings: > > (apply #'+ (mapcar #'string-width str)) I see. So all the later elements are suffixes and concatenated? This seems like an unnecessary completion given that the completion-table implementor can already concatenate all the suffixes. Or is the idea that the UI can show all these suffixes in some kind of table-like view? It seems that there is at least need for better documentation. My proposal is to only allow three-element lists and remove support to specify only the suffix. And one could keep the door open by allowing more than three element lists for additional annotations. Let's say you want to specify some additional help/tool-tip text for example. Daniel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-24 21:17 ` Daniel Mendler @ 2021-04-24 21:41 ` Juri Linkov 2021-04-24 22:01 ` Daniel Mendler 0 siblings, 1 reply; 18+ messages in thread From: Juri Linkov @ 2021-04-24 21:41 UTC (permalink / raw) To: Daniel Mendler; +Cc: emacs-devel > I think it is slightly confusing and unnecessarily complicated. But if you > want to retain backward compatibility, there is no way back. However since > the `affixation-function` has only been introduced recently, there should > still be a time window to change the definition? There is no released > version of Emacs with `affixation-function` support. > > (If it is decided to change the definition it should be feasible to go over > all ELPA/MELPA and apply patches to all packages which already make use of > the `affixation-function`.) I'm not sure if breaking the existing API is worth the trouble. We could just change the documentation of ‘affixation-function’ to define only one supported way of using the “completion + prefix + suffix” format to reduce confusion. >> More than three elements are already supported since e.g. the >> total length is calculated as a sum of lengths of all strings: >> (apply #'+ (mapcar #'string-width str)) > > I see. So all the later elements are suffixes and concatenated? This seems > like an unnecessary completion given that the completion-table implementor > can already concatenate all the suffixes. This is just implementation detail, there is no intention to support more suffixes. > Or is the idea that the UI can show all these suffixes in some kind of > table-like view? Currently I'm trying to use tabulated-list-mode in the completions buffer. But even in this case there is no need to add more suffixes for more table columns. > My proposal is to only allow three-element lists and remove support to > specify only the suffix. Supporting only the suffix still is necessary for the ‘annotation-function’. > And one could keep the door open by allowing more than three element lists > for additional annotations. Let's say you want to specify some additional > help/tool-tip text for example. I'd prefer to support additional text using keywords, e.g. ("completion" "prefix" "suffix" :help "Help text") ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-24 21:41 ` Juri Linkov @ 2021-04-24 22:01 ` Daniel Mendler 0 siblings, 0 replies; 18+ messages in thread From: Daniel Mendler @ 2021-04-24 22:01 UTC (permalink / raw) To: Juri Linkov; +Cc: emacs-devel On 4/24/21 11:41 PM, Juri Linkov wrote:> We could just change the documentation of ‘affixation-function’ to define > only one supported way of using the “completion + prefix + suffix” format > to reduce confusion. This is a "resolution" I would not be happy with. We still keep around an obsolete format (which has only been introduced a few months ago) and then keep it out of the documentation. I think it is preferable to correct the definition then. But it is okay to keep the current definition if you think the costs of a change outweigh the benefits. > I'd prefer to support additional text using keywords, e.g. > ("completion" "prefix" "suffix" :help "Help text") The suggestion with the keywords is nice. If you plan to allow such additional keywords, this should be documented then, since completion UIs rely on the documentation when they implement support for the function. Which formats will be allowed? We already have `(candidate suffix)` and `(candidate prefix suffix)`. For extensibility one may want to add (candidate :prefix prefix :suffix suffix :other-keys...) or as you proposed (candidate prefix suffix :other-keys...). Daniel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-24 20:22 ` Juri Linkov 2021-04-24 21:17 ` Daniel Mendler @ 2021-04-24 22:34 ` Stefan Monnier 2021-04-24 22:48 ` Dmitry Gutov 1 sibling, 1 reply; 18+ messages in thread From: Stefan Monnier @ 2021-04-24 22:34 UTC (permalink / raw) To: Juri Linkov; +Cc: Daniel Mendler, emacs-devel > because internally it depends on the predefined order of elements: > “completion + suffix” or “completion + prefix + suffix”. > There is no backward-compatible way to change this order. We don't need to worry about backward compatibility here since this functionality has not yet been included in any released Emacs. Stefan ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-24 22:34 ` Stefan Monnier @ 2021-04-24 22:48 ` Dmitry Gutov 2021-04-24 22:56 ` Daniel Mendler 0 siblings, 1 reply; 18+ messages in thread From: Dmitry Gutov @ 2021-04-24 22:48 UTC (permalink / raw) To: Stefan Monnier, Juri Linkov; +Cc: Daniel Mendler, emacs-devel On 25.04.2021 01:34, Stefan Monnier wrote: >> because internally it depends on the predefined order of elements: >> “completion + suffix” or “completion + prefix + suffix”. >> There is no backward-compatible way to change this order. > We don't need to worry about backward compatibility here since this > functionality has not yet been included in any released Emacs. Speaking of not being able to change it after the release, am I right to assume that this feature's main target is completing-read and not completion-at-point-functions? Nobody proposed a patch for Company, and I'm not sure how to handle such non-semantic affixations in there (icons generally require more care since they often take up more than single character width). Speaking of it's used in help--symbol-completion-table-affixation, we have recently added a related feature called 'kind' in Company which assigns each completion a icon (using a user-customizable mapping and/or algorithm). You can see its integration in elisp-completion-at-point (the :company-kind attributes). ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-24 22:48 ` Dmitry Gutov @ 2021-04-24 22:56 ` Daniel Mendler 2021-04-25 17:58 ` Dmitry Gutov 0 siblings, 1 reply; 18+ messages in thread From: Daniel Mendler @ 2021-04-24 22:56 UTC (permalink / raw) To: Dmitry Gutov, Stefan Monnier, Juri Linkov; +Cc: emacs-devel On 4/25/21 12:48 AM, Dmitry Gutov wrote: > On 25.04.2021 01:34, Stefan Monnier wrote: >>> because internally it depends on the predefined order of elements: >>> “completion + suffix” or “completion + prefix + suffix”. >>> There is no backward-compatible way to change this order. >> We don't need to worry about backward compatibility here since this >> functionality has not yet been included in any released Emacs. > > Speaking of not being able to change it after the release, am I right to > assume that this feature's main target is completing-read and not > completion-at-point-functions? I support affixation-functions in my small Corfu package, which shows overlay popups like Company. However the result will not be good if the affixation-functions return long suffix strings and are written with the *Completions* buffer in mind. Daniel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-24 22:56 ` Daniel Mendler @ 2021-04-25 17:58 ` Dmitry Gutov 2021-04-25 18:08 ` Daniel Mendler 0 siblings, 1 reply; 18+ messages in thread From: Dmitry Gutov @ 2021-04-25 17:58 UTC (permalink / raw) To: Daniel Mendler, Stefan Monnier, Juri Linkov; +Cc: emacs-devel On 25.04.2021 01:56, Daniel Mendler wrote: > I support affixation-functions in my small Corfu package, which shows > overlay popups like Company. However the result will not be good if the > affixation-functions return long suffix strings and are written with the > *Completions* buffer in mind. I guess my problem with it is, with the apparent end goal of flexibility, it ends up targeting only the default completion UI, and the more an alternative UI is different from it, the worse the result can look. And without semantic information, it fails to take advantage of the additional features the alternative UIs might provide. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-25 17:58 ` Dmitry Gutov @ 2021-04-25 18:08 ` Daniel Mendler 2021-04-25 22:31 ` Dmitry Gutov 0 siblings, 1 reply; 18+ messages in thread From: Daniel Mendler @ 2021-04-25 18:08 UTC (permalink / raw) To: Dmitry Gutov, Stefan Monnier, Juri Linkov; +Cc: emacs-devel On 4/25/21 7:58 PM, Dmitry Gutov wrote: > I guess my problem with it is, with the apparent end goal of > flexibility, it ends up targeting only the default completion UI, and > the more an alternative UI is different from it, the worse the result > can look. > > And without semantic information, it fails to take advantage of the > additional features the alternative UIs might provide. You are right about that. As things stand now the annotation/affixation-function only work well for the default completions buffer and the vertical completion UIs. The completion-at-point popups are very different from that, so it is only fair if they try to invent their own metadata functions as you are doing in Company with `company-kind` etc. However I am a bit critical with regards to the "semantic information". As far as I understood you use some icon names for that, but this restricts the purpose of the annotations. Maybe it would be sufficient to use a more crude solution, where you only specify that the annotations/affixations must be sufficiently short in order to display well in the popups, without going the full way to the semantic kinds. Daniel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-25 18:08 ` Daniel Mendler @ 2021-04-25 22:31 ` Dmitry Gutov 2021-04-27 16:48 ` Juri Linkov 0 siblings, 1 reply; 18+ messages in thread From: Dmitry Gutov @ 2021-04-25 22:31 UTC (permalink / raw) To: Daniel Mendler, Stefan Monnier, Juri Linkov; +Cc: emacs-devel On 25.04.2021 21:08, Daniel Mendler wrote: > On 4/25/21 7:58 PM, Dmitry Gutov wrote: >> I guess my problem with it is, with the apparent end goal of >> flexibility, it ends up targeting only the default completion UI, and >> the more an alternative UI is different from it, the worse the result >> can look. >> >> And without semantic information, it fails to take advantage of the >> additional features the alternative UIs might provide. > > You are right about that. As things stand now the > annotation/affixation-function only work well for the default > completions buffer and the vertical completion UIs. Isn't Company a vertical completion UI? > The > completion-at-point popups are very different from that, so it is only > fair if they try to invent their own metadata functions as you are doing > in Company with `company-kind` etc. It's fair that they try to invent new stuff, but it's more economical to reuse the stuff when feasible. > However I am a bit critical with regards to the "semantic information". > As far as I understood you use some icon names for that, but this > restricts the purpose of the annotations. Maybe it would be sufficient > to use a more crude solution, where you only specify that the > annotations/affixations must be sufficiently short in order to display > well in the popups, without going the full way to the semantic kinds. There are currently only two places where affixation-function is used in the core. One of them is the aforementioned help--symbol-completion-table. Regardless of whether there will ever be a completing-read-function based on Company (it's not hard to do, actually; mostly the popup rendering method is holding it back, but I had it working with company-posframe), if help--symbol-completion-table-affixation plugged into :company-kind instead, the users could see the icons already familiar from completion code, from other backends, they wouldn't need to puzzle out what the "u", "a" and "c" characters mean. And other completion frameworks can pick up this feature too (maybe even reuse the icon mappings, we'll see). The user can also customize the icons' look, choose whether they should be SVG, text, icon font characters, or so on. The other use is in read-char-by-name. And I can admit, seeing the characters in the first column is slightly better than following each completion. Not by much, they still work well enough as annotations, but seeing them in the first column is a bit tidier. What would I do? First of all, keep them in annotations, because just one slightly better-looking use case does not justify the added complexity. If someone really wanted to improve positioning of annotations for that completion table, there are other options: - Add a custom var that aligns all annotations to the right, then they'll also be in one column. Company has such an option already. - Create a var specific for the default UI that would move the annotations to the left of the completions. read-char-by-name could bind it to t before calling completing-read. Then the *Completions* rendering code would do whatever is necessary to render it correctly at the requested side. But since mule--ucs-names-affixation, aside from information, also contains presentation (spacing and alignment chars), it would be infeasible for a completion function that doesn't want extra stuff on the left to render its result on the right. You can also note that the third (suffix) element is always an empty string in both of these use cases. So affixation-function was really added to be able to add a prefix. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-25 22:31 ` Dmitry Gutov @ 2021-04-27 16:48 ` Juri Linkov 2021-04-27 17:39 ` Daniel Mendler 2021-04-28 0:20 ` Dmitry Gutov 0 siblings, 2 replies; 18+ messages in thread From: Juri Linkov @ 2021-04-27 16:48 UTC (permalink / raw) To: Dmitry Gutov; +Cc: Daniel Mendler, Stefan Monnier, emacs-devel > You can also note that the third (suffix) element is always an empty string > in both of these use cases. So affixation-function was really added to be > able to add a prefix. affixation-function was an improvement over annotation-function, but nonetheless it has limitations too. What would be a better thing is like Daniel proposed a new meta `group-function`, I'd imagine a similar meta `format-function` that could receive a candidate and return a string to insert to the completions buffer. Then the caller e.g. help--symbol-completion-table could define whether to append "u", "a" and "c" in parens by using on a candidate something like (format "%s (%s)" cand (cond ((fboundp (intern cand)) "f")) ...), or prepend a dimmed letter as a prefix, or to use an icon. The same `format-function` could be used to remove the group prefix when `group-function` is in use, instead of providing an additional argument `transform` for `group-function`. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-27 16:48 ` Juri Linkov @ 2021-04-27 17:39 ` Daniel Mendler 2021-04-27 18:11 ` Juri Linkov 2021-04-28 0:20 ` Dmitry Gutov 1 sibling, 1 reply; 18+ messages in thread From: Daniel Mendler @ 2021-04-27 17:39 UTC (permalink / raw) To: Juri Linkov, Dmitry Gutov; +Cc: Stefan Monnier, emacs-devel On 4/27/21 6:48 PM, Juri Linkov wrote: >> You can also note that the third (suffix) element is always an empty string >> in both of these use cases. So affixation-function was really added to be >> able to add a prefix. > > affixation-function was an improvement over annotation-function, > but nonetheless it has limitations too. What would be a better thing is > like Daniel proposed a new meta `group-function`, I'd imagine a similar > meta `format-function` that could receive a candidate and return > a string to insert to the completions buffer. > > Then the caller e.g. help--symbol-completion-table could define whether > to append "u", "a" and "c" in parens by using on a candidate something like > (format "%s (%s)" cand (cond ((fboundp (intern cand)) "f")) ...), > or prepend a dimmed letter as a prefix, or to use an icon. > > The same `format-function` could be used to remove the group prefix > when `group-function` is in use, instead of providing an additional > argument `transform` for `group-function`. There has been some confusion regarding this already. Some people (me included) had assumed at some point that the affixation function is allowed to transform the candidate, since the candidate is part of the returned list elements (Now I know that this is not the case, but the function should be allowed to add faces). It should be possible to relax the affixation function to allow a candidate transformation, then we avoid the addition of another format-function function. One may ask - why not change the affixation function then such that it only returns a single string? We could do that but I think it is valuable to separate prefix/candidate/suffix for display in a tablist. The group function candidate transformation is also to be distinguished from a potential transformation performed by a format/affixation-function, since the group transformation should be only applied when grouping is active. It is therefore better to keep the transformations separate. Daniel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-27 17:39 ` Daniel Mendler @ 2021-04-27 18:11 ` Juri Linkov 2021-04-27 18:40 ` Daniel Mendler 0 siblings, 1 reply; 18+ messages in thread From: Juri Linkov @ 2021-04-27 18:11 UTC (permalink / raw) To: Daniel Mendler; +Cc: emacs-devel, Stefan Monnier, Dmitry Gutov >> affixation-function was an improvement over annotation-function, >> but nonetheless it has limitations too. What would be a better thing is >> like Daniel proposed a new meta `group-function`, I'd imagine a similar >> meta `format-function` that could receive a candidate and return >> a string to insert to the completions buffer. > > There has been some confusion regarding this already. Some people (me > included) had assumed at some point that the affixation function is > allowed to transform the candidate, since the candidate is part of the > returned list elements (Now I know that this is not the case, but the > function should be allowed to add faces). It should be possible to relax > the affixation function to allow a candidate transformation, then we > avoid the addition of another format-function function. One may ask - affixation-function is called immediately after sorting candidates. format-function could be called immediately before inserting candidates only when they are displayed. > why not change the affixation function then such that it only returns a > single string? We could do that but I think it is valuable to separate > prefix/candidate/suffix for display in a tablist. Because completion--insert-strings needs to highlight the untransformed candidate with mouse-face=highlight. >> The same `format-function` could be used to remove the group prefix >> when `group-function` is in use, instead of providing an additional >> argument `transform` for `group-function`. > > The group function candidate transformation is also to be distinguished > from a potential transformation performed by a > format/affixation-function, since the group transformation should be > only applied when grouping is active. It is therefore better to keep the > transformations separate. API would be more clear when transformation is separated from grouping. So if there is no need to transform group candidates, only group-function is provided. When group candidates need transformation, then additionally format/affixation-function can be provided as well. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-27 18:11 ` Juri Linkov @ 2021-04-27 18:40 ` Daniel Mendler 0 siblings, 0 replies; 18+ messages in thread From: Daniel Mendler @ 2021-04-27 18:40 UTC (permalink / raw) To: Juri Linkov; +Cc: emacs-devel, Stefan Monnier, Dmitry Gutov On 4/27/21 8:11 PM, Juri Linkov wrote: > affixation-function is called immediately after sorting candidates. > format-function could be called immediately before inserting candidates > only when they are displayed. I don't see why using the affixation function is not possible for the transformation. The affixation function is basically just called right before insertion, right before the candidates are passed to `display-completion-list`. I don't see the need for an additional format function here. >> why not change the affixation function then such that it only returns a >> single string? We could do that but I think it is valuable to separate >> prefix/candidate/suffix for display in a tablist. > > Because completion--insert-strings needs to highlight the untransformed > candidate with mouse-face=highlight. Yes, that's right. `choose-completion` uses the mouse highlight to locate the candidate. But this trick must be relaxed as soon as you bring transformed candidates into the game. In my `group-function` patch I am attaching the untransformed candidate to the property `completion--string`, which is then read by `choose-completion`. Note that the highlighting is still preserved, if no grouping/transformation is used. In that case the highlighting still reflects the untransformed candidate. As such the change is backward compatible as long as grouping/transformation is guarded behind a feature flag. >> The group function candidate transformation is also to be distinguished >> from a potential transformation performed by a >> format/affixation-function, since the group transformation should be >> only applied when grouping is active. It is therefore better to keep the >> transformations separate. > > API would be more clear when transformation is separated from grouping. > So if there is no need to transform group candidates, only group-function > is provided. When group candidates need transformation, then additionally > format/affixation-function can be provided as well. I considered exactly this, but it is problematic. The idea of grouping is that you can optionally turn it on or optionally support it in the UI. The grouping transformation should only be applied when grouping is enabled. This is important since the grouping candidate transformation may remove some redundant part of the candidate which is then displayed in the group title. This means we cannot conflate the grouping candidate transformation with the `affixation/format-function`. We can either go with two functions `group-sort-function+group-transform-function`, where `group-transform-function` is optional or with the boolean `transform` argument I am having now in the patch. I think it is easier to have a single `group-function` instead of splitting this small feature into two functions. Daniel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-27 16:48 ` Juri Linkov 2021-04-27 17:39 ` Daniel Mendler @ 2021-04-28 0:20 ` Dmitry Gutov 2021-04-28 19:59 ` Juri Linkov 1 sibling, 1 reply; 18+ messages in thread From: Dmitry Gutov @ 2021-04-28 0:20 UTC (permalink / raw) To: Juri Linkov; +Cc: Daniel Mendler, Stefan Monnier, emacs-devel On 27.04.2021 19:48, Juri Linkov wrote: >> You can also note that the third (suffix) element is always an empty string >> in both of these use cases. So affixation-function was really added to be >> able to add a prefix. > > affixation-function was an improvement over annotation-function, > but nonetheless it has limitations too. What would be a better thing is > like Daniel proposed a new meta `group-function`, I'd imagine a similar > meta `format-function` that could receive a candidate and return > a string to insert to the completions buffer. That would also conflate information with presentation, and thus only be usable for the default completion UI. And not ideal even for that purpose. > Then the caller e.g. help--symbol-completion-table could define whether > to append "u", "a" and "c" in parens by using on a candidate something like > (format "%s (%s)" cand (cond ((fboundp (intern cand)) "f")) ...), > or prepend a dimmed letter as a prefix, or to use an icon. Do you use Company? Take a look at what elisp--company-kind does. The fact that the space of allowed values is constrained makes the returned information really more useful. And here since you do not document which values (strings, characters, etc) the prefix returned by affixation-function can take, their usefulness is limited. The user can't be sure what "c" means: it's "command" here, but could be meant as "constant" by another affixation function. Is "m" a "macro" or "method"? "f" stands for "function" or "field"? And also because of that no completing-read UI can replace these characters with any alternative (e.g. graphical) representation. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-28 0:20 ` Dmitry Gutov @ 2021-04-28 19:59 ` Juri Linkov 2021-04-29 2:15 ` Dmitry Gutov 0 siblings, 1 reply; 18+ messages in thread From: Juri Linkov @ 2021-04-28 19:59 UTC (permalink / raw) To: Dmitry Gutov; +Cc: Daniel Mendler, Stefan Monnier, emacs-devel >> Then the caller e.g. help--symbol-completion-table could define whether >> to append "u", "a" and "c" in parens by using on a candidate something like >> (format "%s (%s)" cand (cond ((fboundp (intern cand)) "f")) ...), >> or prepend a dimmed letter as a prefix, or to use an icon. > > Do you use Company? Take a look at what elisp--company-kind does. > > The fact that the space of allowed values is constrained makes the returned > information really more useful. > > And here since you do not document which values (strings, characters, etc) > the prefix returned by affixation-function can take, their usefulness is > limited. The user can't be sure what "c" means: it's "command" here, but > could be meant as "constant" by another affixation function. Is "m" > a "macro" or "method"? "f" stands for "function" or "field"? > > And also because of that no completing-read UI can replace these characters > with any alternative (e.g. graphical) representation. I took a look at elisp--company-kind and see such code: :annotation-function (lambda (str) (if (fboundp (intern-soft str)) " <f>")) :company-kind #'elisp--company-kind There are still hard-coded letters where "f" stands for "function". ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Simplification of `affixation-function` 2021-04-28 19:59 ` Juri Linkov @ 2021-04-29 2:15 ` Dmitry Gutov 0 siblings, 0 replies; 18+ messages in thread From: Dmitry Gutov @ 2021-04-29 2:15 UTC (permalink / raw) To: Juri Linkov; +Cc: Daniel Mendler, Stefan Monnier, emacs-devel On 28.04.2021 22:59, Juri Linkov wrote: > I took a look at elisp--company-kind and see such code: > > :annotation-function > (lambda (str) (if (fboundp (intern-soft str)) " <f>")) > :company-kind #'elisp--company-kind > > There are still hard-coded letters where "f" stands for "function". You're looking at the "old" approach to that feature, using annotation-function. I couldn't just remove it here because the default completion UI doesn't know to use :company-kind (elisp--company-kind's definition is below in the same file). The approach above has worked okay-ish over the years (so it hopefully illustrates that the use of affixation-function in read-char-by-name is not essential), but has the same flaws that I already described, for the purpose of using it seriously to show icons/kinds/types in different commands and completion tables. Until now it has only been used for Elisp, and only to indicate one specific kind, so it was less of a problem. ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2021-04-29 2:15 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-04-24 17:35 Simplification of `affixation-function` Daniel Mendler 2021-04-24 20:22 ` Juri Linkov 2021-04-24 21:17 ` Daniel Mendler 2021-04-24 21:41 ` Juri Linkov 2021-04-24 22:01 ` Daniel Mendler 2021-04-24 22:34 ` Stefan Monnier 2021-04-24 22:48 ` Dmitry Gutov 2021-04-24 22:56 ` Daniel Mendler 2021-04-25 17:58 ` Dmitry Gutov 2021-04-25 18:08 ` Daniel Mendler 2021-04-25 22:31 ` Dmitry Gutov 2021-04-27 16:48 ` Juri Linkov 2021-04-27 17:39 ` Daniel Mendler 2021-04-27 18:11 ` Juri Linkov 2021-04-27 18:40 ` Daniel Mendler 2021-04-28 0:20 ` Dmitry Gutov 2021-04-28 19:59 ` Juri Linkov 2021-04-29 2:15 ` 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).