7
votes

Comment déterminer par programme les dimensions du personnage de ma fenêtre de terminal?

J'écris un script qui affichera un tableau des stocks en tant qu'art ASCII dans une fenêtre d'émulateur de terminal. J'utilise normalement osx / terminal.app mais une solution à base de Linux serait une alternative acceptable.

Mon script a actuellement des arguments de ligne de commande pour la largeur de l'écran et la hauteur (à nouveau, comme mesuré en caractères, pas de pixels), avec des paramètres par défaut déterminés par des variables d'environnement de ma propre invention. Je voudrais que ces scripts déterminent la taille de la fenêtre actuelle (en caractères) et l'utiliser comme par défaut. Une taille typique pour une grande fenêtre sur mon MacBook Pro 17 pouces pourrait être 200 x 68.

Ceci est un script Perl, mais si vous connaissez une solution dans une autre langue, dites-le!

tia.
Ken


2 commentaires

Avez-vous essayé Googling pour "avoir une taille de terminal à Perl"?


J'ai essayé d'autres phrases différentes, mais pas celle-là ... Ça révèle effectivement la solution Perl-ISH. Merci.


3 Réponses :


1
votes

Lorsque vous exécutez de manière interactive, bash définit $ lines et $ colonnes . Sinon, utilisez des malédictions / ncurses pour récupérer les dimensions du terminal.


1 commentaires

Merci pour une réponse rapide et utile! À ma consternation, je n'ai pas pu proposer un moyen d'accéder à des lignes $ et de colonnes $ de Perl. Ce n'est pas une variable d'environnement, même s'il est disponible à partir d'une coque de bash interactive. En fait, j'ai écrit un programme de fenêtre.C.C à l'aide de NCurses, et cela aurait été une solution acceptable. Merci encore.



8
votes

La façon habituelle de faire ceci est Lignes TPT et COLS TPLUT ; cette question, dans l'ordre:

  • $ lines et $ colonnes variables d'environnement;
  • TERMIOS Paramètres, qui sont définis par des émulateurs de terminaux lorsque vous redimensionnez leurs fenêtres;
  • the terminfo Description identifiée par $ TERM .

6 commentaires

Parfait! Merci, geekosaur! Je préfère en fait cette solution sur la solution plus perl-ish à l'aide du terme :: lecture en lecture en lecture en lecture en lecture, car c'est une solution que je peux utiliser à la fois dans les scripts Perl et dans les scripts Bash. J'écris des tonnes des deux types de scripts.


Perl: Chomp (my $ window_size_lines = lignes TPT ); # aussi pour les cols


Les lignes de récupération étaient censées être en backtocks. Je suppose que je n'ai pas appris à poster des fragments de code dans une réponse. Je l'ai fait dans ma question à l'aide de HTML


Utilisez deux backtsks pour la citation. (hm, droite, ne peut pas faire des affichages dans les commentaires) this `has` backticks


Chomp (My $ Window_Size_Lines = `TPT Lines`); ... Testez mes nouvelles connaissances ... merci!


Cela m'a permis d'utiliser réinitialisation de TPT pour "corriger" mes paramètres de terminal vissé très rapidement :)



2
votes

de C, vous utiliseriez l'option tiocgwinsz code> à un appel iOOCTL code> Appel système sur / dev / tty code>.

Ceci est Exposé par le terme Terme :: lecture lecture_damétique code> à partir de homme perlfaq8 code>: p>

Comment puis-je obtenir la taille de l'écran? strong> p>

Si vous avez Terme :: Readkey Code> MODULE INSTALLÉ À partir de CPAN, vous pouvez l'utiliser pour récupérer la largeur et la hauteur en caractères et en pixels: P>

use Term::ReadKey;
($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();


2 commentaires

Je me sens coupable de ne pas vous donner le trophée "Solution acceptée", car, comme indiqué, le vôtre est la meilleure solution. (Appelant des commandes de bash de Perl est fronçée sur, je sais. Je suis aussi froncée aussi.) Ce que je n'ai pas dit en question, c'est que je fais aussi beaucoup de scripts Bash, de sorte que la commande Bash 'tput' est donc plus largement utile pour moi. Désolé, quelle que soit la façon dont je vais, je ne pourrai pas dormir la nuit. :)


Donc, vous devriez - n'hésitez pas à utiliser le TPT de bash, mais vous devriez vraiment utiliser le terme :: Datakey Méthode lorsque vous êtes dans un script Perl au lieu de forger deux commandes supplémentaires ;-) P.S. Vous voudrez peut-être également enquêter sur le signal Sigwinch, qui est envoyé à tout moment, la fenêtre du terminal est redimensionnée.