Project

General

Profile

Actions

Feature #19010

open

Follow up of #18996: Support changing irb's autocompletion background

Added by st0012 (Stan Lo) 3 months ago. Updated 2 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:109949]

Description

If the APIs proposed in #18996 (or similar ones) are accepted, we'll be able to configure irb's autocompletion dialog colors.

And for the irb side, I want to propose 2 levels of configurations:

TL;DR

  • Have dark/bright themes in irb
  • Use dark theme by default because a bright dropdown in dark background is more uncomfortable to read than a dark dropdown in bright background.
  • irb will pass per-colour configuration to reline too. So users can still configure individual colours if they want to.

1. Theme selection

Consider most users don't care about individual colors if the text are readable and roughly match with the terminal background, I want to provide 2 basic themes (dark/bright) for users to choose:

Theme:dark

Bright terminal - dark theme Dark terminal - dark theme

Theme :bright

Bright terminal - bright theme Dark terminal - bright theme

Default

In terms of default, I think dark is better than bright. Because when in a bright terminal, seeing a dark dropdown isn't so troubling. But when in a dark terminal, seeing a large bright dropdown can bring discomfort to eyes.

Side note: It's possible to detect the terminal's background color from an xterm-compatible terminal emulator (example gist), so irb may automatically assign themes based on users' terminal theme. But we still need to pick a default as the fallback.

Interface for theme selection

If we think it's possible to introduce more themes than just dark/bright, we can expose the API as

IRB.conf[:DIALOG_THEME] = theme_name

If we don't consider introducing other themes, we can make it a toggle for the non-default theme, like

IRB.conf[:USE_BRIGHT_THEME] = true

2. Per-color configurations

For users who want to configure individual colors, we should also provide options on the irb side, like

IRB.conf[:dialog_default_bg_color] = :black

This prevents directly exposing reline's API to normal irb users.

I implemented the ideas in this proof of concept PR.


Files

Screenshot_20220918_135231.png (70.8 KB) Screenshot_20220918_135231.png kaiquekandykoga (Kaíque Koga), 09/18/2022 05:01 PM

Related issues 1 (1 open0 closed)

Related to Ruby master - Feature #18996: Proposal: Introduce new APIs to reline for changing dialog UI coloursOpenActions

Updated by kaiquekandykoga (Kaíque Koga) 3 months ago

I like the idea of having multiple themes. I use light screen for everything, and I enjoy the way irb is currently displayed. Perhaps keeping the current irb's colors as one alternative, and add the proposed light theme and dark theme too. Some people use other colors than black or white for terminals, like blue for instance, so having a few themes thinking about that can help.

About the default color. I like to use autocompletion, but I know that some people dislike having enabled autocompletion by default. So if irb start showing the autocompletion only if a theme is set, there is not need to think about a default color.

Updated by st0012 (Stan Lo) 3 months ago

kaiquekandykoga (Kaíque Koga) wrote in #note-1:

Perhaps keeping the current irb's colors as one alternative

irb doesn't have a theme at the moment. The colours we see are reline's default values for the dialog UI. And it's not a complete set of configurations either. reline only sets background colours of items, but not the foreground (text) colours. That's why it works for some users but not others (like me), depends on the text colours of their themes.

You can learn more about reline's colour APIs in #18996

Some people use other colors than black or white for terminals, like blue for instance, so having a few themes thinking about that can help.

People can have dozens or even hundreds of different background colours, so it's not possible for irb to have themes to nicely match them. And it's not the purpose of themes either. It's to provide acceptable colour contrasts to help users read the content.

About the default color. I like to use autocompletion, but I know that some people dislike having enabled autocompletion by default. So if irb start showing the autocompletion only if a theme is set, there is not need to think about a default color.

I disagree with this. People usually don't look up a tool's features proactively. So if we disabled it, it's likely that most users won't even know about it. And this very helpful feature will end up benefit a lot fewer users than it could have helped.

What we should do instead, is to

  1. Reduce the things that make people dislike it as much as we can (like improving the colours)
  2. Make it easy to disable the feature

So even if some users disabled it now, at least they now this feature exists and there are people improving it. It's way better than having most people unaware of it IMO.

Actions #3

Updated by st0012 (Stan Lo) 3 months ago

  • Description updated (diff)
Actions #4

Updated by st0012 (Stan Lo) 3 months ago

  • Tracker changed from Bug to Feature
  • Backport deleted (2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN)

Updated by kaiquekandykoga (Kaíque Koga) 3 months ago

I agree and support your arguments.

Thank you for the detailed explanation and the reline's reference.

Updated by mame (Yusuke Endoh) 2 months ago

Briefly discussed at the dev meeting, but we agreed that we need to finish #18996 first.

Here are the opinions expressed at the meeting:

  • The color there should be not only for the dialog but also other things (such as the syntax highlight). So DIALOG_THEME is not a good name. IRB_THEME?
  • The names :dark and :bright is confusing because those who use a bright (white background) terminal must choose :dark theme. Better names are wanted.
Actions #7

Updated by mame (Yusuke Endoh) 6 days ago

  • Related to Feature #18996: Proposal: Introduce new APIs to reline for changing dialog UI colours added
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0