Я работаю под управлением 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
.