Cada vez que alguien establece un tamaño diferente para una consola virtual, less
reconoce la resolución de la ventana (supongo que...); de acuerdo con eso, cambia cuántas líneas de texto debe visualizar. ¿Cómo se calcula ese parámetro?
Respuesta1
Si está buscando una manera de verificar desde un script, puede hacer cualquiera de estas cosas:
- Ejecutar
tput cols
ytput lines
, como sugiere manatwork - comprobar los valores de $LINES y $COLUMNS
Pero si quieres los detalles, allá vamos:
Para terminales virtuales (xterm, et al) hay una ioctl()
llamada al sistema que le indicará el tamaño de la ventana. Si puede, less
utiliza esta llamada. Además, cuando cambia el tamaño de la ventana, lo que sea que se esté ejecutando en esa ventana recibe una SIGWINCH
señal que le less
indica que debe buscar un nuevo tamaño de ventana. Por ejemplo, comencé a less
ejecutar (como ID de proceso 16663), me conecté con strace
y cambié el tamaño de la ventana. Esto es lo que 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
Esto también es lo que tput cols
hacen tput lines
entre bastidores, si pueden. Para obtener más información sobre este método, consulte man tty-ioctl
y busque TIOCGWINSZ.
Sin embargo, para otros terminales, como los conectados a puertos serie, no hay forma de obtener esta información directamente. En ese caso, less
empieza a buscar pistas en las variables de entorno.
LINES
yCOLUMNS
a menudo se ajustarán a las dimensiones del terminal. De hecho, sibash
ozsh
puede encontrar las dimensiones del terminal, establecerá automáticamente estas variables para facilitar que los programas no tan inteligentes vean el tamaño del terminal. Sin embargo, la mayoría de los demás shells, incluidosdash
ytcsh
, no configuran estas variables.TERM
normalmente se establece en el tipo de terminal, en cuyo caso la base de datos terminfo puede contener el tamaño esperado del terminal. Sitput rows
no puede utilizar IOCTL (por ejemplo, si está conectado a través de un puerto serie), recurrirá a los valores registrados aquí. Para un terminal cuyo tamaño puede cambiar, esto es sólo una suposición y es probable que esté equivocado.
Para obtener más información, consulte man tput
el comando para controlar el terminal y man terminfo
para obtener una lista de cosas que puede decirle al terminal que haga.
Respuesta2
Si echas un vistazo al código fuente, conocerás less
las llamadas ioctl()
para recuperar el tamaño de la ventana en 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
Respuesta3
No estoy seguro de si esta es la información que estás buscando. Supongo que less
registra un controlador de señal para SIGWINCH
. Cuando la dimensión del terminal cambia, recibe una SIGWINCH
señal y analiza la información tty para conocer la dimensión actual del terminal.
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html