emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Stepping Back: A Wealth Of Completion systems Re: [ELPA] New package


From: Jean Louis
Subject: Re: Stepping Back: A Wealth Of Completion systems Re: [ELPA] New package: vertico
Date: Wed, 7 Apr 2021 22:47:57 +0300
User-agent: Mutt/2.0.6 (2021-03-06)

* Philip Kaludercic <philipk@posteo.net> [2021-04-07 22:14]:
> Daniel Mendler <mail@daniel-mendler.de> writes:
> 
> > On 4/7/21 6:20 PM, Philip Kaludercic wrote:
> >> Well that is because imenu presents the options in the minibuffer, and
> >> you have to go through the menu step-by-step. What I'm talking about is
> >> a direct hierarchical visualisation, that should be navigable with the
> >> intuitiveness of org-mode.
> >
> > This is a bit vague. If we have a tree structure one can have some
> > tree-like visualization (like the sidebar tree browsers) or have an 
> > outline like in org-mode. But how would you actually navigate quickly?
> > Using Avy-like keys? What if the structure does not fit on the screen 
> > easily, what if there are cycles, ...?
> 
> I'm still thinking about all of this, and have to find the time to
> implement a prototype. It might make sense to have a similar approach to
> completing-read, where a variable like completing-read-function can
> change everything.
> 
> A tree-like visualisation would probably make more sense, as long as it
> can be manipulated using the keyboard. I mentioned org-mode thinking of
> the org-cycle command, and how it allows you to hide and show
> subtrees.

When selecting items in tabulated-list-mode, all of them have the ID,
but some IDs have its type of being a Set or subtree. When subtree is
choosen a new frame appears with its nodes.

Similarly, completing-read could even now browse trees, it is matter
of recognizing which item belong to a tree to immediately offer
another completing-read with the nodes of the subtree. Subtrees cannot
be selected, but those nodes or candidates which are not subtrees they
can be selected.

I am using strings with IDs like "Selection candidate [123]" and that
is how I extract the ID of the item, then I can test for it if it is a
subtree or not and offer new completing read on that.

(defun string-cut-right-square-bracket-reference (s)
  "Returns the reference within square brackets on the end of S."
  (let* ((space (string-match " " (reverse s))))
    (if space
        (let* ((id (substring (reverse s) 0 space)))
          (if (and (string-match "\\[" id)
                   (string-match "\\]" id))
              (replace-regexp-in-string "\\[\\\|\\]" "" (reverse id))
            nil))
      nil)))

(string-cut-right-square-bracket-reference "Selection candidate [123]") → "123"

(setq set '(10 20))
(setq collection-data '(("Candidate A" 10)
                        ("Candidate B" 11)
                        ("Candidate C" 20)
                        ("Candidate D" 12)
                        ("Candidate E" 13)
                        ("Candidate D" 14)))
(setq collection-verify collection-data)

(setq collection nil)

(while collection-data
  (let ((item (pop collection-data)))
    (push (format "%s [%s]" (car item) (cadr item)) collection)))

(completing-read "Choose item: " collection) → "Candidate A [10]"

Concept is here:

(defun completing-read-tree (prompt collection)
  (while (member (string-to-number
                  (string-cut-right-square-bracket-reference
                   (completing-read "Choose: " collection)))
                 set)
    (completing-read-tree prompt collection))) ;; at this point `collection'
                                               ;; would be replaced
                                               ;; with collection that
                                               ;; belongs to
                                               ;; particular set and
                                               ;; browsing trees with
                                               ;; completing read goes
                                               ;; deeper and deeper. A
                                               ;; key would be
                                               ;; required to go back.


(completing-read-tree "Choose: " collection)

-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

Sign an open letter in support of Richard M. Stallman
https://rms-support-letter.github.io/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]