Я использую Arch Linux (альтернативная 32-битная версия), и недавно я обнаружил, что синие линии, которые я раньше видел в Vim с :set cursorline, должны были быть подчеркнуты, а не синие.

Это заставило меня искать решение повсюду.

Я не использую графическую среду, поэтому никакой среды рабочего стола или оконного менеджера, только старая добрая с zsh, моя текущая любимая оболочка.

Я обнаружил, что :hi CursorLine cterm=bold делает линию курсора намного красивее, так как теперь она больше не синяя, а по большей части просто более светлая, и это уже сделало мою жизнь лучше.

Я также пробовал cterm=underline (линия все еще отображается синей), undercurl, пробовал :hi clear CursorLine, затем повторял все сначала, но ничего не дает мне подчеркивания, которые я хочу.

Я попробовал Vim на fbterm, потому что считаю, что это квази-графический эмулятор терминала, но у меня было такое же поведение, только с более уродливым сверхшироким шрифтом.

Это относится не только к Vim, но, кажется, ко всему. Я попробовал escape-последовательности ANSI на echo, и при попытке подчеркнуть текст я также получил этот синий цвет без подчеркивания.

Поэтому я считаю, что чего-то не хватает, будь то шрифт, конфигурация оболочки, конфигурация Vim или что-то еще.

После долгих поисков я так и не приблизился к ответу, почему в моем tty отсутствуют эти параметры форматирования, поэтому я решил спросить здесь.

Также стоит отметить, что я попробовал это на Raspberry Pi 3B+ с Raspbian и получил почти такое же поведение на tty.

Единственное место, где мне удалось заставить это работать, было на X-сервере, который я время от времени запускаю, чтобы использовать Firefox. Я создал xterm на нем, и вуаля я получил подчеркивание даже при вводе команд на zsh.

Теперь я попробую поиграть с различными терминальными шрифтами, чтобы увидеть, смогу ли я приблизиться к красивейшему своему tty.

Изменить 01:

Я записал это с помощью Asciinema, и там все хорошо видно, но то, что я на самом деле видел, было именно таким, как я описал. asciicast

Редактировать 02:

Я читал эту страницу Arch Wiki в разделе об эмуляторах терминала, и решил попробовать yaft, поскольку это звучало как раз то, что я искал.

Оказалось, что он у меня уже установлен, и его использование действительно включает по крайней мере некоторые функции, которые я хотел, так что это здорово.

3
Micael Jarniac 21 Ноя 2019 в 23:09
1
Это почти наверняка возможности (или их отсутствие) в любом эмуляторе терминала, который вы используете, и/или несоответствие типа терминала. Что сообщает echo $TERM и правильно ли оно?
 – 
roaima
20 Ноя 2019 в 22:43
echo $TERM сообщает linux, и, поскольку я все еще использую терминал Arch "по умолчанию", я считаю, что это правильно.
 – 
Micael Jarniac
20 Ноя 2019 в 23:07
@ Кристофер, я полагаю, ты предлагаешь export TERM=xterm-256color, правильно? Я пробовал это, подтвердил, что это изменилось с помощью echo $TERM, и все равно получил синий текст вместо подчеркивания как в Vim, так и в echo -e "\033[4munderline\033[0m".
 – 
Micael Jarniac
20 Ноя 2019 в 23:39
Ну, я сначала собирался спросить об этом на Stack Overflow, но потом понял, что это больше подходит для этого. И хотя эта проблема также возникает на Raspbian, я впервые заметил ее на своем ноутбуке с Arch Linux, поэтому я считаю, что это больше связано с Linux и tty, чем с чем-либо еще.
 – 
Micael Jarniac
20 Ноя 2019 в 23:54

1 ответ

Лучший ответ

Драйвер консоли Linux не поддерживает подчеркивание на цветных дисплеях, потому что это компромисс между удобочитаемостью и простотой реализации. Так было с середины 1990-х и задокументировано в console_codes(4):

   4       set underscore (simulated with color on a color display)
           (the colors used to simulate dim or underline are set
           using ESC ] ...)

Маловероятно, что у вас есть что-то кроме цветного дисплея. Вы можете изменить цвет, используемый для изображения подчеркивания, но оно будет окрашено тем или иным образом. На странице руководства упоминается escape-последовательность, используемая для настройки палитры:

   ESC ]     OSC      (Should be: Operating system command) ESC ] P
                      nrrggbb: set palette, with parameter given in 7
                      hexadecimal digits after the final P :-(.  Here n
                      is the color (0–15), and rrggbb indicates the
                      red/green/blue values (0–255).  ESC ] R: reset
                      palette

И escape-последовательности, используемые для указания, какие из 16 элементов палитры будут отображать затемнение и подчеркивание:

   ESC [ 1 ; n ]       Set color n as the underline color.
   ESC [ 2 ; n ]       Set color n as the dim color.

Установка TERM в любой вариант "xterm" даст плохие результаты, потому что

  • Драйвер консоли Linux не поддерживает то, что можно найти в описании терминала xterm, и
  • описание терминала linux предназначено для использования фактических функций драйвера консоли Linux.

Используйте infocmp linux xterm-256color, чтобы увидеть различия. Это длинно, поэтому вот краткое изложение, чтобы показать размер разницы:

$ infocmp -1x linux | wc -l
122
$ infocmp -1x xterm-256color |wc -l
272
$ infocmp -1x linux xterm-256color | wc -l
213
3
Thomas Dickey 21 Ноя 2019 в 01:40
Большое тебе спасибо! Теперь я начну искать способ иметь терминал (эмулятор), который работает аналогично тому, к которому я привык, но имеет больший набор функций. Я, вероятно, закончу тем, что запущу X-сервер с простым WM, просто чтобы виртуальный терминал оставался открытым, но если это так, то я думаю, что все будет хорошо.
 – 
Micael Jarniac
21 Ноя 2019 в 02:03