Defina a largura da tabulação no terminal da GUI

3

descobri que

setterm -regtabs 4

não funciona no xterm ou no urxvt.

Mas isso

xterm_set_tabs () { 
  TERM=linux;
  export $TERM;
  setterm -regtabs 4
}

contornará o problema.

Mas, eu suspeito que seja sub-ótimo como (1) eu recebo um erro gfx que eu não posso explicar (pelo menos, se eu entendi a aba corretamente essa possibilidade é descartada), e (2) quando eu ssh para o Solaris da minha escola, e execute emacs -nw , ele diz que o terminal "linux" é desconhecido! Então eu tenho que mudar de volta para "xterm". Claro, isso é bobo o tempo todo usando o mesmo terminal.

Além disso, talvez não confiar em guias é uma boa regra de ouro!

    
por Emanuel Berg 26.08.2012 / 17:55

5 respostas

3

Você pode definir a variável de ambiente temporariamente sem precisar exportá-la para toda a sua sessão usando env :

env TERM=linux setterm -regtabs 4
    
por 27.08.2012 / 00:18
3

Muitos terminais suportam seqüências de escape que definem paradas de tabulação. O recurso tem até uma entrada em terminfo (5): tbc (limpar todas as guias) e hts (conjunto de guias horizontais).

$ tput tbc; echo aaaaaaaaaaaaaaaaaaaaa$(tput hts); echo 'a\tb'
aaaaaaaaaaaaaaaaaaaaa
a                    b

Acima definimos uma parada de tabulação no final desses aaaaaaaa e vemos o resultado na próxima linha.

Então, para definir as paradas de tabulação, a cada 4 colunas, precisamos:

tbc=$(tput tbc) hts=$(tput hts) cuf4=$(tput cuf 4)
printf '%s\r' "$tbc"
i=4
while [ "$i" -lt "$COLUMNS" ]; do
  printf %s "$cuf4$hts"
  i=$(($i + 4))
done
printf '\r'

Ou você também pode definir paradas de tabulação em intervalos irregulares. Acima usamos "tput cuf" para mover o cursor para frente, enquanto no primeiro exemplo usamos "aaaa". Você pode fazer:

printf '\r%s' "${tbc}aaaa${hts}aaaaa${hts}aaaaaaaa${hts}"

para definir uma parada de tabulação na quarta coluna e, em seguida, a próxima, mais 5 colunas ...

    
por 26.08.2012 / 21:22
2

Em resposta a @Jim Paris:

Note que isso só funciona para terminais que suportam as mesmas seqüências de escape dos terminais virtuais do linux para definir abas (e mover o cursor para frente). Por exemplo, usando "cat -v", podemos ver qual seqüência setterm está enviando:

$ TERM=linux setterm -regtabs 4 | cat -vte
^[[3g^M^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^[[4C^[H^M

Felizmente, são as mesmas seqüências suportadas pelo xterm:

~$ TERM=xterm tput tbc | cat -vte
^[[3g
~$ TERM=xterm tput hts | cat -vte
^[H
~$ TERM=xterm tput cuf 4 | cat -vte
^[[4C

E como é o caso do vt100, é provável que seja o caso da maioria dos emuladores finais.

    
por 27.08.2012 / 09:09
2

O utilitário setterm destina-se ao uso com o console do Linux. De acordo com a página de manual do console_codes :

The Linux console implements a large subset of the VT102 and ECMA-48/ISO 6429/ANSI X3.64 terminal controls, plus certain private- mode sequences for changing the color palette, character-set mapping, and so on.

Como o programa é difícil codificado ,

/* -regtabs. */
if (ctl->opt_regtabs && vc_only(ctl, "--regtabs")) {
    int i;

    fputs("3[3g\r", stdout);
    for (i = ctl->opt_rt_len + 1; i <= TABS_MAX; i += ctl->opt_rt_len)
        printf("3[%dC3H", ctl->opt_rt_len);
    putchar('\r');
}

acontece de trabalhar com o xterm já que o xterm implementa controles do VT100 (e mais) .

Quanto ao grande subconjunto , isso é discutível. Em uma contagem rápida dos itens em console_codes , vejo 79 seqüências de controle. Isso é muito menos do que qualquer um dos similares xterm documentados no xterm FAQ Comparando versões, contando controles . Por si só, 79 não é grande. O próprio VT102 (não é um xterm parecido) tinha 104. ISO-6429 (também conhecido como ECMA-48 ) documenta 20 modos e 162 seqüências. Quer você conte o total como 182 ou 162, 50% não é um grande subconjunto .

Em vez de usar um utilitário de console do Linux, há uma opção mais portátil: o utilitário tabs (em POSIX , bem como Solaris). É parte dos utilitários ncurses (e provavelmente instalados em seu sistema Linux).

Para o exemplo dado na pergunta, você pode fazer isso:

tabs -4

Isso usa o banco de dados do terminal, em vez de ser codificado. Guias e as seqüências de controle para defini-las estão documentadas no ECMA-48 e em outros lugares, como o terminfo (5) página de manual.

E tabs funciona com o xterm.

    
por 27.09.2016 / 03:28
-1

OK, eu li man xterm e não há menção da largura da tabulação. Eu estou começando a pensar que é mais fácil apenas redefinir TERM . Em .bashrc :

function xterm_set_tabs () {
  TERM=linux
  export $TERM
  setterm -regtabs 4
  TERM=xterm
  export $TERM
}

if [ 'echo $TERM' == "xterm" ]; then
  xterm_set_tabs
fi

Editar : Isso funciona para o problema descrito, mas tem o efeito colateral de que, quando executo emacs -nw , o movimento do cursor é confuso. Como isso é muito sério, esta não é uma solução aceitável para o problema. (Não tenho certeza sobre a política do site - devo remover minha resposta ou devo deixá-la para que os outros aprendam com o erro também? Obviamente, acho que deve permanecer. De qualquer forma, voltamos à prancheta.)

    
por 29.08.2012 / 00:58