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
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!
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
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 ...
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.
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.
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.)