Redefinição do estilo do cursor do terminal virtual do Ubuntu

Redefinição do estilo do cursor do terminal virtual do Ubuntu

Estou executando o Ubuntu 14.04 e usando um dos terminais virtuais (TTY[1-6], acessível via Ctrl-Alt-F[1-6]); Quero alterar permanentemente a aparência do meu cursor do padrão aparente, um sublinhado piscante, para uma caixa piscante. Posso alterá-lo temporariamente, mas ele é redefinido de forma consistente quando determinados aplicativos são executados.

Inicialmente, o estilo do cursor nas sessões TTY era um sublinhado piscante. Descobri que poderia alterá-lo para uma caixa piscando com o comando:

printf '\e[?8c'

Isso muda o cursor no terminal e se reflete em programas como emacs ou elinks. Então coloquei o comando acima em meu .bashrc.

No entanto, certos aplicativos parecem reverter o estilo do cursor para um sublinhado piscante e isso persiste mesmo depois de sair desses aplicativos. Posso redefinir o estilo do cursor para uma caixa piscando reemitindo o comando acima, obtendo .bashrc ou efetuando logout e login novamente.

Por exemplo, considere como os três aplicativos a seguir (tmux, emacs, elinks) afetam o estilo do cursor:

  • tmux:o estilo do cursor é imediatamente definido como um sublinhado piscante, esse estilo é mantido em todos os aplicativos executados no tmux e a alteração persiste após sair do tmux. O comando printf acima não tem efeito no tmux.
  • emacs:o estilo do cursor é o estilo que estava ativo quando o executei e, em seguida, o estilo muda para um sublinhado piscante ao sair do emacs.
  • links:o estilo do cursor é aquele que estava ativo quando o executei, e o estilo do cursor NÃO muda ao sair do elinks.

Devo observar que tenho configurações do emacs para definir o estilo do cursor (dentro do emacs) para uma caixa e que, embora tenha procurado uma configuração para definir o estilo do cursor no tmux, não consegui encontrar nada além de uma entrada na página de manual do tmux, que afirma:

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.

Infelizmente não entendo como "definir Cs" e, como mencionado acima, tentei emitir o comando printf para definir o estilo do cursor dentro do tmux sem sucesso.

Outra observação interessante é que o problema com a alteração do estilo do cursor não ocorre ao executar um emulador de terminal X, como o Terminal XFCE4. Isso parece ocorrer apenas nos TTYs.

Não consigo encontrar nenhuma informação sobre outras pessoas que tiveram esse problema ou configurações nos aplicativos mencionados que possam estar causando o problema. O que está causando esse problema e como posso resolvê-lo para ter consistentemente um estilo de cursor de bloco piscando?

Responder1

Os recursos do terminal não estão disponíveis em todos os terminais e podem diferir de acordo com as versões do tmux. Vejo a descrição citada no tmux 1.6 no Debian 7. O Ubuntu 14.04 é um pouco antigo e possui o tmux 1.8 (mesma descrição).

O exemplo dado na página de manual se parece com DECSCUSR, que é suportado xtermcomeçando compatch #252em 2009. ConsulteSequências de controle 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).

Para usá-los, você faria uma entrada terminfo modificada usando o tic do ncurses, por exemplo,

infocmp -x >foo
vi foo
tic -x foo

adicionando esta linha (com uma guia inicial, como os outros recursos):

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

No entanto, verificando a fonte do tmux 2.1, ele não lê mais esses recursos terminfo e foi modificado para usar Cse Crdefinir cores (feito em versões mais antigas usando Cce Cr). A versão mais recente possui lógica integrada para reconhecimento DECSCUSRsem uma extensão terminfo.

Terminais baseados em VTE (como o terminal XFCE) podem (dependendo da versão) implementar DECSCUSR, mas é improvável que o console Linux faça isso, uma vez que implementa apenas um subconjunto do VT220 enquanto DECSCUSRé de um VT520terminal (um superconjunto do VT220).

Você verá diferenças com outros aplicativos, como o emacs, porque DECSCUSRse sobrepõe a outros recursos de estilo de cursor, como o recurso de cursor piscante, definido ou redefinido com os recursos cvvise cnormdo terminfo para xterm:

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

No entanto, parece que você deseja modificar a aparência do cursor no console Linux (também chamado de console virtual). DECSCUSRnão tem efeito lá.

Para transformar seu cursor em um bloco piscantetodosvez, você teria que alterar os recursos de aparência do cursor nas descrições dos terminais que você está usando. São eles civis(tornar o cursor invisível), cnorm(tornar o cursor uma aparência "normal") e cvvis(tornar o cursor muito visível):

  • Fazer ambos \e[?8cna entrada "linux" diria a programas como o emacs que usam essa entrada para usar o cursor da caixa piscante.
  • tmux também lê a entrada do terminal, observando cnorme civis.
  • elinks, por outro lado, é codificado, ignorando o banco de dados do terminal. Em uma leitura rápida de sua fonte, não vejo nenhuma sequência de escape que redefina o terminal ou modifique a aparência do cursor.

Como você está usando tmux, também pode ser necessário modificar o xterm(para que os aplicativos executados internamente tmuxusem esse estilo de cursor). Mas teste primeiro sem isso: se vocêdeve, você provavelmente pode combinar o \e[?8ccom a string existente cnorm, já que xtermignora \e[?8c.

informação relacionada