all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org>
To: help-gnu-emacs@gnu.org
Subject: Jean: buc.el ready (actually, now when I understand it again, it isn't a bad idea at all!)
Date: Tue, 08 Jun 2021 10:12:04 +0200	[thread overview]
Message-ID: <878s3kyduz.fsf@zoho.eu> (raw)

Jean, or anyone else, take a look. Is the pack ready? [code
also yanked last in mail]

  https://dataswamp.org/~incal/emacs-init/buc.el

I went thru it and it is actually a very good an simple idea,
I don't know why I suddenly didn't understand it's purpose and
thought it complicated...

I'm unsure tho if the documentation probably doesn't make
anything clearer to a lot of people, right?

Perhaps should add an example run...

What do you think?

Is it OK now as an Elisp package?

;;; buc.el --- move between buffers based on category -*- lexical-binding: t
;;;
;;; Commentary:
;;;
;;; Author: Emanuel Berg (incal) <moasenwood@zoho.eu>
;;; Created: 2021-05-23
;;; Keywords: docs, files
;;; License: GPL3+
;;; Package-Requires: ((cl-lib "1.0"))
;;; URL: https://dataswamp.org/~incal/emacs-init/buc.el
;;; Version: 2.0.0
;;;
;;; Move between similar buffers. So far I have only found one
;;; use case for this, namely accessing man pages. Try
;;; `man-buc' below.
;;;
;;; The general idea behind the interface is to present
;;; alternatives based on your recent answers to the same
;;; questions. The alternatives are sorted to present you with
;;; the most relevant one first. You pick an alternative by
;;; hitting a single key. If your desired choice isn't among
;;; the alternatives, start typing, that will bypass the
;;; interface and the default interface will be used as
;;; a fallback. (But technically it isn't a fallback, rather
;;; the interfaces are cooperating covering different parts of
;;; one problem, and buc was programmed with this situation
;;; in mind.)
;;;
;;; If you'd count the number of keypresses you'd see the
;;; advantage with this package. When the buc interface is
;;; used, the count is much lower; when it isn't used, the
;;; count still isn't higher than what you'd use anyway.
;;; Again, try `man-buc' to see how it works first hand.
;;;
;;; Or take a look at this screenshot:
;;;
;;;   https://dataswamp.org/~incal/dumps/buc.png
;;;
;;; The principle behind the interface is similar to that of
;;; a computer hardware cache: proximity in space and time,
;;; with updates on every single access.
;;;
;;; The interface is an hybrid between the GUI and CLI style,
;;; the GUI "icons" here being words! Some say icons are more
;;; intuitive. That's were we agree to disagree, that perhaps
;;; holds for infants (and illiterates) but not to adults
;;; who've literally spent a substantial part of their life
;;; reading and writing. Because we believe intuition is an
;;; acquired skill just like everything else.
;;;
;;; Code:

(require 'cl-lib)

(defun buffer-names ()
  "Get the names of all open buffers, as strings."
  (mapcar #'buffer-name (buffer-list)) )

(defvar nav-keys     nil "The keys used to select buffers.")
(defvar nav-keys-str nil "Descriptions of the buffer-select keys.")

(setq nav-keys     '(?\r ?\s ?\t ?\d ?\C-j ?\C-k ?\C-l ?\C-u ?\C-o ?\C-p))
(setq nav-keys-str  (split-string (key-description nav-keys)))

(defun extract-strings (strings match)
  "From STRINGS, get a list with the parts that MATCH."
  (remove nil
    (mapcar
     (lambda (s) (when (string-match match s) (match-string 1 s)))
     strings) ))

(defun get-ps (names)
  "Make the prompt-string, with NAMES."
  (let ((k -1)
        (s " [") )
    (dolist (e names (concat s "] "))
      (setq s (format "%s %s:%s "
                      s (nth (cl-incf k) nav-keys-str) e) ))))

(defun navigate-buffer-category (prefix &optional bad-key &rest args)
  "Display all buffers that start with PREFIX.
If none of the offered buffers are chosen by the user's keystroke,
evaluate (BAD-KEY ARGS)."
  (let ((pages (extract-strings
                (buffer-names)
                (format "%s%s" prefix "\\(.*\\)\\*") )))
    (if pages
        (let*((ps (get-ps pages))
              (key (read-key ps))
              (page-index    (cl-position key nav-keys))
              (page          (when page-index (nth page-index pages))) )
          (if (= key 7) (message "quit")
            (if page (switch-to-buffer (format "%s%s*" prefix page))
              (when bad-key (apply bad-key `(,@args ,key))) )))
      (if bad-key (apply bad-key args)
        (error "Empty category and no fallback function") ))))

(defun switch-to-type (ps fun &optional key)
  "Ask for a string with the prompt-string PS.
Use the string as input to FUN.
If KEY, it'll be the first KEY of the string, auto-inserted."
  (apply fun
         `(,(read-string ps (when key (char-to-string key)) nil)) ))

(defun man-buc ()
  "Show man pages.  If you type, you get the common prompt."
  (interactive)
  (navigate-buffer-category "*Man "
                            #'switch-to-type
                            "[buc] man page: "
                            'man) )

(provide 'buc)
;;; buc.el ends here

-- 
underground experts united
https://dataswamp.org/~incal




             reply	other threads:[~2021-06-08  8:12 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-08  8:12 Emanuel Berg via Users list for the GNU Emacs text editor [this message]
2021-06-08 14:28 ` buc.el ready Jean Louis
2021-07-06  9:39   ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-07-06 15:53   ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-07-06 16:18     ` Emanuel Berg via Users list for the GNU Emacs text editor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=878s3kyduz.fsf@zoho.eu \
    --to=help-gnu-emacs@gnu.org \
    --cc=moasenwood@zoho.eu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.