Сброс стиля курсора виртуального терминала Ubuntu

997
llzrk

Я использую Ubuntu 14.04 и использую один из виртуальных терминалов (TTY [1-6], доступный через Ctrl-Alt-F [1-6]); Я хочу навсегда изменить вид моего курсора с видимого по умолчанию, мигающего подчеркивания, на мигающий прямоугольник. Я могу временно изменить его, но он последовательно сбрасывается при запуске определенных приложений.

Первоначально стиль курсора в сеансах TTY был мигающим подчеркиванием. Я обнаружил, что могу изменить его на мигающую коробку с помощью команды:

printf '\e[?8c' 

Это меняет курсор в терминале и отражается в таких программах, как emacs или elinks. Поэтому я поместил вышеуказанную команду в мой .bashrc.

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

Например, рассмотрим, как следующие 3 приложения (tmux, emacs, elinks) влияют на стиль курсора:

  • tmux: стиль курсора немедленно устанавливается на мигающее подчеркивание, этот стиль поддерживается во всех приложениях, запущенных в tmux, и изменение сохраняется после выхода из tmux. Приведенная выше команда printf не действует в tmux.
  • emacs: стиль курсора зависит от того, какой стиль был активен, когда я его запускал, а затем при выходе из emacs стиль меняется на мигающее подчеркивание.
  • elinks: стиль курсора зависит от того, какой стиль был активен, когда я его запускал, и стиль курсора НЕ изменяется при выходе из elinks.

Я должен отметить, что у меня есть настройки emacs для установки стиля курсора (в emacs) на блок, и что, хотя я искал настройку для установки стиля курсора в tmux, я не смог найти ничего, кроме записи в справочной странице tmux, которая состояния:

tmux understands some extensions to terminfo(5):  [...]  Cs, Csr Change the cursor style. If set, a sequence such as this may be used to change the cursor to an underline:  $ printf '\033[4 q'  If Csr is set, it will be used to reset the cursor style instead of Cs. 

К сожалению, я не понимаю, как «установить Cs», и, как упоминалось выше, я попытался выполнить команду printf, чтобы установить стиль курсора внутри tmux безрезультатно.

Еще одно интересное замечание: проблема с изменением стиля курсора не возникает при запуске эмулятора X-терминала, такого как XFCE4 Terminal. Это только кажется, что происходит в TTY.

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

1

1 ответ на вопрос

1
Thomas Dickey

Функции терминала доступны не для всех терминалов и могут отличаться в зависимости от версии tmux. Я вижу описание, приведенное в tmux 1.6 на Debian 7. Ubuntu 14.04 немного устарела и имеет tmux 1.8 (то же описание).

Пример, приведенный на странице справочника, выглядит следующим образом DECSCUSR, который поддерживается, xtermначиная с патча № 252 в 2009 году. См. Последовательности управления XTerm :

CSI Ps SP q Set cursor style (DECSCUSR, VT520). Ps = 0 -> blinking block. Ps = 1 -> blinking block (default). Ps = 2 -> steady block. Ps = 3 -> blinking underline. Ps = 4 -> steady underline. Ps = 5 -> blinking bar (xterm). Ps = 6 -> steady bar (xterm). 

Чтобы использовать их, вы должны сделать измененную запись terminfo, используя тик ncurses, например,

infocmp -x >foo vi foo tic -x foo 

добавив эту строку (с ведущей вкладкой, как и другие возможности):

Cs=\E[%p\sq, Csr=\E[0\sq, 

Однако, проверяя источник для tmux 2.1, он больше не читает эти функции terminfo и был изменен для использования Csи Crдля установки цвета (сделано в более старых версиях с использованием Ccи Cr). Более новая версия имеет встроенную логику для распознавания DECSCUSRбез расширения terminfo.

Терминалы на основе VTE (такие как терминал XFCE) могут (в зависимости от версии) реализовать DECSCUSR, но консоль Linux вряд ли сделает это, поскольку она реализует только подмножество VT220, в то время как DECSCUSRэто от VT520терминала (надмножество VT220).

Вы увидите различия с другими приложениями, такие как Emacs, потому что DECSCUSRперекрывают другие функции курсора стиля, такие как мигающая функция курсора, установить или сбросить с cvvisи cnormвозможностями от terminfo В течение xterm:

CSI ? Pm h DEC Private Mode Set (DECSET). Ps = 1 2 -> Start Blinking Cursor (att610). 

Однако вы, похоже, хотите изменить внешний вид курсора в консоли Linux (также называемой виртуальной консолью). DECSCUSRне имеет никакого эффекта там.

Для того, чтобы курсор мигающий блок все время, вы должны изменить возможности курсора внешний вид в описании терминала (ов), которые вы используете. Это civis(сделать курсор невидимым), cnorm(сделать курсор «нормальным» видом) и cvvis(сделать курсор очень видимым):

  • Включение обоих \e[?8cв запись "linux" скажет программам, таким как emacs, которые используют эту запись, чтобы использовать ваш мигающий курсор.
  • tmux также читает запись терминала, просматривая cnormи civis.
  • elinks, с другой стороны, жестко запрограммирован, игнорируя базу данных терминала. Быстро прочитав его источник, я не вижу никаких escape-последовательностей, которые сбрасывают терминал или изменяют внешний вид курсора.

Поскольку вы используете tmux, вам также может потребоваться изменить xterm(чтобы приложения, работающие внутри, tmuxиспользовали этот стиль курсора). Но сначала протестируйте без этого: если нужно, вы, вероятно, можете объединить \e[?8cс существующей cnormстрокой, так как xtermигнорирует \e[?8c.

Спасибо за ваш ответ. Я попытался изменить запись terminfo, используя тик, как вы показали, но, похоже, это не имело никакого эффекта. Есть ли что-нибудь еще, что я могу попробовать? llzrk 8 лет назад 0
Еще раз спасибо Ваш обновленный комментарий, в дополнение к ответам на [этот вопрос] (http://unix.stackexchange.com/questions/3759/how-to-stop-cursor-from-blinking), приводит меня к решению: tmux относится к запись cnorm в infoterm для установки стиля курсора, поэтому я ввел команду "tput cnorm '\ e [? 8c'", чтобы установить запись cnorm, и "tput cvvis '\ e [? 8c'", чтобы установить запись cvvis ( для хорошей меры). После повторного входа в систему и запуска tmux исправление работает! llzrk 8 лет назад 0
нет проблем: я начал с того, что думал, что вы пытаетесь заставить `DECSCUSR` работать, потом понял, что проблема в emacs и т. д. Thomas Dickey 8 лет назад 0

Похожие вопросы