A redefinição do estilo do cursor virtual do Ubuntu

1

Estou executando o Ubuntu 14.04 e usando um dos terminais virtuais (TTY [1-6], acessível via Ctrl-Alt-F [1-6]); Eu quero mudar permanentemente a aparência do meu cursor do padrão aparente, um sublinhado piscando, para uma caixa piscando. Eu posso mudá-lo temporariamente, mas ele está constantemente redefinindo quando certos aplicativos são executados.

Inicialmente, o estilo do cursor nas sessões do TTY era um sublinhado intermitente. Eu descobri que eu poderia mudá-lo para uma caixa piscando com o comando:

printf '\e[?8c'

Isso altera o cursor no terminal e é refletido em programas como emacs ou elinks. Então eu coloquei o comando acima no meu .bashrc.

No entanto, alguns 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 intermitente, reemitindo o comando acima, obtendo o .bashrc ou fazendo logout e voltando.

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

  • tmux: o estilo do cursor é imediatamente definido para um sublinhado intermitente, este estilo é mantido em todas as aplicações executadas dentro do tmux, e a mudança 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 eu corri, e então o estilo muda para um sublinhado piscante ao sair do emacs.
  • elinks: o estilo do cursor é o estilo que estava ativo quando eu corri, 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 enquanto pesquisei uma configuração para definir o estilo do cursor no tmux, não consegui encontrar nada além de uma entrada no homem do tmux página, 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 '3[4 q'

         If Csr is set, it will be used to reset the cursor style instead of Cs.
Infelizmente eu não entendo como "setar Cs" e, como mencionado acima, eu 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 mudança do estilo do cursor não ocorre ao executar um emulador de terminal X, como o Terminal XFCE4. Isso só parece ocorrer nos TTYs.

Não consigo encontrar informações 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 que eu tenha sempre um estilo de cursor de bloco piscando?

    
por llzrk 29.01.2016 / 16:00

1 resposta

1

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

O exemplo dado na página de manual se parece com DECSCUSR , que é suportado por xterm começando com patch # 252 em 2009. Consulte Sequê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 de ncurses, por exemplo,

infocmp -x >foo
vi foo
tic -x foo

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

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

No entanto, verificando a origem do tmux 2.1, ele não lê mais esses recursos do terminfo e foi modificado para usar Cs e Cr para definir cores (feito em versões mais antigas usando Cc e Cr ) . A versão mais recente possui lógica integrada para reconhecer DECSCUSR sem uma extensão terminfo.

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

Você verá diferenças com outros aplicativos como emacs porque DECSCUSR sobrepõe outros recursos de estilo de cursor, como o recurso de cursor piscante, definido ou redefinido com os recursos cvvis e cnorm de 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 do Linux (também chamado de console virtual). DECSCUSR não tem efeito.

Para tornar seu cursor um bloco piscando todo tempo, você teria que alterar os recursos de aparência do cursor na (s) descrição (ões) do terminal que você está usando. Esses são civis (tornar o cursor invisível), cnorm (tornar o cursor uma aparência "normal") e cvvis (tornar o cursor muito visível):

  • Fazer ambos os \e[?8c na entrada "linux" diria a programas como o emacs usando essa entrada para usar o cursor da caixa piscando.
  • O tmux também lê a entrada do terminal, olhando para cnorm e civis .
  • elinks, por outro lado, é codificado, ignorando o banco de dados do terminal. Em uma rápida leitura de sua fonte, não vejo nenhuma seqüê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 em execução dentro de tmux usem esse estilo de cursor). Mas teste sem isso primeiro: se você precisar , provavelmente é possível combinar o \e[?8c com a string cnorm existente, pois xterm ignora \e[?8c .

    
por 30.01.2016 / 01:23