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

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

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

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

printf '\e[?8c'

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

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

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

  • тмукc:стиль курсора немедленно устанавливается на мигающее подчеркивание, этот стиль сохраняется во всех приложениях, запущенных в tmux, и изменение сохраняется после выхода из tmux. Вышеуказанная команда printf не имеет эффекта в tmux.
  • емакс:стиль курсора — тот, который был активен при запуске, а затем стиль меняется на мигающее подчеркивание при выходе из emacs.
  • ссылки:стиль курсора - тот, который был активен при запуске, и стиль курсора НЕ меняется при выходе из 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

Функции терминала доступны не для всех терминалов и могут отличаться в зависимости от версии 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 с помощью tic 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, тогда как 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.

Связанный контент