unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* feature/icomplete-vertical
@ 2020-09-12 13:10 Gregory Heytings via Emacs development discussions.
  2020-09-12 13:33 ` feature/icomplete-vertical Ergus
  2020-09-18 21:39 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 2 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-12 13:10 UTC (permalink / raw)
  To: Ergus; +Cc: Eli Zaretskii, casouri, emacs-devel


>
>> If there was a built-in vertical mode it would be better / more 
>> intuitive.
>
> Could you try the branch feature/icomplete-vertical? I need some testers 
> before adding it to master.
>

Alas no, I have been using the following to have icomplete-vertical for 
quite some time, it works perfectly well, so I don't see why a more 
complex implementation would be necessary.

(setq icomplete-prospects-height 6)
(setq icomplete-separator "\n")
(defun icomplete-vertical-minibuffer-setup ()
   (setq truncate-lines t)
   (setq-local completion-ignore-case t)
   (setq-local read-file-name-completion-ignore-case t)
   (setq-local read-buffer-completion-ignore-case t)
   (setq icomplete-hide-common-prefix nil))
(add-hook 'icomplete-minibuffer-setup-hook #'icomplete-vertical-minibuffer-setup)
(defun icomplete-vertical-reformat-completions (completions)
   (save-match-data
     (let ((cnp (substring-no-properties completions)))
       (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" cnp)
           (format "%s \n%s"
                   (or (match-string 1 cnp) "")
                   (replace-regexp-in-string "^" (make-string (current-column) ? ) (match-string 2 cnp)))
         cnp))))
(defun icomplete-vertical-adjust-minibuffer-height (completions)
   (let* ((comp (icomplete-vertical-reformat-completions completions))
          (complen (length (split-string comp "\n"))))
     (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1- (window-height)))))
     comp))
(advice-add 'icomplete-completions :filter-return #'icomplete-vertical-adjust-minibuffer-height)



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

* Re: feature/icomplete-vertical
  2020-09-12 13:10 feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-12 13:33 ` Ergus
  2020-09-12 14:30   ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
                     ` (2 more replies)
  2020-09-18 21:39 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 3 replies; 118+ messages in thread
From: Ergus @ 2020-09-12 13:33 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, casouri, emacs-devel

On Sat, Sep 12, 2020 at 01:10:57PM +0000, Gregory Heytings wrote:
>
>>
>>>If there was a built-in vertical mode it would be better / more 
>>>intuitive.
>>
>>Could you try the branch feature/icomplete-vertical? I need some 
>>testers before adding it to master.
>>
>
>Alas no, I have been using the following to have icomplete-vertical 
>for quite some time, it works perfectly well, so I don't see why a 
>more complex implementation would be necessary.
>
>(setq icomplete-prospects-height 6)
>(setq icomplete-separator "\n")
>(defun icomplete-vertical-minibuffer-setup ()
>  (setq truncate-lines t)
>  (setq-local completion-ignore-case t)
>  (setq-local read-file-name-completion-ignore-case t)
>  (setq-local read-buffer-completion-ignore-case t)
>  (setq icomplete-hide-common-prefix nil))
>(add-hook 'icomplete-minibuffer-setup-hook #'icomplete-vertical-minibuffer-setup)
>(defun icomplete-vertical-reformat-completions (completions)
>  (save-match-data
>    (let ((cnp (substring-no-properties completions)))
>      (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" cnp)
>          (format "%s \n%s"
>                  (or (match-string 1 cnp) "")
>                  (replace-regexp-in-string "^" (make-string (current-column) ? ) (match-string 2 cnp)))
>        cnp))))
>(defun icomplete-vertical-adjust-minibuffer-height (completions)
>  (let* ((comp (icomplete-vertical-reformat-completions completions))
>         (complen (length (split-string comp "\n"))))
>    (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1- (window-height)))))
>    comp))
>(advice-add 'icomplete-completions :filter-return #'icomplete-vertical-adjust-minibuffer-height)

1) Internal functionalities try not to use advises.
2) The branch is not actually more complex, it just generates the
formatted vertical output form the beginning.
3) It does more or less the same you are doing but with a simpler
config:

(icomplete-mode t)
(icomplete-format 'vertical)

4) We add arrow bindings to move
5) Add completion matching faces is also coming.



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

* Re: feature/icomplete-vertical
  2020-09-12 13:33 ` feature/icomplete-vertical Ergus
@ 2020-09-12 14:30   ` Gregory Heytings via Emacs development discussions.
  2020-09-14  6:44   ` feature/icomplete-vertical jixiuf
  2020-09-20 10:55   ` feature/icomplete-vertical João Távora
  2 siblings, 0 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-12 14:30 UTC (permalink / raw)
  To: Ergus; +Cc: emacs-devel


>
> 1) Internal functionalities try not to use advises.
> 2) The branch is not actually more complex, it just generates the formatted vertical output form the beginning.
> 3) It does more or less the same you are doing but with a simpler config:
>
> (icomplete-mode t)
> (icomplete-format 'vertical)
>
> 4) We add arrow bindings to move
> 5) Add completion matching faces is also coming.
>

Okay, I did not mean to disregard what you did, but I did this before it 
was an internal functionality (based on a code snippet I found somewhere). 
I doubt the config you indicate would suffice to do what I have (and 
want), unless there is an option to do "(replace-regexp-in-string "^" 
(make-string (current-column) ? ) (match-string 2 cnp))".  That is, to 
have the completion candidates presented under the cursor (instead of on 
the left of the minibuffer).



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

* Re: feature/icomplete-vertical
  2020-09-12 13:33 ` feature/icomplete-vertical Ergus
  2020-09-12 14:30   ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-14  6:44   ` jixiuf
  2020-09-14  7:08     ` feature/icomplete-vertical Ergus
  2020-09-14 15:02     ` feature/icomplete-vertical Ergus
  2020-09-20 10:55   ` feature/icomplete-vertical João Távora
  2 siblings, 2 replies; 118+ messages in thread
From: jixiuf @ 2020-09-14  6:44 UTC (permalink / raw)
  To: Ergus; +Cc: emacs-devel

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



> 2020年9月12日 下午9:33,Ergus <spacibba@aol.com> 写道:
> 
> On Sat, Sep 12, 2020 at 01:10:57PM +0000, Gregory Heytings wrote:
>> 
>>> 
>>>> If there was a built-in vertical mode it would be better / more intuitive.
>>> 
>>> Could you try the branch feature/icomplete-vertical? I need some testers before adding it to master.
>>> 
>> 
>> Alas no, I have been using the following to have icomplete-vertical for quite some time, it works perfectly well, so I don't see why a more complex implementation would be necessary.
>> 
>> (setq icomplete-prospects-height 6)
>> (setq icomplete-separator "\n")
>> (defun icomplete-vertical-minibuffer-setup ()
>> (setq truncate-lines t)
>> (setq-local completion-ignore-case t)
>> (setq-local read-file-name-completion-ignore-case t)
>> (setq-local read-buffer-completion-ignore-case t)
>> (setq icomplete-hide-common-prefix nil))
>> (add-hook 'icomplete-minibuffer-setup-hook #'icomplete-vertical-minibuffer-setup)
>> (defun icomplete-vertical-reformat-completions (completions)
>> (save-match-data
>>   (let ((cnp (substring-no-properties completions)))
>>     (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" cnp)
>>         (format "%s \n%s"
>>                 (or (match-string 1 cnp) "")
>>                 (replace-regexp-in-string "^" (make-string (current-column) ? ) (match-string 2 cnp)))
>>       cnp))))
>> (defun icomplete-vertical-adjust-minibuffer-height (completions)
>> (let* ((comp (icomplete-vertical-reformat-completions completions))
>>        (complen (length (split-string comp "\n"))))
>>   (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1- (window-height)))))
>>   comp))
>> (advice-add 'icomplete-completions :filter-return #'icomplete-vertical-adjust-minibuffer-height)
> 
> 1) Internal functionalities try not to use advises.
> 2) The branch is not actually more complex, it just generates the
> formatted vertical output form the beginning.
> 3) It does more or less the same you are doing but with a simpler
> config:
> 
> (icomplete-mode t)
> (icomplete-format 'vertical)
> 
> 4) We add arrow bindings to move
> 5) Add completion matching faces is also coming.
> 

Some feedback about  branch : feature/icomplete-vertical  

I tried this branch with config:

  (icomplete-mode 1)
  (setq icomplete-format 'vertical)



And found this bug still exists:

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379

Some related links about how to work around this bug:

https://www.reddit.com/r/emacs/comments/fswt7c/using_icomplete_vertically/fm86m0q?utm_source=share&utm_medium=web2x&context=3
https://www.reddit.com/r/emacs/comments/fswt7c/using_icomplete_vertically/fm8z6h0?utm_source=share&utm_medium=web2x&context=3

Hope the problem of   disappearing prompt and entered text problem can be fixed in your branch. 



[-- Attachment #2: Type: text/html, Size: 5823 bytes --]

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

* Re: feature/icomplete-vertical
  2020-09-14  6:44   ` feature/icomplete-vertical jixiuf
@ 2020-09-14  7:08     ` Ergus
  2020-09-14 15:02     ` feature/icomplete-vertical Ergus
  1 sibling, 0 replies; 118+ messages in thread
From: Ergus @ 2020-09-14  7:08 UTC (permalink / raw)
  To: jixiuf; +Cc: emacs-devel

On Mon, Sep 14, 2020 at 02:44:59PM +0800, jixiuf wrote:
>
>
>> 2020年9月12日 下午9:33,Ergus <spacibba@aol.com> 写道:
>>
>> On Sat, Sep 12, 2020 at 01:10:57PM +0000, Gregory Heytings wrote:
>>>
>>>>
>>>>> If there was a built-in vertical mode it would be better / more intuitive.
>>>>
>>>> Could you try the branch feature/icomplete-vertical? I need some testers before adding it to master.
>>>>
>>>
>>> Alas no, I have been using the following to have icomplete-vertical for quite some time, it works perfectly well, so I don't see why a more complex implementation would be necessary.
>>>
>>> (setq icomplete-prospects-height 6)
>>> (setq icomplete-separator "\n")
>>> (defun icomplete-vertical-minibuffer-setup ()
>>> (setq truncate-lines t)
>>> (setq-local completion-ignore-case t)
>>> (setq-local read-file-name-completion-ignore-case t)
>>> (setq-local read-buffer-completion-ignore-case t)
>>> (setq icomplete-hide-common-prefix nil))
>>> (add-hook 'icomplete-minibuffer-setup-hook #'icomplete-vertical-minibuffer-setup)
>>> (defun icomplete-vertical-reformat-completions (completions)
>>> (save-match-data
>>>   (let ((cnp (substring-no-properties completions)))
>>>     (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" cnp)
>>>         (format "%s \n%s"
>>>                 (or (match-string 1 cnp) "")
>>>                 (replace-regexp-in-string "^" (make-string (current-column) ? ) (match-string 2 cnp)))
>>>       cnp))))
>>> (defun icomplete-vertical-adjust-minibuffer-height (completions)
>>> (let* ((comp (icomplete-vertical-reformat-completions completions))
>>>        (complen (length (split-string comp "\n"))))
>>>   (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1- (window-height)))))
>>>   comp))
>>> (advice-add 'icomplete-completions :filter-return #'icomplete-vertical-adjust-minibuffer-height)
>>
>> 1) Internal functionalities try not to use advises.
>> 2) The branch is not actually more complex, it just generates the
>> formatted vertical output form the beginning.
>> 3) It does more or less the same you are doing but with a simpler
>> config:
>>
>> (icomplete-mode t)
>> (icomplete-format 'vertical)
>>
>> 4) We add arrow bindings to move
>> 5) Add completion matching faces is also coming.
>>
>
>Some feedback about  branch : feature/icomplete-vertical
>
>I tried this branch with config:
>
>  (icomplete-mode 1)
>  (setq icomplete-format 'vertical)
>
>
>
>And found this bug still exists:
>
>https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
>https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379
>
>Some related links about how to work around this bug:
>
>https://www.reddit.com/r/emacs/comments/fswt7c/using_icomplete_vertically/fm86m0q?utm_source=share&utm_medium=web2x&context=3
>https://www.reddit.com/r/emacs/comments/fswt7c/using_icomplete_vertically/fm8z6h0?utm_source=share&utm_medium=web2x&context=3
>
>Hope the problem of   disappearing prompt and entered text problem can be fixed in your branch.
>
>

Hi:

I can't reproduce https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
with this config.

emacs -Q
(icomplete-mode 1)
(setq icomplete-format 'vertical)

The prompt is not disappearing for me. Is there some other
indication/config missing?



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

* Re: feature/icomplete-vertical
  2020-09-14  6:44   ` feature/icomplete-vertical jixiuf
  2020-09-14  7:08     ` feature/icomplete-vertical Ergus
@ 2020-09-14 15:02     ` Ergus
  2020-09-14 17:13       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-16 15:22       ` feature/icomplete-vertical jixiuf
  1 sibling, 2 replies; 118+ messages in thread
From: Ergus @ 2020-09-14 15:02 UTC (permalink / raw)
  To: jixiuf; +Cc: emacs-devel

On Mon, Sep 14, 2020 at 02:44:59PM +0800, jixiuf wrote:
>
>
>Some feedback about  branch : feature/icomplete-vertical
>
>I tried this branch with config:
>
>  (icomplete-mode 1)
>  (setq icomplete-format 'vertical)
>
>
>
>And found this bug still exists:
>
>https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
>https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379
>
>Some related links about how to work around this bug:
>
>https://www.reddit.com/r/emacs/comments/fswt7c/using_icomplete_vertically/fm86m0q?utm_source=share&utm_medium=web2x&context=3
>https://www.reddit.com/r/emacs/comments/fswt7c/using_icomplete_vertically/fm8z6h0?utm_source=share&utm_medium=web2x&context=3
>
>Hope the problem of   disappearing prompt and entered text problem can be fixed in your branch.
>
>
This is already fixed.



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

* Re: feature/icomplete-vertical
  2020-09-14 15:02     ` feature/icomplete-vertical Ergus
@ 2020-09-14 17:13       ` Gregory Heytings via Emacs development discussions.
  2020-09-14 17:31         ` feature/icomplete-vertical Ergus
  2020-09-16 15:22       ` feature/icomplete-vertical jixiuf
  1 sibling, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-14 17:13 UTC (permalink / raw)
  To: Ergus; +Cc: emacs-devel


Hi Ergus,

I gave your icomplete-vertical a try.  It seems to work well so far, but 
there is one thing that does not work as expected (or, at least, as I 
expect it to work): for some reason when you complete a filename 
(find-file), the first candidate './' has been taken out of the candidate 
list (with both icomplete-format 'vertical and 'horizontal), which means 
that I see ("[]" is the point):

Find file: ~/[]/ | { <other candidates> }

or:

Find file: ~/[]./
<other candidates>

I do not understand why this is the case.

Likewise, when there are multiple candidates, icomplete-vertical behaves 
in a counterintuitive way with find-file, for example I see (with two 
candidate directories "foofoo and "foobar"):

Find file: ~/foo[]foofoo
foobar



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

* Re: feature/icomplete-vertical
  2020-09-14 17:13       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-14 17:31         ` Ergus
  0 siblings, 0 replies; 118+ messages in thread
From: Ergus @ 2020-09-14 17:31 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: emacs-devel

On Mon, Sep 14, 2020 at 05:13:40PM +0000, Gregory Heytings via Emacs development discussions. wrote:
>
>Hi Ergus,
>
>I gave your icomplete-vertical a try.  It seems to work well so far, 
>but there is one thing that does not work as expected (or, at least, 
>as I expect it to work): for some reason when you complete a filename 
>(find-file), the first candidate './' has been taken out of the 
>candidate list (with both icomplete-format 'vertical and 'horizontal), 
>which means that I see ("[]" is the point):
>
>Find file: ~/[]/ | { <other candidates> }
>
>or:
>
>Find file: ~/[]./
><other candidates>
>
>I do not understand why this is the case.
>
>Likewise, when there are multiple candidates, icomplete-vertical 
>behaves in a counterintuitive way with find-file, for example I see 
>(with two candidate directories "foofoo and "foobar"):
>
>Find file: ~/foo[]foofoo
>foobar
>

You are right. This is a change I introduced recently to simplify
something else. I will fix it asap; the idea is that you may see:

Find file: ~/foofoo
foobar

and with a different option this:

Find file: ~/foo
foofoo
foobar

with the first foofoo fontified. As someone requested also to have this:

Find file: ~/foo
                 foofoo
                 foobar

or

Find file: ~/foo
              foofoo
              foobar

And personally I want this:

Find file: ~/foo
> foofoo
   foobar


So I am working in all of them at the time avoiding adding too much
complexity. But the code get complex because I have to keep old
variables like the separator which I don't need (because I am using
formats)

I'll keep you posted when I fix this. It is not very complex indeed but
I am very busy these days.



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

* Re: feature/icomplete-vertical
  2020-09-14 15:02     ` feature/icomplete-vertical Ergus
  2020-09-14 17:13       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-16 15:22       ` jixiuf
       [not found]         ` <20200918005354.muskx2b7tssyqzzk@Ergus>
  1 sibling, 1 reply; 118+ messages in thread
From: jixiuf @ 2020-09-16 15:22 UTC (permalink / raw)
  To: Ergus; +Cc: emacs-devel

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



> 2020年9月14日 下午11:02,Ergus <spacibba@aol.com> 写道:
> 
> On Mon, Sep 14, 2020 at 02:44:59PM +0800, jixiuf wrote:
>> 
>> 
>> Some feedback about  branch : feature/icomplete-vertical
>> 
>> I tried this branch with config:
>> 
>> (icomplete-mode 1)
>> (setq icomplete-format 'vertical)
>> 
>> 
>> 
>> And found this bug still exists:
>> 
>> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
>> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379
>> 
>> Some related links about how to work around this bug:
>> 
>> https://www.reddit.com/r/emacs/comments/fswt7c/using_icomplete_vertically/fm86m0q?utm_source=share&utm_medium=web2x&context=3
>> https://www.reddit.com/r/emacs/comments/fswt7c/using_icomplete_vertically/fm8z6h0?utm_source=share&utm_medium=web2x&context=3
>> 
>> Hope the problem of   disappearing prompt and entered text problem can be fixed in your branch.
>> 
>> 
> This is already fixed.
> 


With commit f80a97fedf81cb0af955a4f799d5ac3105570a25 

```
(setq icomplete-format 'vertical)
(setq icomplete-hide-common-prefix nil)
(setq icomplete-show-matches-on-no-input t)
(icomplete-mode 1)

```

1. I got  this error when I press C-h f (describe-function)
Error in post-command-hook (icomplete-post-command-hook): (error "Invalid format operation %
“)


2. M-x:man 
 got :

Even with (setq icomplete-hide-common-prefix nil) , the prefix is still hidden.




[-- Attachment #2.1: Type: text/html, Size: 3089 bytes --]

[-- Attachment #2.2: 粘贴的图形-1.png --]
[-- Type: image/png, Size: 15305 bytes --]

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

* Re: feature/icomplete-vertical
       [not found]         ` <20200918005354.muskx2b7tssyqzzk@Ergus>
@ 2020-09-18  3:08           ` jixiuf
  2020-09-18 11:58             ` feature/icomplete-vertical Ergus
  2020-09-18 17:05             ` feature/icomplete-vertical Ergus
  0 siblings, 2 replies; 118+ messages in thread
From: jixiuf @ 2020-09-18  3:08 UTC (permalink / raw)
  To: Ergus; +Cc: emacs-devel

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



> 2020年9月18日 上午8:53,Ergus <spacibba@aol.com> 写道:
> 
> On Wed, Sep 16, 2020 at 11:22:19PM +0800, jixiuf wrote:
>> 
>> 
>> 
>> 
>> With commit f80a97fedf81cb0af955a4f799d5ac3105570a25
>> 
>> ```
>> (setq icomplete-format 'vertical)
>> (setq icomplete-hide-common-prefix nil)
>> (setq icomplete-show-matches-on-no-input t)
>> (icomplete-mode 1)
>> 
>> ```
>> 
>> 1. I got  this error when I press C-h f (describe-function)
>> Error in post-command-hook (icomplete-post-command-hook): (error "Invalid format operation %
>> “)
>> 
>> 
>> 2. M-x:man
>> got :
>> 
>> Even with (setq icomplete-hide-common-prefix nil) , the prefix is still hidden.
>> 
> Both are fixed now. Please try.
Thanks, it is fixed .

But  the bug of  "disappearing prompt and entered text problem" came back again, when I  (setq max-mini-window-height 10)  

```

(setq icomplete-show-matches-on-no-input t)
(icomplete-mode 1)
(setq icomplete-format 'vertical)

(defface vmacs-minibuffer-font
 `((t :inherit default :height 1.3))
 "The default font for minibuffer buffer.
Monospaced font whihc is fixed idth and height is recommended."
 :group 'minibuffer)

(defun vmacs-minibuffer-hook()
 (set (make-local-variable 'buffer-face-mode-face) 'vmacs-minibuffer-font)
 (buffer-face-mode t))

(add-hook 'minibuffer-setup-hook #'vmacs-minibuffer-hook)

(setq max-mini-window-height 10)   ;; add  this line
```

[-- Attachment #2.1: Type: text/html, Size: 3054 bytes --]

[-- Attachment #2.2: 粘贴的图形-1.png --]
[-- Type: image/png, Size: 25676 bytes --]

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

* Re: feature/icomplete-vertical
  2020-09-18  3:08           ` feature/icomplete-vertical jixiuf
@ 2020-09-18 11:58             ` Ergus
  2020-09-18 17:05             ` feature/icomplete-vertical Ergus
  1 sibling, 0 replies; 118+ messages in thread
From: Ergus @ 2020-09-18 11:58 UTC (permalink / raw)
  To: jixiuf; +Cc: emacs-devel

On Fri, Sep 18, 2020 at 11:08:48AM +0800, jixiuf wrote:
>
>
>Thanks, it is fixed .
>
>But  the bug of  "disappearing prompt and entered text problem" came back again, when I  (setq max-mini-window-height 10)
>
Indeed this is nasty because the issue is not exactly in icomplete. I
will explain a bit:

max-mini-window-height sets the height of mini-windows BUT when it is
set as an int it sets the minibuffer height using the number of lines
but using the main frame's font height.

In your case the problem is that the face in minibuffer is different
than in the rest of the frame and your font is bigger. So for the moment
there is only a solutions fromicomp lete I can do without forcing a
resize (something I am trying to avoid):

Use your font to increment the height and stop when fixed (which will
not respect the 10 lines as you want because your font is bigger)

Alternatively I can try to fix the resize mechanism properly by fixing
where the minibuffer resize happens and how it gets the font... but this
will require more time (I think it is the right thing to do.)



>```
>
>(setq icomplete-show-matches-on-no-input t)
>(icomplete-mode 1)
>(setq icomplete-format 'vertical)
>
>(defface vmacs-minibuffer-font
> `((t :inherit default :height 1.3))
> "The default font for minibuffer buffer.
>Monospaced font whihc is fixed idth and height is recommended."
> :group 'minibuffer)
>
>(defun vmacs-minibuffer-hook()
> (set (make-local-variable 'buffer-face-mode-face) 'vmacs-minibuffer-font)
> (buffer-face-mode t))
>
>(add-hook 'minibuffer-setup-hook #'vmacs-minibuffer-hook)
>
>(setq max-mini-window-height 10)   ;; add  this line
>```



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

* Re: feature/icomplete-vertical
  2020-09-18  3:08           ` feature/icomplete-vertical jixiuf
  2020-09-18 11:58             ` feature/icomplete-vertical Ergus
@ 2020-09-18 17:05             ` Ergus
  2020-09-18 19:52               ` feature/icomplete-vertical Eli Zaretskii
  1 sibling, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-18 17:05 UTC (permalink / raw)
  To: jixiuf; +Cc: emacs-devel

On Fri, Sep 18, 2020 at 11:08:48AM +0800, jixiuf wrote:
>
>
>Thanks, it is fixed .
>
>But  the bug of  "disappearing prompt and entered text problem" came back again, when I  (setq max-mini-window-height 10)
>
>```
>
>(setq icomplete-show-matches-on-no-input t)
>(icomplete-mode 1)
>(setq icomplete-format 'vertical)
>
>(defface vmacs-minibuffer-font
> `((t :inherit default :height 1.3))
> "The default font for minibuffer buffer.
>Monospaced font whihc is fixed idth and height is recommended."
> :group 'minibuffer)
>
>(defun vmacs-minibuffer-hook()
> (set (make-local-variable 'buffer-face-mode-face) 'vmacs-minibuffer-font)
> (buffer-face-mode t))
>
>(add-hook 'minibuffer-setup-hook #'vmacs-minibuffer-hook)
>
>(setq max-mini-window-height 10)   ;; add  this line
>```

After asking Stefan he agrees that the problem is in the documentation
of max-mini-window-height that should specify that the height is
expressed in terms of the default's frame font.

So according to that it is fixed now in icomplete-vertical and waiting
for a patch to improve the documentation of max-mini-window-height.

Best,
Ergus.



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

* Re: feature/icomplete-vertical
  2020-09-18 17:05             ` feature/icomplete-vertical Ergus
@ 2020-09-18 19:52               ` Eli Zaretskii
  0 siblings, 0 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-18 19:52 UTC (permalink / raw)
  To: Ergus; +Cc: jixiuf, emacs-devel

> Date: Fri, 18 Sep 2020 19:05:38 +0200
> From: Ergus <spacibba@aol.com>
> Cc: emacs-devel@gnu.org
> 
> So according to that it is fixed now in icomplete-vertical and waiting
> for a patch to improve the documentation of max-mini-window-height.

I fixed the documentation of max-mini-window-height to be more clear
about the meaning of an integer value.



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

* Re: feature/icomplete-vertical
  2020-09-12 13:10 feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-12 13:33 ` feature/icomplete-vertical Ergus
@ 2020-09-18 21:39 ` Gregory Heytings via Emacs development discussions.
  2020-09-18 23:27   ` feature/icomplete-vertical Stefan Monnier
  2020-09-19  1:59   ` feature/icomplete-vertical Ergus
  1 sibling, 2 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-18 21:39 UTC (permalink / raw)
  To: Ergus; +Cc: Eli Zaretskii, casouri, emacs-devel

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


Hi Ergus,

I don't understand why you change so many things in icomplete.el for 
icomplete-vertical.  I attach a patch which implements icomplete-vertical 
by adding only 20 lines to that file.  It seems to work correctly.  Use it 
with:

(icomplete-mode 1)
(setq icomplete-vertical t)

and set `icomplete-prospects-height' to the maximal number of completion 
candidates you want to display, for example:

(setq icomplete-prospects-height 10)

Gregory

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-diff; name=icomplete.patch; charset=us-ascii, Size: 4511 bytes --]

--- a/icomplete.el	2020-09-01 10:14:22.000000000 +0000
+++ b/icomplete.el	2020-09-18 21:14:15.000000000 +0000
@@ -62,6 +62,10 @@
   :type 'string
   :version "24.4")
 
+(defcustom icomplete-vertical nil "...")
+
+(defvar icomplete--prospects-count 0 "...")
+
 (defcustom icomplete-hide-common-prefix t
   "When non-nil, hide common prefix from completion candidates.
 When nil, show candidates in full."
@@ -573,7 +577,10 @@
               ;; marker's stickiness to figure out whether to place the cursor
               ;; before or after the string, so let's spoon-feed it the pos.
               (put-text-property 0 1 'cursor t text)
-              (overlay-put icomplete-overlay 'after-string text))))))))
+              (overlay-put icomplete-overlay 'after-string text)
+	      (if (and (> (window-height) icomplete--prospects-count)
+		       (< icomplete--prospects-count icomplete-prospects-height))
+		  (shrink-window (- icomplete-prospects-height icomplete--prospects-count))))))))))
 
 ;;;_ > icomplete-completions (name candidates predicate require-match)
 (defun icomplete-completions (name candidates predicate require-match)
@@ -650,18 +657,22 @@
 				(t (concat ellipsis (substring most compare))))
 			       close-bracket)))
 	     ;;"-prospects" - more than one candidate
-	     (prospects-len (+ (string-width
-				(or determ (concat open-bracket close-bracket)))
-			       (string-width icomplete-separator)
-			       (+ 2 (string-width ellipsis)) ;; take {…} into account
-			       (string-width (buffer-string))))
+	     (prospects-len (if icomplete-vertical
+				0
+			      (+ (string-width
+				  (or determ (concat open-bracket close-bracket)))
+				 (string-width icomplete-separator)
+				 (+ 2 (string-width ellipsis)) ;; take {…} into account
+				 (string-width (buffer-string)))))
              (prospects-max
-              ;; Max total length to use, including the minibuffer content.
-              (* (+ icomplete-prospects-height
-                    ;; If the minibuffer content already uses up more than
-                    ;; one line, increase the allowable space accordingly.
-                    (/ prospects-len (window-width)))
-                 (window-width)))
+	      (if icomplete-vertical
+		  icomplete-prospects-height
+		;; Max total length to use, including the minibuffer content.
+		(* (+ icomplete-prospects-height
+                      ;; If the minibuffer content already uses up more than
+                      ;; one line, increase the allowable space accordingly.
+                      (/ prospects-len (window-width)))
+                   (window-width))))
              ;; Find the common prefix among `comps'.
              ;; We can't use the optimization below because its assumptions
              ;; aren't always true, e.g. when completion-cycling (bug#10850):
@@ -705,13 +716,20 @@
 	    (setq comp
 		  (if prefix-len (substring (car comps) prefix-len) (car comps))
 		  comps (cdr comps))
-	    (setq prospects-len
-                  (+ (string-width comp)
-		     (string-width icomplete-separator)
-		     prospects-len))
+	    (if icomplete-vertical
+		(if (> (length comp) 0)
+		    (setq prospects-len (1+ prospects-len)))
+	      (setq prospects-len
+                    (+ (string-width comp)
+		       (string-width icomplete-separator)
+		       prospects-len)))
 	    (if (< prospects-len prospects-max)
-		(push comp prospects)
+		(if icomplete-vertical
+		    (if (> (length comp) 0)
+			(push comp prospects))
+		  (push comp prospects))
 	      (setq limit t))))
+	(setq icomplete--prospects-count prospects-len)
 	(setq prospects (nreverse prospects))
         ;; Return the first match if the user hits enter.
         (when icomplete-show-matches-on-no-input
@@ -726,11 +744,16 @@
         ;; is cached.
         (if last (setcdr last base-size))
 	(if prospects
-	    (concat determ
-		    "{"
-		    (mapconcat 'identity prospects icomplete-separator)
-		    (and limit (concat icomplete-separator ellipsis))
-		    "}")
+	    (if icomplete-vertical
+		(concat determ
+			" \n"
+			(mapconcat 'identity prospects "\n")
+			(and limit (concat "\n" ellipsis)))
+	      (concat determ
+		      "{"
+		      (mapconcat 'identity prospects icomplete-separator)
+		      (and limit (concat icomplete-separator ellipsis))
+		      "}"))
 	  (concat determ " [Matched]"))))))
 
 ;;; Iswitchb compatibility

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

* Re: feature/icomplete-vertical
  2020-09-18 21:39 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-18 23:27   ` Stefan Monnier
  2020-09-19  1:59   ` feature/icomplete-vertical Ergus
  1 sibling, 0 replies; 118+ messages in thread
From: Stefan Monnier @ 2020-09-18 23:27 UTC (permalink / raw)
  To: Gregory Heytings via Emacs development discussions.
  Cc: Gregory Heytings, Ergus, casouri, Eli Zaretskii

> I don't understand why you change so many things in icomplete.el for
> icomplete-vertical.

I think it's because the display suggests a change to the way you
interact with it.


        Stefan




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

* Re: feature/icomplete-vertical
  2020-09-18 21:39 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-18 23:27   ` feature/icomplete-vertical Stefan Monnier
@ 2020-09-19  1:59   ` Ergus
  2020-09-19  4:03     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-19  1:59 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, casouri, emacs-devel

On Fri, Sep 18, 2020 at 09:39:58PM +0000, Gregory Heytings via Emacs development discussions. wrote:
>
>Hi Ergus,
>
>I don't understand why you change so many things in icomplete.el for 
>icomplete-vertical.  I attach a patch which implements 
>icomplete-vertical by adding only 20 lines to that file.  It seems to 
>work correctly.  Use it with:
>
>(icomplete-mode 1)
>(setq icomplete-vertical t)
>
>and set `icomplete-prospects-height' to the maximal number of 
>completion candidates you want to display, for example:
>
>(setq icomplete-prospects-height 10)
>
>Gregory


Hi Gregory, thanks for commenting.

I know the branch has too many changes. Usually I do a full refactor and
a squash before merging to master to simplify all the experimental
things I try during development. My error was probably to call it
feature and not scratch branch.

The changes I introduced are actually not too many, the others are just
details and customs to avoid to interfere or changing the defaults of
icomplete while developing. Most of them will disappear in the final
patch or come latter as different features. (I have the bad habit to
overwrite too much my histories ;p)

OTOH: The problem with the approach in your patch (that you can see is
essentially similar to the first commit in the branch) are basically:

1) Icomplete shouldn't call shrink-window because the minibuffer resize
must respect the max-mini-window-height and resize-mini-windows policy.

2) When using different fonts (as a user jixiuf did) the prompt
disappears because there is a mismatch between the visible lines and the
ones the minibuffer shows. So we need to fix that in a general way and
calculate sizes in pixels to avoid this problem.

3) In vertical the [] and () are annoying; more than in horizontal so we
should give some control for them. Now there is a mechanism a bit
complex, but just because it is under development. I am actually trying
to simplify that.

4) Even in vertical the icomplete-separator must be respected somehow
because some users reported to use it (with the external package) to
separate the candidates from the left of the window, add prompts and so
on. (for example adding a > before the first candidate (changing the {)
and a space before the others (changing the separator)) So our changes
need to support all that in a simpler way. Also some users requested to
have two \n as a separator (don't ask me why).

5) I opted for a more modular approach because filling the code with
several 'if' it harder to read and very error prone to maintain
latter. So I just separated the setups when vertical and horizontal so
if we want to add more policies and features we have to deal with less
race conditions.

For now I am only worried about functionality; when that works as
expected and cover all the popular use cases I will cleanup I promise :)

Best,
Ergus



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

* Re: feature/icomplete-vertical
  2020-09-19  1:59   ` feature/icomplete-vertical Ergus
@ 2020-09-19  4:03     ` Gregory Heytings via Emacs development discussions.
  2020-09-19  6:15       ` feature/icomplete-vertical Ergus
  0 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-19  4:03 UTC (permalink / raw)
  To: Ergus; +Cc: Eli Zaretskii, casouri, emacs-devel

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


Hi Ergus,

Thanks for your comments.

>
> 1) Icomplete shouldn't call shrink-window because the minibuffer resize 
> must respect the max-mini-window-height and resize-mini-windows policy.
>

Okay, these lines in my patch can just be dropped indeed.  This makes the 
whole thing even simpler.

>
> 2) When using different fonts (as a user jixiuf did) the prompt 
> disappears because there is a mismatch between the visible lines and the 
> ones the minibuffer shows. So we need to fix that in a general way and 
> calculate sizes in pixels to avoid this problem.
>

I see.  I did not think about that potential problem before sending the 
patch.  I attach an updated patch (still very short) in which this problem 
is (I think) fixed.

>
> 3) In vertical the [] and () are annoying; more than in horizontal so we 
> should give some control for them. Now there is a mechanism a bit 
> complex, but just because it is under development. I am actually trying 
> to simplify that.
>

That could be an additional feature indeed.  I do not understand why they 
are annoying, it's common in completion mechanisms to have such 
indications, but why not.  But I think it is better to separate concerns.

>
> 4) Even in vertical the icomplete-separator must be respected somehow 
> because some users reported to use it (with the external package) to 
> separate the candidates from the left of the window, add prompts and so 
> on. (for example adding a > before the first candidate (changing the {) 
> and a space before the others (changing the separator)) So our changes 
> need to support all that in a simpler way. Also some users requested to 
> have two \n as a separator (don't ask me why).
>

That could also be an additional feature, again I don't really see why it 
would be useful, but why not.  OTOH, it is not possible to do this with 
the current version of icomplete in horizontal mode, and again I think it 
is better to separate concerns.

>
> 5) I opted for a more modular approach because filling the code with 
> several 'if' it harder to read and very error prone to maintain latter. 
> So I just separated the setups when vertical and horizontal so if we 
> want to add more policies and features we have to deal with less race 
> conditions.
>

The patch I propose has only five "if icomplete-vertical", that's not much 
I think.  And in fact it's easy to remove three of them, and to have only 
two "if icomplete-vertical" (see the other attached patch).  If horizontal 
icomplete remains the default behavior (as I think it will), these if's 
make it clear where the code differs between the two cases.

Gregory

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-diff; name=icomplete.patch; charset=us-ascii, Size: 4592 bytes --]

--- icomplete.el.orig	2020-09-01 10:14:22.000000000 +0000
+++ icomplete.el	2020-09-19 03:20:09.000000000 +0000
@@ -62,6 +62,8 @@
   :type 'string
   :version "24.4")
 
+(defcustom icomplete-vertical nil "...")
+
 (defcustom icomplete-hide-common-prefix t
   "When non-nil, hide common prefix from completion candidates.
 When nil, show candidates in full."
@@ -107,6 +109,8 @@
   :type 'integer
   :version "26.1")
 
+(defvar icomplete--prospects-actual-height 0 "...")
+
 (defcustom icomplete-compute-delay .3
   "Completions-computation stall, used only with large-number completions.
 See `icomplete-delay-completions-threshold'."
@@ -431,6 +435,13 @@
   "Run in minibuffer on activation to establish incremental completion.
 Usually run by inclusion in `minibuffer-setup-hook'."
   (when (and icomplete-mode (icomplete-simple-completing-p))
+    (setq icomplete--prospects-actual-height
+	  (min icomplete-prospects-height
+	       (1- (floor (/ (* (if (floatp max-mini-window-height)
+				    (frame-native-height)
+				  (frame-char-height))
+				max-mini-window-height)
+			     (line-pixel-height))))))
     (set (make-local-variable 'completion-show-inline-help) nil)
     (use-local-map (make-composed-keymap icomplete-minibuffer-map
     					 (current-local-map)))
@@ -650,18 +661,22 @@
 				(t (concat ellipsis (substring most compare))))
 			       close-bracket)))
 	     ;;"-prospects" - more than one candidate
-	     (prospects-len (+ (string-width
-				(or determ (concat open-bracket close-bracket)))
-			       (string-width icomplete-separator)
-			       (+ 2 (string-width ellipsis)) ;; take {…} into account
-			       (string-width (buffer-string))))
+	     (prospects-len (if icomplete-vertical
+				0
+			      (+ (string-width
+				  (or determ (concat open-bracket close-bracket)))
+				 (string-width icomplete-separator)
+				 (+ 2 (string-width ellipsis)) ;; take {…} into account
+				 (string-width (buffer-string)))))
              (prospects-max
-              ;; Max total length to use, including the minibuffer content.
-              (* (+ icomplete-prospects-height
-                    ;; If the minibuffer content already uses up more than
-                    ;; one line, increase the allowable space accordingly.
-                    (/ prospects-len (window-width)))
-                 (window-width)))
+	      (if icomplete-vertical
+		  (- icomplete--prospects-actual-height (/ (point) (window-width)))
+		;; Max total length to use, including the minibuffer content.
+		(* (+ icomplete-prospects-height
+                      ;; If the minibuffer content already uses up more than
+                      ;; one line, increase the allowable space accordingly.
+                      (/ prospects-len (window-width)))
+                   (window-width))))
              ;; Find the common prefix among `comps'.
              ;; We can't use the optimization below because its assumptions
              ;; aren't always true, e.g. when completion-cycling (bug#10850):
@@ -705,12 +720,18 @@
 	    (setq comp
 		  (if prefix-len (substring (car comps) prefix-len) (car comps))
 		  comps (cdr comps))
-	    (setq prospects-len
-                  (+ (string-width comp)
-		     (string-width icomplete-separator)
-		     prospects-len))
+	    (if icomplete-vertical
+		(if (> (length comp) 0)
+		    (setq prospects-len (1+ prospects-len)))
+	      (setq prospects-len
+                    (+ (string-width comp)
+		       (string-width icomplete-separator)
+		       prospects-len)))
 	    (if (< prospects-len prospects-max)
-		(push comp prospects)
+		(if icomplete-vertical
+		    (if (> (length comp) 0)
+			(push comp prospects))
+		  (push comp prospects))
 	      (setq limit t))))
 	(setq prospects (nreverse prospects))
         ;; Return the first match if the user hits enter.
@@ -726,11 +747,16 @@
         ;; is cached.
         (if last (setcdr last base-size))
 	(if prospects
-	    (concat determ
-		    "{"
-		    (mapconcat 'identity prospects icomplete-separator)
-		    (and limit (concat icomplete-separator ellipsis))
-		    "}")
+	    (if icomplete-vertical
+		(concat determ
+			" \n"
+			(mapconcat 'identity prospects "\n")
+			(and limit (concat "\n" ellipsis)))
+	      (concat determ
+		      "{"
+		      (mapconcat 'identity prospects icomplete-separator)
+		      (and limit (concat icomplete-separator ellipsis))
+		      "}"))
 	  (concat determ " [Matched]"))))))
 
 ;;; Iswitchb compatibility

[-- Attachment #3: Type: text/x-diff, Size: 3567 bytes --]

--- a/icomplete.el	2020-09-01 10:14:22.000000000 +0000
+++ b/icomplete.el	2020-09-19 03:54:43.000000000 +0000
@@ -62,6 +62,8 @@
   :type 'string
   :version "24.4")
 
+(defcustom icomplete-vertical nil "...")
+
 (defcustom icomplete-hide-common-prefix t
   "When non-nil, hide common prefix from completion candidates.
 When nil, show candidates in full."
@@ -107,6 +109,8 @@
   :type 'integer
   :version "26.1")
 
+(defvar icomplete--prospects-actual-height 0 "...")
+
 (defcustom icomplete-compute-delay .3
   "Completions-computation stall, used only with large-number completions.
 See `icomplete-delay-completions-threshold'."
@@ -431,6 +435,13 @@
   "Run in minibuffer on activation to establish incremental completion.
 Usually run by inclusion in `minibuffer-setup-hook'."
   (when (and icomplete-mode (icomplete-simple-completing-p))
+    (setq icomplete--prospects-actual-height
+	  (min icomplete-prospects-height
+	       (1- (floor (/ (* (if (floatp max-mini-window-height)
+				    (frame-native-height)
+				  (frame-char-height))
+				max-mini-window-height)
+			     (line-pixel-height))))))
     (set (make-local-variable 'completion-show-inline-help) nil)
     (use-local-map (make-composed-keymap icomplete-minibuffer-map
     					 (current-local-map)))
@@ -701,17 +712,30 @@
 	    ;; completion field.
 	    (setq determ (concat open-bracket "" close-bracket)))
 	  ;; Compute prospects for display.
-	  (while (and comps (not limit))
-	    (setq comp
-		  (if prefix-len (substring (car comps) prefix-len) (car comps))
-		  comps (cdr comps))
-	    (setq prospects-len
-                  (+ (string-width comp)
-		     (string-width icomplete-separator)
-		     prospects-len))
-	    (if (< prospects-len prospects-max)
-		(push comp prospects)
-	      (setq limit t))))
+	  (if icomplete-vertical
+	      (let ((prospects-len 0)
+		    (prospects-max (- icomplete--prospects-actual-height (/ (point) (window-width)))))
+		(while (and comps (not limit))
+		  (setq comp
+			(if prefix-len (substring (car comps) prefix-len) (car comps))
+			comps (cdr comps))
+		  (if (> (length comp) 0)
+		      (setq prospects-len (1+ prospects-len)))
+		  (if (< prospects-len prospects-max)
+		      (if (> (length comp) 0)
+			  (push comp prospects))
+		    (setq limit t))))
+	    (while (and comps (not limit))
+	      (setq comp
+		    (if prefix-len (substring (car comps) prefix-len) (car comps))
+		    comps (cdr comps))
+	      (setq prospects-len
+                    (+ (string-width comp)
+		       (string-width icomplete-separator)
+		       prospects-len))
+	      (if (< prospects-len prospects-max)
+		  (push comp prospects)
+		(setq limit t)))))
 	(setq prospects (nreverse prospects))
         ;; Return the first match if the user hits enter.
         (when icomplete-show-matches-on-no-input
@@ -726,11 +750,16 @@
         ;; is cached.
         (if last (setcdr last base-size))
 	(if prospects
-	    (concat determ
-		    "{"
-		    (mapconcat 'identity prospects icomplete-separator)
-		    (and limit (concat icomplete-separator ellipsis))
-		    "}")
+	    (if icomplete-vertical
+		(concat determ
+			" \n"
+			(mapconcat 'identity prospects "\n")
+			(and limit (concat "\n" ellipsis)))
+	      (concat determ
+		      "{"
+		      (mapconcat 'identity prospects icomplete-separator)
+		      (and limit (concat icomplete-separator ellipsis))
+		      "}"))
 	  (concat determ " [Matched]"))))))
 
 ;;; Iswitchb compatibility

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

* Re: feature/icomplete-vertical
  2020-09-19  4:03     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-19  6:15       ` Ergus
  2020-09-19  8:35         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-19  6:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, casouri, emacs-devel

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

On Sat, Sep 19, 2020 at 04:03:36AM +0000, Gregory Heytings wrote:
>
>Hi Ergus,
>
>Thanks for your comments.
>
>
>Okay, these lines in my patch can just be dropped indeed.  This makes 
>the whole thing even simpler.
>
I thought the same on the beginning, but then the sizes issues came here
and there.

>
>I see.  I did not think about that potential problem before sending 
>the patch.  I attach an updated patch (still very short) in which this 
>problem is (I think) fixed.
>
There is another corner case that is when

(frame-parameter nil 'minibuffer) is 'only. This was also a problem
reported some days ago needed when using frames and not the minibuffer.

>
>That could be an additional feature indeed.  I do not understand why 
>they are annoying, it's common in completion mechanisms to have such 
>indications, but why not.  But I think it is better to separate 
>concerns.
>
The point is that they process the output and substitute the [] () {}
and | with an advise.

Not only in the external package but also some custom configurations
they sent by mail made many magics with this. And it was explicitly
requested by a user some days ago.
>
>That could also be an additional feature, again I don't really see why 
>it would be useful, but why not.  OTOH, it is not possible to do this 
>with the current version of icomplete in horizontal mode, and again I 
>think it is better to separate concerns.
>
With the advise it is possible and more or less simple.

That's why I have been playing with the formats to see if I can provide
that with a simple code. But ofcourse, it is expected to be an
additional feature.

>
>The patch I propose has only five "if icomplete-vertical", that's not 
>much I think.  And in fact it's easy to remove three of them, and to 
>have only two "if icomplete-vertical" (see the other attached patch).  
>If horizontal icomplete remains the default behavior (as I think it 
>will), these if's make it clear where the code differs between the two 
>cases.
>
The other problem with the patch is that due to rounding and floor when
using different fonts there is too much extra space missing and
sometimes missed a candidate at the end. This was also reported some
days ago.


>Gregory

Look at the attached patch as it is partially simplified in my local
branch.

It can be still very improved (the separator part, for example needs
some extra checks to assert it contains at least a '\n', I am actually
thinking in removing the icomplete-format variable and just look for a
\n in the separator in the setup; it will be simpler indeed) but also
some actions are repeated with no reason.

But at least it includes the minimal changes, the corner cases with the
windows/frames/fonts size, fixes the prompt hidden issue, respects the
user separator variable and reduces the conditions we check to only 1 in
the setup.


Best,
Ergus.


[-- Attachment #2: icomplete-vertical.patch --]
[-- Type: text/plain, Size: 11542 bytes --]

diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index 4e546807b7..c1028e84d0 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -50,6 +50,7 @@
 ;;; Code:
 
 (require 'rfn-eshadow) ; rfn-eshadow-overlay
+(require 'cl-lib)
 
 (defgroup icomplete nil
   "Show completions dynamically in minibuffer."
@@ -57,7 +58,7 @@ icomplete
   :link '(info-link "(emacs)Icomplete")
   :group 'minibuffer)
 
-(defcustom icomplete-separator " | "
+(defcustom icomplete-separator nil
   "String used by Icomplete to separate alternatives in the minibuffer."
   :type 'string
   :version "24.4")
@@ -68,6 +69,12 @@ icomplete-hide-common-prefix
   :type 'boolean
   :version "24.4")
 
+(defcustom icomplete-format 'horizontal
+  "Enable `icomplete' vertical mode."
+  :type '(choice (const horizontal)
+                 (const vertical))
+  :version "28.1")
+
 (defvar icomplete-tidy-shadowed-file-names nil
   "If non-nil, automatically delete superfluous parts of file names.
 For example, if the user types ~/ after a long path name,
@@ -139,6 +146,22 @@ icomplete-minibuffer-setup-hook
   :group 'icomplete)
 
 
+(defvar-local icomplete--ellipsis nil
+  "Ellipsis symbol to indicate continuation.")
+
+(defvar-local icomplete--separator nil
+  "If there are multiple possibilities this separates them.")
+
+(defvar-local icomplete--list-indicators-format nil
+  "Indicator for when multiple prospects are available.
+means that further input is required to distinguish a single one")
+
+(defvar-local icomplete--last-format nil)
+(defvar-local icomplete--prospects nil)
+(defvar-local icomplete--match-braket nil)
+(defvar-local icomplete--prospects-max-pixel-height nil)
+
+
 ;;;_* Initialization
 
 ;;;_ + Internal Variables
@@ -437,6 +460,61 @@ icomplete-simple-completing-p
                (member table icomplete-with-completion-tables))))))
 
 ;;;_ > icomplete-minibuffer-setup ()
+
+(defun icomplete--vertical-prospects (prefix-len _determ comps)
+  "List of vertical completions limited."
+  ;; Max total rows to use, including the minibuffer content.
+  (let* ((single-line-height (line-pixel-height))
+         (line-height (* (cl-count ?\n icomplete--separator) single-line-height))
+         ;; Needed for prospects-max-height-pixel
+         (prospects-rows-pixel (* (+ 1
+                                     (cl-count ?\n icomplete--match-braket)
+                                     (cl-count ?\n icomplete--list-indicators-format))
+                                  single-line-height))
+         (prospects-max-pixel-height (min (+ prospects-rows-pixel
+                                             (* icomplete-prospects-height line-height))
+                                          icomplete--prospects-max-pixel-height))
+         limit prospects comp)
+
+
+    (while (and comps (not limit))
+      (setq comp (substring (pop comps) prefix-len)
+            prospects-rows-pixel (+ prospects-rows-pixel line-height))
+
+      (if (< prospects-rows-pixel prospects-max-pixel-height)
+          (push comp prospects)
+        (push icomplete--ellipsis prospects)
+        (setq limit t)))
+    (nreverse prospects)))
+
+
+(defun icomplete--horizontal-prospects (prefix-len determ comps)
+  "List of horizontal completions limited."
+
+  (let* (;; Max total length to use, including the minibuffer content.
+         (separator-width (string-width icomplete--separator))
+         (prospects-len (+ (string-width (or determ (format icomplete--match-braket "")))
+                           (string-width icomplete--separator)
+                           (+ 2 (string-width icomplete--ellipsis)) ;; take {…} into account
+                           (string-width (buffer-string))))
+         (prospects-max-len (* (+ icomplete-prospects-height
+                                  ;; If the minibuffer content already uses up more than
+                                  ;; one line, increase the allowable space accordingly.
+                                  (/ prospects-len (window-width)))
+                               (window-width)))
+         limit prospects comp)
+
+    (while (and comps (not limit))
+      (setq comp (substring (pop comps) prefix-len)
+            prospects-len (+ prospects-len (string-width comp) separator-width))
+
+      (if (< prospects-len prospects-max-len)
+          (push comp prospects)
+        (push icomplete--ellipsis prospects)
+        (setq limit t)))
+    (nreverse prospects)))
+
+
 (defun icomplete-minibuffer-setup ()
   "Run in minibuffer on activation to establish incremental completion.
 Usually run by inclusion in `minibuffer-setup-hook'."
@@ -446,7 +524,31 @@ icomplete-minibuffer-setup
     					 (current-local-map)))
     (add-hook 'pre-command-hook  #'icomplete-pre-command-hook  nil t)
     (add-hook 'post-command-hook #'icomplete-post-command-hook nil t)
-    (run-hooks 'icomplete-minibuffer-setup-hook)))
+    (run-hooks 'icomplete-minibuffer-setup-hook)
+
+    (setq-local icomplete--ellipsis (if (char-displayable-p ?…) "…" "..."))
+
+    (cond
+     ((eq icomplete-format 'vertical)
+      (setq-local icomplete--list-indicators-format " \n%s"
+                  icomplete--separator (or icomplete-separator "\n")
+                  icomplete--prospects 'icomplete--vertical-prospects
+                  icomplete--prospects-max-pixel-height
+                  (let ((minibuffer-parameter (frame-parameter nil 'minibuffer)))
+                    (cond
+                     ((eq minibuffer-parameter t)
+                      (cond ((floatp max-mini-window-height)
+                             (floor (* max-mini-window-height (frame-pixel-height))))
+                            ((integerp max-mini-window-height)
+                             (floor (* max-mini-window-height (frame-char-height))))
+                            (t
+                             (* icomplete-prospects-height (frame-char-height)))))
+                     ((eq minibuffer-parameter 'only)
+                      (frame-pixel-height))))))
+     (t (setq-local icomplete--list-indicators-format "{%s}"
+                    icomplete--separator (or icomplete-separator " | ")
+                    icomplete--prospects 'icomplete--horizontal-prospects)))))
+
 
 (defvar icomplete--in-region-buffer nil)
 
@@ -639,8 +741,6 @@ icomplete-completions
 
   (...) - a single prospect is identified and matching is enforced,
   [...] - a single prospect is identified but matching is optional, or
-  {...} - multiple prospects, separated by commas, are indicated, and
-          further input is required to distinguish a single one.
 
 If there are multiple possibilities, `icomplete-separator' separates them.
 
@@ -665,13 +765,13 @@ icomplete-completions
 	 (md (completion--field-metadata (icomplete--field-beg)))
 	 (comps (icomplete--sorted-completions))
          (last (if (consp comps) (last comps)))
-         (base-size (cdr last))
-         (open-bracket (if require-match "(" "["))
-         (close-bracket (if require-match ")" "]")))
+         (base-size (cdr last)))
+
+    (setq-local icomplete--match-braket (if require-match "(%s)" "[%s]"))
     ;; `concat'/`mapconcat' is the slow part.
     (if (not (consp comps))
 	(progn ;;(debug (format "Candidates=%S field=%S" candidates name))
-	  (format " %sNo matches%s" open-bracket close-bracket))
+	  (format icomplete--match-braket "No matches"))
       (if last (setcdr last nil))
       (let* ((most-try
               (if (and base-size (> base-size 0))
@@ -687,33 +787,18 @@ icomplete-completions
              ;; a prefix of most, or something else.
 	     (compare (compare-strings name nil nil
 				       most nil nil completion-ignore-case))
-	     (ellipsis (if (char-displayable-p ?…) "…" "..."))
 	     (determ (unless (or (eq t compare) (eq t most-try)
 				 (= (setq compare (1- (abs compare)))
 				    (length most)))
-		       (concat open-bracket
+		       (format icomplete--match-braket
 			       (cond
 				((= compare (length name))
                                  ;; Typical case: name is a prefix.
 				 (substring most compare))
                                 ;; Don't bother truncating if it doesn't gain
                                 ;; us at least 2 columns.
-				((< compare (+ 2 (string-width ellipsis))) most)
-				(t (concat ellipsis (substring most compare))))
-			       close-bracket)))
-	     ;;"-prospects" - more than one candidate
-	     (prospects-len (+ (string-width
-				(or determ (concat open-bracket close-bracket)))
-			       (string-width icomplete-separator)
-			       (+ 2 (string-width ellipsis)) ;; take {…} into account
-			       (string-width (buffer-string))))
-             (prospects-max
-              ;; Max total length to use, including the minibuffer content.
-              (* (+ icomplete-prospects-height
-                    ;; If the minibuffer content already uses up more than
-                    ;; one line, increase the allowable space accordingly.
-                    (/ prospects-len (window-width)))
-                 (window-width)))
+				((< compare (+ 2 (string-width icomplete--ellipsis))) most)
+				(t (concat icomplete--ellipsis (substring most compare)))))))
              ;; Find the common prefix among `comps'.
              ;; We can't use the optimization below because its assumptions
              ;; aren't always true, e.g. when completion-cycling (bug#10850):
@@ -725,12 +810,13 @@ icomplete-completions
 	     (prefix (when icomplete-hide-common-prefix
 		       (try-completion "" comps)))
              (prefix-len
-	      (and (stringp prefix)
+              (and icomplete-hide-common-prefix
+                   (stringp prefix)
                    ;; Only hide the prefix if the corresponding info
                    ;; is already displayed via `most'.
                    (string-prefix-p prefix most t)
-                   (length prefix))) ;;)
-	     prospects comp limit)
+                   (length prefix)))
+	     prospects)
 	(if (or (eq most-try t) (not (consp (cdr comps))))
 	    (setq prospects nil)
 	  (when (member name comps)
@@ -751,20 +837,11 @@ icomplete-completions
 	    ;; To circumvent all the above problems, provide a visual
 	    ;; cue to the user via an "empty string" in the try
 	    ;; completion field.
-	    (setq determ (concat open-bracket "" close-bracket)))
+	    (setq determ (format icomplete--match-braket "")))
 	  ;; Compute prospects for display.
-	  (while (and comps (not limit))
-	    (setq comp
-		  (if prefix-len (substring (car comps) prefix-len) (car comps))
-		  comps (cdr comps))
-	    (setq prospects-len
-                  (+ (string-width comp)
-		     (string-width icomplete-separator)
-		     prospects-len))
-	    (if (< prospects-len prospects-max)
-		(push comp prospects)
-	      (setq limit t))))
-	(setq prospects (nreverse prospects))
+          (setq prospects
+                (funcall icomplete--prospects prefix-len determ comps)))
+
 	;; Decorate first of the prospects.
 	(when prospects
 	  (let ((first (copy-sequence (pop prospects))))
@@ -776,10 +853,8 @@ icomplete-completions
         (if last (setcdr last base-size))
 	(if prospects
 	    (concat determ
-		    "{"
-		    (mapconcat 'identity prospects icomplete-separator)
-		    (and limit (concat icomplete-separator ellipsis))
-		    "}")
+                    (format icomplete--list-indicators-format
+                            (mapconcat 'identity prospects icomplete--separator)))
 	  (concat determ " [Matched]"))))))
 
 ;;; Iswitchb compatibility

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

* Re: feature/icomplete-vertical
  2020-09-19  6:15       ` feature/icomplete-vertical Ergus
@ 2020-09-19  8:35         ` Gregory Heytings via Emacs development discussions.
  2020-09-19 10:30           ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
                             ` (2 more replies)
  0 siblings, 3 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-19  8:35 UTC (permalink / raw)
  To: Ergus; +Cc: Eli Zaretskii, casouri, emacs-devel


>
> There is another corner case that is when
>
> (frame-parameter nil 'minibuffer) is 'only. This was also a problem 
> reported some days ago needed when using frames and not the minibuffer.
>

Hmmm... in that case (a corner case, indeed, which does not seem to be 
covered by the current icomplete implementation), it means that the 
minibuffer is not resized att all?  TBH, it seems to me that using 
icomplete with a minibuffer-only frame does not have much sense.

That being said, it is always possible to imagine more corner cases, for 
example a completion candidate that would fill more than one line, or a 
completion candidate list with different fonts (I'm not sure that this is 
actually feasible), or completion candidates with embedded newlines, or...

>
> The other problem with the patch is that due to rounding and floor when 
> using different fonts there is too much extra space missing and 
> sometimes missed a candidate at the end. This was also reported some 
> days ago.
>

I don't think so, but I could be wrong.  I tested my code with many 
different parameters, and did not see the "extra space" you mention, in 
all cases the completions fit perfectly in the minibuffer, and the prompt 
is never hidden.

>
> Look at the attached patch as it is partially simplified in my local 
> branch.
>

Thanks, I'll have a look.

Gregory



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

* Re: feature/icomplete-vertical
  2020-09-19  8:35         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-19 10:30           ` Gregory Heytings via Emacs development discussions.
  2020-09-19 11:19             ` feature/icomplete-vertical Ergus
  2020-09-19 11:43             ` feature/icomplete-vertical Ergus
  2020-09-19 10:47           ` feature/icomplete-vertical Ergus
  2020-09-19 17:08           ` feature/icomplete-vertical Drew Adams
  2 siblings, 2 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-19 10:30 UTC (permalink / raw)
  To: Ergus; +Cc: Eli Zaretskii, casouri, emacs-devel


>> Look at the attached patch as it is partially simplified in my local 
>> branch.
>
> Thanks, I'll have a look.
>

It seems to me that it does not work as well as my code, alas.  A few 
points:

- with C-x C-f the default completion, between angle brackets in the 
original icomplete code, is not shown anymore, unless there is a single 
candidate (for example in a directory with "foo", "bar1", "bar2", "f" will 
give "f[oo]" but "b" will give "b[]"); in other words, the "[]" after the 
point usually serves no purpose

- likewise, with M-x there is a "()" after the point that usually serves 
no purpose

- if I type "M-x icomplete-m", I see the following:

M-x icomplete-m(ode)
|

where "|" represents the cursor (on the next line!)

- when the current line after the prompt is too long the prompt disappears

- when completing a unique completion with TAB the point is moved to the 
next line

Gregory



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

* Re: feature/icomplete-vertical
  2020-09-19  8:35         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-19 10:30           ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-19 10:47           ` Ergus
  2020-09-19 17:08           ` feature/icomplete-vertical Drew Adams
  2 siblings, 0 replies; 118+ messages in thread
From: Ergus @ 2020-09-19 10:47 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, casouri, emacs-devel

On Sat, Sep 19, 2020 at 08:35:24AM +0000, Gregory Heytings via Emacs development discussions. wrote:
>
>>
>>There is another corner case that is when
>>
>>(frame-parameter nil 'minibuffer) is 'only. This was also a problem 
>>reported some days ago needed when using frames and not the 
>>minibuffer.
>>
>
>Hmmm... in that case (a corner case, indeed, which does not seem to be 
>covered by the current icomplete implementation), it means that the 
>minibuffer is not resized att all?  TBH, it seems to me that using 
>icomplete with a minibuffer-only frame does not have much sense.
>
Some users of maple-minibuffer-mode uses them with icomplete + the
external package.

>That being said, it is always possible to imagine more corner cases, 
>for example a completion candidate that would fill more than one line,
I know, for this the users set visual-line in minibuffer. Which I
probably will do to.

>or a completion candidate list with different fonts (I'm not sure that
>this is actually feasible)

This is the reason of the "format" approach I was trying; and why
working directly in pixels as it is simple to get the current line
height in pixels too and increment it more precisely. But I consider
this as a different feature too, so it is not in that patch.

>, or completion candidates with embedded newlines, or...

Covered with the format approach too, but also a new feature.
>
>>
>>The other problem with the patch is that due to rounding and floor 
>>when using different fonts there is too much extra space missing and 
>>sometimes missed a candidate at the end. This was also reported some 
>>days ago.
>>
>
>I don't think so, but I could be wrong.  I tested my code with many 
>different parameters, and did not see the "extra space" you mention, 
>in all cases the completions fit perfectly in the minibuffer, and the 
>prompt is never hidden.
>
Or I could, but I had issues before with this before.

>>
>>Look at the attached patch as it is partially simplified in my local 
>>branch.
>>
>
>Thanks, I'll have a look.
>
>Gregory
>



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

* Re: feature/icomplete-vertical
  2020-09-19 10:30           ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-19 11:19             ` Ergus
  2020-09-19 11:56               ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-19 11:43             ` feature/icomplete-vertical Ergus
  1 sibling, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-19 11:19 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, casouri, emacs-devel

On Sat, Sep 19, 2020 at 10:30:13AM +0000, Gregory Heytings via Emacs development discussions. wrote:
>
>>>Look at the attached patch as it is partially simplified in my 
>>>local branch.
>>
>>Thanks, I'll have a look.
>>
>
>It seems to me that it does not work as well as my code, alas.  A few 
>points:
>
>- with C-x C-f the default completion, between angle brackets in the 
>original icomplete code, is not shown anymore, unless there is a 
>single candidate (for example in a directory with "foo", "bar1", 
>"bar2", "f" will give "f[oo]" but "b" will give "b[]"); in other 
>words, the "[]" after the point usually serves no purpose
>
>- likewise, with M-x there is a "()" after the point that usually 
>serves no purpose
>
As you can see in my patch I didn't change that part.

>- if I type "M-x icomplete-m", I see the following:
>
>M-x icomplete-m(ode)
>|
>
>where "|" represents the cursor (on the next line!)
>
I can't reproduce this, normally this happened when there was a missing
space before the newline in icomplete--list-indicators-format, but it is
in the patch....


>- when the current line after the prompt is too long the prompt disappears
>
Yes, set visual-line-mode -1 for this. Is the only solution so far and what I
will do in the setup probably.

>- when completing a unique completion with TAB the point is moved to 
>the next line
>
Same problem of icomplete--list-indicators-format. Did you applied the
patch cleanly?

>Gregory
>



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

* Re: feature/icomplete-vertical
  2020-09-19 10:30           ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-19 11:19             ` feature/icomplete-vertical Ergus
@ 2020-09-19 11:43             ` Ergus
  2020-09-19 13:00               ` feature/icomplete-vertical Stefan Monnier
  1 sibling, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-19 11:43 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, casouri, emacs-devel

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

Hi Gregory:

Please look at the attached patch where I use a modified version of your
line approach instead of pixels. Because I can't reproduce most of the
issues you mention.

This change is not permanent, but it is the only substantial difference
with your and my code; so lets try that and if this fixes your issue I
will check the pixels approach.

Thanks in advance,
Ergus

On Sat, Sep 19, 2020 at 10:30:13AM +0000, Gregory Heytings wrote:
>
>
>It seems to me that it does not work as well as my code, alas.  A few 
>points:
>
>- with C-x C-f the default completion, between angle brackets in the 
>original icomplete code, is not shown anymore, unless there is a 
>single candidate (for example in a directory with "foo", "bar1", 
>"bar2", "f" will give "f[oo]" but "b" will give "b[]"); in other 
>words, the "[]" after the point usually serves no purpose
>
>- likewise, with M-x there is a "()" after the point that usually 
>serves no purpose
>
>- if I type "M-x icomplete-m", I see the following:
>
>M-x icomplete-m(ode)
>|
>
>where "|" represents the cursor (on the next line!)
>
>- when the current line after the prompt is too long the prompt disappears
>
>- when completing a unique completion with TAB the point is moved to 
>the next line
>
>Gregory

[-- Attachment #2: icomplete-vertical.patch --]
[-- Type: text/plain, Size: 11101 bytes --]

diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index 4e546807b7..6905883cad 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -50,6 +50,7 @@
 ;;; Code:
 
 (require 'rfn-eshadow) ; rfn-eshadow-overlay
+(require 'cl-lib)
 
 (defgroup icomplete nil
   "Show completions dynamically in minibuffer."
@@ -57,7 +58,7 @@ icomplete
   :link '(info-link "(emacs)Icomplete")
   :group 'minibuffer)
 
-(defcustom icomplete-separator " | "
+(defcustom icomplete-separator nil
   "String used by Icomplete to separate alternatives in the minibuffer."
   :type 'string
   :version "24.4")
@@ -68,6 +69,12 @@ icomplete-hide-common-prefix
   :type 'boolean
   :version "24.4")
 
+(defcustom icomplete-format 'horizontal
+  "Enable `icomplete' vertical mode."
+  :type '(choice (const horizontal)
+                 (const vertical))
+  :version "28.1")
+
 (defvar icomplete-tidy-shadowed-file-names nil
   "If non-nil, automatically delete superfluous parts of file names.
 For example, if the user types ~/ after a long path name,
@@ -139,6 +146,22 @@ icomplete-minibuffer-setup-hook
   :group 'icomplete)
 
 
+(defvar-local icomplete--ellipsis nil
+  "Ellipsis symbol to indicate continuation.")
+
+(defvar-local icomplete--separator nil
+  "If there are multiple possibilities this separates them.")
+
+(defvar-local icomplete--list-indicators-format nil
+  "Indicator for when multiple prospects are available.
+means that further input is required to distinguish a single one")
+
+(defvar-local icomplete--last-format nil)
+(defvar-local icomplete--prospects nil)
+(defvar-local icomplete--match-braket nil)
+(defvar-local icomplete--prospects-max-height nil)
+
+
 ;;;_* Initialization
 
 ;;;_ + Internal Variables
@@ -437,6 +460,52 @@ icomplete-simple-completing-p
                (member table icomplete-with-completion-tables))))))
 
 ;;;_ > icomplete-minibuffer-setup ()
+
+(defun icomplete--vertical-prospects (prefix-len _determ comps)
+  "List of vertical completions limited."
+  ;; Max total rows to use, including the minibuffer content.
+  (let* (;; Needed for prospects-max-height-pixel
+         (prospects-rows (+ 1 (cl-count ?\n icomplete--list-indicators-format)))
+         limit prospects comp)
+
+    (while (and comps (not limit))
+      (setq comp (substring (pop comps) prefix-len)
+            prospects-rows (1+ prospects-rows))
+
+      (if (< prospects-rows icomplete--prospects-max-height)
+          (push comp prospects)
+        (push icomplete--ellipsis prospects)
+        (setq limit t)))
+    (nreverse prospects)))
+
+
+(defun icomplete--horizontal-prospects (prefix-len determ comps)
+  "List of horizontal completions limited."
+
+  (let* (;; Max total length to use, including the minibuffer content.
+         (separator-width (string-width icomplete--separator))
+         (prospects-len (+ (string-width (or determ (format icomplete--match-braket "")))
+                           (string-width icomplete--separator)
+                           (+ 2 (string-width icomplete--ellipsis)) ;; take {…} into account
+                           (string-width (buffer-string))))
+         (prospects-max-len (* (+ icomplete-prospects-height
+                                  ;; If the minibuffer content already uses up more than
+                                  ;; one line, increase the allowable space accordingly.
+                                  (/ prospects-len (window-width)))
+                               (window-width)))
+         limit prospects comp)
+
+    (while (and comps (not limit))
+      (setq comp (substring (pop comps) prefix-len)
+            prospects-len (+ prospects-len (string-width comp) separator-width))
+
+      (if (< prospects-len prospects-max-len)
+          (push comp prospects)
+        (push icomplete--ellipsis prospects)
+        (setq limit t)))
+    (nreverse prospects)))
+
+
 (defun icomplete-minibuffer-setup ()
   "Run in minibuffer on activation to establish incremental completion.
 Usually run by inclusion in `minibuffer-setup-hook'."
@@ -446,7 +515,32 @@ icomplete-minibuffer-setup
     					 (current-local-map)))
     (add-hook 'pre-command-hook  #'icomplete-pre-command-hook  nil t)
     (add-hook 'post-command-hook #'icomplete-post-command-hook nil t)
-    (run-hooks 'icomplete-minibuffer-setup-hook)))
+    (run-hooks 'icomplete-minibuffer-setup-hook)
+
+    (setq-local icomplete--ellipsis (if (char-displayable-p ?…) "…" "..."))
+
+    (cond
+     ((eq icomplete-format 'vertical)
+      (setq-local icomplete--list-indicators-format " \n%s"
+                  icomplete--separator (or icomplete-separator "\n")
+                  icomplete--prospects 'icomplete--vertical-prospects
+                  icomplete--prospects-max-height
+                  (let ((minibuffer-parameter (frame-parameter nil 'minibuffer)))
+                    (min (floor (cond
+                                 ((eq minibuffer-parameter t)
+                                  (if (floatp max-mini-window-height)
+                                      (* max-mini-window-height (frame-pixel-height))
+                                    (* max-mini-window-height (frame-char-height))))
+                                 ;; TODO : minibuffer-parameter can have other values.
+                                 ((eq minibuffer-parameter 'only)
+                                  (frame-pixel-height)))
+                                (* (cl-count ?\n icomplete--separator) (line-pixel-height)))
+                         (+ 2 icomplete-prospects-height)))))
+     ;; Default is horizontal
+     (t (setq-local icomplete--list-indicators-format "{%s}"
+                    icomplete--separator (or icomplete-separator " | ")
+                    icomplete--prospects 'icomplete--horizontal-prospects)))))
+
 
 (defvar icomplete--in-region-buffer nil)
 
@@ -639,8 +733,6 @@ icomplete-completions
 
   (...) - a single prospect is identified and matching is enforced,
   [...] - a single prospect is identified but matching is optional, or
-  {...} - multiple prospects, separated by commas, are indicated, and
-          further input is required to distinguish a single one.
 
 If there are multiple possibilities, `icomplete-separator' separates them.
 
@@ -665,13 +757,13 @@ icomplete-completions
 	 (md (completion--field-metadata (icomplete--field-beg)))
 	 (comps (icomplete--sorted-completions))
          (last (if (consp comps) (last comps)))
-         (base-size (cdr last))
-         (open-bracket (if require-match "(" "["))
-         (close-bracket (if require-match ")" "]")))
+         (base-size (cdr last)))
+
+    (setq-local icomplete--match-braket (if require-match "(%s)" "[%s]"))
     ;; `concat'/`mapconcat' is the slow part.
     (if (not (consp comps))
 	(progn ;;(debug (format "Candidates=%S field=%S" candidates name))
-	  (format " %sNo matches%s" open-bracket close-bracket))
+	  (format icomplete--match-braket "No matches"))
       (if last (setcdr last nil))
       (let* ((most-try
               (if (and base-size (> base-size 0))
@@ -687,33 +779,18 @@ icomplete-completions
              ;; a prefix of most, or something else.
 	     (compare (compare-strings name nil nil
 				       most nil nil completion-ignore-case))
-	     (ellipsis (if (char-displayable-p ?…) "…" "..."))
 	     (determ (unless (or (eq t compare) (eq t most-try)
 				 (= (setq compare (1- (abs compare)))
 				    (length most)))
-		       (concat open-bracket
+		       (format icomplete--match-braket
 			       (cond
 				((= compare (length name))
                                  ;; Typical case: name is a prefix.
 				 (substring most compare))
                                 ;; Don't bother truncating if it doesn't gain
                                 ;; us at least 2 columns.
-				((< compare (+ 2 (string-width ellipsis))) most)
-				(t (concat ellipsis (substring most compare))))
-			       close-bracket)))
-	     ;;"-prospects" - more than one candidate
-	     (prospects-len (+ (string-width
-				(or determ (concat open-bracket close-bracket)))
-			       (string-width icomplete-separator)
-			       (+ 2 (string-width ellipsis)) ;; take {…} into account
-			       (string-width (buffer-string))))
-             (prospects-max
-              ;; Max total length to use, including the minibuffer content.
-              (* (+ icomplete-prospects-height
-                    ;; If the minibuffer content already uses up more than
-                    ;; one line, increase the allowable space accordingly.
-                    (/ prospects-len (window-width)))
-                 (window-width)))
+				((< compare (+ 2 (string-width icomplete--ellipsis))) most)
+				(t (concat icomplete--ellipsis (substring most compare)))))))
              ;; Find the common prefix among `comps'.
              ;; We can't use the optimization below because its assumptions
              ;; aren't always true, e.g. when completion-cycling (bug#10850):
@@ -725,12 +802,13 @@ icomplete-completions
 	     (prefix (when icomplete-hide-common-prefix
 		       (try-completion "" comps)))
              (prefix-len
-	      (and (stringp prefix)
+              (and icomplete-hide-common-prefix
+                   (stringp prefix)
                    ;; Only hide the prefix if the corresponding info
                    ;; is already displayed via `most'.
                    (string-prefix-p prefix most t)
-                   (length prefix))) ;;)
-	     prospects comp limit)
+                   (length prefix)))
+	     prospects)
 	(if (or (eq most-try t) (not (consp (cdr comps))))
 	    (setq prospects nil)
 	  (when (member name comps)
@@ -751,20 +829,11 @@ icomplete-completions
 	    ;; To circumvent all the above problems, provide a visual
 	    ;; cue to the user via an "empty string" in the try
 	    ;; completion field.
-	    (setq determ (concat open-bracket "" close-bracket)))
+	    (setq determ (format icomplete--match-braket "")))
 	  ;; Compute prospects for display.
-	  (while (and comps (not limit))
-	    (setq comp
-		  (if prefix-len (substring (car comps) prefix-len) (car comps))
-		  comps (cdr comps))
-	    (setq prospects-len
-                  (+ (string-width comp)
-		     (string-width icomplete-separator)
-		     prospects-len))
-	    (if (< prospects-len prospects-max)
-		(push comp prospects)
-	      (setq limit t))))
-	(setq prospects (nreverse prospects))
+          (setq prospects
+                (funcall icomplete--prospects prefix-len determ comps)))
+
 	;; Decorate first of the prospects.
 	(when prospects
 	  (let ((first (copy-sequence (pop prospects))))
@@ -776,10 +845,8 @@ icomplete-completions
         (if last (setcdr last base-size))
 	(if prospects
 	    (concat determ
-		    "{"
-		    (mapconcat 'identity prospects icomplete-separator)
-		    (and limit (concat icomplete-separator ellipsis))
-		    "}")
+                    (format icomplete--list-indicators-format
+                            (mapconcat 'identity prospects icomplete--separator)))
 	  (concat determ " [Matched]"))))))
 
 ;;; Iswitchb compatibility

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

* Re: feature/icomplete-vertical
  2020-09-19 11:19             ` feature/icomplete-vertical Ergus
@ 2020-09-19 11:56               ` Gregory Heytings via Emacs development discussions.
  2020-09-19 12:57                 ` feature/icomplete-vertical Ergus
  0 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-19 11:56 UTC (permalink / raw)
  To: Ergus; +Cc: Eli Zaretskii, casouri, emacs-devel

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


>> - when the current line after the prompt is too long the prompt 
>> disappears
>
> Yes, set visual-line-mode -1 for this. Is the only solution so far and 
> what I will do in the setup probably.
>

No, it is not the only solution, my code handles that case without using 
visual-line-mode.  By the way, I just checked it (with your code) and 
apparently enabling visual-line-mode does not solve that problem.

>
> Did you applied the patch cleanly?
>

As far as I can see yes.  I already tried your code twice, did you try 
mine?  I attach the improved version which handles the minibuffer-only 
case.

Anyway, IMO you not are using the best approach on this project, you are 
trying to do too many things at once.  Completion mechanisms are a very 
complex thing, and I believe the best way is to do small incremental 
improvements with minimal changes, and to test them thoroughly before 
implementing the next improvement.

[-- Attachment #2: Type: text/x-diff, Size: 3722 bytes --]

--- a/icomplete.el	2020-09-01 10:14:22.000000000 +0000
+++ b/icomplete.el	2020-09-19 11:49:08.000000000 +0000
@@ -62,6 +62,8 @@
   :type 'string
   :version "24.4")
 
+(defcustom icomplete-vertical nil "...")
+
 (defcustom icomplete-hide-common-prefix t
   "When non-nil, hide common prefix from completion candidates.
 When nil, show candidates in full."
@@ -107,6 +109,8 @@
   :type 'integer
   :version "26.1")
 
+(defvar icomplete--prospects-available-height 0 "...")
+
 (defcustom icomplete-compute-delay .3
   "Completions-computation stall, used only with large-number completions.
 See `icomplete-delay-completions-threshold'."
@@ -431,6 +435,15 @@
   "Run in minibuffer on activation to establish incremental completion.
 Usually run by inclusion in `minibuffer-setup-hook'."
   (when (and icomplete-mode (icomplete-simple-completing-p))
+    (setq icomplete--prospects-available-height
+	  (min icomplete-prospects-height
+	       (1- (floor (/ (if (eq (frame-parameter nil 'minibuffer) 'only)
+                                 (frame-native-height)
+                               (* (if (floatp max-mini-window-height)
+				      (frame-native-height)
+				    (frame-char-height))
+				  max-mini-window-height))
+			     (line-pixel-height))))))
     (set (make-local-variable 'completion-show-inline-help) nil)
     (use-local-map (make-composed-keymap icomplete-minibuffer-map
     					 (current-local-map)))
@@ -701,17 +714,30 @@
 	    ;; completion field.
 	    (setq determ (concat open-bracket "" close-bracket)))
 	  ;; Compute prospects for display.
-	  (while (and comps (not limit))
-	    (setq comp
-		  (if prefix-len (substring (car comps) prefix-len) (car comps))
-		  comps (cdr comps))
-	    (setq prospects-len
-                  (+ (string-width comp)
-		     (string-width icomplete-separator)
-		     prospects-len))
-	    (if (< prospects-len prospects-max)
-		(push comp prospects)
-	      (setq limit t))))
+	  (if icomplete-vertical
+	      (let ((prospects-len 0)
+		    (prospects-max (- icomplete--prospects-available-height (/ (point) (window-width)))))
+		(while (and comps (not limit))
+		  (setq comp
+			(if prefix-len (substring (car comps) prefix-len) (car comps))
+			comps (cdr comps))
+		  (if (> (length comp) 0)
+		      (setq prospects-len (1+ prospects-len)))
+		  (if (< prospects-len prospects-max)
+		      (if (> (length comp) 0)
+			  (push comp prospects))
+		    (setq limit t))))
+	    (while (and comps (not limit))
+	      (setq comp
+		    (if prefix-len (substring (car comps) prefix-len) (car comps))
+		    comps (cdr comps))
+	      (setq prospects-len
+                    (+ (string-width comp)
+		       (string-width icomplete-separator)
+		       prospects-len))
+	      (if (< prospects-len prospects-max)
+		  (push comp prospects)
+		(setq limit t)))))
 	(setq prospects (nreverse prospects))
         ;; Return the first match if the user hits enter.
         (when icomplete-show-matches-on-no-input
@@ -726,11 +752,16 @@
         ;; is cached.
         (if last (setcdr last base-size))
 	(if prospects
-	    (concat determ
-		    "{"
-		    (mapconcat 'identity prospects icomplete-separator)
-		    (and limit (concat icomplete-separator ellipsis))
-		    "}")
+	    (if icomplete-vertical
+		(concat determ
+			" \n"
+			(mapconcat 'identity prospects "\n")
+			(and limit (concat "\n" ellipsis)))
+	      (concat determ
+		      "{"
+		      (mapconcat 'identity prospects icomplete-separator)
+		      (and limit (concat icomplete-separator ellipsis))
+		      "}"))
 	  (concat determ " [Matched]"))))))
 
 ;;; Iswitchb compatibility

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

* Re: feature/icomplete-vertical
  2020-09-19 11:56               ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-19 12:57                 ` Ergus
  0 siblings, 0 replies; 118+ messages in thread
From: Ergus @ 2020-09-19 12:57 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, casouri, emacs-devel


On Sat, Sep 19, 2020 at 11:56:19AM +0000, Gregory Heytings via Emacs development discussions. wrote:
>
>>>- when the current line after the prompt is too long the prompt 
>>>disappears
>>
>>Yes, set visual-line-mode -1 for this. Is the only solution so far 
>>and what I will do in the setup probably.
>>
>
>No, it is not the only solution, my code handles that case without 
>using visual-line-mode.
>
If there is visual-lines -1 + truncate-lines that takes care of this in
a consistent way using the internal infrastructure. Why should I use
something else?

>By the way, I just checked it (with your 
>code) and apparently enabling visual-line-mode does not solve that 
>problem.

Did you added truncate-lines locally?

As I said before, the patch was preliminar and needs some fixes I do
slowly as I am not a lisper. I just diff my local changes to send them
to you

>>
>>Did you applied the patch cleanly?
>>
>
>As far as I can see yes.  I already tried your code twice, did you try 
>mine?  I attach the improved version which handles the minibuffer-only 
>case.
>

The changes indeed do only one thing at the time and it separated the
vertical from the horizontal completely. Which is IMO simpler that just
add if and else conditions here and there or hard code the mapcar
ignoring the user separator.

>Anyway, IMO you not are using the best approach on this project, you 
>are trying to do too many things at once.

You can do it if you want. No problem with that. Actually I tried to
convince the creator of the external package to do it and asked in the
mailing list some months ago if anyone wanted to do it and nobody
replied.

>Completion mechanisms are a 
>very complex thing, and I believe the best way is to do small 
>incremental improvements with minimal changes, and to test them 
>thoroughly before implementing the next improvement.

This is not a big change at all. This is just some cosmetics to an
output. I don't interact with he completion system and the code is not
complex at all.

Actually it is just 2 functions. The rest is the same just in a
different place. But actually your code and mine do exactly the same
just using different conditions.

If you see my first commits it was almost as simple as yours but then
reports started coming and I needed to fix them unless some of them
(like the disappearing prompt) were old bug already reported.

IMO this is an incremental change, but I don't try to compete for a
smaller patch but simpler and free of known issues. Like the ones you
are reporting.

Best
Ergus



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

* Re: feature/icomplete-vertical
  2020-09-19 11:43             ` feature/icomplete-vertical Ergus
@ 2020-09-19 13:00               ` Stefan Monnier
  2020-09-19 13:42                 ` feature/icomplete-vertical Ergus
  2020-09-19 13:59                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 2 replies; 118+ messages in thread
From: Stefan Monnier @ 2020-09-19 13:00 UTC (permalink / raw)
  To: Ergus; +Cc: Gregory Heytings, Eli Zaretskii, casouri, emacs-devel

> +                  (let ((minibuffer-parameter (frame-parameter nil 'minibuffer)))
> +                    (min (floor (cond
> +                                 ((eq minibuffer-parameter t)
> +                                  (if (floatp max-mini-window-height)
> +                                      (* max-mini-window-height (frame-pixel-height))
> +                                    (* max-mini-window-height (frame-char-height))))
> +                                 ;; TODO : minibuffer-parameter can have other values.
> +                                 ((eq minibuffer-parameter 'only)
> +                                  (frame-pixel-height)))
> +                                (* (cl-count ?\n icomplete--separator) (line-pixel-height)))
> +                         (+ 2 icomplete-prospects-height)))))

Why do we care about (cl-count ?\n icomplete--separator)?

I mean, the purpose of this code AFAIK is to *estimate* an upper bound
on the number of candidates that will be visible.  Depending on various
factors (special fonts, text-properties, you name it), this estimate
will at time be wrong, so in any case we will have to make sure that the
resulting behavior is still acceptable when we end up displaying more
(or less) candidates than fits.

Using 1 instead of (cl-count ?\n icomplete--separator) will err on the
side of putting too many rather than too few candidates, which should
have as sole negative impact a negligible performance hit.


        Stefan




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

* Re: feature/icomplete-vertical
  2020-09-19 13:00               ` feature/icomplete-vertical Stefan Monnier
@ 2020-09-19 13:42                 ` Ergus
  2020-09-19 15:35                   ` feature/icomplete-vertical Stefan Monnier
  2020-09-19 13:59                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-19 13:42 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Gregory Heytings, Eli Zaretskii, casouri, emacs-devel

On Sat, Sep 19, 2020 at 09:00:05AM -0400, Stefan Monnier wrote:
>> +                  (let ((minibuffer-parameter (frame-parameter nil 'minibuffer)))
>> +                    (min (floor (cond
>> +                                 ((eq minibuffer-parameter t)
>> +                                  (if (floatp max-mini-window-height)
>> +                                      (* max-mini-window-height (frame-pixel-height))
>> +                                    (* max-mini-window-height (frame-char-height))))
>> +                                 ;; TODO : minibuffer-parameter can have other values.
>> +                                 ((eq minibuffer-parameter 'only)
>> +                                  (frame-pixel-height)))
>> +                                (* (cl-count ?\n icomplete--separator) (line-pixel-height)))
>> +                         (+ 2 icomplete-prospects-height)))))

Hi Stefan:
>
>Why do we care about (cl-count ?\n icomplete--separator)?
>
>I mean, the purpose of this code AFAIK is to *estimate* an upper bound
>on the number of candidates that will be visible.  Depending on various
>factors (special fonts, text-properties, you name it), this estimate
>will at time be wrong, so in any case we will have to make sure that the
>resulting behavior is still acceptable when we end up displaying more
>(or less) candidates than fits.
>
That's why I work with pixels. Because we can get the height of every
added line and do a better estimation... but we need to add the text
properties before the increment... which is a different topic because
ATM this is not happening.

>Using 1 instead of (cl-count ?\n icomplete--separator) will err on the
>side of putting too many rather than too few candidates, which should
>have as sole negative impact a negligible performance hit.
>
>
>        Stefan
>

I actually added the cl-count for the opposite reason; in case the user
adds a separator with more than one \n.

Because the idea was to change the condition to enable vertical mode for
when the separator contains at least a \n. Because otherwise the
horizontal formatting could be more accurate. So having both (format and
separator) may conflict unless we prioritize one of them; which IMO
should be the separator as it is the already existent variable.

My intention is to remove the icomplete-format variable completely and
use the right condition based only on the user's separator because
that's something that 2 users mentioned when I asked in this mailing
list to try the branch. This is needed to keep compatibility with the
external package.

OTOH the problem of adding too many candidates (IIUC) is the hiding
prompt issue which comes from there but also the ... will be hiden. So
we need to add the exact amount of lines as accurate as possible.



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

* Re: feature/icomplete-vertical
  2020-09-19 13:00               ` feature/icomplete-vertical Stefan Monnier
  2020-09-19 13:42                 ` feature/icomplete-vertical Ergus
@ 2020-09-19 13:59                 ` Gregory Heytings via Emacs development discussions.
  2020-09-19 14:43                   ` feature/icomplete-vertical Ergus
  2020-09-19 15:37                   ` feature/icomplete-vertical Stefan Monnier
  1 sibling, 2 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-19 13:59 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Ergus, Eli Zaretskii, casouri, emacs-devel


>
> I mean, the purpose of this code AFAIK is to *estimate* an upper bound 
> on the number of candidates that will be visible.  Depending on various 
> factors (special fonts, text-properties, you name it), this estimate 
> will at time be wrong, so in any case we will have to make sure that the 
> resulting behavior is still acceptable when we end up displaying more 
> (or less) candidates than fits.
>
> Using 1 instead of (cl-count ?\n icomplete--separator) will err on the 
> side of putting too many rather than too few candidates, which should 
> have as sole negative impact a negligible performance hit.
>

Alas an estimate is not enough in this case.  As Ergus just wrote, if 
there are too many candidates the prompt disappears, leaving the cursor at 
the beginning of the minibuffer, which is counterintuitive.  A simple 
example: after (setq max-mini-window-height 1), with "M-x a" the "M-x" 
prompt and the "a" disappear.  Likwise after (setq icomplete-separator 
"\n").  IOW, to avoid this it is necessary to compute the number of 
completion candidates that will be shown in the minibuffer, depending on 
its height, its font size, and so forth.



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

* Re: feature/icomplete-vertical
  2020-09-19 13:59                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-19 14:43                   ` Ergus
  2020-09-19 15:37                   ` feature/icomplete-vertical Stefan Monnier
  1 sibling, 0 replies; 118+ messages in thread
From: Ergus @ 2020-09-19 14:43 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Stefan Monnier, Eli Zaretskii, casouri, emacs-devel

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

On Sat, Sep 19, 2020 at 01:59:18PM +0000, Gregory Heytings wrote:

Hi Stefan and Gregory:

Here it is so far my last patch about vertical only feature. Please feel
free to correct it.

I removed the format variable and now to get vertical we only need to
add at least a \n to the separator. With the simple cases I tested it
works.

Stefan:

As you requested for a single feature I will remove the remote branch
again and push one only with this commit.

Gregory:

I took the freedom to add one condition from your code and added it to
mine. (The one for empty candidates)

I didn't do this before because I was keeping the first candidate in the
same line so it made sense to keep the empty one. So after all I will
condition this condition in a future too; when I add options to
remove/change the [] and ().

The other one

(prospects-max (- icomplete--prospects-available-height (/ (point) (window-width))))

I think is good for continuation lines, but I am not sure if that's
better than truncate line and horizontally scroll because in that case
the proposed candidates will be very long as well and continuing them
will reduce their number to the half too. (I took ivy as a pattern for
this)

So I will wait for other users' suggestions about what they prefer OR
take this condition conditionally in case the user explicitly disables
the lines truncation.

Best,
Ergus


[-- Attachment #2: icomplete-vertical.patch --]
[-- Type: text/plain, Size: 10469 bytes --]

diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index 4e546807b7..c071691b07 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -50,6 +50,7 @@
 ;;; Code:
 
 (require 'rfn-eshadow) ; rfn-eshadow-overlay
+(require 'cl-lib)
 
 (defgroup icomplete nil
   "Show completions dynamically in minibuffer."
@@ -139,6 +140,19 @@ icomplete-minibuffer-setup-hook
   :group 'icomplete)
 
 
+(defvar-local icomplete--ellipsis nil
+  "Ellipsis symbol to indicate continuation.")
+
+(defvar-local icomplete--list-indicators-format nil
+  "Indicator for when multiple prospects are available.
+means that further input is required to distinguish a single one")
+
+(defvar-local icomplete--prospects nil)
+(defvar-local icomplete--match-braket nil)
+(defvar-local icomplete--prospects-max-height nil)
+(defvar-local icomplete--lines-per-candidate 0)
+
+
 ;;;_* Initialization
 
 ;;;_ + Internal Variables
@@ -437,6 +451,62 @@ icomplete-simple-completing-p
                (member table icomplete-with-completion-tables))))))
 
 ;;;_ > icomplete-minibuffer-setup ()
+
+(defun icomplete--vertical-prospects (prefix-len _determ comps)
+  "List of vertical completions limited."
+  ;; Max total rows to use, including the minibuffer content.
+  (let* (;; Needed for prospects-max-height-pixel
+         (single-line-height (line-pixel-height))
+         ;; in general this should be done for every line
+         (line-height (* icomplete--lines-per-candidate single-line-height))
+         (prospects-rows (* (1+ (cl-count ?\n icomplete--list-indicators-format))
+                            single-line-height))
+         limit prospects comp comp-len)
+
+    (while (and comps (not limit))
+      (setq comp (substring (pop comps) prefix-len)
+            comp-len (> (length comp) 0))
+
+      (if comp-len
+           (setq prospects-rows (+ prospects-rows line-height)))
+
+      (if (< prospects-rows icomplete--prospects-max-height)
+          (if comp-len
+              (push comp prospects))
+        (push icomplete--ellipsis prospects)
+        (setq limit t)))
+    (nreverse prospects)))
+
+
+(defun icomplete--horizontal-prospects (prefix-len determ comps)
+  "List of horizontal completions limited."
+
+  (let* (;; Max total length to use, including the minibuffer content.
+         (separator-width (string-width icomplete-separator))
+         (prospects-len (+ (string-width (or determ (format icomplete--match-braket "")))
+                           (string-width icomplete-separator)
+                           (+ 2 (string-width icomplete--ellipsis)) ;; take {…} into account
+                           (string-width (buffer-string))))
+         (prospects-max-len (* (+ icomplete-prospects-height
+                                  ;; If the minibuffer content already uses up more than
+                                  ;; one line, increase the allowable space accordingly.
+                                  (/ prospects-len (window-width)))
+                               (window-width)))
+         limit prospects comp)
+
+    (while (and comps (not limit))
+      (setq comp (substring (pop comps) prefix-len))
+
+      (when (> (length comp) 0)
+          (setq prospects-len (+ prospects-len (string-width comp) separator-width)))
+
+      (if (< prospects-len prospects-max-len)
+          (push comp prospects)
+        (push icomplete--ellipsis prospects)
+        (setq limit t)))
+    (nreverse prospects)))
+
+
 (defun icomplete-minibuffer-setup ()
   "Run in minibuffer on activation to establish incremental completion.
 Usually run by inclusion in `minibuffer-setup-hook'."
@@ -446,7 +516,29 @@ icomplete-minibuffer-setup
     					 (current-local-map)))
     (add-hook 'pre-command-hook  #'icomplete-pre-command-hook  nil t)
     (add-hook 'post-command-hook #'icomplete-post-command-hook nil t)
-    (run-hooks 'icomplete-minibuffer-setup-hook)))
+    (run-hooks 'icomplete-minibuffer-setup-hook)
+
+    (setq icomplete--ellipsis (if (char-displayable-p ?…) "…" "...")
+          icomplete--lines-per-candidate (cl-count ?\n icomplete-separator))
+
+    (if (> icomplete--lines-per-candidate 0)
+        (setq-local icomplete--list-indicators-format " \n%s"
+                    icomplete--prospects 'icomplete--vertical-prospects
+                    icomplete--prospects-max-height
+                    (let ((minibuffer-parameter (frame-parameter nil 'minibuffer)))
+                      (min (cond
+                            ((eq minibuffer-parameter t)
+                             (if (floatp max-mini-window-height)
+                                 (* max-mini-window-height (frame-pixel-height))
+                               (* max-mini-window-height (frame-char-height))))
+                            ;; TODO : minibuffer-parameter can have other values.
+                            ((eq minibuffer-parameter 'only)
+                             (frame-pixel-height)))
+                           (* (+ 2 icomplete-prospects-height) (line-pixel-height)))))
+
+      (setq-local icomplete--list-indicators-format "{%s}"
+                  icomplete--prospects 'icomplete--horizontal-prospects))))
+
 
 (defvar icomplete--in-region-buffer nil)
 
@@ -639,8 +731,6 @@ icomplete-completions
 
   (...) - a single prospect is identified and matching is enforced,
   [...] - a single prospect is identified but matching is optional, or
-  {...} - multiple prospects, separated by commas, are indicated, and
-          further input is required to distinguish a single one.
 
 If there are multiple possibilities, `icomplete-separator' separates them.
 
@@ -665,13 +755,13 @@ icomplete-completions
 	 (md (completion--field-metadata (icomplete--field-beg)))
 	 (comps (icomplete--sorted-completions))
          (last (if (consp comps) (last comps)))
-         (base-size (cdr last))
-         (open-bracket (if require-match "(" "["))
-         (close-bracket (if require-match ")" "]")))
+         (base-size (cdr last)))
+
+    (setq-local icomplete--match-braket (if require-match "(%s)" "[%s]"))
     ;; `concat'/`mapconcat' is the slow part.
     (if (not (consp comps))
 	(progn ;;(debug (format "Candidates=%S field=%S" candidates name))
-	  (format " %sNo matches%s" open-bracket close-bracket))
+	  (format icomplete--match-braket "No matches"))
       (if last (setcdr last nil))
       (let* ((most-try
               (if (and base-size (> base-size 0))
@@ -687,33 +777,18 @@ icomplete-completions
              ;; a prefix of most, or something else.
 	     (compare (compare-strings name nil nil
 				       most nil nil completion-ignore-case))
-	     (ellipsis (if (char-displayable-p ?…) "…" "..."))
 	     (determ (unless (or (eq t compare) (eq t most-try)
 				 (= (setq compare (1- (abs compare)))
 				    (length most)))
-		       (concat open-bracket
+		       (format icomplete--match-braket
 			       (cond
 				((= compare (length name))
                                  ;; Typical case: name is a prefix.
 				 (substring most compare))
                                 ;; Don't bother truncating if it doesn't gain
                                 ;; us at least 2 columns.
-				((< compare (+ 2 (string-width ellipsis))) most)
-				(t (concat ellipsis (substring most compare))))
-			       close-bracket)))
-	     ;;"-prospects" - more than one candidate
-	     (prospects-len (+ (string-width
-				(or determ (concat open-bracket close-bracket)))
-			       (string-width icomplete-separator)
-			       (+ 2 (string-width ellipsis)) ;; take {…} into account
-			       (string-width (buffer-string))))
-             (prospects-max
-              ;; Max total length to use, including the minibuffer content.
-              (* (+ icomplete-prospects-height
-                    ;; If the minibuffer content already uses up more than
-                    ;; one line, increase the allowable space accordingly.
-                    (/ prospects-len (window-width)))
-                 (window-width)))
+				((< compare (+ 2 (string-width icomplete--ellipsis))) most)
+				(t (concat icomplete--ellipsis (substring most compare)))))))
              ;; Find the common prefix among `comps'.
              ;; We can't use the optimization below because its assumptions
              ;; aren't always true, e.g. when completion-cycling (bug#10850):
@@ -725,12 +800,13 @@ icomplete-completions
 	     (prefix (when icomplete-hide-common-prefix
 		       (try-completion "" comps)))
              (prefix-len
-	      (and (stringp prefix)
+              (and icomplete-hide-common-prefix
+                   (stringp prefix)
                    ;; Only hide the prefix if the corresponding info
                    ;; is already displayed via `most'.
                    (string-prefix-p prefix most t)
-                   (length prefix))) ;;)
-	     prospects comp limit)
+                   (length prefix)))
+	     prospects)
 	(if (or (eq most-try t) (not (consp (cdr comps))))
 	    (setq prospects nil)
 	  (when (member name comps)
@@ -751,20 +827,11 @@ icomplete-completions
 	    ;; To circumvent all the above problems, provide a visual
 	    ;; cue to the user via an "empty string" in the try
 	    ;; completion field.
-	    (setq determ (concat open-bracket "" close-bracket)))
+	    (setq determ (format icomplete--match-braket "")))
 	  ;; Compute prospects for display.
-	  (while (and comps (not limit))
-	    (setq comp
-		  (if prefix-len (substring (car comps) prefix-len) (car comps))
-		  comps (cdr comps))
-	    (setq prospects-len
-                  (+ (string-width comp)
-		     (string-width icomplete-separator)
-		     prospects-len))
-	    (if (< prospects-len prospects-max)
-		(push comp prospects)
-	      (setq limit t))))
-	(setq prospects (nreverse prospects))
+          (setq prospects
+                (funcall icomplete--prospects prefix-len determ comps)))
+
 	;; Decorate first of the prospects.
 	(when prospects
 	  (let ((first (copy-sequence (pop prospects))))
@@ -776,10 +843,8 @@ icomplete-completions
         (if last (setcdr last base-size))
 	(if prospects
 	    (concat determ
-		    "{"
-		    (mapconcat 'identity prospects icomplete-separator)
-		    (and limit (concat icomplete-separator ellipsis))
-		    "}")
+                    (format icomplete--list-indicators-format
+                            (mapconcat 'identity prospects icomplete-separator)))
 	  (concat determ " [Matched]"))))))
 
 ;;; Iswitchb compatibility

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

* Re: feature/icomplete-vertical
  2020-09-19 13:42                 ` feature/icomplete-vertical Ergus
@ 2020-09-19 15:35                   ` Stefan Monnier
  0 siblings, 0 replies; 118+ messages in thread
From: Stefan Monnier @ 2020-09-19 15:35 UTC (permalink / raw)
  To: Ergus; +Cc: Gregory Heytings, Eli Zaretskii, casouri, emacs-devel

> That's why I work with pixels.

Yes, that's fine.

> Because we can get the height of every added line and do a better
> estimation... but we need to add the text properties before the
> increment... which is a different topic because ATM this is
> not happening.

You don't want to go there.  You end up having to reimplement the job
done by the redisplay.  Instead, just output "a bit more" than
necessary, and then ask the redisplay code whether it fits (so you
reuse the redisplay code instead of reimplementing it).

>>Using 1 instead of (cl-count ?\n icomplete--separator) will err on the
>>side of putting too many rather than too few candidates, which should
>>have as sole negative impact a negligible performance hit.
> I actually added the cl-count for the opposite reason; in case the user
> adds a separator with more than one \n.

That's not the opposite reason, that's the case I had in mind.  By using
1 instead of (cl-count ?\n icomplete--separator) you'll be
over-estimating (by the factor that would have been returned by
`cl-count`) the number of candidates that can fit when (cl-count ?\n
icomplete--separator) is greater than 1.

> So we need to add the exact amount of lines as accurate as possible.

I *strongly* recommend you design the behavior under the assumption that
it's OK if there are a few more lines in the (mini)buffer than are
actually visible.


        Stefan




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

* Re: feature/icomplete-vertical
  2020-09-19 13:59                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-19 14:43                   ` feature/icomplete-vertical Ergus
@ 2020-09-19 15:37                   ` Stefan Monnier
  2020-09-19 15:49                     ` feature/icomplete-vertical Ergus
  2020-09-19 15:55                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 2 replies; 118+ messages in thread
From: Stefan Monnier @ 2020-09-19 15:37 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Ergus, casouri, Eli Zaretskii, emacs-devel

> Alas an estimate is not enough in this case.  As Ergus just wrote, if there
>  are too many candidates the prompt disappears, leaving the cursor at the
>  beginning of the minibuffer, which is counterintuitive.  A simple example:
>  after (setq max-mini-window-height 1), with "M-x a" the "M-x" prompt and
>  the "a" disappear.

That can (and should) be fixed without having to reduce the number of
candidates inserted in the (mini)buffer.


        Stefan




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

* Re: feature/icomplete-vertical
  2020-09-19 15:37                   ` feature/icomplete-vertical Stefan Monnier
@ 2020-09-19 15:49                     ` Ergus
  2020-09-19 16:01                       ` feature/icomplete-vertical Stefan Monnier
  2020-09-19 15:55                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-19 15:49 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Gregory Heytings, Eli Zaretskii, casouri, emacs-devel

On Sat, Sep 19, 2020 at 11:37:07AM -0400, Stefan Monnier wrote:
>> Alas an estimate is not enough in this case.  As Ergus just wrote, if there
>>  are too many candidates the prompt disappears, leaving the cursor at the
>>  beginning of the minibuffer, which is counterintuitive.  A simple example:
>>  after (setq max-mini-window-height 1), with "M-x a" the "M-x" prompt and
>>  the "a" disappear.
>
>That can (and should) be fixed without having to reduce the number of
>candidates inserted in the (mini)buffer.
>
>
>        Stefan
>
It will be great if you give me an idea about how to do that. Because
all the code seems to be designed with this assumption in mind. And also
ido and the others had similar issues with this.

I mean, if we can go around the prompt issue all this will be much
easier.





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

* Re: feature/icomplete-vertical
  2020-09-19 15:37                   ` feature/icomplete-vertical Stefan Monnier
  2020-09-19 15:49                     ` feature/icomplete-vertical Ergus
@ 2020-09-19 15:55                     ` Gregory Heytings via Emacs development discussions.
  1 sibling, 0 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-19 15:55 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Ergus, casouri, Eli Zaretskii, emacs-devel


>> Alas an estimate is not enough in this case.  As Ergus just wrote, if 
>> there are too many candidates the prompt disappears, leaving the cursor 
>> at the beginning of the minibuffer, which is counterintuitive.  A 
>> simple example: after (setq max-mini-window-height 1), with "M-x a" the 
>> "M-x" prompt and the "a" disappear.
>
> That can (and should) be fixed without having to reduce the number of 
> candidates inserted in the (mini)buffer.
>

But how?  What should the algorithm be?  Put a too long list of candidates 
in the minibuffer, redisplay, check if the resulting height is larger than 
then available height (with window-text-pixel-size?), if so remove a 
candidate, redisplay, ...?  Hmmm, no, you just wrote "without having to 
reduce the number of candidates inserted in the (mini)buffer", so it must 
be something else?



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

* Re: feature/icomplete-vertical
  2020-09-19 15:49                     ` feature/icomplete-vertical Ergus
@ 2020-09-19 16:01                       ` Stefan Monnier
  2020-09-19 16:05                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 118+ messages in thread
From: Stefan Monnier @ 2020-09-19 16:01 UTC (permalink / raw)
  To: Ergus; +Cc: Gregory Heytings, Eli Zaretskii, casouri, emacs-devel

>>That can (and should) be fixed without having to reduce the number of
>>candidates inserted in the (mini)buffer.
> It will be great if you give me an idea about how to do that.

You need to figure out why the redisplay decides to hide the prompt
rather than some other part of the (mini)buffer.

Usually, the deciding factor is the position of `point` (the redisplay
tries hard to always keep `point` visible).


        Stefan




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

* Re: feature/icomplete-vertical
  2020-09-19 16:01                       ` feature/icomplete-vertical Stefan Monnier
@ 2020-09-19 16:05                         ` Gregory Heytings via Emacs development discussions.
  2020-09-19 16:15                           ` feature/icomplete-vertical Stefan Monnier
  0 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-19 16:05 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Ergus, Eli Zaretskii, casouri, emacs-devel


>>> That can (and should) be fixed without having to reduce the number of 
>>> candidates inserted in the (mini)buffer.
>>
>> It will be great if you give me an idea about how to do that.
>
> You need to figure out why the redisplay decides to hide the prompt 
> rather than some other part of the (mini)buffer.
>
> Usually, the deciding factor is the position of `point` (the redisplay 
> tries hard to always keep `point` visible).
>

In this case it is not, apparently at least.  As you can see with the 
(setq max-mini-window-height 1) M-x a example, the typical effect is to 
put the point at the first position of the window (top left), thereby 
hiding what precedes (the prompt and the characters typed so far).



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

* Re: feature/icomplete-vertical
  2020-09-19 16:05                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-19 16:15                           ` Stefan Monnier
  2020-09-19 16:19                             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 118+ messages in thread
From: Stefan Monnier @ 2020-09-19 16:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Ergus, casouri, Eli Zaretskii, emacs-devel

>>>> That can (and should) be fixed without having to reduce the number of
>>>> candidates inserted in the (mini)buffer.
>>> It will be great if you give me an idea about how to do that.
>> You need to figure out why the redisplay decides to hide the prompt rather
>> than some other part of the (mini)buffer.
>> Usually, the deciding factor is the position of `point` (the redisplay
>> tries hard to always keep `point` visible).
> In this case it is not, apparently at least.  As you can see with the (setq
> max-mini-window-height 1) M-x a example, the typical effect is to put the
> point at the first position of the window (top left), thereby hiding what
> precedes (the prompt and the characters typed so far).

Yes, hence the question is "why".  I suspect it has to do with the way
we insert the extra text and by teaking it we may work around
this problem.

We could/should also consider this as a problem in the redisplay, so
maybe you should file a bug report for it.

In any case, your example shows that it's not a new problem introduced
by icomplete-vertical, so fixing it should likely be orthogonal to the
addition of icomplete-vertical.


        Stefan




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

* Re: feature/icomplete-vertical
  2020-09-19 16:15                           ` feature/icomplete-vertical Stefan Monnier
@ 2020-09-19 16:19                             ` Gregory Heytings via Emacs development discussions.
  2020-09-19 16:58                               ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-19 16:19 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Ergus, Eli Zaretskii, casouri, emacs-devel


>
> Yes, hence the question is "why".  I suspect it has to do with the way 
> we insert the extra text and by teaking it we may work around this 
> problem.
>

Do you have pointers where one might try to find the "why"?  xdisp.c?

>
> We could/should also consider this as a problem in the redisplay, so 
> maybe you should file a bug report for it.
>

It's a well-known problem, with already several bugs filed.

>
> In any case, your example shows that it's not a new problem introduced 
> by icomplete-vertical, so fixing it should likely be orthogonal to the 
> addition of icomplete-vertical.
>

Indeed.  In fact AFAICT so far everyone tries to work-around that 
bug/feature/limitation/... by doing what we were trying to do, which 
amounts (as you wrote) to redoing or approximating what redisplay does.



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

* Re: feature/icomplete-vertical
  2020-09-19 16:19                             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-19 16:58                               ` Eli Zaretskii
  2020-09-19 17:06                                 ` feature/icomplete-vertical Ergus
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-19 16:58 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: spacibba, casouri, monnier, emacs-devel

> Date: Sat, 19 Sep 2020 16:19:10 +0000
> cc: Ergus <spacibba@aol.com>, Eli Zaretskii <eliz@gnu.org>, casouri@gmail.com, 
>  emacs-devel@gnu.org
> From: Gregory Heytings via "Emacs development discussions." <emacs-devel@gnu.org>
> 
> > We could/should also consider this as a problem in the redisplay, so 
> > maybe you should file a bug report for it.
> >
> 
> It's a well-known problem, with already several bugs filed.

Which problems, and what bugs, please?



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

* Re: feature/icomplete-vertical
  2020-09-19 16:58                               ` feature/icomplete-vertical Eli Zaretskii
@ 2020-09-19 17:06                                 ` Ergus
  2020-09-19 17:21                                   ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-19 17:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gregory Heytings, casouri, monnier, emacs-devel

On Sat, Sep 19, 2020 at 07:58:35PM +0300, Eli Zaretskii wrote:
>> Date: Sat, 19 Sep 2020 16:19:10 +0000
>> cc: Ergus <spacibba@aol.com>, Eli Zaretskii <eliz@gnu.org>, casouri@gmail.com,
>>  emacs-devel@gnu.org
>> From: Gregory Heytings via "Emacs development discussions." <emacs-devel@gnu.org>
>>
>> > We could/should also consider this as a problem in the redisplay, so
>> > maybe you should file a bug report for it.
>> >
>>
>> It's a well-known problem, with already several bugs filed.
>
>Which problems, and what bugs, please?
>

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379



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

* RE: feature/icomplete-vertical
  2020-09-19  8:35         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-19 10:30           ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-19 10:47           ` feature/icomplete-vertical Ergus
@ 2020-09-19 17:08           ` Drew Adams
  2020-09-20  0:28             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2 siblings, 1 reply; 118+ messages in thread
From: Drew Adams @ 2020-09-19 17:08 UTC (permalink / raw)
  To: Gregory Heytings, Ergus; +Cc: Eli Zaretskii, casouri, emacs-devel

[Adding back emacs-devel to the cc list...]

> TBH, it seems to me that using icomplete with a
> minibuffer-only frame does not have much sense.

Why would you think so?

I've been using Icomplete since it existed.  And
I use a standalone minibuffer frame.

I've even - since 1995 - provided a library of
Icomplete enhancements, `icomplete+.el'.  They're
independent of whether someone uses a standalone
minibuffer frame.

https://www.emacswiki.org/emacs/IcompleteMode#IcompleteModePlus

https://www.emacswiki.org/emacs/download/icomplete%2b.el



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

* Re: feature/icomplete-vertical
  2020-09-19 17:06                                 ` feature/icomplete-vertical Ergus
@ 2020-09-19 17:21                                   ` Eli Zaretskii
  2020-09-19 20:47                                     ` feature/icomplete-vertical Ergus
  2020-09-19 21:40                                     ` feature/icomplete-vertical Dmitry Gutov
  0 siblings, 2 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-19 17:21 UTC (permalink / raw)
  To: Ergus; +Cc: ghe, casouri, monnier, emacs-devel

> Date: Sat, 19 Sep 2020 19:06:45 +0200
> From: Ergus <spacibba@aol.com>
> Cc: Gregory Heytings <ghe@sdf.org>, casouri@gmail.com,
> 	monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> >> It's a well-known problem, with already several bugs filed.
> >
> >Which problems, and what bugs, please?
> >
> 
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379

Those are fixed, AFAICT.



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

* Re: feature/icomplete-vertical
  2020-09-19 17:21                                   ` feature/icomplete-vertical Eli Zaretskii
@ 2020-09-19 20:47                                     ` Ergus
  2020-09-19 22:07                                       ` feature/icomplete-vertical Stefan Monnier
                                                         ` (2 more replies)
  2020-09-19 21:40                                     ` feature/icomplete-vertical Dmitry Gutov
  1 sibling, 3 replies; 118+ messages in thread
From: Ergus @ 2020-09-19 20:47 UTC (permalink / raw)
  To: emacs-devel, Eli Zaretskii; +Cc: ghe, casouri, monnier

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

But why are se having the same issue then?

On September 19, 2020 7:21:12 PM GMT+02:00, Eli Zaretskii <eliz@gnu.org> wrote:
>> Date: Sat, 19 Sep 2020 19:06:45 +0200
>> From: Ergus <spacibba@aol.com>
>> Cc: Gregory Heytings <ghe@sdf.org>, casouri@gmail.com,
>> 	monnier@iro.umontreal.ca, emacs-devel@gnu.org
>> 
>> >> It's a well-known problem, with already several bugs filed.
>> >
>> >Which problems, and what bugs, please?
>> >
>> 
>> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
>> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379
>
>Those are fixed, AFAICT.

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.

[-- Attachment #2: Type: text/html, Size: 1441 bytes --]

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

* Re: feature/icomplete-vertical
  2020-09-19 17:21                                   ` feature/icomplete-vertical Eli Zaretskii
  2020-09-19 20:47                                     ` feature/icomplete-vertical Ergus
@ 2020-09-19 21:40                                     ` Dmitry Gutov
  2020-09-20  5:45                                       ` feature/icomplete-vertical Eli Zaretskii
  1 sibling, 1 reply; 118+ messages in thread
From: Dmitry Gutov @ 2020-09-19 21:40 UTC (permalink / raw)
  To: Eli Zaretskii, Ergus; +Cc: ghe, casouri, monnier, emacs-devel

On 19.09.2020 20:21, Eli Zaretskii wrote:
>> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
>> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379
> Those are fixed, AFAICT.

You might want to read the comments to remember the discussions.

The bugs are fixed in an ad-hoc way, with the general problem left intact.

The present issue is exactly the one I described in comment 
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379#61. You called it a 
"future bug".



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

* Re: feature/icomplete-vertical
  2020-09-19 20:47                                     ` feature/icomplete-vertical Ergus
@ 2020-09-19 22:07                                       ` Stefan Monnier
  2020-09-20  5:31                                       ` feature/icomplete-vertical Eli Zaretskii
  2020-09-20 10:47                                       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2 siblings, 0 replies; 118+ messages in thread
From: Stefan Monnier @ 2020-09-19 22:07 UTC (permalink / raw)
  To: Ergus; +Cc: ghe, Eli Zaretskii, casouri, emacs-devel

> But why are se having the same issue then?

Because the underlying problem is not actually fixed.
See bug#43519 where I'm trying to focus on the underlying problem.


        Stefan




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

* RE: feature/icomplete-vertical
  2020-09-19 17:08           ` feature/icomplete-vertical Drew Adams
@ 2020-09-20  0:28             ` Gregory Heytings via Emacs development discussions.
  2020-09-20  1:18               ` feature/icomplete-vertical Drew Adams
  0 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-20  0:28 UTC (permalink / raw)
  To: Drew Adams; +Cc: Ergus, Eli Zaretskii, casouri, emacs-devel


>> TBH, it seems to me that using icomplete with a minibuffer-only frame 
>> does not have much sense.
>
> Why would you think so?
>
> I've been using Icomplete since it existed.  And I use a standalone 
> minibuffer frame.
>

My sentence was indeed not clear enough.  What I meant is: it seems to me 
that using *vertical* icomplete with a minibuffer-only frame does not make 
much sense.



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

* RE: feature/icomplete-vertical
  2020-09-20  0:28             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-20  1:18               ` Drew Adams
  0 siblings, 0 replies; 118+ messages in thread
From: Drew Adams @ 2020-09-20  1:18 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Ergus, casouri, Eli Zaretskii, emacs-devel

> >> TBH, it seems to me that using icomplete with a minibuffer-only frame
> >> does not have much sense.
> >
> > Why would you think so?
> >
> > I've been using Icomplete since it existed.  And I use a standalone
> > minibuffer frame.
> 
> My sentence was indeed not clear enough.  What I meant is: it seems to me
> that using *vertical* icomplete with a minibuffer-only frame does not make
> much sense.

That could be.

A frame can be resized of course - like a window.
I don't see why what applies to a window, in this
respect wouldn't also apply to a minibuffer-only
frame.

But I won't be using my standalone minibuffer frame
with verticle icomplete, so I have nothing special
to say about that.



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

* Re: feature/icomplete-vertical
  2020-09-19 20:47                                     ` feature/icomplete-vertical Ergus
  2020-09-19 22:07                                       ` feature/icomplete-vertical Stefan Monnier
@ 2020-09-20  5:31                                       ` Eli Zaretskii
  2020-09-20 10:47                                       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2 siblings, 0 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-20  5:31 UTC (permalink / raw)
  To: Ergus; +Cc: ghe, casouri, monnier, emacs-devel

> Date: Sat, 19 Sep 2020 22:47:48 +0200
> CC: ghe@sdf.org,casouri@gmail.com,monnier@iro.umontreal.ca
> From: Ergus <spacibba@aol.com>
> 
> But why are se having the same issue then?

AFAIU, you are asking the display engine to do the impossible.

But let's continue this discussion in the bug that Stefan filed.



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

* Re: feature/icomplete-vertical
  2020-09-19 21:40                                     ` feature/icomplete-vertical Dmitry Gutov
@ 2020-09-20  5:45                                       ` Eli Zaretskii
  0 siblings, 0 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-20  5:45 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ghe, spacibba, emacs-devel, casouri, monnier

> Cc: ghe@sdf.org, casouri@gmail.com, monnier@iro.umontreal.ca,
>  emacs-devel@gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> Date: Sun, 20 Sep 2020 00:40:55 +0300
> 
> On 19.09.2020 20:21, Eli Zaretskii wrote:
> >> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24293
> >> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379
> > Those are fixed, AFAICT.
> 
> You might want to read the comments to remember the discussions.
> 
> The bugs are fixed in an ad-hoc way, with the general problem left intact.

You may wish re-reading the discussions, which I hope will clarify
that the fix was where it should be, and that the general problem is
an illusion, probably due to a desire to have application-level
problems go away by some magic.

> The present issue is exactly the one I described in comment 
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39379#61. You called it a 
> "future bug".

There's a new bug#43519 which discusses this situation (if you think
it is exactly the one you described there -- I think you are wrong),
so if you are interested in what I think about it, please read that
discussion and comment there.



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

* Re: feature/icomplete-vertical
  2020-09-19 20:47                                     ` feature/icomplete-vertical Ergus
  2020-09-19 22:07                                       ` feature/icomplete-vertical Stefan Monnier
  2020-09-20  5:31                                       ` feature/icomplete-vertical Eli Zaretskii
@ 2020-09-20 10:47                                       ` Gregory Heytings via Emacs development discussions.
  2020-09-20 13:04                                         ` feature/icomplete-vertical Ergus
  2 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-20 10:47 UTC (permalink / raw)
  To: Ergus; +Cc: emacs-devel, Eli Zaretskii, casouri, monnier


Hi Ergus,

I don't know if you're following the discussion on bug#43519, but there is 
in fact an almost trivial way to implement icomplete-vertical:

(setq icomplete-separator "\n")
(setq icomplete-prospects-height 10)
(add-hook 'icomplete-minibuffer-setup-hook (function (lambda () (setq resize-mini-windows nil) (enlarge-window icomplete-prospects-height))))

It needs some tweaking, but it works.



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

* Re: feature/icomplete-vertical
  2020-09-12 13:33 ` feature/icomplete-vertical Ergus
  2020-09-12 14:30   ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-14  6:44   ` feature/icomplete-vertical jixiuf
@ 2020-09-20 10:55   ` João Távora
  2020-09-20 13:04     ` feature/icomplete-vertical Ergus
  2 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-09-20 10:55 UTC (permalink / raw)
  To: Ergus; +Cc: Gregory Heytings, Eli Zaretskii, Yuan Fu, emacs-devel

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

I'm late to the party here, but I'd just like to add that
Gregory's solution based on advice can easily be be integrated into
icomplete-mode directly.  I do like that it's such a simple solution,
doesn't include new defcustoms, modes and such.  I didn't have
a in-depth look, but it looks like your solution Ergus, is quite a bit
more complex.  Why?  What extras does it bring to the table?
And are we sure we need those extras in the first version of this?

Or am I missing something and is Gregory's solution fundamentally
unusable?

My 2c,
João

On Sat, Sep 12, 2020 at 2:33 PM Ergus <spacibba@aol.com> wrote:

> On Sat, Sep 12, 2020 at 01:10:57PM +0000, Gregory Heytings wrote:
> >
> >>
> >>>If there was a built-in vertical mode it would be better / more
> >>>intuitive.
> >>
> >>Could you try the branch feature/icomplete-vertical? I need some
> >>testers before adding it to master.
> >>
> >
> >Alas no, I have been using the following to have icomplete-vertical
> >for quite some time, it works perfectly well, so I don't see why a
> >more complex implementation would be necessary.
> >
> >(setq icomplete-prospects-height 6)
> >(setq icomplete-separator "\n")
> >(defun icomplete-vertical-minibuffer-setup ()
> >  (setq truncate-lines t)
> >  (setq-local completion-ignore-case t)
> >  (setq-local read-file-name-completion-ignore-case t)
> >  (setq-local read-buffer-completion-ignore-case t)
> >  (setq icomplete-hide-common-prefix nil))
> >(add-hook 'icomplete-minibuffer-setup-hook
> #'icomplete-vertical-minibuffer-setup)
> >(defun icomplete-vertical-reformat-completions (completions)
> >  (save-match-data
> >    (let ((cnp (substring-no-properties completions)))
> >      (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}"
> cnp)
> >          (format "%s \n%s"
> >                  (or (match-string 1 cnp) "")
> >                  (replace-regexp-in-string "^" (make-string
> (current-column) ? ) (match-string 2 cnp)))
> >        cnp))))
> >(defun icomplete-vertical-adjust-minibuffer-height (completions)
> >  (let* ((comp (icomplete-vertical-reformat-completions completions))
> >         (complen (length (split-string comp "\n"))))
> >    (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1-
> (window-height)))))
> >    comp))
> >(advice-add 'icomplete-completions :filter-return
> #'icomplete-vertical-adjust-minibuffer-height)
>
> 1) Internal functionalities try not to use advises.
> 2) The branch is not actually more complex, it just generates the
> formatted vertical output form the beginning.
> 3) It does more or less the same you are doing but with a simpler
> config:
>
> (icomplete-mode t)
> (icomplete-format 'vertical)
>
> 4) We add arrow bindings to move
> 5) Add completion matching faces is also coming.
>
>

-- 
João Távora

[-- Attachment #2: Type: text/html, Size: 3764 bytes --]

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

* Re: feature/icomplete-vertical
  2020-09-20 10:47                                       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-20 13:04                                         ` Ergus
  0 siblings, 0 replies; 118+ messages in thread
From: Ergus @ 2020-09-20 13:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: emacs-devel, Eli Zaretskii, casouri, monnier

On Sun, Sep 20, 2020 at 10:47:44AM +0000, Gregory Heytings via Emacs development discussions. wrote:
>
>Hi Ergus,
>
>I don't know if you're following the discussion on bug#43519, but 
>there is in fact an almost trivial way to implement 
>icomplete-vertical:
>
>(setq icomplete-separator "\n")
>(setq icomplete-prospects-height 10)

>(add-hook 'icomplete-minibuffer-setup-hook (function (lambda () (setq resize-mini-windows nil) (enlarge-window icomplete-prospects-height))))
>
>It needs some tweaking, but it works.
>
That's indeed similar to what the external package does with some extras
(remove the {} and add the extra line after the {, truncate the long
ones, resize automatically when less candidates based on an option).

https://github.com/oantolin/icomplete-vertical

Then the only thin we need is (setq resize-mini-windows nil) and doesn't
need to be in the icomplete-minibuffer-setup-hook.

The problem was that I tried to avoid calling enlarge-window and I
thought there was a good reason to do that... my bad.




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

* Re: feature/icomplete-vertical
  2020-09-20 10:55   ` feature/icomplete-vertical João Távora
@ 2020-09-20 13:04     ` Ergus
  2020-09-20 13:15       ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-20 13:04 UTC (permalink / raw)
  To: João Távora
  Cc: Gregory Heytings, Eli Zaretskii, Yuan Fu, emacs-devel

Hi Joao:

The problem was that I was trying to avoid calling enlarge-window from
icomplete and rely on the internal resize mechanism (maybe that was the
main error) to avoid calculating the height in general. And of course
the prompt issue that came out when using different fonts as a
surprise. I tried to solve that without the enlarge to respect also the
resize-mini-windows either when t or grow-only.

Initially I separated icomplete--prospects only, but then all the height
calculation complexity came and that's why I ended with the complex
approach. I didn't know that the prompt issue disappeared with

(setq resize-mini-windows nil)

What I wonder about this is the potential conflicts when another package
or function relies on resize-mini-windows. And that the ... is not shown
to indicate that there are more candidates.

OTOH: My main goal (more than the vertical) was to implement a sort of
zsh like completion. (similar to what I did for *Completions* buffer) so
at least I will request to avoid using only and advise.


On Sun, Sep 20, 2020 at 11:55:52AM +0100, Jo�o T�vora wrote:
>I'm late to the party here, but I'd just like to add that
>Gregory's solution based on advice can easily be be integrated into
>icomplete-mode directly.  I do like that it's such a simple solution,
>doesn't include new defcustoms, modes and such.  I didn't have
>a in-depth look, but it looks like your solution Ergus, is quite a bit
>more complex.  Why?  What extras does it bring to the table?
>And are we sure we need those extras in the first version of this?
>
>Or am I missing something and is Gregory's solution fundamentally
>unusable?
>
>My 2c,
>Jo�o
>
>On Sat, Sep 12, 2020 at 2:33 PM Ergus <spacibba@aol.com> wrote:
>
>> On Sat, Sep 12, 2020 at 01:10:57PM +0000, Gregory Heytings wrote:
>> >
>> >>
>> >>>If there was a built-in vertical mode it would be better / more
>> >>>intuitive.
>> >>
>> >>Could you try the branch feature/icomplete-vertical? I need some
>> >>testers before adding it to master.
>> >>
>> >
>> >Alas no, I have been using the following to have icomplete-vertical
>> >for quite some time, it works perfectly well, so I don't see why a
>> >more complex implementation would be necessary.
>> >
>> >(setq icomplete-prospects-height 6)
>> >(setq icomplete-separator "\n")
>> >(defun icomplete-vertical-minibuffer-setup ()
>> >  (setq truncate-lines t)
>> >  (setq-local completion-ignore-case t)
>> >  (setq-local read-file-name-completion-ignore-case t)
>> >  (setq-local read-buffer-completion-ignore-case t)
>> >  (setq icomplete-hide-common-prefix nil))
>> >(add-hook 'icomplete-minibuffer-setup-hook
>> #'icomplete-vertical-minibuffer-setup)
>> >(defun icomplete-vertical-reformat-completions (completions)
>> >  (save-match-data
>> >    (let ((cnp (substring-no-properties completions)))
>> >      (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}"
>> cnp)
>> >          (format "%s \n%s"
>> >                  (or (match-string 1 cnp) "")
>> >                  (replace-regexp-in-string "^" (make-string
>> (current-column) ? ) (match-string 2 cnp)))
>> >        cnp))))
>> >(defun icomplete-vertical-adjust-minibuffer-height (completions)
>> >  (let* ((comp (icomplete-vertical-reformat-completions completions))
>> >         (complen (length (split-string comp "\n"))))
>> >    (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1-
>> (window-height)))))
>> >    comp))
>> >(advice-add 'icomplete-completions :filter-return
>> #'icomplete-vertical-adjust-minibuffer-height)
>>
>> 1) Internal functionalities try not to use advises.
>> 2) The branch is not actually more complex, it just generates the
>> formatted vertical output form the beginning.
>> 3) It does more or less the same you are doing but with a simpler
>> config:
>>
>> (icomplete-mode t)
>> (icomplete-format 'vertical)
>>
>> 4) We add arrow bindings to move
>> 5) Add completion matching faces is also coming.
>>
>>
>
>-- 
>Jo�o T�vora



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

* Re: feature/icomplete-vertical
  2020-09-20 13:04     ` feature/icomplete-vertical Ergus
@ 2020-09-20 13:15       ` Eli Zaretskii
  2020-09-20 13:37         ` feature/icomplete-vertical Ergus
  2020-09-20 14:07         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 2 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-20 13:15 UTC (permalink / raw)
  To: Ergus; +Cc: ghe, casouri, joaotavora, emacs-devel

> Date: Sun, 20 Sep 2020 15:04:35 +0200
> From: Ergus <spacibba@aol.com>
> Cc: Gregory Heytings <ghe@sdf.org>, Eli Zaretskii <eliz@gnu.org>,
> 	Yuan Fu <casouri@gmail.com>, emacs-devel <emacs-devel@gnu.org>
> 
> Initially I separated icomplete--prospects only, but then all the height
> calculation complexity came and that's why I ended with the complex
> approach. I didn't know that the prompt issue disappeared with
> 
> (setq resize-mini-windows nil)
> 
> What I wonder about this is the potential conflicts when another package
> or function relies on resize-mini-windows. And that the ... is not shown
> to indicate that there are more candidates.

resize-mini-windows is a user option, so resetting it globally is
almost certainly a non-starter.



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

* Re: feature/icomplete-vertical
  2020-09-20 13:15       ` feature/icomplete-vertical Eli Zaretskii
@ 2020-09-20 13:37         ` Ergus
  2020-09-20 14:07         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 0 replies; 118+ messages in thread
From: Ergus @ 2020-09-20 13:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: joaotavora, ghe, casouri, emacs-devel

On Sun, Sep 20, 2020 at 04:15:41PM +0300, Eli Zaretskii wrote:
>> Date: Sun, 20 Sep 2020 15:04:35 +0200
>> From: Ergus <spacibba@aol.com>
>> Cc: Gregory Heytings <ghe@sdf.org>, Eli Zaretskii <eliz@gnu.org>,
>> 	Yuan Fu <casouri@gmail.com>, emacs-devel <emacs-devel@gnu.org>
>>
>> Initially I separated icomplete--prospects only, but then all the height
>> calculation complexity came and that's why I ended with the complex
>> approach. I didn't know that the prompt issue disappeared with
>>
>> (setq resize-mini-windows nil)
>>
>> What I wonder about this is the potential conflicts when another package
>> or function relies on resize-mini-windows. And that the ... is not shown
>> to indicate that there are more candidates.
>
>resize-mini-windows is a user option, so resetting it globally is
>almost certainly a non-starter.

The other thing I don;t like about this solution is that it does the
resize in advance.



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

* Re: feature/icomplete-vertical
  2020-09-20 13:15       ` feature/icomplete-vertical Eli Zaretskii
  2020-09-20 13:37         ` feature/icomplete-vertical Ergus
@ 2020-09-20 14:07         ` Gregory Heytings via Emacs development discussions.
  2020-09-20 14:28           ` feature/icomplete-vertical Eli Zaretskii
  2020-09-20 14:49           ` feature/icomplete-vertical Ergus
  1 sibling, 2 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-20 14:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Ergus, casouri, joaotavora, emacs-devel


>> Initially I separated icomplete--prospects only, but then all the 
>> height calculation complexity came and that's why I ended with the 
>> complex approach. I didn't know that the prompt issue disappeared with
>>
>> (setq resize-mini-windows nil)
>>
>> What I wonder about this is the potential conflicts when another 
>> package or function relies on resize-mini-windows. And that the ... is 
>> not shown to indicate that there are more candidates.
>
> resize-mini-windows is a user option, so resetting it globally is almost 
> certainly a non-starter.
>

The three lines I sent:

(setq icomplete-separator "\n")
(setq icomplete-prospects-height 10)
(add-hook 'icomplete-minibuffer-setup-hook (function (lambda () (setq resize-mini-windows nil) (enlarge-window icomplete-prospects-height))))

had no other purpose except demonstrating that (setq resize-mini-windows 
nil) solves the problem of disappearing prompts.  Of course I do not 
consider that these lines should be blindly used, in fact I wrote "It 
needs some tweaking, but it works."  Indeed one should do something with 
user preferences, and use a setq-local.  The point is that doing this is 
much simpler than trying to calculate the height of the completion 
candidate list, which amount (as Stefan wrote) to redoing what redisplay 
does.



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

* Re: feature/icomplete-vertical
  2020-09-20 14:07         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-20 14:28           ` Eli Zaretskii
  2020-09-20 15:04             ` feature/icomplete-vertical Ergus
  2020-09-20 17:09             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-20 14:49           ` feature/icomplete-vertical Ergus
  1 sibling, 2 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-20 14:28 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: spacibba, emacs-devel, casouri, joaotavora

> Date: Sun, 20 Sep 2020 14:07:45 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: Ergus <spacibba@aol.com>, casouri@gmail.com, joaotavora@gmail.com,
>         emacs-devel@gnu.org
> 
> 
> > resize-mini-windows is a user option, so resetting it globally is almost 
> > certainly a non-starter.
> >
> 
> The three lines I sent:
> 
> (setq icomplete-separator "\n")
> (setq icomplete-prospects-height 10)
> (add-hook 'icomplete-minibuffer-setup-hook (function (lambda () (setq resize-mini-windows nil) (enlarge-window icomplete-prospects-height))))
> 
> had no other purpose except demonstrating that (setq resize-mini-windows 
> nil) solves the problem of disappearing prompts.  Of course I do not 
> consider that these lines should be blindly used

Please note that I wasn't replying to your proposal, I was replying to
Jimmy's.

> trying to calculate the height of the completion candidate list,
> which amount (as Stefan wrote) to redoing what redisplay does.

I don't agree with Stefan, if this interpretation of what he said is
correct.  We have window-text-pixel-size to measure the size of text
on display without redoing what redisplay does.



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

* Re: feature/icomplete-vertical
  2020-09-20 14:07         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-09-20 14:28           ` feature/icomplete-vertical Eli Zaretskii
@ 2020-09-20 14:49           ` Ergus
  2020-09-20 15:46             ` feature/icomplete-vertical Eli Zaretskii
  1 sibling, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-20 14:49 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, casouri, joaotavora, emacs-devel

On Sun, Sep 20, 2020 at 02:07:45PM +0000, Gregory Heytings wrote:
>
>>>Initially I separated icomplete--prospects only, but then all the 
>>>height calculation complexity came and that's why I ended with the 
>>>complex approach. I didn't know that the prompt issue disappeared 
>>>with
>>>
>>>(setq resize-mini-windows nil)
>>>
>>>What I wonder about this is the potential conflicts when another 
>>>package or function relies on resize-mini-windows. And that the 
>>>... is not shown to indicate that there are more candidates.
>>
>>resize-mini-windows is a user option, so resetting it globally is 
>>almost certainly a non-starter.
>>
>
>The three lines I sent:
>
>(setq icomplete-separator "\n")
>(setq icomplete-prospects-height 10)
>(add-hook 'icomplete-minibuffer-setup-hook (function (lambda () (setq resize-mini-windows nil) (enlarge-window icomplete-prospects-height))))
>
>had no other purpose except demonstrating that (setq 
>resize-mini-windows nil) solves the problem of disappearing prompts.  
>Of course I do not consider that these lines should be blindly used, 
>in fact I wrote "It needs some tweaking, but it works."  Indeed one 
>should do something with user preferences, and use a setq-local.  The 
>point is that doing this is much simpler than trying to calculate the 
>height of the completion candidate list, which amount (as Stefan 
>wrote) to redoing what redisplay does.

Hi Gregory:

When the display engine have resize-mini-windows not nil it will try to
resize the windows after an action in minibuffer. This happens
automatically and setting it as local or so will still overwrite the
user choice.

What we need is to inhibit that behavior while icomplete is active We
could add a hook to minibuffer-exit-hook to reset resize-mini-windows to
it's original value (and remove itself)

Something like (untested)

(setq icomplete-separator "\n")
(setq icomplete-prospects-height 10)
(defvar icomplete-saved-resize-mini-windows nil)

(defun icomplete-minibuffer-exit-hook ()
     (setq resize-mini-windows icomplete-saved-resize-mini-windows)
     (remove-hook 'minibuffer-exit-hook #'icomplete-minibuffer-exit-hook))

(add-hook 'icomplete-minibuffer-setup-hook
           '(lambda ()
               (setq icomplete-saved-resize-mini-windows resize-mini-windows)
               (setq resize-mini-windows nil)
               (enlarge-window icomplete-prospects-height)
               (add-hook 'minibuffer-exit-hook #icomplete-minibuffer-exit-hook)))

Should probably work. (But this still looks like a workaround more than
a solution to me.)




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

* Re: feature/icomplete-vertical
  2020-09-20 14:28           ` feature/icomplete-vertical Eli Zaretskii
@ 2020-09-20 15:04             ` Ergus
  2020-09-20 15:54               ` feature/icomplete-vertical Eli Zaretskii
  2020-09-20 17:09             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 1 reply; 118+ messages in thread
From: Ergus @ 2020-09-20 15:04 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gregory Heytings, casouri, joaotavora, emacs-devel

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

On Sun, Sep 20, 2020 at 05:28:50PM +0300, Eli Zaretskii wrote:
>
>Please note that I wasn't replying to your proposal, I was replying to
>Jimmy's.
>
>> trying to calculate the height of the completion candidate list,
>> which amount (as Stefan wrote) to redoing what redisplay does.
>
>I don't agree with Stefan, if this interpretation of what he said is
>correct.  We have window-text-pixel-size to measure the size of text
>on display without redoing what redisplay does.

Hi Eli that's what I have been doing so far, but the approach looks a
bit too complex. It is actually not, but I understand that a better
simpler one is desirable.

You can look at the attached patch.

Any way it seems to me a bit buggy that (only) the prompt disappears in
this situation and how it behaves when we use the arrows. In general
without this issue we should be allowed to set \n separator and it
basically should work out of the box without requiring my code at all.

Best,
Ergus

[-- Attachment #2: icomplete-vertical-Eli.patch --]
[-- Type: text/plain, Size: 10469 bytes --]

diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index 4e546807b7..c071691b07 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -50,6 +50,7 @@
 ;;; Code:
 
 (require 'rfn-eshadow) ; rfn-eshadow-overlay
+(require 'cl-lib)
 
 (defgroup icomplete nil
   "Show completions dynamically in minibuffer."
@@ -139,6 +140,19 @@ icomplete-minibuffer-setup-hook
   :group 'icomplete)
 
 
+(defvar-local icomplete--ellipsis nil
+  "Ellipsis symbol to indicate continuation.")
+
+(defvar-local icomplete--list-indicators-format nil
+  "Indicator for when multiple prospects are available.
+means that further input is required to distinguish a single one")
+
+(defvar-local icomplete--prospects nil)
+(defvar-local icomplete--match-braket nil)
+(defvar-local icomplete--prospects-max-height nil)
+(defvar-local icomplete--lines-per-candidate 0)
+
+
 ;;;_* Initialization
 
 ;;;_ + Internal Variables
@@ -437,6 +451,62 @@ icomplete-simple-completing-p
                (member table icomplete-with-completion-tables))))))
 
 ;;;_ > icomplete-minibuffer-setup ()
+
+(defun icomplete--vertical-prospects (prefix-len _determ comps)
+  "List of vertical completions limited."
+  ;; Max total rows to use, including the minibuffer content.
+  (let* (;; Needed for prospects-max-height-pixel
+         (single-line-height (line-pixel-height))
+         ;; in general this should be done for every line
+         (line-height (* icomplete--lines-per-candidate single-line-height))
+         (prospects-rows (* (1+ (cl-count ?\n icomplete--list-indicators-format))
+                            single-line-height))
+         limit prospects comp comp-len)
+
+    (while (and comps (not limit))
+      (setq comp (substring (pop comps) prefix-len)
+            comp-len (> (length comp) 0))
+
+      (if comp-len
+           (setq prospects-rows (+ prospects-rows line-height)))
+
+      (if (< prospects-rows icomplete--prospects-max-height)
+          (if comp-len
+              (push comp prospects))
+        (push icomplete--ellipsis prospects)
+        (setq limit t)))
+    (nreverse prospects)))
+
+
+(defun icomplete--horizontal-prospects (prefix-len determ comps)
+  "List of horizontal completions limited."
+
+  (let* (;; Max total length to use, including the minibuffer content.
+         (separator-width (string-width icomplete-separator))
+         (prospects-len (+ (string-width (or determ (format icomplete--match-braket "")))
+                           (string-width icomplete-separator)
+                           (+ 2 (string-width icomplete--ellipsis)) ;; take {…} into account
+                           (string-width (buffer-string))))
+         (prospects-max-len (* (+ icomplete-prospects-height
+                                  ;; If the minibuffer content already uses up more than
+                                  ;; one line, increase the allowable space accordingly.
+                                  (/ prospects-len (window-width)))
+                               (window-width)))
+         limit prospects comp)
+
+    (while (and comps (not limit))
+      (setq comp (substring (pop comps) prefix-len))
+
+      (when (> (length comp) 0)
+          (setq prospects-len (+ prospects-len (string-width comp) separator-width)))
+
+      (if (< prospects-len prospects-max-len)
+          (push comp prospects)
+        (push icomplete--ellipsis prospects)
+        (setq limit t)))
+    (nreverse prospects)))
+
+
 (defun icomplete-minibuffer-setup ()
   "Run in minibuffer on activation to establish incremental completion.
 Usually run by inclusion in `minibuffer-setup-hook'."
@@ -446,7 +516,29 @@ icomplete-minibuffer-setup
     					 (current-local-map)))
     (add-hook 'pre-command-hook  #'icomplete-pre-command-hook  nil t)
     (add-hook 'post-command-hook #'icomplete-post-command-hook nil t)
-    (run-hooks 'icomplete-minibuffer-setup-hook)))
+    (run-hooks 'icomplete-minibuffer-setup-hook)
+
+    (setq icomplete--ellipsis (if (char-displayable-p ?…) "…" "...")
+          icomplete--lines-per-candidate (cl-count ?\n icomplete-separator))
+
+    (if (> icomplete--lines-per-candidate 0)
+        (setq-local icomplete--list-indicators-format " \n%s"
+                    icomplete--prospects 'icomplete--vertical-prospects
+                    icomplete--prospects-max-height
+                    (let ((minibuffer-parameter (frame-parameter nil 'minibuffer)))
+                      (min (cond
+                            ((eq minibuffer-parameter t)
+                             (if (floatp max-mini-window-height)
+                                 (* max-mini-window-height (frame-pixel-height))
+                               (* max-mini-window-height (frame-char-height))))
+                            ;; TODO : minibuffer-parameter can have other values.
+                            ((eq minibuffer-parameter 'only)
+                             (frame-pixel-height)))
+                           (* (+ 2 icomplete-prospects-height) (line-pixel-height)))))
+
+      (setq-local icomplete--list-indicators-format "{%s}"
+                  icomplete--prospects 'icomplete--horizontal-prospects))))
+
 
 (defvar icomplete--in-region-buffer nil)
 
@@ -639,8 +731,6 @@ icomplete-completions
 
   (...) - a single prospect is identified and matching is enforced,
   [...] - a single prospect is identified but matching is optional, or
-  {...} - multiple prospects, separated by commas, are indicated, and
-          further input is required to distinguish a single one.
 
 If there are multiple possibilities, `icomplete-separator' separates them.
 
@@ -665,13 +755,13 @@ icomplete-completions
 	 (md (completion--field-metadata (icomplete--field-beg)))
 	 (comps (icomplete--sorted-completions))
          (last (if (consp comps) (last comps)))
-         (base-size (cdr last))
-         (open-bracket (if require-match "(" "["))
-         (close-bracket (if require-match ")" "]")))
+         (base-size (cdr last)))
+
+    (setq-local icomplete--match-braket (if require-match "(%s)" "[%s]"))
     ;; `concat'/`mapconcat' is the slow part.
     (if (not (consp comps))
 	(progn ;;(debug (format "Candidates=%S field=%S" candidates name))
-	  (format " %sNo matches%s" open-bracket close-bracket))
+	  (format icomplete--match-braket "No matches"))
       (if last (setcdr last nil))
       (let* ((most-try
               (if (and base-size (> base-size 0))
@@ -687,33 +777,18 @@ icomplete-completions
              ;; a prefix of most, or something else.
 	     (compare (compare-strings name nil nil
 				       most nil nil completion-ignore-case))
-	     (ellipsis (if (char-displayable-p ?…) "…" "..."))
 	     (determ (unless (or (eq t compare) (eq t most-try)
 				 (= (setq compare (1- (abs compare)))
 				    (length most)))
-		       (concat open-bracket
+		       (format icomplete--match-braket
 			       (cond
 				((= compare (length name))
                                  ;; Typical case: name is a prefix.
 				 (substring most compare))
                                 ;; Don't bother truncating if it doesn't gain
                                 ;; us at least 2 columns.
-				((< compare (+ 2 (string-width ellipsis))) most)
-				(t (concat ellipsis (substring most compare))))
-			       close-bracket)))
-	     ;;"-prospects" - more than one candidate
-	     (prospects-len (+ (string-width
-				(or determ (concat open-bracket close-bracket)))
-			       (string-width icomplete-separator)
-			       (+ 2 (string-width ellipsis)) ;; take {…} into account
-			       (string-width (buffer-string))))
-             (prospects-max
-              ;; Max total length to use, including the minibuffer content.
-              (* (+ icomplete-prospects-height
-                    ;; If the minibuffer content already uses up more than
-                    ;; one line, increase the allowable space accordingly.
-                    (/ prospects-len (window-width)))
-                 (window-width)))
+				((< compare (+ 2 (string-width icomplete--ellipsis))) most)
+				(t (concat icomplete--ellipsis (substring most compare)))))))
              ;; Find the common prefix among `comps'.
              ;; We can't use the optimization below because its assumptions
              ;; aren't always true, e.g. when completion-cycling (bug#10850):
@@ -725,12 +800,13 @@ icomplete-completions
 	     (prefix (when icomplete-hide-common-prefix
 		       (try-completion "" comps)))
              (prefix-len
-	      (and (stringp prefix)
+              (and icomplete-hide-common-prefix
+                   (stringp prefix)
                    ;; Only hide the prefix if the corresponding info
                    ;; is already displayed via `most'.
                    (string-prefix-p prefix most t)
-                   (length prefix))) ;;)
-	     prospects comp limit)
+                   (length prefix)))
+	     prospects)
 	(if (or (eq most-try t) (not (consp (cdr comps))))
 	    (setq prospects nil)
 	  (when (member name comps)
@@ -751,20 +827,11 @@ icomplete-completions
 	    ;; To circumvent all the above problems, provide a visual
 	    ;; cue to the user via an "empty string" in the try
 	    ;; completion field.
-	    (setq determ (concat open-bracket "" close-bracket)))
+	    (setq determ (format icomplete--match-braket "")))
 	  ;; Compute prospects for display.
-	  (while (and comps (not limit))
-	    (setq comp
-		  (if prefix-len (substring (car comps) prefix-len) (car comps))
-		  comps (cdr comps))
-	    (setq prospects-len
-                  (+ (string-width comp)
-		     (string-width icomplete-separator)
-		     prospects-len))
-	    (if (< prospects-len prospects-max)
-		(push comp prospects)
-	      (setq limit t))))
-	(setq prospects (nreverse prospects))
+          (setq prospects
+                (funcall icomplete--prospects prefix-len determ comps)))
+
 	;; Decorate first of the prospects.
 	(when prospects
 	  (let ((first (copy-sequence (pop prospects))))
@@ -776,10 +843,8 @@ icomplete-completions
         (if last (setcdr last base-size))
 	(if prospects
 	    (concat determ
-		    "{"
-		    (mapconcat 'identity prospects icomplete-separator)
-		    (and limit (concat icomplete-separator ellipsis))
-		    "}")
+                    (format icomplete--list-indicators-format
+                            (mapconcat 'identity prospects icomplete-separator)))
 	  (concat determ " [Matched]"))))))
 
 ;;; Iswitchb compatibility

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

* Re: feature/icomplete-vertical
  2020-09-20 14:49           ` feature/icomplete-vertical Ergus
@ 2020-09-20 15:46             ` Eli Zaretskii
  0 siblings, 0 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-20 15:46 UTC (permalink / raw)
  To: Ergus; +Cc: ghe, casouri, joaotavora, emacs-devel

> Date: Sun, 20 Sep 2020 16:49:03 +0200
> From: Ergus <spacibba@aol.com>
> Cc: Eli Zaretskii <eliz@gnu.org>, casouri@gmail.com, joaotavora@gmail.com,
> 	emacs-devel@gnu.org
> 
> (setq icomplete-separator "\n")
> (setq icomplete-prospects-height 10)
> (defvar icomplete-saved-resize-mini-windows nil)
> 
> (defun icomplete-minibuffer-exit-hook ()
>      (setq resize-mini-windows icomplete-saved-resize-mini-windows)
>      (remove-hook 'minibuffer-exit-hook #'icomplete-minibuffer-exit-hook))
> 
> (add-hook 'icomplete-minibuffer-setup-hook
>            '(lambda ()
>                (setq icomplete-saved-resize-mini-windows resize-mini-windows)
>                (setq resize-mini-windows nil)
>                (enlarge-window icomplete-prospects-height)
>                (add-hook 'minibuffer-exit-hook #icomplete-minibuffer-exit-hook)))

Like I said previously: beware, the temporary resize-mini-windows
setting should be in effect when redisplay of the mini-window runs,
and I'm not quite sure that happens when your lambda-function is
called.



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

* Re: feature/icomplete-vertical
  2020-09-20 15:04             ` feature/icomplete-vertical Ergus
@ 2020-09-20 15:54               ` Eli Zaretskii
  2020-09-20 16:13                 ` feature/icomplete-vertical Ergus
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-20 15:54 UTC (permalink / raw)
  To: Ergus; +Cc: ghe, casouri, joaotavora, emacs-devel

> Date: Sun, 20 Sep 2020 17:04:54 +0200
> From: Ergus <spacibba@aol.com>
> Cc: Gregory Heytings <ghe@sdf.org>, casouri@gmail.com, joaotavora@gmail.com,
> 	emacs-devel@gnu.org
> 
> >I don't agree with Stefan, if this interpretation of what he said is
> >correct.  We have window-text-pixel-size to measure the size of text
> >on display without redoing what redisplay does.
> 
> Hi Eli that's what I have been doing so far, but the approach looks a
> bit too complex.

I don't see a call to window-text-pixel-size.  I see calls to
string-width, which is less accurate.

> It is actually not, but I understand that a better
> simpler one is desirable.

"An implementation should be as simple as possible, but no simpler."

> Any way it seems to me a bit buggy that (only) the prompt disappears in
> this situation

Not the prompt disappears, the entire text of the buffer disappears
from view.  What is left is the text of the after-string from an
overlay.  That's because the window-start of the mini-window is set at
EOB of the minibuffer.



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

* Re: feature/icomplete-vertical
  2020-09-20 15:54               ` feature/icomplete-vertical Eli Zaretskii
@ 2020-09-20 16:13                 ` Ergus
  0 siblings, 0 replies; 118+ messages in thread
From: Ergus @ 2020-09-20 16:13 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, casouri, joaotavora, emacs-devel

>
>Not the prompt disappears, the entire text of the buffer disappears
>from view.  What is left is the text of the after-string from an
>overlay.  That's because the window-start of the mini-window is set at
>EOB of the minibuffer.
>
Sorry the after-string concept is not clear for me yet :( and the
documentation was not clear either, so I can't understand the issue;
that's why I didn't participate in the bug thread.



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

* Re: feature/icomplete-vertical
  2020-09-20 14:28           ` feature/icomplete-vertical Eli Zaretskii
  2020-09-20 15:04             ` feature/icomplete-vertical Ergus
@ 2020-09-20 17:09             ` Gregory Heytings via Emacs development discussions.
  2020-09-20 17:43               ` feature/icomplete-vertical Eli Zaretskii
  1 sibling, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-09-20 17:09 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: spacibba, emacs-devel, casouri, joaotavora


>> trying to calculate the height of the completion candidate list, which 
>> amount (as Stefan wrote) to redoing what redisplay does.
>
> I don't agree with Stefan, if this interpretation of what he said is 
> correct.  We have window-text-pixel-size to measure the size of text on 
> display without redoing what redisplay does.
>

Do you mean that every function which wants to display something in the 
minibuffer should use window-text-pixel-size to create a text that fits in 
the minibuffer without hiding the prompt?

And that this is better than only expecting such functions to approximate 
the available space, and to rely on the fact that if the text is too large 
the display engine will hide the end of the text instead of the prompt?



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

* Re: feature/icomplete-vertical
  2020-09-20 17:09             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-09-20 17:43               ` Eli Zaretskii
  2020-10-01 16:48                 ` feature/icomplete-vertical Ergus
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-09-20 17:43 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: joaotavora, spacibba, casouri, emacs-devel

> Date: Sun, 20 Sep 2020 17:09:46 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: spacibba@aol.com, emacs-devel@gnu.org, casouri@gmail.com,
>         joaotavora@gmail.com
> 
> >> trying to calculate the height of the completion candidate list, which 
> >> amount (as Stefan wrote) to redoing what redisplay does.
> >
> > I don't agree with Stefan, if this interpretation of what he said is 
> > correct.  We have window-text-pixel-size to measure the size of text on 
> > display without redoing what redisplay does.
> >
> 
> Do you mean that every function which wants to display something in the 
> minibuffer should use window-text-pixel-size to create a text that fits in 
> the minibuffer without hiding the prompt?

I didn't say that every function needs to do it, or anything to that
effect.  I was responding to the claim that measuring the size of text
on display needs to redo what redisplay does.

> And that this is better than only expecting such functions to approximate 
> the available space, and to rely on the fact that if the text is too large 
> the display engine will hide the end of the text instead of the prompt?

I didn't say that, either, not in such a general form, anyway.

I explained the state of affairs for the issue at hand in the bug
report; if something there is unclear, I will happily answer specific
questions regarding the issue we are facing.



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

* Re: feature/icomplete-vertical
  2020-09-20 17:43               ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-01 16:48                 ` Ergus
  2020-10-02  4:45                   ` feature/icomplete-vertical jixiuf
  2020-10-04 23:47                   ` feature/icomplete-vertical João Távora
  0 siblings, 2 replies; 118+ messages in thread
From: Ergus @ 2020-10-01 16:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gregory Heytings, joaotavora, casouri, emacs-devel, juri

Hi:

I made some corrections to simplify the icomplete-vertical feature
branch and pushed (forced) some days ago. (sorry for that, I should have
used a scratch branch instead)

Now the icomplete-format variable is removed and the user only needs to
add at least one '\n' to the separator. I also use
window-text-pixel-size to correct the issue with long lines but still
perform the height calculations in pixels to properly show the ellipsis
as Eli recommended.

I keep the funcall approach because IMO it is cleaner, and reduces
unneeded and redundant things. (And because it is compatible with
something else I am working in)

If some of the previous testers could give it a second try. When it is
fine I will add some documentation and merge in master.

BTW: If someone could give a look to the completions-highlight feature
branch too and make recommendations, report issues?

Best,
Ergus



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

* Re: feature/icomplete-vertical
  2020-10-01 16:48                 ` feature/icomplete-vertical Ergus
@ 2020-10-02  4:45                   ` jixiuf
  2020-10-03  2:13                     ` feature/icomplete-vertical Ergus
  2020-10-04 23:47                   ` feature/icomplete-vertical João Távora
  1 sibling, 1 reply; 118+ messages in thread
From: jixiuf @ 2020-10-02  4:45 UTC (permalink / raw)
  To: Ergus; +Cc: emacs-devel

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



> 2020年10月2日 上午12:48,Ergus <spacibba@aol.com> 写道:
> 
> Hi:
> 
> I made some corrections to simplify the icomplete-vertical feature
> branch and pushed (forced) some days ago. (sorry for that, I should have
> used a scratch branch instead)
> 
> Now the icomplete-format variable is removed and the user only needs to
> add at least one '\n' to the separator. I also use
> window-text-pixel-size to correct the issue with long lines but still
> perform the height calculations in pixels to properly show the ellipsis
> as Eli recommended.
> 
> I keep the funcall approach because IMO it is cleaner, and reduces
> unneeded and redundant things. (And because it is compatible with
> something else I am working in)
> 
> If some of the previous testers could give it a second try. When it is
> fine I will add some documentation and merge in master.
I have tried your branch and it worked perfectly. 

1. And Is there any plan to implements  a completion style like helm or  orderless(https://github.com/oantolin/orderless <https://github.com/oantolin/orderless>).
 Divides the pattern into space-separated components, and matches candidates that match all of the components in any order.

2. And Is there any plan to implements async-completing-read for icomplete ,
 one of my use cases involve an external command to generate the list of candidates, 
and that command may take some time to run( like conusel-rg).

Hope those feature can be implemented in emacs core.	


> 
> BTW: If someone could give a look to the completions-highlight feature
> branch too and make recommendations, report issues?
> 
> Best,
> Ergus
> 


[-- Attachment #2: Type: text/html, Size: 2716 bytes --]

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

* Re: feature/icomplete-vertical
@ 2020-10-02  6:37 Manuel Uberti
  0 siblings, 0 replies; 118+ messages in thread
From: Manuel Uberti @ 2020-10-02  6:37 UTC (permalink / raw)
  To: spacibba; +Cc: emacs-devel

Hi Ergus,

just tried the branch both from vanilla Emacs and from Emacs with my
configuration and it works as expected.

Thank you (and everyone else involved) for working on this.


All the best.

-- 
Manuel Uberti
www.manueluberti.eu



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

* Re: feature/icomplete-vertical
  2020-10-02  4:45                   ` feature/icomplete-vertical jixiuf
@ 2020-10-03  2:13                     ` Ergus
  0 siblings, 0 replies; 118+ messages in thread
From: Ergus @ 2020-10-03  2:13 UTC (permalink / raw)
  To: jixiuf; +Cc: emacs-devel

On Fri, Oct 02, 2020 at 12:45:41PM +0800, jixiuf wrote:
>
>
>I have tried your branch and it worked perfectly.
>
>1. And Is there any plan to implements  a completion style like helm or  orderless(https://github.com/oantolin/orderless <https://github.com/oantolin/orderless>).
> Divides the pattern into space-separated components, and matches candidates that match all of the components in any order.
>
Not that I am aware of. In principle we already have some completions
styles you could try...

C-h v: completion-styles-alist

AFAIR flex was added recently and it is similar to what you mention
(just a bit different requiring the order).

It is pretty straightforward to create and customize new completions and
differently to icomplete-vertical; orderless does not need hacks (like
advices, minibuffer resize or extra hooks) to do it's work fine. So I
don't see a need to add more completions to vanilla (I am not opposed to
that either; specially if the code is simple).

If you want more completion styles you could make a feature request
and/or contact oantolin to add part of his code to vanilla OR at least
add ordeless to elpa to make the package more "official".

>2. And Is there any plan to implements async-completing-read for icomplete ,
> one of my use cases involve an external command to generate the list of candidates,
>and that command may take some time to run( like conusel-rg).
>

Not from me ATM. I just implemented this in the core to avoid the need
of some hacks in icomplete-vertical. But I don't want to add excessive
complexity to icomplete. To do that I support adding ivy+counsel to
vanilla as mentioned in another thread some weeks ago.

>
>Hope those feature can be implemented in emacs core.	
>
>
>>
>> BTW: If someone could give a look to the completions-highlight feature
>> branch too and make recommendations, report issues?
>>
>> Best,
>> Ergus
>>
>



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

* Re: feature/icomplete-vertical
  2020-10-01 16:48                 ` feature/icomplete-vertical Ergus
  2020-10-02  4:45                   ` feature/icomplete-vertical jixiuf
@ 2020-10-04 23:47                   ` João Távora
  2020-10-05  4:48                     ` feature/icomplete-vertical Ergus
                                       ` (2 more replies)
  1 sibling, 3 replies; 118+ messages in thread
From: João Távora @ 2020-10-04 23:47 UTC (permalink / raw)
  To: Ergus; +Cc: Gregory Heytings, Eli Zaretskii, Juri Linkov, Yuan Fu,
	emacs-devel

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

Hi Ergus,

Thanks, I had a look at your patch.  I'm personally not too fond of that
kind of
complexity coming into lisp/icomplete.el especially when then are simpler
formulae for achieving a funcional vertical icomplete system.  My solution
is even
simpler than Gregory's for example (and based on his):

(setq icomplete-prospects-height 6)
(setq icomplete-separator "\n")

(defun icomplete-vertical-adjust-minibuffer-height (completions)
  (let* ((comp completions)
          (complen (length (split-string comp "\n"))))
     (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1-
(window-height)))))
     comp))
(advice-add 'icomplete-completions :filter-return
#'icomplete-vertical-adjust-minibuffer-height)

So, in my view, all that's needed is to fix the window height problem
(addressed separately
in a discussion which I haven't been following), and then add sufficient
hookage so that
a _separate_ icomplete-vertical.el package with all the advanced features
you are working
on can be developed.

By the way, do you mind listing here exactly which ones those are in
relation to the
system attained  by the code above?

João


On Thu, Oct 1, 2020 at 5:48 PM Ergus <spacibba@aol.com> wrote:

> Hi:
>
> I made some corrections to simplify the icomplete-vertical feature
> branch and pushed (forced) some days ago. (sorry for that, I should have
> used a scratch branch instead)
>
> Now the icomplete-format variable is removed and the user only needs to
> add at least one '\n' to the separator. I also use
> window-text-pixel-size to correct the issue with long lines but still
> perform the height calculations in pixels to properly show the ellipsis
> as Eli recommended.
>
> I keep the funcall approach because IMO it is cleaner, and reduces
> unneeded and redundant things. (And because it is compatible with
> something else I am working in)
>
> If some of the previous testers could give it a second try. When it is
> fine I will add some documentation and merge in master.
>
> BTW: If someone could give a look to the completions-highlight feature
> branch too and make recommendations, report issues?
>
> Best,
> Ergus
>


-- 
João Távora

[-- Attachment #2: Type: text/html, Size: 2923 bytes --]

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

* Re: feature/icomplete-vertical
  2020-10-04 23:47                   ` feature/icomplete-vertical João Távora
@ 2020-10-05  4:48                     ` Ergus
  2020-10-05  9:06                       ` feature/icomplete-vertical João Távora
  2020-10-05  5:45                     ` feature/icomplete-vertical Eli Zaretskii
  2020-10-05  7:52                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2 siblings, 1 reply; 118+ messages in thread
From: Ergus @ 2020-10-05  4:48 UTC (permalink / raw)
  To: João Távora
  Cc: Gregory Heytings, Eli Zaretskii, Juri Linkov, Yuan Fu,
	emacs-devel

On Mon, Oct 05, 2020 at 12:47:39AM +0100, Jo�o T�vora wrote:

Hi Joao:

Please look at the previous messages in this same thread to see the
problems with your approach.

So far there is:

1) The problem when using different font in minibuffer reported by Jixiuf 
2) the long line issue from Gregory (but also mentioned before)
3) the ellipsis issue mentioned by Eli
4) The prompt issue (which seems is not going to be solved as it is more
a design choice or a feature than a real issue)
5) Respect the user customs max-mini-window-height and
resize-mini-windows so we shouldn't call enlarge-window and as an
core package we must not conflict with such customs.
6) The removal of {} in vertical mode because in that case they are
redundant.
7) The compatibility with packages like maple-minibuffer reported by
Dimitry.
8) The case when using multiline separator.
9) Move the first candidate to a newline instead of keeping it inline.

The patch I propose is not complex at all considering all the above
conditions. The only complexity comes from the height calculation in
pixels which is something that will need to be done in any case either
for 1, 2, 3 or 4.

>Hi Ergus,
>
>Thanks, I had a look at your patch.  I'm personally not too fond of that
>kind of
>complexity coming into lisp/icomplete.el especially when then are simpler
>formulae for achieving a funcional vertical icomplete system.  My solution
>is even
>simpler than Gregory's for example (and based on his):
>
>(setq icomplete-prospects-height 6)
>(setq icomplete-separator "\n")
>
>(defun icomplete-vertical-adjust-minibuffer-height (completions)
>  (let* ((comp completions)
>          (complen (length (split-string comp "\n"))))
>     (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1-
>(window-height)))))
>     comp))
>(advice-add 'icomplete-completions :filter-return
>#'icomplete-vertical-adjust-minibuffer-height)
>
>So, in my view, all that's needed is to fix the window height problem
>(addressed separately
>in a discussion which I haven't been following), and then add sufficient
>hookage so that
>a _separate_ icomplete-vertical.el package with all the advanced features
>you are working
>on can be developed.
>
>By the way, do you mind listing here exactly which ones those are in
>relation to the
>system attained  by the code above?
>
Look at the other branch I mentioned
(completions-highlight-modifications).

I want to bring such zsh-like completion style to icomplete (when have
some time). It must be simpler than in the *Completions* because it
won't need to switch window or add overlays.

Ergus

>Jo�o
>
>
>On Thu, Oct 1, 2020 at 5:48 PM Ergus <spacibba@aol.com> wrote:
>
>> Hi:
>>
>> I made some corrections to simplify the icomplete-vertical feature
>> branch and pushed (forced) some days ago. (sorry for that, I should have
>> used a scratch branch instead)
>>
>> Now the icomplete-format variable is removed and the user only needs to
>> add at least one '\n' to the separator. I also use
>> window-text-pixel-size to correct the issue with long lines but still
>> perform the height calculations in pixels to properly show the ellipsis
>> as Eli recommended.
>>
>> I keep the funcall approach because IMO it is cleaner, and reduces
>> unneeded and redundant things. (And because it is compatible with
>> something else I am working in)
>>
>> If some of the previous testers could give it a second try. When it is
>> fine I will add some documentation and merge in master.
>>
>> BTW: If someone could give a look to the completions-highlight feature
>> branch too and make recommendations, report issues?
>>
>> Best,
>> Ergus
>>
>
>
>-- 
>Jo�o T�vora



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

* Re: feature/icomplete-vertical
  2020-10-04 23:47                   ` feature/icomplete-vertical João Távora
  2020-10-05  4:48                     ` feature/icomplete-vertical Ergus
@ 2020-10-05  5:45                     ` Eli Zaretskii
  2020-10-05  9:13                       ` feature/icomplete-vertical João Távora
  2020-10-05  7:52                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05  5:45 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, juri, casouri, emacs-devel

> From: João Távora <joaotavora@gmail.com>
> Date: Mon, 5 Oct 2020 00:47:39 +0100
> Cc: Eli Zaretskii <eliz@gnu.org>, Gregory Heytings <ghe@sdf.org>, Yuan Fu <casouri@gmail.com>, 
> 	emacs-devel <emacs-devel@gnu.org>, Juri Linkov <juri@linkov.net>
> 
> (defun icomplete-vertical-adjust-minibuffer-height (completions)
>   (let* ((comp completions)
>           (complen (length (split-string comp "\n"))))
>      (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1- (window-height)))))
>      comp))
> (advice-add 'icomplete-completions :filter-return #'icomplete-vertical-adjust-minibuffer-height)

What happens with your solution if you need to enlarge the mini-window
to a height that is greater than the frame's height?



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

* Re: feature/icomplete-vertical
  2020-10-04 23:47                   ` feature/icomplete-vertical João Távora
  2020-10-05  4:48                     ` feature/icomplete-vertical Ergus
  2020-10-05  5:45                     ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05  7:52                     ` Gregory Heytings via Emacs development discussions.
  2020-10-05  8:22                       ` feature/icomplete-vertical Manuel Uberti
  2020-10-05  9:40                       ` feature/icomplete-vertical João Távora
  2 siblings, 2 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05  7:52 UTC (permalink / raw)
  To: João Távora
  Cc: Ergus, Eli Zaretskii, Yuan Fu, emacs-devel, Juri Linkov

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


Hi Ergus and João,

As I explained in a separate thread, at the moment the best way to 
implement icomplete-vertical (and in general to display completion 
candidates in the minibuffer) is to convince Emacs to start displaying the 
minibuffer at its beginning.  This avoids all known problems.

With this solution, displaying completion candidates after point in a 
minibuffer is a trivial task: it suffices to insert the completion 
candidates in the minibuffer, and Emacs will display as many of these 
candidates as possible, given the user preferences 
(max-mini-window-height, resize-mini-windows, ...), the size of the Emacs 
frame, the phase of the moon, ...  This works on Emacs 24, 25, 26, 27 and 
28, with fixed and variable width fonts.

Part 1 of the solution (which solves the "root" problem, and is not 
specific to icomplete-vertical):

(defvar-local start-display-at-beginning-of-minibuffer nil)
(defun start-display-at-beginning-of-minibuffer (&rest args)
   (when (and start-display-at-beginning-of-minibuffer (minibufferp))
     (set-window-start-at-begin (point-min) (point))))
(defun set-window-start-at-begin (beg end)
   (when (< (+ beg 2) end)
     (set-window-start nil beg)
     (unless (pos-visible-in-window-p end nil t)
       (set-window-start-at-begin (+ beg (/ (- end beg) 2)) end))))
(add-hook 'window-scroll-functions #'start-display-at-beginning-of-minibuffer)
(add-hook 'post-command-hook #'start-display-at-beginning-of-minibuffer)

Part 2 of the solution (which implements icomplete-vertical):

(setq icomplete-separator "\n")
(add-hook 'icomplete-minibuffer-setup-hook (lambda () (setq start-display-at-beginning-of-minibuffer t)))
(defun icomplete-vertical-reformat-completions (completions)
   (save-match-data
     (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" completions)
         (format "%s \n%s" (or (match-string 1 completions) "") (match-string 2 completions))
       completions)))
(advice-add 'icomplete-completions :filter-return #'icomplete-vertical-reformat-completions)

The only limit of this solution is that is is not possible to display an 
ellipsis ("...") at the end of the completion candidates list, to indicate 
that some completion candidates are not displayed.  This is a minor 
limitation, and IMO using one screen line just to display "..." is a waste 
of resources.

Gregory

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

* Re: feature/icomplete-vertical
  2020-10-05  7:52                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-10-05  8:22                       ` Manuel Uberti
  2020-10-05  9:40                       ` feature/icomplete-vertical João Távora
  1 sibling, 0 replies; 118+ messages in thread
From: Manuel Uberti @ 2020-10-05  8:22 UTC (permalink / raw)
  To: Gregory Heytings, João Távora
  Cc: Ergus, Juri Linkov, Yuan Fu, Eli Zaretskii, emacs-devel

On 05/10/20 09:52, Gregory Heytings via Emacs development discussions. wrote:
> 
> Hi Ergus and João,
> 
> As I explained in a separate thread, at the moment the best way to implement
> icomplete-vertical (and in general to display completion candidates in the
> minibuffer) is to convince Emacs to start displaying the minibuffer at its
> beginning.  This avoids all known problems.
> 
> With this solution, displaying completion candidates after point in a minibuffer
> is a trivial task: it suffices to insert the completion candidates in the
> minibuffer, and Emacs will display as many of these candidates as possible,
> given the user preferences (max-mini-window-height, resize-mini-windows, ...),
> the size of the Emacs frame, the phase of the moon, ...  This works on Emacs 24,
> 25, 26, 27 and 28, with fixed and variable width fonts.
> 
> Part 1 of the solution (which solves the "root" problem, and is not specific to
> icomplete-vertical):
> 
> (defvar-local start-display-at-beginning-of-minibuffer nil)
> (defun start-display-at-beginning-of-minibuffer (&rest args)
>   (when (and start-display-at-beginning-of-minibuffer (minibufferp))
>     (set-window-start-at-begin (point-min) (point))))
> (defun set-window-start-at-begin (beg end)
>   (when (< (+ beg 2) end)
>     (set-window-start nil beg)
>     (unless (pos-visible-in-window-p end nil t)
>       (set-window-start-at-begin (+ beg (/ (- end beg) 2)) end))))
> (add-hook 'window-scroll-functions #'start-display-at-beginning-of-minibuffer)
> (add-hook 'post-command-hook #'start-display-at-beginning-of-minibuffer)
> 
> Part 2 of the solution (which implements icomplete-vertical):
> 
> (setq icomplete-separator "\n")
> (add-hook 'icomplete-minibuffer-setup-hook (lambda () (setq
> start-display-at-beginning-of-minibuffer t)))
> (defun icomplete-vertical-reformat-completions (completions)
>   (save-match-data
>     (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" completions)
>         (format "%s \n%s" (or (match-string 1 completions) "") (match-string 2
> completions))
>       completions)))
> (advice-add 'icomplete-completions :filter-return
> #'icomplete-vertical-reformat-completions)
> 
> The only limit of this solution is that is is not possible to display an
> ellipsis ("...") at the end of the completion candidates list, to indicate that
> some completion candidates are not displayed.  This is a minor limitation, and
> IMO using one screen line just to display "..." is a waste of resources.
> 
> Gregory

Hi Gregory,

FWIW, your code works absolutely fine for me and I was able to replace the
external icomplete-vertical package with your solution.

Thanks for working on this.

-- 
Manuel Uberti
www.manueluberti.eu



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

* Re: feature/icomplete-vertical
  2020-10-05  4:48                     ` feature/icomplete-vertical Ergus
@ 2020-10-05  9:06                       ` João Távora
  2020-10-05 12:23                         ` feature/icomplete-vertical Ergus
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05  9:06 UTC (permalink / raw)
  To: Ergus; +Cc: Gregory Heytings, Eli Zaretskii, emacs-devel, Yuan Fu,
	Juri Linkov

Ergus <spacibba@aol.com> writes:

> On Mon, Oct 05, 2020 at 12:47:39AM +0100, Jo�o T�vora wrote:
>
> Hi Joao:
>
> Please look at the previous messages in this same thread to see the
> problems with your approach.
>
> So far there is:
>
> 1) The problem when using different font in minibuffer reported by
> Jixiuf 2) the long line issue from Gregory (but also mentioned before)
> 3) the ellipsis issue mentioned by Eli
> 4) The prompt issue (which seems is not going to be solved as it is more
> a design choice or a feature than a real issue)
> 5) Respect the user customs max-mini-window-height and
> resize-mini-windows so we shouldn't call enlarge-window and as an
> core package we must not conflict with such customs.
> 6) The removal of {} in vertical mode because in that case they are
> redundant.
> 7) The compatibility with packages like maple-minibuffer reported by
> Dimitry.
> 8) The case when using multiline separator.
> 9) Move the first candidate to a newline instead of keeping it inline.
>
> The patch I propose is not complex at all considering all the above
> conditions. The only complexity comes from the height calculation in
> pixels which is something that will need to be done in any case either
> for 1, 2, 3 or 4.

Thanks for listing these again, for my benefit.  I've not been following
this very closely, and needed a summary to give me context after trying
your patch again, as you requested.

To be clear: I'm not "against" this functionality or even against it
becoming a part of Emacs or Emacs core.  I think solving the problems
you list above is fine (though I haven't been by them, at least not yet)

I'm not too much concerned about the complexity of implementation (such
as the height calculation).  I am concerned the changes to the user
interface, of which your patch seems to bring many, or at least more
than I would have expected.  It seems to be that your solution mixes
bugfixes and new features, which is what I object to.  I think your
solution could be trimmed down so that it solves _only_ the technical
problems you list above without adding new user interfaces.

In other words, don't see why the points above, which sound like
basically bugs, need any new "defcustom".  This is why I asked you to
(re)list them.  Then I can start with my naive implementation and fix
them one by one, without adding new interfaces.  Of course, then I will
be repeating some work you've already done, so this is why I'm arguing
for this separation in _your_ work.

Could you structure your work so that one part fixes the above problems,
and another part adds the new features, like customizing bracket types
and such, and is should be discussed as a separate matter.

After my sig, some comments that illustrate my points.

I took this diff with git diff master...feature/icomplete-vertical

João

> -(defcustom icomplete-separator " | "
> -  "String used by Icomplete to separate alternatives in the minibuffer."
> -  :type 'string
> -  :version "24.4")
> +(defcustom icomplete-vertical nil
> +  "Enable `icomplete' vertical mode."
> +  :type 'bool
> +  :version "28.1")

I would think it more elegant to keep `icomplete-separator` as the entry
point to verticality.  Certainly it should be possible to analyse the
string and decide whether it implies verticality and needs special
worries.

  (defcustom icomplete-hide-common-prefix t
   "When non-nil, hide common prefix from completion candidates.
@@ -97,6 +97,12 @@ icomplete-first-match
   "Face used by Icomplete for highlighting first match."
   :version "24.4")
 
> +(defface icomplete-common-match '((t :inherit 'highlight
> +                                     :underline t
> +                                     :weight bold))
> +  "Face used by Icomplete for highlighting common completion."
> +  :version "28.1")


What is a "common match"?  Is this exclusive to icomplete verticalness?
Doesn't seem so, is this not a side feature?

> -(defcustom icomplete-minibuffer-setup-hook nil
> +(defvar icomplete-ellipsis nil)
> +
> +(defcustom icomplete--minibuffer-setup-hook nil
>    "Icomplete-specific customization of minibuffer setup.

Why has this minibuffer hook been made an internal variable?

> -    (define-key map (kbd "<right>") 'icomplete-forward-completions)
> -    (define-key map (kbd "<left>") 'icomplete-backward-completions)

Why have these been removed from icomplete-fido-mode-map?  Also, I have
C-r and C-r in that map, will it work in the verticality?  I would hope
it would, as it does not in my naive verticality implementation.

> -;;;_ > icomplete-minibuffer-setup ()
> -(defun icomplete-minibuffer-setup ()
> +;; Vertical functions
> +
> +(defcustom icomplete-separator-vertical " \n"
> +  "String used by Icomplete to separate alternatives in the minibuffer."
> +  :type 'string
> +  :version "28.1")
> +
> +(defcustom icomplete-list-indicators-vertical (cons "" "")
> +  "Indicator bounds to list alternatives in the minibuffer."
> +  :type 'string
> +  :version "28.1")
> +
> +(defcustom icomplete-require-indicators-vertical (cons "" "")
> +  "Indicator bounds for match in the minibuffer when require-match."
> +  :type 'string
> +  :version "28.1")
> +
> +(defcustom icomplete-not-require-indicators-vertical (cons "" "")
> +  "Indicator bounds for match in the minibuffer when not require-match."
> +  :type 'string
> +  :version "28.1")

These are examples of "interface bloat" that do not seem to directly
address the 9 problems you listed in the beginning of the message
(again, I am not against these features per se, mind you)

> +(defvar icomplete--vertical-mode-map

If this keymap is "internal" (as indicated by the two "--") how am I
supposed to customize the keybindings?

> +(defcustom icomplete-list-indicators-horizontal (cons "{" "}")
> +  "Indicator bounds to list alternatives in the minibuffer."
> +  :type 'string
> +  :version "28.1")
> +
> +(defcustom icomplete-require-indicators-horizontal (cons "(" ")")
> +  "Indicator bounds for match in the minibuffer when require-match."
> +  :type 'string
> +  :version "28.1")
> +
> +(defcustom icomplete-not-require-indicators-horizontal (cons "[" "]")
> +  "Indicator bounds for match in the minibuffer when not require-match."
> +  :type 'string
> +  :version "28.1")

Again, these seem like improvements that are not directly related to
verticality.  (Maybe they are very good improvements, but still...

João



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

* Re: feature/icomplete-vertical
  2020-10-05  5:45                     ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05  9:13                       ` João Távora
  2020-10-05  9:46                         ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05  9:13 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, spacibba, juri, casouri, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: João Távora <joaotavora@gmail.com>
>> Date: Mon, 5 Oct 2020 00:47:39 +0100
>> Cc: Eli Zaretskii <eliz@gnu.org>, Gregory Heytings <ghe@sdf.org>, Yuan Fu <casouri@gmail.com>, 
>> 	emacs-devel <emacs-devel@gnu.org>, Juri Linkov <juri@linkov.net>
>> 
>> (defun icomplete-vertical-adjust-minibuffer-height (completions)
>>   (let* ((comp completions)
>>           (complen (length (split-string comp "\n"))))
>>      (if (> complen 1) (enlarge-window (- icomplete-prospects-height (1- (window-height)))))
>>      comp))
>> (advice-add 'icomplete-completions :filter-return #'icomplete-vertical-adjust-minibuffer-height)
>
> What happens with your solution if you need to enlarge the mini-window
> to a height that is greater than the frame's height?

I don't know.  Wouldn't I need an extremely stubby frame to achieve
that?  Anyway, that's not even my code.  As I explained to Ergus, just
wanted to underline that a solution without new user interfaces can be a
starting point with bugs that are fixed as bugs.  I doubt that
systematically fixing these bugs would necessarily leads us to a
solution with N new defcustoms and a new minor mode.

João



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

* Re: feature/icomplete-vertical
  2020-10-05  7:52                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-10-05  8:22                       ` feature/icomplete-vertical Manuel Uberti
@ 2020-10-05  9:40                       ` João Távora
  2020-10-05 10:53                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05  9:40 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Ergus, Juri Linkov, Yuan Fu, Eli Zaretskii, emacs-devel

Gregory Heytings <ghe@sdf.org> writes:

> Part 1 of the solution (which solves the "root" problem, and is not
> specific to icomplete-vertical):

Right.  I appreciate this separation: solve a bug _then_ implement a
feature.

Now, as far as I understand Eli and remaining maintainers are not OK
with your bugfix.  This I have no opinion about, except for finding your
expectation of "auto-enlargement" reasonable at first sight.  Other than
that, I haven't studied the matter.  But hopefully we should all agree
on basic icomplete-independent behaviour and come up with a fix that is
acceptable for all.

> Part 2 of the solution (which implements icomplete-vertical):

> (setq icomplete-separator "\n")
> (add-hook 'icomplete-minibuffer-setup-hook (lambda () (setq start-display-at-beginning-of-minibuffer t)))
> (defun icomplete-vertical-reformat-completions (completions)
>   (save-match-data
>     (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" completions)
>         (format "%s \n%s" (or (match-string 1 completions) "") (match-string 2 completions))
>       completions)))n
> (advice-add 'icomplete-completions :filter-return
> #'icomplete-vertical-reformat-completions)
>
> The only limit of this solution is that is is not possible to display
> an ellipsis ("...") at the end of the completion candidates list, to
> indicate that some completion candidates are not displayed.  This is a
> minor limitation, and IMO using one screen line just to display "..."
> is a waste of resources.

Yeah, I agree.  For example, in my verticality thing I would even remove
one extra feature of your implementation that I don't find useful: the
indentation of the candidates.  These are features that can be of course
implemented _separately_.

João



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

* Re: feature/icomplete-vertical
  2020-10-05  9:13                       ` feature/icomplete-vertical João Távora
@ 2020-10-05  9:46                         ` Eli Zaretskii
  2020-10-05  9:57                           ` feature/icomplete-vertical João Távora
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05  9:46 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, emacs-devel, casouri, juri

> From: João Távora <joaotavora@gmail.com>
> Date: Mon, 05 Oct 2020 10:13:30 +0100
> Cc: ghe@sdf.org, spacibba@aol.com, juri@linkov.net, casouri@gmail.com,
>  emacs-devel@gnu.org
> 
> > What happens with your solution if you need to enlarge the mini-window
> > to a height that is greater than the frame's height?
> 
> I don't know.  Wouldn't I need an extremely stubby frame to achieve
> that?

Or a lot of completion candidates.

My point is that enlarging the mini-window only works up to a limit.
So it cannot solve every case; eventually, you will need to truncate
the list of candidates in some way, and show to the user that the list
was truncated.



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

* Re: feature/icomplete-vertical
  2020-10-05  9:46                         ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05  9:57                           ` João Távora
  2020-10-05 10:11                             ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05  9:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gregory Heytings, Ergus, emacs-devel, Yuan Fu, Juri Linkov

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

On Mon, Oct 5, 2020 at 10:46 AM Eli Zaretskii <eliz@gnu.org> wrote:
>
> > From: João Távora <joaotavora@gmail.com>
> > Date: Mon, 05 Oct 2020 10:13:30 +0100
> > Cc: ghe@sdf.org, spacibba@aol.com, juri@linkov.net, casouri@gmail.com,
> >  emacs-devel@gnu.org

> Or a lot of completion candidates.

That's odd, I've been C-x C-f'ing to directories with "a lot" of files
and I don't notice any problems.  What size of "lot" did you have in
mind?

> My point is that enlarging the mini-window only works up to a limit.
> So it cannot solve every case; eventually, you will need to truncate
> the list of candidates in some way, and show to the user that the list
> was truncated.

Make sense. I do notice some truncation in the candidates in this new
vertical mode I've been trying for a day or so, but I expect truncation of
candidates anyway, so I haven't missed the feature of being shown
explicitly that truncation is happening.  Anyway, whoever is making
this truncation happen (display engine?) should be the responsible for
showing that warning hint.  I don't see why it should be related to
"candidates" or completion at all.

Though maybe the responsible for the truncation can provide a
way (a hook, a variable, a function?) for the user of the minibuffer to
select
the appropriate hint.  My point here is that this variable/function
shouldn't
be called icomplete-truncation-hint, but rather mini-window-truncation-hint.

Hope I've explained myself,
João

[-- Attachment #2: Type: text/html, Size: 2161 bytes --]

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

* Re: feature/icomplete-vertical
  2020-10-05  9:57                           ` feature/icomplete-vertical João Távora
@ 2020-10-05 10:11                             ` Eli Zaretskii
  2020-10-05 10:52                               ` feature/icomplete-vertical João Távora
  2020-10-05 13:13                               ` feature/icomplete-vertical Stefan Monnier
  0 siblings, 2 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 10:11 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, emacs-devel, casouri, juri

> From: João Távora <joaotavora@gmail.com>
> Date: Mon, 5 Oct 2020 10:57:35 +0100
> Cc: Gregory Heytings <ghe@sdf.org>, Ergus <spacibba@aol.com>, Juri Linkov <juri@linkov.net>, 
> 	Yuan Fu <casouri@gmail.com>, emacs-devel <emacs-devel@gnu.org>
> 
> > Or a lot of completion candidates.
> 
> That's odd, I've been C-x C-f'ing to directories with "a lot" of files
> and I don't notice any problems.  What size of "lot" did you have in
> mind?

More than can be displayed, one candidate on each line, by the frame's
dimensions, I guess.

> Make sense. I do notice some truncation in the candidates in this new
> vertical mode I've been trying for a day or so, but I expect truncation of 
> candidates anyway, so I haven't missed the feature of being shown 
> explicitly that truncation is happening.  Anyway, whoever is making 
> this truncation happen (display engine?) should be the responsible for 
> showing that warning hint.  I don't see why it should be related to 
> "candidates" or completion at all.

The truncation is done by icomplete, not by the display engine.  The
"warning" is supposed to be in the form of the ellipsis displayed
after the last candidate that is shown.

> Though maybe the responsible for the truncation can provide a 
> way (a hook, a variable, a function?) for the user of the minibuffer to select 
> the appropriate hint.  My point here is that this variable/function shouldn't 
> be called icomplete-truncation-hint, but rather mini-window-truncation-hint.

The code which displays the min-window is more-or-less the generic
Emacs window-display code, it doesn't care that not all of the stuff
fits in the window.  If an application wants to fit the buffer in the
window, or display some hint about truncation, it's the application's
business to do these things.



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

* Re: feature/icomplete-vertical
  2020-10-05 10:11                             ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 10:52                               ` João Távora
  2020-10-05 11:00                                 ` feature/icomplete-vertical Eli Zaretskii
  2020-10-05 11:02                                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-10-05 13:13                               ` feature/icomplete-vertical Stefan Monnier
  1 sibling, 2 replies; 118+ messages in thread
From: João Távora @ 2020-10-05 10:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, spacibba, emacs-devel, casouri, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> From: João Távora <joaotavora@gmail.com>
>> Date: Mon, 5 Oct 2020 10:57:35 +0100
>> Cc: Gregory Heytings <ghe@sdf.org>, Ergus <spacibba@aol.com>, Juri Linkov <juri@linkov.net>, 
>> 	Yuan Fu <casouri@gmail.com>, emacs-devel <emacs-devel@gnu.org>
>> 
>> > Or a lot of completion candidates.
>> 
>> That's odd, I've been C-x C-f'ing to directories with "a lot" of files
>> and I don't notice any problems.  What size of "lot" did you have in
>> mind?
>
> More than can be displayed, one candidate on each line, by the frame's
> dimensions, I guess.

I've certainly got more than that, and the problem doesn't happen.

>> Though maybe the responsible for the truncation can provide a 
>> way (a hook, a variable, a function?) for the user of the minibuffer to select 
>> the appropriate hint.  My point here is that this variable/function shouldn't 
>> be called icomplete-truncation-hint, but rather mini-window-truncation-hint.
>
> The code which displays the min-window is more-or-less the generic
> Emacs window-display code, it doesn't care that not all of the stuff
> fits in the window.

That's the code that honours max-mini-window-height, right?  Though that
doesn't seem to be what's kicking in here, I believe it should be.

Anyway, I think it's reasonable to suggest I think, that whoever is
truncating the display has someway of notifying the client (whoever
requested the display), that truncation happened, or is about to happen.

> If an application wants to fit the buffer in the window, or display
> some hint about truncation, it's the application's business to do
> these things.

I guess you can argue that, but this implies there are ways to predict
truncation (since being notified of it seems to be what you're opposed
to).

So how is the application to know if its n lines, of lengths L = {l1,
..., li, ..., ln}, it wants to display (not necessarily by buffer
insertion) in the mini-window need truncation and starting in which
line?  Does it need to perform calculations with max-mini-window-height?
If so, is there a "canonical" way to perform these calculations that
accounts for fontsizes, frame widths, etc?  To be clear, I find this
information useful for other domais, notably designing the way the Eldoc
should show information in the echo area.

João



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

* Re: feature/icomplete-vertical
  2020-10-05  9:40                       ` feature/icomplete-vertical João Távora
@ 2020-10-05 10:53                         ` Gregory Heytings via Emacs development discussions.
  0 siblings, 0 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05 10:53 UTC (permalink / raw)
  To: João Távora
  Cc: Ergus, Eli Zaretskii, Yuan Fu, emacs-devel, Juri Linkov


>> Part 1 of the solution (which solves the "root" problem, and is not 
>> specific to icomplete-vertical):
>
> Right.  I appreciate this separation: solve a bug _then_ implement a 
> feature.
>

Thank you :-)

>
> Now, as far as I understand Eli and remaining maintainers are not OK 
> with your bugfix.
>

No, Eli is "not against using this as a workaround [...] until the better 
solution arrives".  It's not yet clear what that "better solution" will 
be, and when it will be implemented.  And for code that needs to work on 
older Emacsen, this will remain a good solution.

>> (setq icomplete-separator "\n")
>> (add-hook  'icomplete-minibuffer-setup-hook (lambda () (setq start-display-at-beginning-of-minibuffer t)))
>> (defun icomplete-vertical-reformat-completions (completions)
>>   (save-match-data
>>     (if (string-match "^\\((.*)\\|\\[.+\\]\\)?{\\(\\(?:.\\|\n\\)+\\)}" completions)
>>         (format "%s \n%s" (or (match-string 1 completions) "") (match-string 2 completions))
>>       completions)))
>> (advice-add 'icomplete-completions :filter-return #'icomplete-vertical-reformat-completions)
>
> For example, in my verticality thing I would even remove one extra 
> feature of your implementation that I don't find useful: the indentation 
> of the candidates.
>

Indeed, I forgot to remove this from my code when I first sent my proposed 
solution two weeks ago.  This extra feature is not anymore present in the 
above code.



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

* Re: feature/icomplete-vertical
  2020-10-05 10:52                               ` feature/icomplete-vertical João Távora
@ 2020-10-05 11:00                                 ` Eli Zaretskii
  2020-10-05 11:11                                   ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-10-05 11:24                                   ` feature/icomplete-vertical João Távora
  2020-10-05 11:02                                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 2 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 11:00 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, emacs-devel, casouri, juri

> From: João Távora <joaotavora@gmail.com>
> Cc: ghe@sdf.org,  spacibba@aol.com,  juri@linkov.net,  casouri@gmail.com,
>   emacs-devel@gnu.org
> Date: Mon, 05 Oct 2020 11:52:59 +0100
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> That's odd, I've been C-x C-f'ing to directories with "a lot" of files
> >> and I don't notice any problems.  What size of "lot" did you have in
> >> mind?
> >
> > More than can be displayed, one candidate on each line, by the frame's
> > dimensions, I guess.
> 
> I've certainly got more than that, and the problem doesn't happen.

Then either you truncate the candidate's (i.e., don't show all of it),
or your code isn't working properly.

> > The code which displays the min-window is more-or-less the generic
> > Emacs window-display code, it doesn't care that not all of the stuff
> > fits in the window.
> 
> That's the code that honours max-mini-window-height, right?

Yes.  Followed by the normal window redisplay.

> Though that doesn't seem to be what's kicking in here, I believe it
> should be.

Not sure I can parse this properly.  What exactly isn't "kicking in"?

> Anyway, I think it's reasonable to suggest I think, that whoever is
> truncating the display has someway of notifying the client (whoever
> requested the display), that truncation happened, or is about to happen.

I think whoever truncates the display is the same as the client.
Unless I misunderstand what you mean by "truncate".

> > If an application wants to fit the buffer in the window, or display
> > some hint about truncation, it's the application's business to do
> > these things.
> 
> I guess you can argue that, but this implies there are ways to predict
> truncation (since being notified of it seems to be what you're opposed
> to).

There are ways.  They aren't necessarily easy, but if your application
does care about not everything being visible in a window, the
application must do something about it, because the "normal" Emacs
display doesn't treat partial display of a buffer as something
special, since that is what happens all the time in Emacs.

> So how is the application to know if its n lines, of lengths L = {l1,
> ..., li, ..., ln}, it wants to display (not necessarily by buffer
> insertion) in the mini-window need truncation and starting in which
> line?

We have window-text-pixel-size for that.

> Does it need to perform calculations with max-mini-window-height?

Yes.

> If so, is there a "canonical" way to perform these calculations that
> accounts for fontsizes, frame widths, etc?  To be clear, I find this
> information useful for other domais, notably designing the way the Eldoc
> should show information in the echo area.

Not sure what should be canonical here.  AFAIU, just using
window-text-pixel-size and comparing with the window dimensions is all
that's needed.



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

* Re: feature/icomplete-vertical
  2020-10-05 10:52                               ` feature/icomplete-vertical João Távora
  2020-10-05 11:00                                 ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 11:02                                 ` Gregory Heytings via Emacs development discussions.
  2020-10-05 11:32                                   ` feature/icomplete-vertical João Távora
  1 sibling, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05 11:02 UTC (permalink / raw)
  To: João Távora; +Cc: Eli Zaretskii, spacibba, juri, casouri, emacs-devel


>> If an application wants to fit the buffer in the window, or display 
>> some hint about truncation, it's the application's business to do these 
>> things.
>
> I guess you can argue that, but this implies there are ways to predict 
> truncation (since being notified of it seems to be what you're opposed 
> to).
>
> So how is the application to know if its n lines, of lengths L = {l1, 
> ..., li, ..., ln}, it wants to display (not necessarily by buffer 
> insertion) in the mini-window need truncation and starting in which 
> line?  Does it need to perform calculations with max-mini-window-height? 
> If so, is there a "canonical" way to perform these calculations that 
> accounts for fontsizes, frame widths, etc?  To be clear, I find this 
> information useful for other domais, notably designing the way the Eldoc 
> should show information in the echo area.
>

This is feasible, but IMHO very (and needlessly) difficult.  Basically you 
need to work with pixel dimensions, and recalculate everything manually: 
first calculate the (maximal) size of the miniwindow (given the user 
preferences, in particular max-mini-window-height), then calculate the 
size of its contents with window-text-pixel-size.  You should add one 
character (or line) at at time, and recalculate the new size each time.



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

* Re: feature/icomplete-vertical
  2020-10-05 11:00                                 ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 11:11                                   ` Gregory Heytings via Emacs development discussions.
  2020-10-05 11:33                                     ` feature/icomplete-vertical Eli Zaretskii
  2020-10-05 17:59                                     ` feature/icomplete-vertical martin rudalics
  2020-10-05 11:24                                   ` feature/icomplete-vertical João Távora
  1 sibling, 2 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05 11:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: João Távora, spacibba, emacs-devel, casouri, juri


>> If so, is there a "canonical" way to perform these calculations that 
>> accounts for fontsizes, frame widths, etc?  To be clear, I find this 
>> information useful for other domais, notably designing the way the 
>> Eldoc should show information in the echo area.
>
> Not sure what should be canonical here.  AFAIU, just using 
> window-text-pixel-size and comparing with the window dimensions is all 
> that's needed.
>

Just calculating the window dimensions is already a nontrivial task. 
There are two cases: a miniwindow-only frame, and the "normal" case.  In 
the first case you need to use frame-height, and multiply it with the 
pixel height of the "default" face.  In the second case you can get the 
maximal dimensions with max-mini-window-height, and multiply it by the 
pixel height of the "default" face.  But you cannot just multiply 
max-mini-window-height by that height, that would be too easy.  There are 
again two cases: either max-mini-window-height is an integer, in which 
case you can just do that multiplication, or it is a floating point 
number, in which case you have to multiply that number by frame-height and 
truncate it, and multiply the resulting number by the pixel height of the 
"default" face...



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

* Re: feature/icomplete-vertical
  2020-10-05 11:00                                 ` feature/icomplete-vertical Eli Zaretskii
  2020-10-05 11:11                                   ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-10-05 11:24                                   ` João Távora
  2020-10-05 11:45                                     ` feature/icomplete-vertical Eli Zaretskii
  1 sibling, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 11:24 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, spacibba, emacs-devel, casouri, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> >> That's odd, I've been C-x C-f'ing to directories with "a lot" of files
>> >> and I don't notice any problems.  What size of "lot" did you have in
>> >> mind?
>> >
>> > More than can be displayed, one candidate on each line, by the frame's
>> > dimensions, I guess.
>> 
>> I've certainly got more than that, and the problem doesn't happen.
>
> Then either you truncate the candidate's (i.e., don't show all of it),
> or your code isn't working properly.

Well, it's not my code, it's Gregory's.  I just evaluated it and it
seems to be working decently for the day or so.  But I'm fine to admit
there may be corner cases where it would fail, I just haven't detected
those failures.

>> > The code which displays the min-window is more-or-less the generic
>> > Emacs window-display code, it doesn't care that not all of the stuff
>> > fits in the window.
>> That's the code that honours max-mini-window-height, right?
> Yes.  Followed by the normal window redisplay.
>> Though that doesn't seem to be what's kicking in here, I believe it
>> should be.
> Not sure I can parse this properly.  What exactly isn't "kicking in"?

Don't worry. I meant I have that variable set to 3, but I'm seeing a
6-line-high minibuffer prompt, so something in Gregory's code seems to
be overriding it.  By "should be" I'm stating that that overriding
shouldn't happen, i.e. I'm searching for a better solution.

>> Anyway, I think it's reasonable to suggest I think, that whoever is
>> truncating the display has someway of notifying the client (whoever
>> requested the display), that truncation happened, or is about to happen.
>
> I think whoever truncates the display is the same as the client.
> Unless I misunderstand what you mean by "truncate".

Truncation is being given something to display, such as here:

  (let ((minibuffer-setup-hook (lambda ()
                                 (insert (format "one\ntwo\nthree\nfour")))))
    (read-minibuffer "hey"))

and _not_ actually displaying it becasue of some window size constraint.

> There are ways.  They aren't necessarily easy, but if your application
> does care about not everything being visible in a window, the
> application must do something about it, because the "normal" Emacs
> display doesn't treat partial display of a buffer as something
> special, since that is what happens all the time in Emacs.

Right.  But is there a very large cost in implementing a mechanism of
notification that applications can optionally subscribe to take action
when this common thing happens to them?

> Not sure what should be canonical here.  AFAIU, just using
> window-text-pixel-size and comparing with the window dimensions is all
> that's needed.

Thanks, but I don't understand how that could help here.  The docstring
says:

   This function exists to allow Lisp programs to adjust the dimensions
   of WINDOW to the buffer text it needs to display.

But we need a subtly different use which would be:

   This function exists to allow Lisp programs to adjust the buffer text
   so that it fits visually in WINDOW.

I don't know how to use the function to do this.  In other words, I have
some buffer text and I would like to know:

1) If it fits in WINDOW;
2) If it doesn't, where is the cutoff, as a text position.

I'm re-reading the docstring to see it this is possible, but I don't
think the function is tailored for this use case.  Anyway, if that
function existed it would be what I called the canonical solution for
this case.

João



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

* Re: feature/icomplete-vertical
  2020-10-05 11:02                                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-10-05 11:32                                   ` João Távora
  2020-10-05 11:54                                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 11:32 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, emacs-devel, casouri, spacibba, juri

Gregory Heytings <ghe@sdf.org> writes:

>>> If an application wants to fit the buffer in the window, or display
>>> some hint about truncation, it's the application's business to do
>>> these things.
>>
>> I guess you can argue that, but this implies there are ways to
>> predict truncation (since being notified of it seems to be what
>> you're opposed to).
>>
>> So how is the application to know if its n lines, of lengths L =
>> {l1, ..., li, ..., ln}, it wants to display (not necessarily by
>> buffer insertion) in the mini-window need truncation and starting in
>> which line?  Does it need to perform calculations with
>> max-mini-window-height? If so, is there a "canonical" way to perform
>> these calculations that accounts for fontsizes, frame widths, etc?
>> To be clear, I find this information useful for other domais,
>> notably designing the way the Eldoc should show information in the
>> echo area.
>>
>
> This is feasible, but IMHO very (and needlessly) difficult.  Basically
> you need to work with pixel dimensions, and recalculate everything
> manually: first calculate the (maximal) size of the miniwindow (given
> the user preferences, in particular max-mini-window-height), then
> calculate the size of its contents with window-text-pixel-size.  You
> should add one character (or line) at at time, and recalculate the new
> size each time.

Yes, as far as I understand, in the general case, it must be one
character at a time, since each character might have a different pixel
width.  At some point there is a cutoff and things are not displayed
anymore.  I was hoping that that knowledge, which is held somehere in
the system at some point, could be imparted to the application.

Anyway, whatever the mechanism (notification or painstaking
calculation), we should first write a function that does this.  That is
the bugfix in my opinion.  Then we can work on simplifying that
function's implementation, if it turns out to be slow or problematic.

João



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

* Re: feature/icomplete-vertical
  2020-10-05 11:11                                   ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-10-05 11:33                                     ` Eli Zaretskii
  2020-10-05 11:48                                       ` feature/icomplete-vertical João Távora
  2020-10-05 17:59                                     ` feature/icomplete-vertical martin rudalics
  1 sibling, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 11:33 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: spacibba, juri, casouri, joaotavora, emacs-devel

> Date: Mon, 05 Oct 2020 11:11:28 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: João Távora <joaotavora@gmail.com>, spacibba@aol.com,
>         emacs-devel@gnu.org, casouri@gmail.com, juri@linkov.net
> 
> > Not sure what should be canonical here.  AFAIU, just using 
> > window-text-pixel-size and comparing with the window dimensions is all 
> > that's needed.
> 
> Just calculating the window dimensions is already a nontrivial task. 
> There are two cases: a miniwindow-only frame, and the "normal" case.  In 
> the first case you need to use frame-height, and multiply it with the 
> pixel height of the "default" face.  In the second case you can get the 
> maximal dimensions with max-mini-window-height, and multiply it by the 
> pixel height of the "default" face.  But you cannot just multiply 
> max-mini-window-height by that height, that would be too easy.  There are 
> again two cases: either max-mini-window-height is an integer, in which 
> case you can just do that multiplication, or it is a floating point 
> number, in which case you have to multiply that number by frame-height and 
> truncate it, and multiply the resulting number by the pixel height of the 
> "default" face...

Well, if someone wants to write a function which does all that, I'm
sure it will be welcome (assuming that window.el doesn't yet have
something like that already).



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

* Re: feature/icomplete-vertical
  2020-10-05 11:24                                   ` feature/icomplete-vertical João Távora
@ 2020-10-05 11:45                                     ` Eli Zaretskii
  2020-10-05 11:54                                       ` feature/icomplete-vertical João Távora
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 11:45 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, emacs-devel, casouri, juri

> From: João Távora <joaotavora@gmail.com>
> Cc: ghe@sdf.org,  spacibba@aol.com,  juri@linkov.net,  casouri@gmail.com,
>   emacs-devel@gnu.org
> Date: Mon, 05 Oct 2020 12:24:55 +0100
> 
> Truncation is being given something to display, such as here:
> 
>   (let ((minibuffer-setup-hook (lambda ()
>                                  (insert (format "one\ntwo\nthree\nfour")))))
>     (read-minibuffer "hey"))
> 
> and _not_ actually displaying it becasue of some window size constraint.
> 
> > There are ways.  They aren't necessarily easy, but if your application
> > does care about not everything being visible in a window, the
> > application must do something about it, because the "normal" Emacs
> > display doesn't treat partial display of a buffer as something
> > special, since that is what happens all the time in Emacs.
> 
> Right.  But is there a very large cost in implementing a mechanism of
> notification that applications can optionally subscribe to take action
> when this common thing happens to them?

I don't think the cost is large, but someone needs to do the writing.
Emacs was never designed to display completions this way, so it's not
surprising these mechanisms weren't implemented until now.

>    This function exists to allow Lisp programs to adjust the buffer text
>    so that it fits visually in WINDOW.
> 
> I don't know how to use the function to do this.  In other words, I have
> some buffer text and I would like to know:
> 
> 1) If it fits in WINDOW;
> 2) If it doesn't, where is the cutoff, as a text position.

Basically, remove lines one by one until it fits.

We could write a similar function to do what you want, but please note
that such a function will not understand the semantics of the text, so
it could suggest truncating it at some place which makes no sense.  If
the caller would like a smarter 'service", we will have to come up
with some method of telling the function where it makes sense to
truncate the text.



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

* Re: feature/icomplete-vertical
  2020-10-05 11:33                                     ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 11:48                                       ` João Távora
  0 siblings, 0 replies; 118+ messages in thread
From: João Távora @ 2020-10-05 11:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gregory Heytings, spacibba, juri, casouri, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> > Not sure what should be canonical here.  AFAIU, just using 
>> > window-text-pixel-size and comparing with the window dimensions is all 
>> > that's needed.
>> 
>> Just calculating the window dimensions is already a nontrivial task. 

> Well, if someone wants to write a function which does all that, I'm
> sure it will be welcome (assuming that window.el doesn't yet have
> something like that already).

I agree with this.

João



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

* Re: feature/icomplete-vertical
  2020-10-05 11:32                                   ` feature/icomplete-vertical João Távora
@ 2020-10-05 11:54                                     ` Gregory Heytings via Emacs development discussions.
  2020-10-05 11:58                                       ` feature/icomplete-vertical João Távora
  0 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05 11:54 UTC (permalink / raw)
  To: João Távora; +Cc: Eli Zaretskii, emacs-devel, casouri, spacibba, juri


>> This is feasible, but IMHO very (and needlessly) difficult.  Basically 
>> you need to work with pixel dimensions, and recalculate everything 
>> manually: first calculate the (maximal) size of the miniwindow (given 
>> the user preferences, in particular max-mini-window-height), then 
>> calculate the size of its contents with window-text-pixel-size.  You 
>> should add one character (or line) at at time, and recalculate the new 
>> size each time.
>
> Yes, as far as I understand, in the general case, it must be one 
> character at a time, since each character might have a different pixel 
> width.  At some point there is a cutoff and things are not displayed 
> anymore.  I was hoping that that knowledge, which is held somehere in 
> the system at some point, could be imparted to the application.
>
> Anyway, whatever the mechanism (notification or painstaking 
> calculation), we should first write a function that does this.  That is 
> the bugfix in my opinion.  Then we can work on simplifying that 
> function's implementation, if it turns out to be slow or problematic.
>

There is no need to calculate anything with the 
"start-display-at-beginning-of-minibuffer" solution I sent a few hours 
ago.  Emacs does everything for you, at no cost.

Or is there something that you need (e.g. for Eldoc) and that this 
solution does not do?



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

* Re: feature/icomplete-vertical
  2020-10-05 11:45                                     ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 11:54                                       ` João Távora
  2020-10-05 12:05                                         ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 11:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, spacibba, emacs-devel, casouri, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> Right.  But is there a very large cost in implementing a mechanism of
>> notification that applications can optionally subscribe to take action
>> when this common thing happens to them?
>
> I don't think the cost is large, but someone needs to do the writing.
> Emacs was never designed to display completions this way, so it's not
> surprising these mechanisms weren't implemented until now.

Right.  Though it's not only for completion.

>>    This function exists to allow Lisp programs to adjust the buffer text
>>    so that it fits visually in WINDOW.
>> 
>> I don't know how to use the function to do this.  In other words, I have
>> some buffer text and I would like to know:
>> 
>> 1) If it fits in WINDOW;
>> 2) If it doesn't, where is the cutoff, as a text position.
>
> Basically, remove lines one by one until it fits.

This was the approach I took in eldoc.el, but I found it's complex.  And
it assumes we want to cut off at logical line positions.  In a recent
proposal of bug#43543 I proposed taking it out of eldoc.el (presumably
to be replaced later with some more generic means).

> We could write a similar function to do what you want, but please note
> that such a function will not understand the semantics of the text, so
> it could suggest truncating it at some place which makes no sense.
> If the caller would like a smarter 'service", we will have to come up
> with some method of telling the function where it makes sense to
> truncate the text.

Right. My idea is that a "dumb" service gives us a text position and the
application, which does know the semantics of the things being
displayed, decides based on that.

For example, icomplete would remove the candidate where the truncation
happened and replace it with an elipsis, whereas eldoc would remove the
piece of documentation entirely and maybe replace it with a hint to
visit the *eldoc* buffer.

João



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

* Re: feature/icomplete-vertical
  2020-10-05 11:54                                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-10-05 11:58                                       ` João Távora
  2020-10-05 12:02                                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 11:58 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, Juri Linkov, Ergus, Yuan Fu, emacs-devel

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

On Mon, Oct 5, 2020 at 12:54 PM Gregory Heytings <ghe@sdf.org> wrote:
>
> >> This is feasible, but IMHO very (and needlessly) difficult.  Basically
> >> you need to work with pixel dimensions, and recalculate everything
> >> manually: first calculate the (maximal) size of the miniwindow (given
> >> the user preferences, in particular max-mini-window-height), then
> >> calculate the size of its contents with window-text-pixel-size.  You
> >> should add one character (or line) at at time, and recalculate the new
> >> size each time.
> >
> > Yes, as far as I understand, in the general case, it must be one
> > character at a time, since each character might have a different pixel
> > width.  At some point there is a cutoff and things are not displayed
> > anymore.  I was hoping that that knowledge, which is held somehere in
> > the system at some point, could be imparted to the application.
> >
> > Anyway, whatever the mechanism (notification or painstaking
> > calculation), we should first write a function that does this.  That is
> > the bugfix in my opinion.  Then we can work on simplifying that
> > function's implementation, if it turns out to be slow or problematic.
> >
>
> There is no need to calculate anything with the
> "start-display-at-beginning-of-minibuffer" solution I sent a few hours
> ago.  Emacs does everything for you, at no cost.
>
> Or is there something that you need (e.g. for Eldoc) and that this
> solution does not do?

I suppose not, but I take it that that solution is a non-starter
because of Eli's and Stefan's objections to it. Maybe you
somehow placate those objections.

João

[-- Attachment #2: Type: text/html, Size: 2053 bytes --]

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

* Re: feature/icomplete-vertical
  2020-10-05 11:58                                       ` feature/icomplete-vertical João Távora
@ 2020-10-05 12:02                                         ` Gregory Heytings via Emacs development discussions.
  2020-10-05 12:07                                           ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05 12:02 UTC (permalink / raw)
  To: João Távora
  Cc: Eli Zaretskii, Juri Linkov, Ergus, Yuan Fu, emacs-devel

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


>> There is no need to calculate anything with the 
>> "start-display-at-beginning-of-minibuffer" solution I sent a few hours 
>> ago.  Emacs does everything for you, at no cost.
>>
>> Or is there something that you need (e.g. for Eldoc) and that this 
>> solution does not do?
> 
> I suppose not, but I take it that that solution is a non-starter because 
> of Eli's and Stefan's objections to it.
>

I did not see objections from Stefan.  And the objection of Eli is only, 
AFAIU, that in a longer term a better solution should be implemented.

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

* Re: feature/icomplete-vertical
  2020-10-05 11:54                                       ` feature/icomplete-vertical João Távora
@ 2020-10-05 12:05                                         ` Eli Zaretskii
  2020-10-05 13:07                                           ` feature/icomplete-vertical João Távora
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 12:05 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, juri, casouri, emacs-devel

> From: João Távora <joaotavora@gmail.com>
> Date: Mon, 05 Oct 2020 12:54:52 +0100
> Cc: ghe@sdf.org, spacibba@aol.com, emacs-devel@gnu.org, casouri@gmail.com,
>  juri@linkov.net
> 
> > We could write a similar function to do what you want, but please note
> > that such a function will not understand the semantics of the text, so
> > it could suggest truncating it at some place which makes no sense.
> > If the caller would like a smarter 'service", we will have to come up
> > with some method of telling the function where it makes sense to
> > truncate the text.
> 
> Right. My idea is that a "dumb" service gives us a text position and the
> application, which does know the semantics of the things being
> displayed, decides based on that.
> 
> For example, icomplete would remove the candidate where the truncation
> happened and replace it with an elipsis, whereas eldoc would remove the
> piece of documentation entirely and maybe replace it with a hint to
> visit the *eldoc* buffer.

In use cases that are not the most trivial ones, knowing what to
remove could not be easy.  For example, what if the part that exceeds
the window dimensions comes from display or overlay string?  Also,
does the application tolerate partially-visible lines?  So some
additional information will need to be made available to the function,
I think.

Patches welcome.



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

* Re: feature/icomplete-vertical
  2020-10-05 12:02                                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-10-05 12:07                                           ` Eli Zaretskii
  2020-10-05 12:25                                             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 12:07 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: spacibba, emacs-devel, casouri, joaotavora, juri

> Date: Mon, 05 Oct 2020 12:02:30 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: Eli Zaretskii <eliz@gnu.org>, Juri Linkov <juri@linkov.net>,
>         Ergus <spacibba@aol.com>, Yuan Fu <casouri@gmail.com>,
>         emacs-devel <emacs-devel@gnu.org>
> 
> > I suppose not, but I take it that that solution is a non-starter because 
> > of Eli's and Stefan's objections to it.
> >
> 
> I did not see objections from Stefan.  And the objection of Eli is only, 
> AFAIU, that in a longer term a better solution should be implemented.

No, my objections are that your proposal is not safe wrt recursive
editing, and will affect uses of mini-windows other than prompting the
user, where these effects aren't intended.

AFAIU, Stefan agreed that this is a problem in your proposal.



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

* Re: feature/icomplete-vertical
  2020-10-05  9:06                       ` feature/icomplete-vertical João Távora
@ 2020-10-05 12:23                         ` Ergus
  2020-10-05 12:28                           ` feature/icomplete-vertical João Távora
  0 siblings, 1 reply; 118+ messages in thread
From: Ergus @ 2020-10-05 12:23 UTC (permalink / raw)
  To: João Távora
  Cc: Gregory Heytings, Eli Zaretskii, emacs-devel, Yuan Fu,
	Juri Linkov

Hi Joao

The changes you show are the old version of the branch where I was
trying some experiments... I should have called it "scratch" to that
first version. I understand your concerns now. But not, this is not the
new version

I cleaned all of it in a recent forced push some weeks ago. Please give
a look at the new version. It is simpler and doesn't give any change in
the interface.

Ergus



On Mon, Oct 05, 2020 at 10:06:22AM +0100, Jo�o T�vora wrote:
>Ergus <spacibba@aol.com> writes:
>
>> On Mon, Oct 05, 2020 at 12:47:39AM +0100, Jo�o T�vora wrote:
>>
>> Hi Joao:
>>
>> Please look at the previous messages in this same thread to see the
>> problems with your approach.
>>
>> So far there is:
>>
>> 1) The problem when using different font in minibuffer reported by
>> Jixiuf 2) the long line issue from Gregory (but also mentioned before)
>> 3) the ellipsis issue mentioned by Eli
>> 4) The prompt issue (which seems is not going to be solved as it is more
>> a design choice or a feature than a real issue)
>> 5) Respect the user customs max-mini-window-height and
>> resize-mini-windows so we shouldn't call enlarge-window and as an
>> core package we must not conflict with such customs.
>> 6) The removal of {} in vertical mode because in that case they are
>> redundant.
>> 7) The compatibility with packages like maple-minibuffer reported by
>> Dimitry.
>> 8) The case when using multiline separator.
>> 9) Move the first candidate to a newline instead of keeping it inline.
>>
>> The patch I propose is not complex at all considering all the above
>> conditions. The only complexity comes from the height calculation in
>> pixels which is something that will need to be done in any case either
>> for 1, 2, 3 or 4.
>
>Thanks for listing these again, for my benefit.  I've not been following
>this very closely, and needed a summary to give me context after trying
>your patch again, as you requested.
>
>To be clear: I'm not "against" this functionality or even against it
>becoming a part of Emacs or Emacs core.  I think solving the problems
>you list above is fine (though I haven't been by them, at least not yet)
>
>I'm not too much concerned about the complexity of implementation (such
>as the height calculation).  I am concerned the changes to the user
>interface, of which your patch seems to bring many, or at least more
>than I would have expected.  It seems to be that your solution mixes
>bugfixes and new features, which is what I object to.  I think your
>solution could be trimmed down so that it solves _only_ the technical
>problems you list above without adding new user interfaces.
>
>In other words, don't see why the points above, which sound like
>basically bugs, need any new "defcustom".  This is why I asked you to
>(re)list them.  Then I can start with my naive implementation and fix
>them one by one, without adding new interfaces.  Of course, then I will
>be repeating some work you've already done, so this is why I'm arguing
>for this separation in _your_ work.
>
>Could you structure your work so that one part fixes the above problems,
>and another part adds the new features, like customizing bracket types
>and such, and is should be discussed as a separate matter.
>
>After my sig, some comments that illustrate my points.
>
>I took this diff with git diff master...feature/icomplete-vertical
>
>Jo�o
>
>> -(defcustom icomplete-separator " | "
>> -  "String used by Icomplete to separate alternatives in the minibuffer."
>> -  :type 'string
>> -  :version "24.4")
>> +(defcustom icomplete-vertical nil
>> +  "Enable `icomplete' vertical mode."
>> +  :type 'bool
>> +  :version "28.1")
>
>I would think it more elegant to keep `icomplete-separator` as the entry
>point to verticality.  Certainly it should be possible to analyse the
>string and decide whether it implies verticality and needs special
>worries.
>
>  (defcustom icomplete-hide-common-prefix t
>   "When non-nil, hide common prefix from completion candidates.
>@@ -97,6 +97,12 @@ icomplete-first-match
>   "Face used by Icomplete for highlighting first match."
>   :version "24.4")
>
>> +(defface icomplete-common-match '((t :inherit 'highlight
>> +                                     :underline t
>> +                                     :weight bold))
>> +  "Face used by Icomplete for highlighting common completion."
>> +  :version "28.1")
>
>
>What is a "common match"?  Is this exclusive to icomplete verticalness?
>Doesn't seem so, is this not a side feature?
>
>> -(defcustom icomplete-minibuffer-setup-hook nil
>> +(defvar icomplete-ellipsis nil)
>> +
>> +(defcustom icomplete--minibuffer-setup-hook nil
>>    "Icomplete-specific customization of minibuffer setup.
>
>Why has this minibuffer hook been made an internal variable?
>
>> -    (define-key map (kbd "<right>") 'icomplete-forward-completions)
>> -    (define-key map (kbd "<left>") 'icomplete-backward-completions)
>
>Why have these been removed from icomplete-fido-mode-map?  Also, I have
>C-r and C-r in that map, will it work in the verticality?  I would hope
>it would, as it does not in my naive verticality implementation.
>
>> -;;;_ > icomplete-minibuffer-setup ()
>> -(defun icomplete-minibuffer-setup ()
>> +;; Vertical functions
>> +
>> +(defcustom icomplete-separator-vertical " \n"
>> +  "String used by Icomplete to separate alternatives in the minibuffer."
>> +  :type 'string
>> +  :version "28.1")
>> +
>> +(defcustom icomplete-list-indicators-vertical (cons "" "")
>> +  "Indicator bounds to list alternatives in the minibuffer."
>> +  :type 'string
>> +  :version "28.1")
>> +
>> +(defcustom icomplete-require-indicators-vertical (cons "" "")
>> +  "Indicator bounds for match in the minibuffer when require-match."
>> +  :type 'string
>> +  :version "28.1")
>> +
>> +(defcustom icomplete-not-require-indicators-vertical (cons "" "")
>> +  "Indicator bounds for match in the minibuffer when not require-match."
>> +  :type 'string
>> +  :version "28.1")
>
>These are examples of "interface bloat" that do not seem to directly
>address the 9 problems you listed in the beginning of the message
>(again, I am not against these features per se, mind you)
>
>> +(defvar icomplete--vertical-mode-map
>
>If this keymap is "internal" (as indicated by the two "--") how am I
>supposed to customize the keybindings?
>
>> +(defcustom icomplete-list-indicators-horizontal (cons "{" "}")
>> +  "Indicator bounds to list alternatives in the minibuffer."
>> +  :type 'string
>> +  :version "28.1")
>> +
>> +(defcustom icomplete-require-indicators-horizontal (cons "(" ")")
>> +  "Indicator bounds for match in the minibuffer when require-match."
>> +  :type 'string
>> +  :version "28.1")
>> +
>> +(defcustom icomplete-not-require-indicators-horizontal (cons "[" "]")
>> +  "Indicator bounds for match in the minibuffer when not require-match."
>> +  :type 'string
>> +  :version "28.1")
>
>Again, these seem like improvements that are not directly related to
>verticality.  (Maybe they are very good improvements, but still...
>
>Jo�o
>



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

* Re: feature/icomplete-vertical
  2020-10-05 12:07                                           ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 12:25                                             ` Gregory Heytings via Emacs development discussions.
  2020-10-05 12:33                                               ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05 12:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: spacibba, emacs-devel, casouri, joaotavora, juri


>> I did not see objections from Stefan.  And the objection of Eli is 
>> only, AFAIU, that in a longer term a better solution should be 
>> implemented.
>
> No, my objections are that your proposal is not safe wrt recursive 
> editing, and will affect uses of mini-windows other than prompting the 
> user, where these effects aren't intended.
>
> AFAIU, Stefan agreed that this is a problem in your proposal.
>

I don't know which proposal you refer to in that sentence, but I guess 
it's the (second) patch I sent on bug#43572 a week ago, against Emacs C 
core.

The solution in this thread works at the Lisp level, and will not affect 
other uses of the miniwindow, because it relies on a minibuffer-local 
variable.  AFAICS it is also safe wrt recursive editing.



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

* Re: feature/icomplete-vertical
  2020-10-05 12:23                         ` feature/icomplete-vertical Ergus
@ 2020-10-05 12:28                           ` João Távora
  2020-10-05 12:52                             ` feature/icomplete-vertical Ergus
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 12:28 UTC (permalink / raw)
  To: Ergus; +Cc: Gregory Heytings, Eli Zaretskii, Juri Linkov, Yuan Fu,
	emacs-devel

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

On Mon, Oct 5, 2020 at 1:23 PM Ergus <spacibba@aol.com> wrote:
>
> Hi Joao
>
> The changes you show are the old version of the branch where I was
> trying some experiments... I should have called it "scratch" to that
> first version. I understand your concerns now. But not, this is not the
> new version
>
> I cleaned all of it in a recent forced push some weeks ago. Please give
> a look at the new version. It is simpler and doesn't give any change in
> the interface.

OK, I see it now. GreAat!  If that is the case, then I don't have
anything against it in principle. How does it solve the problem
that Gregory is also trying to solve?

João

[-- Attachment #2: Type: text/html, Size: 904 bytes --]

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

* Re: feature/icomplete-vertical
  2020-10-05 12:25                                             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-10-05 12:33                                               ` Eli Zaretskii
  2020-10-05 13:19                                                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 12:33 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: joaotavora, spacibba, juri, casouri, emacs-devel

> Date: Mon, 05 Oct 2020 12:25:13 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: spacibba@aol.com, emacs-devel@gnu.org, casouri@gmail.com,
>         joaotavora@gmail.com, juri@linkov.net
> 
> > No, my objections are that your proposal is not safe wrt recursive 
> > editing, and will affect uses of mini-windows other than prompting the 
> > user, where these effects aren't intended.
> >
> > AFAIU, Stefan agreed that this is a problem in your proposal.
> >
> 
> I don't know which proposal you refer to in that sentence, but I guess 
> it's the (second) patch I sent on bug#43572 a week ago, against Emacs C 
> core.

I referred to the same proposal to which João referred.

> The solution in this thread works at the Lisp level, and will not affect 
> other uses of the miniwindow, because it relies on a minibuffer-local 
> variable.  AFAICS it is also safe wrt recursive editing.

Using a buffer-local variable doesn't necessarily eliminate the
problems with recursive-edit.  And using window-scroll-functions for
this purpose is a no-no.  So I cannot endorse this others solution,
either.



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

* Re: feature/icomplete-vertical
  2020-10-05 12:28                           ` feature/icomplete-vertical João Távora
@ 2020-10-05 12:52                             ` Ergus
  0 siblings, 0 replies; 118+ messages in thread
From: Ergus @ 2020-10-05 12:52 UTC (permalink / raw)
  To: João Távora
  Cc: Gregory Heytings, Eli Zaretskii, emacs-devel, Yuan Fu,
	Juri Linkov

On Mon, Oct 05, 2020 at 01:28:57PM +0100, Jo�o T�vora wrote:
>On Mon, Oct 5, 2020 at 1:23 PM Ergus <spacibba@aol.com> wrote:
>>
>> Hi Joao
>>
>> The changes you show are the old version of the branch where I was
>> trying some experiments... I should have called it "scratch" to that
>> first version. I understand your concerns now. But not, this is not the
>> new version
>>
>> I cleaned all of it in a recent forced push some weeks ago. Please give
>> a look at the new version. It is simpler and doesn't give any change in
>> the interface.
>
>OK, I see it now. GreAat!  If that is the case, then I don't have
>anything against it in principle. How does it solve the problem
>that Gregory is also trying to solve?
>
Everything is solved by truncating the candidates properly considering
the max-mini-window-height, font size, window-text-pixel-size and so on
in advance.

As I said, the prompt problem is actually a design choice with some
"bad" consequences in our case, but not in general.

>Jo�o



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

* Re: feature/icomplete-vertical
  2020-10-05 12:05                                         ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 13:07                                           ` João Távora
  2020-10-05 13:25                                             ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 13:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, spacibba, juri, casouri, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: João Távora <joaotavora@gmail.com>
>> Date: Mon, 05 Oct 2020 12:54:52 +0100
>> Cc: ghe@sdf.org, spacibba@aol.com, emacs-devel@gnu.org, casouri@gmail.com,
>>  juri@linkov.net
>> 
>> > We could write a similar function to do what you want, but please note
>> > that such a function will not understand the semantics of the text, so
>> > it could suggest truncating it at some place which makes no sense.
>> > If the caller would like a smarter 'service", we will have to come up
>> > with some method of telling the function where it makes sense to
>> > truncate the text.
>> 
>> Right. My idea is that a "dumb" service gives us a text position and the
>> application, which does know the semantics of the things being
>> displayed, decides based on that.
>> 
>> For example, icomplete would remove the candidate where the truncation
>> happened and replace it with an elipsis, whereas eldoc would remove the
>> piece of documentation entirely and maybe replace it with a hint to
>> visit the *eldoc* buffer.
>
> In use cases that are not the most trivial ones, knowing what to
> remove could not be easy.  For example, what if the part that exceeds
> the window dimensions comes from display or overlay string?  Also,
> does the application tolerate partially-visible lines?  So some
> additional information will need to be made available to the function,
> I think.

I think the easiest way to make this function is to give it a buffer
where text exists as buffer text and truncate-lines is what it it.  Then
it can say exactly where it _would_ cut off.  The application can then
use that data to inform the display of text and/or overlay strings, and
potentially remove "semantic elements" accordingly.

João




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

* Re: feature/icomplete-vertical
  2020-10-05 10:11                             ` feature/icomplete-vertical Eli Zaretskii
  2020-10-05 10:52                               ` feature/icomplete-vertical João Távora
@ 2020-10-05 13:13                               ` Stefan Monnier
  1 sibling, 0 replies; 118+ messages in thread
From: Stefan Monnier @ 2020-10-05 13:13 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: spacibba, casouri, juri, João Távora, ghe, emacs-devel

> The truncation is done by icomplete, not by the display engine.  The
> "warning" is supposed to be in the form of the ellipsis displayed
> after the last candidate that is shown.

BTW, I think this is a UI mistake in Icomplete.

The simpler way to solve this problem is to replace the "ellipsis to
indicate truncation" with a "thingy to show the end of the list", so if
the output is truncated by the display you'll notice it because of the
lack of "thingy".

In the "horizontal" output, I think the most natural choice for the
"thingy" would be the closing "}".


        Stefan


PS: And no, this is still not a solution for the case where you want
the vertical icomplete list to appear *above* the prompt.  :-(




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

* Re: feature/icomplete-vertical
  2020-10-05 12:33                                               ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 13:19                                                 ` Gregory Heytings via Emacs development discussions.
  2020-10-05 13:44                                                   ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05 13:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: spacibba, emacs-devel, casouri, joaotavora, juri


>> The solution in this thread works at the Lisp level, and will not 
>> affect other uses of the miniwindow, because it relies on a 
>> minibuffer-local variable.  AFAICS it is also safe wrt recursive 
>> editing.
>
> Using a buffer-local variable doesn't necessarily eliminate the problems 
> with recursive-edit. And using window-scroll-functions for this purpose 
> is a no-no.  So I cannot endorse this others solution, either.
>

Once again I have to stop a discussion with you, because I do not want to 
start a public dispute with you.  You reject everything I propose with 
vague statements about "potential problems", without any detail or recipe 
that would help me or others to see whether these "potential problems" are 
real or minor ones.

Note that what you object to (using set-window-start in 
window-scroll-functions) is, in fact, already used twice in Emacs core.

In em-smart.el, eshell-smart-initialize adds eshell-smart-scroll-window to 
window-scroll-functions, eshell-smart-scroll-window calls 
eshell-smart-redisplay, and eshell-smart-redisplay uses set-window-start. 
Likewise, follow.el adds follow-avoid-tail-recenter to 
window-scroll-functions, and follow-avoid-tail-recenter uses 
set-window-start.

In both cases, the code was already present in Emacs 21.  Which means that 
it has been used for twenty years without known problems.



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

* Re: feature/icomplete-vertical
  2020-10-05 13:07                                           ` feature/icomplete-vertical João Távora
@ 2020-10-05 13:25                                             ` Eli Zaretskii
  2020-10-05 19:03                                               ` feature/icomplete-vertical João Távora
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 13:25 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, juri, casouri, emacs-devel

> From: João Távora <joaotavora@gmail.com>
> Cc: ghe@sdf.org,  spacibba@aol.com,  emacs-devel@gnu.org,
>   casouri@gmail.com,  juri@linkov.net
> Date: Mon, 05 Oct 2020 14:07:05 +0100
> 
> I think the easiest way to make this function is to give it a buffer
> where text exists as buffer text and truncate-lines is what it it.  Then
> it can say exactly where it _would_ cut off.

That doesn't work for displaying text with continuation lines, does
it?



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

* Re: feature/icomplete-vertical
  2020-10-05 13:19                                                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-10-05 13:44                                                   ` Eli Zaretskii
  2020-10-05 19:14                                                     ` feature/icomplete-vertical João Távora
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 13:44 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: joaotavora, spacibba, juri, casouri, emacs-devel

> Date: Mon, 05 Oct 2020 13:19:53 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: spacibba@aol.com, emacs-devel@gnu.org, casouri@gmail.com,
>         joaotavora@gmail.com, juri@linkov.net
> 
> > Using a buffer-local variable doesn't necessarily eliminate the problems 
> > with recursive-edit. And using window-scroll-functions for this purpose 
> > is a no-no.  So I cannot endorse this others solution, either.
> 
> Once again I have to stop a discussion with you, because I do not want to 
> start a public dispute with you.

You say that, and then you start a public dispute anyway.  Not sure
what to make of that.

> You reject everything I propose with vague statements about
> "potential problems", without any detail or recipe that would help
> me or others to see whether these "potential problems" are real or
> minor ones.

I'm not sure what detail I need to provide.  Isn't it clear that using
a buffer-local variable doesn't resolve problems with using that same
buffer in another level of recursive-edit?  Or that changing the
window-start position from under the feet of the display engine is
something that should be avoided?  Why would you need examples to
realize that a design based on this cannot be clean, in the sense that
use cases where it causes trouble will eventually surface?

> Note that what you object to (using set-window-start in 
> window-scroll-functions) is, in fact, already used twice in Emacs core.
> 
> In em-smart.el, eshell-smart-initialize adds eshell-smart-scroll-window to 
> window-scroll-functions, eshell-smart-scroll-window calls 
> eshell-smart-redisplay, and eshell-smart-redisplay uses set-window-start. 
> Likewise, follow.el adds follow-avoid-tail-recenter to 
> window-scroll-functions, and follow-avoid-tail-recenter uses 
> set-window-start.
> 
> In both cases, the code was already present in Emacs 21.  Which means that 
> it has been used for twenty years without known problems.

We routinely fix bugs in code that was written 20 and 30 years ago.
So the age of a problematic code doesn't mean it won't one day surface
as a bug.  As users and third-party packages write more and more
complex code for Emacs, we discover bugs that lay hidden for many
years.

Yes, the display engine includes some extra safety nets that might let
these bad practices work, at least in some use cases.  But that
doesn't mean the warnings in the documentation and in this discussion
should be disregarded.  You have just shown here how that can lead to
redisplay glitches.



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

* Re: feature/icomplete-vertical
  2020-10-05 11:11                                   ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-10-05 11:33                                     ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 17:59                                     ` martin rudalics
  2020-10-05 18:24                                       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 1 reply; 118+ messages in thread
From: martin rudalics @ 2020-10-05 17:59 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii
  Cc: spacibba, juri, casouri, João Távora, emacs-devel

 > Just calculating the window dimensions is already a nontrivial
 > task. There are two cases: a miniwindow-only frame, and the "normal"
 > case.  In the first case you need to use frame-height, and multiply it
 > with the pixel height of the "default" face.  In the second case you
 > can get the maximal dimensions with max-mini-window-height, and
 > multiply it by the pixel height of the "default" face.  But you cannot
 > just multiply max-mini-window-height by that height, that would be too
 > easy.  There are again two cases: either max-mini-window-height is an
 > integer, in which case you can just do that multiplication, or it is a
 > floating point number, in which case you have to multiply that number
 > by frame-height and truncate it, and multiply the resulting number by
 > the pixel height of the "default" face...

You underestimate the complexity of resizing the minibuffer window.
'max-mini-window-height' and, say 'frame-pixel-height', are by no means
sufficient to determine whether the minibuffer window can be really made
that large.  You have to check whether the remaining windows on the same
frame can be made sufficiently small in order to accommodate the
enlarged minibuffer window, including the case where you have
fixed-height or height-preserved windows.  Look at the code of
'window--resize-mini-window' and 'window--resize-root-window-vertically'
to see how this can be done.  And even if your code works, you may have
modified the start positions of many other windows on the same frame
when the minibuffer window shrinks back.

I'd never use the default minibuffer window for displaying larger lists
of vertically arranged objects.  On GUIs use a separate child frame, on
TTYs a side window instead.

martin



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

* Re: feature/icomplete-vertical
  2020-10-05 17:59                                     ` feature/icomplete-vertical martin rudalics
@ 2020-10-05 18:24                                       ` Gregory Heytings via Emacs development discussions.
  0 siblings, 0 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05 18:24 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel


>> Just calculating the window dimensions is already a nontrivial task. 
>> There are two cases: a miniwindow-only frame, and the "normal" case. 
>> In the first case you need to use frame-height, and multiply it with 
>> the pixel height of the "default" face.  In the second case you can get 
>> the maximal dimensions with max-mini-window-height, and multiply it by 
>> the pixel height of the "default" face.  But you cannot just multiply 
>> max-mini-window-height by that height, that would be too easy.  There 
>> are again two cases: either max-mini-window-height is an integer, in 
>> which case you can just do that multiplication, or it is a floating 
>> point number, in which case you have to multiply that number by 
>> frame-height and truncate it, and multiply the resulting number by the 
>> pixel height of the "default" face...
>
> You underestimate the complexity of resizing the minibuffer window.
>

I do not, quite the contrary.  Indeed the presentation above (whose 
purpose was to show that doing this is too complex) is simplified.

>
> And even if your code works,
>

It's not my code, quite the contrary.  I explained in every possible 
detail that nobody should have to do this.

>
> I'd never use the default minibuffer window for displaying larger lists 
> of vertically arranged objects.  On GUIs use a separate child frame, on 
> TTYs a side window instead.
>

There is no reason to not do something that can be done easily.  You can 
look at and try the code I sent a few hours ago, it works perfectly well 
both in GUIs and on TTYs, with Emacs 24 to 28.



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

* Re: feature/icomplete-vertical
  2020-10-05 13:25                                             ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 19:03                                               ` João Távora
  2020-10-05 19:12                                                 ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 19:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, spacibba, juri, casouri, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: João Távora <joaotavora@gmail.com>
>> Cc: ghe@sdf.org,  spacibba@aol.com,  emacs-devel@gnu.org,
>>   casouri@gmail.com,  juri@linkov.net
>> Date: Mon, 05 Oct 2020 14:07:05 +0100
>> 
>> I think the easiest way to make this function is to give it a buffer
>> where text exists as buffer text and truncate-lines is what it it.  Then
>> it can say exactly where it _would_ cut off.
>
> That doesn't work for displaying text with continuation lines, does
> it?

I'm not sure what you mean.  Maybe?  Can you provide an example?  The
idea is to use this buffer to "stage" what needs to be displayed, and
gather guiding information from that, not necessarily to _do_ that
displaying on that particular "stage".

João



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

* Re: feature/icomplete-vertical
  2020-10-05 19:03                                               ` feature/icomplete-vertical João Távora
@ 2020-10-05 19:12                                                 ` Eli Zaretskii
  2020-10-05 19:19                                                   ` feature/icomplete-vertical João Távora
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 19:12 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, juri, casouri, emacs-devel

> From: João Távora <joaotavora@gmail.com>
> Cc: ghe@sdf.org,  spacibba@aol.com,  emacs-devel@gnu.org,
>   casouri@gmail.com,  juri@linkov.net
> Date: Mon, 05 Oct 2020 20:03:32 +0100
> 
> >> I think the easiest way to make this function is to give it a buffer
> >> where text exists as buffer text and truncate-lines is what it it.  Then
> >> it can say exactly where it _would_ cut off.
> >
> > That doesn't work for displaying text with continuation lines, does
> > it?
> 
> I'm not sure what you mean.  Maybe?  Can you provide an example?  The
> idea is to use this buffer to "stage" what needs to be displayed, and
> gather guiding information from that, not necessarily to _do_ that
> displaying on that particular "stage".

If the real buffer will be displayed without truncating lines, then
each physical line might take more than one screen line.  You need to
account for that when you decide where to truncate.

But that is so obvious that I fear I'm missing something important
here.



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

* Re: feature/icomplete-vertical
  2020-10-05 13:44                                                   ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 19:14                                                     ` João Távora
  2020-10-05 19:24                                                       ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 19:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gregory Heytings, spacibba, juri, casouri, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> You reject everything I propose with vague statements about
>> "potential problems", without any detail or recipe that would help
>> me or others to see whether these "potential problems" are real or
>> minor ones.
>
> I'm not sure what detail I need to provide.  Isn't it clear that using
> a buffer-local variable doesn't resolve problems with using that same
> buffer in another level of recursive-edit?  Or that changing the
> window-start position from under the feet of the display engine is
> something that should be avoided?  Why would you need examples to
> realize that a design based on this cannot be clean, in the sense that
> use cases where it causes trouble will eventually surface?

I think can understand some of Gregory's frustration.  If those problems
are real, it should be possible to showcase them.  Though that's not
always easy to do, those examples could better illustrate where the
fractures in Gregory's design are, and encourage him to undestand the
problem and find alternatives.  Or, as we often do, clearly document
shortcomings and establish the specific application domain of a
particular technique.  I for one, wouldn't mind a fix that worked only
in Emacs 28, so maybe some C-level handholding can be added.

João



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

* Re: feature/icomplete-vertical
  2020-10-05 19:12                                                 ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 19:19                                                   ` João Távora
  2020-10-05 19:30                                                     ` feature/icomplete-vertical Eli Zaretskii
  0 siblings, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 19:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, spacibba, juri, casouri, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: João Távora <joaotavora@gmail.com>
>> Cc: ghe@sdf.org,  spacibba@aol.com,  emacs-devel@gnu.org,
>>   casouri@gmail.com,  juri@linkov.net
>> Date: Mon, 05 Oct 2020 20:03:32 +0100
>> 
>> >> I think the easiest way to make this function is to give it a buffer
>> >> where text exists as buffer text and truncate-lines is what it it.  Then
>> >> it can say exactly where it _would_ cut off.
>> >
>> > That doesn't work for displaying text with continuation lines, does
>> > it?
>> 
>> I'm not sure what you mean.  Maybe?  Can you provide an example?  The
>> idea is to use this buffer to "stage" what needs to be displayed, and
>> gather guiding information from that, not necessarily to _do_ that
>> displaying on that particular "stage".
>
> If the real buffer will be displayed without truncating lines, then
> each physical line might take more than one screen line.  You need to
> account for that when you decide where to truncate.

Yes, but presumably, the (vapourware) function we are talking about
would interpret the value of truncate-lines "in the stage", and you'd
set that to the same value that you plan to use in the "real buffer".

João



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

* Re: feature/icomplete-vertical
  2020-10-05 19:14                                                     ` feature/icomplete-vertical João Távora
@ 2020-10-05 19:24                                                       ` Eli Zaretskii
  2020-10-05 19:32                                                         ` feature/icomplete-vertical João Távora
  2020-10-05 19:44                                                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  0 siblings, 2 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 19:24 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, juri, casouri, emacs-devel

> From: João Távora <joaotavora@gmail.com>
> Cc: Gregory Heytings <ghe@sdf.org>,  spacibba@aol.com,  emacs-devel@gnu.org,
>   casouri@gmail.com,  juri@linkov.net
> Date: Mon, 05 Oct 2020 20:14:30 +0100
> 
> > I'm not sure what detail I need to provide.  Isn't it clear that using
> > a buffer-local variable doesn't resolve problems with using that same
> > buffer in another level of recursive-edit?  Or that changing the
> > window-start position from under the feet of the display engine is
> > something that should be avoided?  Why would you need examples to
> > realize that a design based on this cannot be clean, in the sense that
> > use cases where it causes trouble will eventually surface?
> 
> I think can understand some of Gregory's frustration.  If those problems
> are real, it should be possible to showcase them.

The second one was showcased by Gregory himself.

The first one should be clear: binding a local variable to a value
will have that value in effect for all the recursive uses of the same
minibuffer, something that isn't necessarily expected by the nested
users.

> Though that's not always easy to do, those examples could better
> illustrate where the fractures in Gregory's design are, and
> encourage him to undestand the problem and find alternatives.

Sorry, I'm unable to encourage Gregory to understand the shortcomings,
no matter how much I tried, I guess it's my fault.  Although it sounds
like the same situation is repeating with Martin's advice regarding
mini-window resizing, so maybe it isn't entirely my fault after all.



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

* Re: feature/icomplete-vertical
  2020-10-05 19:19                                                   ` feature/icomplete-vertical João Távora
@ 2020-10-05 19:30                                                     ` Eli Zaretskii
  2020-10-05 19:36                                                       ` feature/icomplete-vertical João Távora
  0 siblings, 1 reply; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-05 19:30 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, juri, casouri, emacs-devel

> From: João Távora <joaotavora@gmail.com>
> Cc: ghe@sdf.org,  spacibba@aol.com,  emacs-devel@gnu.org,
>   casouri@gmail.com,  juri@linkov.net
> Date: Mon, 05 Oct 2020 20:19:22 +0100
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> From: João Távora <joaotavora@gmail.com>
> >> Cc: ghe@sdf.org,  spacibba@aol.com,  emacs-devel@gnu.org,
> >>   casouri@gmail.com,  juri@linkov.net
> >> Date: Mon, 05 Oct 2020 20:03:32 +0100
> >> 
> >> >> I think the easiest way to make this function is to give it a buffer
> >> >> where text exists as buffer text and truncate-lines is what it it.  Then
> >> >> it can say exactly where it _would_ cut off.
> >> >
> >> > That doesn't work for displaying text with continuation lines, does
> >> > it?
> >> 
> >> I'm not sure what you mean.  Maybe?  Can you provide an example?  The
> >> idea is to use this buffer to "stage" what needs to be displayed, and
> >> gather guiding information from that, not necessarily to _do_ that
> >> displaying on that particular "stage".
> >
> > If the real buffer will be displayed without truncating lines, then
> > each physical line might take more than one screen line.  You need to
> > account for that when you decide where to truncate.
> 
> Yes, but presumably, the (vapourware) function we are talking about
> would interpret the value of truncate-lines "in the stage", and you'd
> set that to the same value that you plan to use in the "real buffer".

I guess I misunderstand your original proposal: did you mean to leave
truncate-lines at its value in the window where the text will be
displayed?  If so, that's OK, but then why did you mentioned that
variable? there are many more that affect the display, and they all
should be left at their values in the window.

In a nutshell, the function we are discussing should get the window in
which the text will be displayed as the argument, so that its layout
calculations are accurate.  The code should be very similar to
window-text-pixel-size, just the stop condition should be different.



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

* Re: feature/icomplete-vertical
  2020-10-05 19:24                                                       ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 19:32                                                         ` João Távora
  2020-10-06  6:16                                                           ` feature/icomplete-vertical Eli Zaretskii
  2020-10-05 19:44                                                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  1 sibling, 1 reply; 118+ messages in thread
From: João Távora @ 2020-10-05 19:32 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, spacibba, juri, casouri, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> I think can understand some of Gregory's frustration.  If those problems
>> are real, it should be possible to showcase them.
> The second one was showcased by Gregory himself.

If I read that correctly that was a synthethic, not a real-life example.

> Sorry, I'm unable to encourage Gregory to understand the shortcomings,
> no matter how much I tried, I guess it's my fault.

It's not a question of "fault" or persuasion, it's a simple question
that code speaks louder than words: good examples can be taken through a
debugger and revealing where in actual code the shortcomings of a given
approach manifests themselves.

> Although it sounds like the same situation is repeating with Martin's
> advice regarding mini-window resizing, so maybe it isn't entirely my
> fault after all.

If I read correctly, Martin reinforced how non-trivial calculations
regarding mini-window sizing is, thus _strenghtening_ the case for
having a solution where the application isn't responsible for that, as
you suggest.

João



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

* Re: feature/icomplete-vertical
  2020-10-05 19:30                                                     ` feature/icomplete-vertical Eli Zaretskii
@ 2020-10-05 19:36                                                       ` João Távora
  0 siblings, 0 replies; 118+ messages in thread
From: João Távora @ 2020-10-05 19:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ghe, spacibba, juri, casouri, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

> I guess I misunderstand your original proposal: did you mean to leave
> truncate-lines at its value in the window where the text will be
> displayed?  If so, that's OK, but then why did you mentioned that
> variable? there are many more that affect the display, and they all
> should be left at their values in the window.

I mentioned it because it's a particularly notable one (and I'm not
immediately familiar with many others).  Didn't imagine it would throw
you off, sorry.

> In a nutshell, the function we are discussing should get the window in
> which the text will be displayed as the argument, so that its layout
> calculations are accurate.  The code should be very similar to
> window-text-pixel-size, just the stop condition should be different.

Yes, exactly.

João



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

* Re: feature/icomplete-vertical
  2020-10-05 19:24                                                       ` feature/icomplete-vertical Eli Zaretskii
  2020-10-05 19:32                                                         ` feature/icomplete-vertical João Távora
@ 2020-10-05 19:44                                                         ` Gregory Heytings via Emacs development discussions.
  2020-10-05 19:49                                                           ` feature/icomplete-vertical João Távora
  2020-10-06  6:20                                                           ` feature/icomplete-vertical Eli Zaretskii
  1 sibling, 2 replies; 118+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-10-05 19:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: João Távora, spacibba, emacs-devel, casouri, juri


>>> I'm not sure what detail I need to provide.  Isn't it clear that using 
>>> a buffer-local variable doesn't resolve problems with using that same 
>>> buffer in another level of recursive-edit?  Or that changing the 
>>> window-start position from under the feet of the display engine is 
>>> something that should be avoided?  Why would you need examples to 
>>> realize that a design based on this cannot be clean, in the sense that 
>>> use cases where it causes trouble will eventually surface?
>>
>> I think can understand some of Gregory's frustration.  If those 
>> problems are real, it should be possible to showcase them.
>
> The second one was showcased by Gregory himself.
>

It's unbelievable you dare to write such a sentence, and from my point of 
view makes it clear how hard it is to have a discussion with you.  For 
those who are not aware of the context:

- I explained (to Stefan) what a part of my code did, and said "it does 
this because otherwise point could become invisible during a second or 
two"

- Eli jumps in the conversation and says "no, that's not possible, point 
can never become invisible, if it does it's a bug, please tell me how this 
can happen"

- I write a recipe to demonstrate how this can happen

- Eli replies that, even though point becomes invisible with the recipe, 
this is after all not a bug, and that the bug is in the recipe

- Eli now uses the recipe I sent him as an argument to explain that my 
code, in which I (obviously) do not do what I did in the recipe, can cause 
"potential problems"

How could anyone remain calm with this?  I can't.



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

* Re: feature/icomplete-vertical
  2020-10-05 19:44                                                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
@ 2020-10-05 19:49                                                           ` João Távora
  2020-10-06  6:20                                                           ` feature/icomplete-vertical Eli Zaretskii
  1 sibling, 0 replies; 118+ messages in thread
From: João Távora @ 2020-10-05 19:49 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: Eli Zaretskii, Juri Linkov, Yuan Fu, Ergus, emacs-devel

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

On Mon, Oct 5, 2020 at 8:44 PM Gregory Heytings <ghe@sdf.org> wrote:

>
> How could anyone remain calm with this?  I can't.
>

But please do :-)

João

[-- Attachment #2: Type: text/html, Size: 505 bytes --]

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

* Re: feature/icomplete-vertical
  2020-10-05 19:32                                                         ` feature/icomplete-vertical João Távora
@ 2020-10-06  6:16                                                           ` Eli Zaretskii
  0 siblings, 0 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-06  6:16 UTC (permalink / raw)
  To: João Távora; +Cc: ghe, spacibba, juri, casouri, emacs-devel

> From: João Távora <joaotavora@gmail.com>
> Cc: ghe@sdf.org,  spacibba@aol.com,  emacs-devel@gnu.org,
>   casouri@gmail.com,  juri@linkov.net
> Date: Mon, 05 Oct 2020 20:32:26 +0100
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> I think can understand some of Gregory's frustration.  If those problems
> >> are real, it should be possible to showcase them.
> > The second one was showcased by Gregory himself.
> 
> If I read that correctly that was a synthethic, not a real-life example.

I fail to see how that is a disadvantage.  Most examples that
illustrate some point are synthetic, because real-life examples run
the risk of hiding the important stuff behind gobs of irrelevant code.
That's why, for example, we ask for simple reproduction recipes when
people report bugs.

> > Sorry, I'm unable to encourage Gregory to understand the shortcomings,
> > no matter how much I tried, I guess it's my fault.
> 
> It's not a question of "fault" or persuasion, it's a simple question
> that code speaks louder than words: good examples can be taken through a
> debugger and revealing where in actual code the shortcomings of a given
> approach manifests themselves.

I'm sorry, but I can only afford hand-holding up to a limit.  I
provided explanations and described how the relevant parts of the
display engine work.  I also reiterated considerations that should be
apparent even without any details, such as that global variables get
in the way of reentrancy, even if they are buffer-local variables.  I
invite you to read the 3 relevant threads and see for yourself.  If
that is not enough, and if the Emacs code doesn't speak loud enough to
be of help, then Gregory should simply take my word for it, as someone
who has many more hours hacking Emacs than he does.  I simply cannot
afford investing so much of the little time I have into educating
people here, and expecting that would be unreasonable and even unfair.

> > Although it sounds like the same situation is repeating with Martin's
> > advice regarding mini-window resizing, so maybe it isn't entirely my
> > fault after all.
> 
> If I read correctly, Martin reinforced how non-trivial calculations
> regarding mini-window sizing is, thus _strenghtening_ the case for
> having a solution where the application isn't responsible for that, as
> you suggest.

That's not my interpretation.  Gregory said that measuring the
pixel-size of text is hard, to which Martin replied that resizing the
mini-window accurately can be even harder.  Then Gregory dismissed
Martin's opinion out of hand.  Martin has more experience with the
window- and frame-related code in Emacs than all the rest of us, so
dismissing his opinions on that is not recommended.



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

* Re: feature/icomplete-vertical
  2020-10-05 19:44                                                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
  2020-10-05 19:49                                                           ` feature/icomplete-vertical João Távora
@ 2020-10-06  6:20                                                           ` Eli Zaretskii
  1 sibling, 0 replies; 118+ messages in thread
From: Eli Zaretskii @ 2020-10-06  6:20 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: spacibba, juri, casouri, joaotavora, emacs-devel

> Date: Mon, 05 Oct 2020 19:44:37 +0000
> From: Gregory Heytings <ghe@sdf.org>
> cc: João Távora <joaotavora@gmail.com>, spacibba@aol.com,
>         emacs-devel@gnu.org, casouri@gmail.com, juri@linkov.net
> 
> - Eli now uses the recipe I sent him as an argument to explain that my 
> code, in which I (obviously) do not do what I did in the recipe, can cause 
> "potential problems"

That's not what I said in response to João.  I said that the recipe
showcases how using window-scroll-functions to affect redisplay can
cause bugs.



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

end of thread, other threads:[~2020-10-06  6:20 UTC | newest]

Thread overview: 118+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-12 13:10 feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-12 13:33 ` feature/icomplete-vertical Ergus
2020-09-12 14:30   ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-14  6:44   ` feature/icomplete-vertical jixiuf
2020-09-14  7:08     ` feature/icomplete-vertical Ergus
2020-09-14 15:02     ` feature/icomplete-vertical Ergus
2020-09-14 17:13       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-14 17:31         ` feature/icomplete-vertical Ergus
2020-09-16 15:22       ` feature/icomplete-vertical jixiuf
     [not found]         ` <20200918005354.muskx2b7tssyqzzk@Ergus>
2020-09-18  3:08           ` feature/icomplete-vertical jixiuf
2020-09-18 11:58             ` feature/icomplete-vertical Ergus
2020-09-18 17:05             ` feature/icomplete-vertical Ergus
2020-09-18 19:52               ` feature/icomplete-vertical Eli Zaretskii
2020-09-20 10:55   ` feature/icomplete-vertical João Távora
2020-09-20 13:04     ` feature/icomplete-vertical Ergus
2020-09-20 13:15       ` feature/icomplete-vertical Eli Zaretskii
2020-09-20 13:37         ` feature/icomplete-vertical Ergus
2020-09-20 14:07         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-20 14:28           ` feature/icomplete-vertical Eli Zaretskii
2020-09-20 15:04             ` feature/icomplete-vertical Ergus
2020-09-20 15:54               ` feature/icomplete-vertical Eli Zaretskii
2020-09-20 16:13                 ` feature/icomplete-vertical Ergus
2020-09-20 17:09             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-20 17:43               ` feature/icomplete-vertical Eli Zaretskii
2020-10-01 16:48                 ` feature/icomplete-vertical Ergus
2020-10-02  4:45                   ` feature/icomplete-vertical jixiuf
2020-10-03  2:13                     ` feature/icomplete-vertical Ergus
2020-10-04 23:47                   ` feature/icomplete-vertical João Távora
2020-10-05  4:48                     ` feature/icomplete-vertical Ergus
2020-10-05  9:06                       ` feature/icomplete-vertical João Távora
2020-10-05 12:23                         ` feature/icomplete-vertical Ergus
2020-10-05 12:28                           ` feature/icomplete-vertical João Távora
2020-10-05 12:52                             ` feature/icomplete-vertical Ergus
2020-10-05  5:45                     ` feature/icomplete-vertical Eli Zaretskii
2020-10-05  9:13                       ` feature/icomplete-vertical João Távora
2020-10-05  9:46                         ` feature/icomplete-vertical Eli Zaretskii
2020-10-05  9:57                           ` feature/icomplete-vertical João Távora
2020-10-05 10:11                             ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 10:52                               ` feature/icomplete-vertical João Távora
2020-10-05 11:00                                 ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 11:11                                   ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-10-05 11:33                                     ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 11:48                                       ` feature/icomplete-vertical João Távora
2020-10-05 17:59                                     ` feature/icomplete-vertical martin rudalics
2020-10-05 18:24                                       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-10-05 11:24                                   ` feature/icomplete-vertical João Távora
2020-10-05 11:45                                     ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 11:54                                       ` feature/icomplete-vertical João Távora
2020-10-05 12:05                                         ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 13:07                                           ` feature/icomplete-vertical João Távora
2020-10-05 13:25                                             ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 19:03                                               ` feature/icomplete-vertical João Távora
2020-10-05 19:12                                                 ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 19:19                                                   ` feature/icomplete-vertical João Távora
2020-10-05 19:30                                                     ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 19:36                                                       ` feature/icomplete-vertical João Távora
2020-10-05 11:02                                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-10-05 11:32                                   ` feature/icomplete-vertical João Távora
2020-10-05 11:54                                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-10-05 11:58                                       ` feature/icomplete-vertical João Távora
2020-10-05 12:02                                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-10-05 12:07                                           ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 12:25                                             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-10-05 12:33                                               ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 13:19                                                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-10-05 13:44                                                   ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 19:14                                                     ` feature/icomplete-vertical João Távora
2020-10-05 19:24                                                       ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 19:32                                                         ` feature/icomplete-vertical João Távora
2020-10-06  6:16                                                           ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 19:44                                                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-10-05 19:49                                                           ` feature/icomplete-vertical João Távora
2020-10-06  6:20                                                           ` feature/icomplete-vertical Eli Zaretskii
2020-10-05 13:13                               ` feature/icomplete-vertical Stefan Monnier
2020-10-05  7:52                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-10-05  8:22                       ` feature/icomplete-vertical Manuel Uberti
2020-10-05  9:40                       ` feature/icomplete-vertical João Távora
2020-10-05 10:53                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-20 14:49           ` feature/icomplete-vertical Ergus
2020-09-20 15:46             ` feature/icomplete-vertical Eli Zaretskii
2020-09-18 21:39 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-18 23:27   ` feature/icomplete-vertical Stefan Monnier
2020-09-19  1:59   ` feature/icomplete-vertical Ergus
2020-09-19  4:03     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-19  6:15       ` feature/icomplete-vertical Ergus
2020-09-19  8:35         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-19 10:30           ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-19 11:19             ` feature/icomplete-vertical Ergus
2020-09-19 11:56               ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-19 12:57                 ` feature/icomplete-vertical Ergus
2020-09-19 11:43             ` feature/icomplete-vertical Ergus
2020-09-19 13:00               ` feature/icomplete-vertical Stefan Monnier
2020-09-19 13:42                 ` feature/icomplete-vertical Ergus
2020-09-19 15:35                   ` feature/icomplete-vertical Stefan Monnier
2020-09-19 13:59                 ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-19 14:43                   ` feature/icomplete-vertical Ergus
2020-09-19 15:37                   ` feature/icomplete-vertical Stefan Monnier
2020-09-19 15:49                     ` feature/icomplete-vertical Ergus
2020-09-19 16:01                       ` feature/icomplete-vertical Stefan Monnier
2020-09-19 16:05                         ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-19 16:15                           ` feature/icomplete-vertical Stefan Monnier
2020-09-19 16:19                             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-19 16:58                               ` feature/icomplete-vertical Eli Zaretskii
2020-09-19 17:06                                 ` feature/icomplete-vertical Ergus
2020-09-19 17:21                                   ` feature/icomplete-vertical Eli Zaretskii
2020-09-19 20:47                                     ` feature/icomplete-vertical Ergus
2020-09-19 22:07                                       ` feature/icomplete-vertical Stefan Monnier
2020-09-20  5:31                                       ` feature/icomplete-vertical Eli Zaretskii
2020-09-20 10:47                                       ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-20 13:04                                         ` feature/icomplete-vertical Ergus
2020-09-19 21:40                                     ` feature/icomplete-vertical Dmitry Gutov
2020-09-20  5:45                                       ` feature/icomplete-vertical Eli Zaretskii
2020-09-19 15:55                     ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-19 10:47           ` feature/icomplete-vertical Ergus
2020-09-19 17:08           ` feature/icomplete-vertical Drew Adams
2020-09-20  0:28             ` feature/icomplete-vertical Gregory Heytings via Emacs development discussions.
2020-09-20  1:18               ` feature/icomplete-vertical Drew Adams
  -- strict thread matches above, loose matches on Subject: below --
2020-10-02  6:37 feature/icomplete-vertical Manuel Uberti

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