Subject: Re: bug#73656: 30.0.91; icomplete-vertical has no matches for M-x man RET chdir

From: Eli Zaretskii <[email-masked]>
Date: Sat, 16 Nov 2024 15:43:59 +0200

Ping! Can you try this patch?  If it solves the problem, I'd like us
to install it.

> From: Stefan Monnier <[email-masked]>
> Cc: [email-masked],  [email-masked]
> Date: Fri, 01 Nov 2024 13:52:55 -0400
> 
> > On NetBSD the patch fails to generate the icomplete-vertical-mode
> > autocomplete for "chd" when invoked in "emacs -Q" session.  The man.elc
> > file was byte recompiled.
> 
> I meant for the patch to be read rather than applied.
> Also, what value do you get for `Man-man-k-flags`?
> 
> > On debian the patch also fails.
> 
> Yes, there was a trivial error.  Fixed in the patch below.
> 
> 
>         Stefan
> 
> 
> diff --git a/lisp/man.el b/lisp/man.el
> index 816c75d749c..d5ac8b93d99 100644
> --- a/lisp/man.el
> +++ b/lisp/man.el
> @@ -973,6 +973,27 @@ Man-parse-man-k
>                (search-forward-regexp "\\=, *\\([^ \t,]+\\)" bound t)))))
>      (nreverse table)))
>  
> +(defvar Man-man-k-flags
> +  ;; It's not clear which man page will "always" be available, `man -k man'
> +  ;; seems like the safest choice, but `man -k apropos' seems almost as safe
> +  ;; and usually returns a much shorter output.
> +  (with-temp-buffer
> +    (with-demoted-errors "%S" (call-process "man" nil t nil "-k" "apropos"))
> +    (let ((lines (count-lines (point-min) (point-max)))
> +          (completions (Man-parse-man-k)))
> +      (if (>= (length completions) lines)
> +          '("-k") ;; "-k" seems to return sane results: look no further!
> +        (erase-buffer)
> +        ;; Try "-k -l" (bug#73656).
> +        (with-demoted-errors "%S" (call-process "man" nil t nil
> +                                                "-k" "-l" "apropos"))
> +        (let ((lines (count-lines (point-min) (point-max)))
> +              (completions (Man-parse-man-k)))
> +          (if (and (> lines 0) (>= (length completions) lines))
> +              '("-k" "-l") ;; "-k -l" seems to return sane results.
> +            '("-k"))))))
> +  "List of arguments to pass to get the expected \"man -k\" output.")
> +
>  (defun Man-completion-table (string pred action)
>    (cond
>     ;; This ends up returning t for pretty much any string, and hence leads to
> @@ -1007,9 +1028,13 @@ Man-completion-table
>              ;; error later.
>              (when (eq 0
>                        (ignore-errors
> -                        (process-file
> +                        (apply
> +                         #'process-file
>                           manual-program nil '(t nil) nil
> -                         "-k" (concat (when (or Man-man-k-use-anchor
> +                         ;; FIXME: When `process-file' runs on a remote hosts,
> +                         ;; `Man-man-k-flags' may be wrong.
> +                         `(,@Man-man-k-flags
> +                           ,(concat (when (or Man-man-k-use-anchor
>                                                  (string-equal prefix ""))
>                                          "^")
>                                        (if (string-equal prefix "")
> @@ -1021,7 +1046,7 @@ Man-completion-table
>                                          ;; But we don't have that, and
>                                          ;; shell-quote-argument does
>                                          ;; the job...
> -                                        (shell-quote-argument prefix))))))
> +                                      (shell-quote-argument prefix)))))))
>                (setq table (Man-parse-man-k)))))
>  	;; Cache the table for later reuse.
>          (when table
> 
>