teclado - terminal para mac
¿Cómo encuentro el ancho y alto de una ventana de terminal? (8)
Como mencioné en la respuesta de lyceus, su código fallará en la configuración regional no inglesa de Windows porque la salida del mode
puede no contener las subcadenas "columnas" o "líneas":
Puedes encontrar la subcadena correcta sin buscar texto:
preg_match(''/---+(/n[^|]+?){2}(?<cols>/d+)/'', `mode`, $matches);
$cols = $matches[''cols''];
Tenga en cuenta que ni siquiera me molesto con las líneas porque no es confiable (y en realidad no me importan).
Edit: De acuerdo con los comentarios sobre Windows 8 (oh tú ...), creo que esto puede ser más confiable:
preg_match(''/CON.*:(/n[^|]+?){3}(?<cols>/d+)/'', `mode`, $matches);
$cols = $matches[''cols''];
Sin embargo, haz una prueba, porque no la probé.
Como ejemplo simple, quiero escribir un script de CLI que pueda imprimir ''='' en todo el ancho de la ventana del terminal.
#!/usr/bin/env php
<?php
echo str_repeat(''='', ???);
o
#!/usr/bin/env python
print ''='' * ???
o
#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n ''=''; let x=$x+1 done; echo
En POSIX, finalmente desea invocar la ioctl()
TIOCGWINSZ
(Get WINdow SiZe). La mayoría de los idiomas deberían tener algún tipo de envoltorio para eso. Por ejemplo, en Perl puedes usar Term::Size :
use Term::Size qw( chars );
my ( $columns, $rows ) = chars /*STDOUT;
En bash, las variables ambientales $LINES
y $COLUMNS
deberían ser capaces de hacer el truco. Se establecerá automáticamente tras cualquier cambio en el tamaño del terminal. (es decir, la señal SIGWINCH )
Inspirado por la respuesta de @ pixelbeat, aquí hay una barra horizontal tput
por tput
, ligero mal uso del relleno / relleno printf
y tr
printf "%0$(tput cols)d" 0|tr ''0'' ''=''
Para hacer esto en el entorno CLI de Windows, la mejor manera que puedo encontrar es usar el comando de modo y analizar la salida.
function getTerminalSizeOnWindows() {
$output = array();
$size = array(''width''=>0,''height''=>0);
exec(''mode'',$output);
foreach($output as $line) {
$matches = array();
$w = preg_match(''/^/s*columns/:?/s*(/d+)/s*$/i'',$line,$matches);
if($w) {
$size[''width''] = intval($matches[1]);
} else {
$h = preg_match(''/^/s*lines/:?/s*(/d+)/s*$/i'',$line,$matches);
if($h) {
$size[''height''] = intval($matches[1]);
}
}
if($size[''width''] AND $size[''height'']) {
break;
}
}
return $size;
}
Espero que sea útil!
NOTA : La altura devuelta es el número de líneas en el búfer, no es el número de líneas que están visibles dentro de la ventana. ¿Alguna mejor opción por ahí?
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d ''/n''
-
tput cols
te dice el número de columnas. -
tput lines
te dice el número de filas.