emacs-devel
[Top][All Lists]
Advanced

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

Re: [RFC] The best way to choose an "action" at point: context-menu-mode


From: Jonas Bernoulli
Subject: Re: [RFC] The best way to choose an "action" at point: context-menu-mode, transient, which-key or embark? (was: Fwd: Org-cite: Replace basic follow-processor with transient menu?)
Date: Wed, 18 Dec 2024 11:47:51 +0100

Hello!


Samuel Wales <samologist@gmail.com> writes:

> thanks for interest.

I've worked with other users with impaired vision to improve their
experience with Transient before and tend to prioritize that work.

That being said, the end-of-year crunch is upon us, so I likely won't
find the time to do anything beyond what I have already done today.

You should update Transient to the development version.  I found two
regressions affecting the features described below and fixed them this
morning.  These fixes will make it into the next release, scheduled for
very early 2025.

> the transient menu i am trying uses more character columns and
> lines than window (c-u m-x gptel-send).

I didn't notice that you effectively said "too small in both
dimensions", so the first advice below, might not be as useful as I
initially though.  Or it might, let's see.

> transient's solution does not work well for me.
>
> 1) wrapping
>    - 3 text columns.

You can tell Transient to only ever use a single column, and
additionally you can always display the menu in a new window on the
right instead of at the bottom.

(setq transient-force-single-column t)
(setq transient-display-buffer-action
      '(display-buffer-in-side-window
        (side . right)
        (dedicated . t)
        (inhibit-same-window . t)))

>                       rightmost text column (header: "Response
>      to") has lines that wrap at rhs (not word) to lhs (not
>      beginning of that text column), putting lines between items
>      in first text column.
>    - (for clarity: by rhs and lhs, i mean where text goes, at
>      smallest usable font, maximized gui frame, no wm
>      decoration, one window in frame, 2 fringes)
>    - BEST SOLUTION FOR ME: wrap at word boundaries, /within each
>      text column/, as is done when one exports org tables to
>      html
> 2) vertical scrolling
>    - BEST SOLUTION FOR ME: SPC DEL, as is done in org export
>      menu
>      - in transient, SPC and DEL make echo area say ? for help.
>        ? makes the message go away but nothing else changes.
>        another ?  brings up the help for function gptel-send.
>        i'd want scrolling.
>      - transient is vertically scrollable using up down arrows
>        and c-v m-v, but those are harder on rsi and harder to
>        locate on my kb than SPC DEL

You can add your preferred bindings like so:

  (keymap-set transient-map "SPC" #'transient-scroll-up)
  (keymap-set transient-map "DEL" #'transient-scroll-down)

Some Transient menus to *not* prevent commands from other keymaps to
be invoked while the menu is active.  If you bind "SPC" in all menus
as shown above, then that will shadow the regular binding, making it
hard to insert a space.

[However, I'll have to deeply think about the bindings used for commands
available in all transient menus in general soon, but this is not the
time and place.]

[I'll likely also have to support horizontal scrolling eventually.]

>    - i did not notice that there are lines below window.  if
>      there isn't an indicator, BEST LOCATION FOR ME: left fringe
>      in cases where fringe exists.

This enters "I'll look into that next year" territory.

The color of that line actually indicates whether a menu allows
"outside" commands to be invoked while the menu is active.

Most users don't notice this piece of information, myself included.
You can hide it, if you wish, using:

  (setq transient-mode-line-format nil)

> 3) transient does not allow changing font size with
>    text-scale-increase/decrease (but a smaller font would not be
>    legible)

To permanently use a different font size in transient menus use:

  (defun transient-i-shrunk-the-glyphs ()
    (text-scale-set -1)) ; or 1 to grow

  (add-hook 'transient-setup-buffer-hook #'transient-i-shrunk-the-glyphs)

To allow changing the size on demand, use something like:

  (defun transient-text-scale-increase (inc)
    (interactive "p")
    (with-current-buffer transient--buffer
      (text-scale-increase inc)))

  (defun transient-text-scale-decrease (dec)
    (interactive "p")
    (with-current-buffer transient--buffer
      (text-scale-decrease dec)))

  (keymap-set transient-map "C-x +" #'transient-text-scale-increase)
  (keymap-set transient-map "C-x -" #'transient-text-scale-decrease)
  (keymap-set transient-predicate-map "<transient-text-scale-increase>"
              #'transient--do-call)
  (keymap-set transient-predicate-map "<transient-text-scale-decrease>"
              #'transient--do-call)

You could also remember the size between menu invocations:

  (defvar transient-text-scale-amount 0)

  (transient-define-suffix transient-text-scale-increase (inc)
    :transient t
    (interactive "p")
    (with-current-buffer transient--buffer
      (text-scale-increase inc)
      (setq transient-text-scale-amount text-scale-mode-amount)))

  (transient-define-suffix transient-text-scale-decrease (inc)
    :transient t
    (interactive "p")
    (with-current-buffer transient--buffer
      (text-scale-decrease dec)
      (setq transient-text-scale-amount text-scale-mode-amount)))

  (keymap-set transient-map "C-x +" #'transient-text-scale-increase)
  (keymap-set transient-map "C-x -" #'transient-text-scale-decrease)

  (defun transient-restore-text-scale ()
    (unless (local-variable-p 'text-scale-mode-amount)
      (text-scale-set transient-text-scale-amount)))

I might make a refinement of one of these variants available by default,
but that will require some more though, which I don't have the time for
until next year.

     Cheers,
     Jonas


> - transient:
>     - Archive: gnu
>     - Version: 0.8.1
>     - dependency issue before explicitly installing this version.
>
> - emacs    29.4
> - org    9.7.16
> - gptel    ~/.emacs.d/elpa/gptel-0.9.6.0.20241115.83706
>
>
> some current org menus, although REALLY GOOD, have possibly
> regressed in recent years.  in any case, for example, export is
> scrollable; todo kw is not, so i cannot access some todo kw.
>
> i put a lot of effort into this response, hope it makes sense.
>
>
> On Mon, Dec 16, 2024 at 10:52 AM Ihor Radchenko <yantar92@posteo.net> wrote:
>>
>> Samuel Wales <samologist@gmail.com> writes:
>>
>> > a couple of quick and somewhat obvious comments.  i use VERY large
>> > fonts with a maximized gui emacs [vt / maximized urxvt  when needed],
>> > still resulting in, throughout emacs, often, a smaller number of
>> > screen lines or columns than content, even with my usual one window
>> > per frame.  most org menus respect this and can be scrolled or
>> > tweaked.  just wanted compatibility to be in the specs.  especially,
>> > to make sure no functionality is unreachable, but also where possible
>> > to modify column numbers / fill to look ok.  i am slowly trying
>> > transient in gptel and still getting used to it.
>>
>> Thanks for the important input!
>> Does transient look fine on your screen? If yes, we should not have a
>> problem.
>>
>> --
>> Ihor Radchenko // yantar92,
>> Org mode maintainer,
>> Learn more about Org mode at <https://orgmode.org/>.
>> Support Org development at <https://liberapay.com/org-mode>,
>> or support my work at <https://liberapay.com/yantar92>
>
>
>
> --
> The Kafka Pandemic
>
> A blog about science, health, human rights, and misopathy:
> https://thekafkapandemic.blogspot.com



reply via email to

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