Toda vez que alguém define um tamanho diferente para um console virtual, less
reconhece a resolução da janela (suponho que ...); de acordo com isso, altera quantas linhas de texto deve visualizar. Como esse parâmetro é calculado?
Toda vez que alguém define um tamanho diferente para um console virtual, less
reconhece a resolução da janela (suponho que ...); de acordo com isso, altera quantas linhas de texto deve visualizar. Como esse parâmetro é calculado?
Respostas:
Se você estiver procurando uma maneira de verificar a partir de um script, execute um destes procedimentos:
tput cols
e tput lines
, como sugere o manatworkMas se você quiser os detalhes, aqui vamos nós:
Para terminais virtuais (xterm, et al), há uma ioctl()
chamada do sistema que informará o tamanho da janela. Se puder, less
use esta chamada. Além disso, quando você altera o tamanho da janela, o que estiver em execução nessa janela recebe um SIGWINCH
sinal que informa less
que deve verificar se há um novo tamanho de janela. Por exemplo, iniciei uma less
execução (como identificação do processo 16663), conectei a ela strace
e redimensionei a janela. Isto é o que eu vi:
$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
Isso também é o que tput cols
e tput lines
fazer nos bastidores, se puderem. Para mais informações sobre esse método, consulte man tty-ioctl
e pesquise TIOCGWINSZ.
Para outros terminais, como os conectados às portas seriais, não há como obter essas informações diretamente. Nesse caso, less
começa a procurar pistas nas variáveis de ambiente.
LINES
e COLUMNS
geralmente será definido para as dimensões do terminal. De fato, se bash
ou zsh
puder encontrar as dimensões do terminal, ele definirá automaticamente essas variáveis automaticamente, para facilitar para os programas não tão inteligentes ver o tamanho do terminal. No entanto, a maioria dos outros shells, incluindo dash
e tcsh
, não define essas variáveis.TERM
geralmente é definido como o tipo de terminal; nesse caso, o banco de dados terminfo pode conter o tamanho esperado do terminal. Se tput rows
não puder usar o IOCTL (por exemplo, se você estiver conectado por uma porta serial), ele retornará aos valores registrados aqui. Para um terminal cujo tamanho pode mudar, isso é apenas um palpite e provavelmente está errado.Para obter mais informações, consulte man tput
o comando para controlar o terminal e man terminfo
uma lista de coisas que você pode solicitar ao terminal.
Se você der uma olhada no código fonte, conhecerá as less
chamadas ioctl()
para recuperar o tamanho da janela no Linux.
#ifdef TIOCGWINSZ
{
struct winsize w;
if (ioctl(2, TIOCGWINSZ, &w) == 0)
{
if (w.ws_row > 0)
sys_height = w.ws_row;
if (w.ws_col > 0)
sys_width = w.ws_col;
}
}
#else
#ifdef WIOCGETD
{
struct uwdata w;
if (ioctl(2, WIOCGETD, &w) == 0)
{
if (w.uw_height > 0)
sys_height = w.uw_height / w.uw_vs;
if (w.uw_width > 0)
sys_width = w.uw_width / w.uw_hs;
}
}
#endif
Não tenho certeza se esta é a informação que você está procurando. Eu acho que less
registra um manipulador de sinal para SIGWINCH
. Quando a dimensão do terminal muda, ele recebe um SIGWINCH
sinal e examina as informações tty da dimensão atual do terminal.
http://www.gnu.org/software/libc/manual/html_node/Misc Miscellaneous-Signals.html