unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Incrementally display the Emacs command list filtered out by the input key words in real-time.
@ 2021-07-02  5:22 Hongyi Zhao
  2021-07-02  6:25 ` Eli Zaretskii
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Hongyi Zhao @ 2021-07-02  5:22 UTC (permalink / raw)
  To: help-gnu-emacs

Say, when I input "foo bar", the matched command list are
incrementally displayed immediately, and finally the ones which
including "foo" and "bar" in any part of the candidate commands are
filtered out. How do I configure my init file to implement this
feature?

Regards
-- 
Assoc. Prof. Hongyi Zhao <hongyi.zhao@gmail.com>
Theory and Simulation of Materials
Hebei Vocational University of Technology and Engineering
NO. 552 North Gangtie Road, Xingtai, China



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

* Re: Incrementally display the Emacs command list filtered out by the input key words in real-time.
  2021-07-02  5:22 Incrementally display the Emacs command list filtered out by the input key words in real-time Hongyi Zhao
@ 2021-07-02  6:25 ` Eli Zaretskii
  2021-07-02  7:23   ` Hongyi Zhao
  2021-07-02 14:43 ` [External] : " Drew Adams
  2021-07-03 18:49 ` Marcin Borkowski
  2 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2021-07-02  6:25 UTC (permalink / raw)
  To: help-gnu-emacs

> From: Hongyi Zhao <hongyi.zhao@gmail.com>
> Date: Fri, 2 Jul 2021 13:22:11 +0800
> 
> Say, when I input "foo bar", the matched command list are
> incrementally displayed immediately, and finally the ones which
> including "foo" and "bar" in any part of the candidate commands are
> filtered out. How do I configure my init file to implement this
> feature?

Explore the various completion styles, perhaps rearranging their order
in the variable completion-styles (see its doc string and the
documentation in the user manual for details).

And maybe try an alternative completion mode, like icompletion-mode.



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

* Re: Incrementally display the Emacs command list filtered out by the input key words in real-time.
  2021-07-02  6:25 ` Eli Zaretskii
@ 2021-07-02  7:23   ` Hongyi Zhao
  2021-07-02 12:40     ` Tassilo Horn
  0 siblings, 1 reply; 9+ messages in thread
From: Hongyi Zhao @ 2021-07-02  7:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: help-gnu-emacs

On Fri, Jul 2, 2021 at 2:26 PM Eli Zaretskii <eliz@gnu.org> wrote:
>
> > From: Hongyi Zhao <hongyi.zhao@gmail.com>
> > Date: Fri, 2 Jul 2021 13:22:11 +0800
> >
> > Say, when I input "foo bar", the matched command list are
> > incrementally displayed immediately, and finally the ones which
> > including "foo" and "bar" in any part of the candidate commands are
> > filtered out. How do I configure my init file to implement this
> > feature?
>
> Explore the various completion styles, perhaps rearranging their order
> in the variable completion-styles (see its doc string and the
> documentation in the user manual for details).

I tried the following code snippet posted at
<https://emacs.stackexchange.com/questions/13500/fuzzy-completion-style>,
but there is no effect at all:

(defun completion-naive-fuzzy-completion (string table predicate point
                                                 &optional all-p)
  (let* ((beforepoint (substring string 0 point))
         (afterpoint (substring string point))
         (boundaries (completion-boundaries beforepoint table
predicate afterpoint))
         (prefix (substring beforepoint 0 (car boundaries)))
         (infix (concat
                 (substring beforepoint (car boundaries))
                 (substring afterpoint 0 (cdr boundaries))))
         (suffix (substring afterpoint (cdr boundaries)))
         ;; |-              string                  -|
         ;;              point^
         ;;            |-  boundaries -|
         ;; |- prefix -|-    infix    -|-  suffix   -|
         ;;
         ;; Infix is the part supposed to be completed by table, AFAIKT.
         (regexp (concat "\\`"
                         (mapconcat
                          (lambda (x)
                            (concat "[^" (string x) "]*?" (string x)))
                          infix
                          "")
                         ".*\\'"))
         (candidates (cl-remove-if-not
                      (apply-partially 'string-match-p regexp)
                      (all-completions prefix table predicate))))
    (if all-p
        ;; Implement completion-all-completions interface
        (when candidates
          ;; Not doing this may result in an error.
          (setcdr (last candidates) (length prefix))
          candidates)
      ;; Implement completion-try-completions interface
      (cond
       ((and (= (length candidates) 1)
             (equal infix (car candidates)))
        t)
       ((= (length candidates) 1)
        ;; Avoid quirk of double / for filename completion. I don't
        ;; know how this is *supposed* to be handled.
        (when (and (> (length (car candidates)) 0)
                   (> (length suffix) 0)
                   (char-equal (aref (car candidates)
                                     (1- (length (car candidates))))
                               (aref suffix 0)))
          (setq suffix (substring suffix 1)))
        (cons (concat prefix (car candidates) suffix)
              (length (concat prefix (car candidates)))))
       ;; Do nothing, i.e leave string as it is.
       (t (cons string point))))))

(defun completion-naive-fuzzy-try-completion (string table predicate point)
  (completion-naive-fuzzy-completion string table predicate point))
(defun completion-naive-fuzzy-all-completions (string table predicate point)
  (completion-naive-fuzzy-completion string table predicate point 'all))

(add-to-list 'completion-styles-alist
             '(naive-fuzzy
               completion-naive-fuzzy-try-completion
               completion-naive-fuzzy-all-completions
               "Simple naive-fuzzy completion, which never alters the
string to complete, unless a unique match exists."))

;; (setq-local completion-styles '(naive-fuzzy))

HY
>
> And maybe try an alternative completion mode, like icompletion-mode.
>

-- 
Assoc. Prof. Hongyi Zhao <hongyi.zhao@gmail.com>
Theory and Simulation of Materials
Hebei Vocational University of Technology and Engineering
NO. 552 North Gangtie Road, Xingtai, China



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

* Re: Incrementally display the Emacs command list filtered out by the input key words in real-time.
  2021-07-02  7:23   ` Hongyi Zhao
@ 2021-07-02 12:40     ` Tassilo Horn
  2021-07-02 15:27       ` Hongyi Zhao
  0 siblings, 1 reply; 9+ messages in thread
From: Tassilo Horn @ 2021-07-02 12:40 UTC (permalink / raw)
  To: help-gnu-emacs

Hongyi Zhao <hongyi.zhao@gmail.com> writes:

> I tried the following code snippet posted at
> <https://emacs.stackexchange.com/questions/13500/fuzzy-completion-style>,
> but there is no effect at all:

Emacs already has a fuzzy completion style (see the `flex' entry in
`completion-styles-alist'), no need to copy&paste some 6 year old
implementation from the internet.

> (add-to-list 'completion-styles-alist
>              '(naive-fuzzy
>                completion-naive-fuzzy-try-completion
>                completion-naive-fuzzy-all-completions
>                "Simple naive-fuzzy completion, which never alters the
> string to complete, unless a unique match exists."))
>
> ;; (setq-local completion-styles '(naive-fuzzy))

Try (setq completion-styles '(flex)).  But note that the used
`completion-styles' just defines how the input is matched against the
things to be completed, i.e., you'll see no visual difference.  See the
manual at (info "(emacs) Completion Styles").

To have a more visual UI, follow Eli's advice:

>> And maybe try an alternative completion mode, like icompletion-mode.

It is called `icomplete-mode'.

Another very nice UI is the `vertico' package from GNU ELPA.  Other
popular choices include ivy, selectrum, etc.

Bye,
Tassilo



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

* RE: [External] : Incrementally display the Emacs command list filtered out by the input key words in real-time.
  2021-07-02  5:22 Incrementally display the Emacs command list filtered out by the input key words in real-time Hongyi Zhao
  2021-07-02  6:25 ` Eli Zaretskii
@ 2021-07-02 14:43 ` Drew Adams
  2021-07-02 15:40   ` Hongyi Zhao
  2021-07-03 18:49 ` Marcin Borkowski
  2 siblings, 1 reply; 9+ messages in thread
From: Drew Adams @ 2021-07-02 14:43 UTC (permalink / raw)
  To: Hongyi Zhao, help-gnu-emacs

> Say, when I input "foo bar", the matched command
> list are incrementally displayed immediately, and
> finally the ones which including "foo" and "bar"
> in any part of the candidate commands are filtered
> out. How do I configure my init file to implement
> this feature?

Not too sure what you're asking for.

1. You say you want to first see command-name
   matches for input `foo bar'.
2. But then you say you want command names that
   contain either `foo' or `bar' to be filtered
   out (i.e., excluded).

Those two seem contradictory.  The first seems
unnecessary - undone by the second.  But maybe
you just want to see all command names at first,
for some reason.

Anyway, if what you want is instead something
like this:

1. You see all command names initially.
2. You type something to exclude the names that
   contain either `foo' or `bar'.

Then that's trivial if you use Icicles.

1. To see all completions initially, set or bind
   variable `icicle-show-Completions-initially-flag'
   to non-nil.

2. To exclude matches of some pattern (e.g. `foo'):

   a. Type the pattern, to see _only_ its matches.
   b. Use `C-~' to get the complement, i.e., to
      subtract those matches from the previous set
      of matches. 

E.g., to exclude all matches for `foo' or `bar'
(anywhere in the command name, i.e., in any order):

1. Type `foo C-~' to see all except `foo' matches.
2. Type `bar C-~' to see all except matches for
   `foo' or `bar'.

See also:

* https://www.emacswiki.org/emacs/Icicles_-_Nutshell_View#ChippingAway

* https://www.emacswiki.org/emacs/Icicles_-_Candidate_Sets#SetOperations

If you don't really care to show all completions for
empty input (e.g. all command names), then leave
`icicle-show-Completions-initially-flag' nil.

By default, you can just use `TAB' or `S-TAB' to
initiate completion.  Doing that once suffices:
completions are then updated automatically as you
change your minibuffer input.

If you want completions to be updated automatically
whenever you change minibuffer input without having
to use `TAB' or `S-TAB', but you don't want to show
completions initially (i.e., with empty input), then
set variable `icicle-incremental-completion' to
non-nil and non-t (the default value is `t').

[You can cycle its value any time, using `C-#' during
completion: OFF, ON (initiated by `TAB' or `S-TAB'),
or eager (initiated by typing anything).]

See: https://www.emacswiki.org/emacs/Icicles_-_Icompletion#IncrementalCompletion

___

There is, BTW, no "fuzzy" matching involved in
your example of excluding `foo' and `bar' matches.
However, Icicles does support fuzzy matching -
seven kinds of fuzzy matching, in fact.

See https://www.emacswiki.org/emacs/Icicles_-_Completion_Methods_and_Styles#FuzzyCompletion

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

* Re: Incrementally display the Emacs command list filtered out by the input key words in real-time.
  2021-07-02 12:40     ` Tassilo Horn
@ 2021-07-02 15:27       ` Hongyi Zhao
  0 siblings, 0 replies; 9+ messages in thread
From: Hongyi Zhao @ 2021-07-02 15:27 UTC (permalink / raw)
  To: Tassilo Horn; +Cc: help-gnu-emacs

On Fri, Jul 2, 2021 at 8:51 PM Tassilo Horn <tsdh@gnu.org> wrote:
>
> Hongyi Zhao <hongyi.zhao@gmail.com> writes:
>
> > I tried the following code snippet posted at
> > <https://emacs.stackexchange.com/questions/13500/fuzzy-completion-style>,
> > but there is no effect at all:
>
> Emacs already has a fuzzy completion style (see the `flex' entry in
> `completion-styles-alist'), no need to copy&paste some 6 year old
> implementation from the internet.
>
> > (add-to-list 'completion-styles-alist
> >              '(naive-fuzzy
> >                completion-naive-fuzzy-try-completion
> >                completion-naive-fuzzy-all-completions
> >                "Simple naive-fuzzy completion, which never alters the
> > string to complete, unless a unique match exists."))
> >
> > ;; (setq-local completion-styles '(naive-fuzzy))
>
> Try (setq completion-styles '(flex)).  But note that the used
> `completion-styles' just defines how the input is matched against the
> things to be completed, i.e., you'll see no visual difference.  See the
> manual at (info "(emacs) Completion Styles").
>
> To have a more visual UI, follow Eli's advice:
>
> >> And maybe try an alternative completion mode, like icompletion-mode.
>
> It is called `icomplete-mode'.
>
> Another very nice UI is the `vertico' package from GNU ELPA.  Other
> popular choices include ivy, selectrum, etc.

Thank you very much for providing me with all kinds of information on
the packages which can achieve this aim. Based on my tries, it seems
that the ivy package, <https://github.com/abo-abo/swiper>, is one of
the most powerful one for this purpose. And the following simple
configuration can achieve the effect described here:

;;;
(straight-use-package
 `(swiper :type git :host github :repo "abo-abo/swiper"
    :pre-build (
               ;("bash" "-c" "cd ~/.emacs.d/straight/repos/swiper")
               ;https://github.com/abo-abo/swiper/issues/2886#issuecomment-860605327
               ("make" "deps")
               ("make" "compile")
               )))

(require 'ivy)
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq ivy-count-format "(%d/%d) ")
;;;

HY
-- 
Assoc. Prof. Hongyi Zhao <hongyi.zhao@gmail.com>
Theory and Simulation of Materials
Hebei Vocational University of Technology and Engineering
NO. 552 North Gangtie Road, Xingtai, China



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

* Re: [External] : Incrementally display the Emacs command list filtered out by the input key words in real-time.
  2021-07-02 14:43 ` [External] : " Drew Adams
@ 2021-07-02 15:40   ` Hongyi Zhao
  0 siblings, 0 replies; 9+ messages in thread
From: Hongyi Zhao @ 2021-07-02 15:40 UTC (permalink / raw)
  To: Drew Adams; +Cc: help-gnu-emacs

On Fri, Jul 2, 2021 at 10:43 PM Drew Adams <drew.adams@oracle.com> wrote:
>
> > Say, when I input "foo bar", the matched command
> > list are incrementally displayed immediately, and
> > finally the ones which including "foo" and "bar"
> > in any part of the candidate commands are filtered
> > out. How do I configure my init file to implement
> > this feature?
>
> Not too sure what you're asking for.
>
> 1. You say you want to first see command-name
>    matches for input `foo bar'.
> 2. But then you say you want command names that
>    contain either `foo' or `bar' to be filtered
>    out (i.e., excluded).
>

Sorry for my misleading/erroneous description. I mean 1. above-mentioned by you.


> Those two seem contradictory.  The first seems
> unnecessary - undone by the second.  But maybe
> you just want to see all command names at first,
> for some reason.
>
> Anyway, if what you want is instead something
> like this:
>
> 1. You see all command names initially.
> 2. You type something to exclude the names that
>    contain either `foo' or `bar'.
>
> Then that's trivial if you use Icicles.
>
> 1. To see all completions initially, set or bind
>    variable `icicle-show-Completions-initially-flag'
>    to non-nil.
>
> 2. To exclude matches of some pattern (e.g. `foo'):
>
>    a. Type the pattern, to see _only_ its matches.
>    b. Use `C-~' to get the complement, i.e., to
>       subtract those matches from the previous set
>       of matches.
>
> E.g., to exclude all matches for `foo' or `bar'
> (anywhere in the command name, i.e., in any order):
>
> 1. Type `foo C-~' to see all except `foo' matches.
> 2. Type `bar C-~' to see all except matches for
>    `foo' or `bar'.
>
> See also:
>
> * https://www.emacswiki.org/emacs/Icicles_-_Nutshell_View#ChippingAway
>
> * https://www.emacswiki.org/emacs/Icicles_-_Candidate_Sets#SetOperations
>
> If you don't really care to show all completions for
> empty input (e.g. all command names), then leave
> `icicle-show-Completions-initially-flag' nil.
>
> By default, you can just use `TAB' or `S-TAB' to
> initiate completion.  Doing that once suffices:
> completions are then updated automatically as you
> change your minibuffer input.
>
> If you want completions to be updated automatically
> whenever you change minibuffer input without having
> to use `TAB' or `S-TAB', but you don't want to show
> completions initially (i.e., with empty input), then
> set variable `icicle-incremental-completion' to
> non-nil and non-t (the default value is `t').
>
> [You can cycle its value any time, using `C-#' during
> completion: OFF, ON (initiated by `TAB' or `S-TAB'),
> or eager (initiated by typing anything).]
>
> See: https://www.emacswiki.org/emacs/Icicles_-_Icompletion#IncrementalCompletion
>
> ___
>
> There is, BTW, no "fuzzy" matching involved in
> your example of excluding `foo' and `bar' matches.
> However, Icicles does support fuzzy matching -
> seven kinds of fuzzy matching, in fact.
>
> See https://www.emacswiki.org/emacs/Icicles_-_Completion_Methods_and_Styles#FuzzyCompletion

Thank you again for letting me know there are so many choices to
achieve this aim. Based on another hint/suggestion given by
Tassilo Horn <tsdh@gnu.org>, I'm currently using the following
settings to obtain this effect:

;;;
(straight-use-package
 `(swiper :type git :host github :repo "abo-abo/swiper"
    :pre-build (
               ;("bash" "-c" "cd ~/.emacs.d/straight/repos/swiper")
               ;https://github.com/abo-abo/swiper/issues/2886#issuecomment-860605327
               ("make" "deps")
               ("make" "compile")
               )))

(require 'ivy)
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq ivy-count-format "(%d/%d) ")
;;;

Regards
--
Assoc. Prof. Hongyi Zhao <hongyi.zhao@gmail.com>
Theory and Simulation of Materials
Hebei Vocational University of Technology and Engineering
NO. 552 North Gangtie Road, Xingtai, China



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

* Re: Incrementally display the Emacs command list filtered out by the input key words in real-time.
  2021-07-02  5:22 Incrementally display the Emacs command list filtered out by the input key words in real-time Hongyi Zhao
  2021-07-02  6:25 ` Eli Zaretskii
  2021-07-02 14:43 ` [External] : " Drew Adams
@ 2021-07-03 18:49 ` Marcin Borkowski
  2021-07-03 23:39   ` Hongyi Zhao
  2 siblings, 1 reply; 9+ messages in thread
From: Marcin Borkowski @ 2021-07-03 18:49 UTC (permalink / raw)
  To: Hongyi Zhao; +Cc: help-gnu-emacs


On 2021-07-02, at 07:22, Hongyi Zhao <hongyi.zhao@gmail.com> wrote:

> Say, when I input "foo bar", the matched command list are
> incrementally displayed immediately, and finally the ones which
> including "foo" and "bar" in any part of the candidate commands are
> filtered out. How do I configure my init file to implement this
> feature?

Install Ivy?

Hth,

-- 
Marcin Borkowski
http://mbork.pl



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

* Re: Incrementally display the Emacs command list filtered out by the input key words in real-time.
  2021-07-03 18:49 ` Marcin Borkowski
@ 2021-07-03 23:39   ` Hongyi Zhao
  0 siblings, 0 replies; 9+ messages in thread
From: Hongyi Zhao @ 2021-07-03 23:39 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: help-gnu-emacs

On Sun, Jul 4, 2021 at 2:49 AM Marcin Borkowski <mbork@mbork.pl> wrote:
>
>
> On 2021-07-02, at 07:22, Hongyi Zhao <hongyi.zhao@gmail.com> wrote:
>
> > Say, when I input "foo bar", the matched command list are
> > incrementally displayed immediately, and finally the ones which
> > including "foo" and "bar" in any part of the candidate commands are
> > filtered out. How do I configure my init file to implement this
> > feature?
>
> Install Ivy?

Yes. It does the trick, as I've posted here. But what about helm for
this purpose?

Regards
-- 
Assoc. Prof. Hongyi Zhao <hongyi.zhao@gmail.com>
Theory and Simulation of Materials
Hebei Vocational University of Technology and Engineering
NO. 552 North Gangtie Road, Xingtai, China



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

end of thread, other threads:[~2021-07-03 23:39 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-07-02  5:22 Incrementally display the Emacs command list filtered out by the input key words in real-time Hongyi Zhao
2021-07-02  6:25 ` Eli Zaretskii
2021-07-02  7:23   ` Hongyi Zhao
2021-07-02 12:40     ` Tassilo Horn
2021-07-02 15:27       ` Hongyi Zhao
2021-07-02 14:43 ` [External] : " Drew Adams
2021-07-02 15:40   ` Hongyi Zhao
2021-07-03 18:49 ` Marcin Borkowski
2021-07-03 23:39   ` Hongyi Zhao

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