【问题标题】:How to programmatically determine character dimensions of my terminal window?如何以编程方式确定终端窗口的字符尺寸?
【发布时间】:2011-08-11 04:38:46
【问题描述】:

我正在编写一个脚本,它将在终端仿真器窗口中将股票图表显示为 ASCII 艺术。我通常使用 OSX/Terminal.app,但基于 Linux 的解决方案是可接受的替代方案。

我的脚本目前有用于屏幕宽度和高度的命令行参数(同样,以字符而不是像素为单位),默认值由我自己发明的环境变量确定。我希望这些脚本确定当前窗口的大小(以字符为单位),并将其用作默认值。在我的 17 英寸 Macbook Pro 上,大窗口的典型尺寸可能是 200 x 68。

这是一个 perl 脚本,但如果您知道其他语言的解决方案,请告诉!

TIA.

【问题讨论】:

  • 你试过用谷歌搜索“在 perl 中获取终端大小”吗?
  • 我尝试了其他类似的短语,但不是那个......那个确实揭示了 perl-ish 解决方案。谢谢。

标签: perl bash scripting terminal terminal-emulator


【解决方案1】:

执行此操作的常用方法是tput linestput cols;这个查询,按顺序:

  • $LINES$COLUMNS 环境变量;
  • termios 设置,由终端模拟器在您调整其窗口大小时设置;
  • terminfo 描述由$TERM 标识。

【讨论】:

  • 完美!谢谢你,极客龙!实际上,与使用 Term::ReadKey 的 perl-ish 解决方案相比,我更喜欢这个解决方案,因为它是我可以在 perl 脚本和 bash 脚本中使用的解决方案。我写了大量的这两种脚本。
  • perl: chomp(my $window_size_lines = tput lines); # 同样适用于 cols
  • tput 行应该是反引号。我想我还没有学会如何在回复中发布代码片段。我在我的问题中使用 HTML
     标签做到了。在这里不起作用。
  • 引用时使用两个反引号。 (嗯,对,不能在 cmets 中显示)this `has` backticks
  • chomp(my $window_size_lines = `tput lines`); ...测试我的新知识...谢谢!
【解决方案2】:

在 C 语言中,您可以使用 TIOCGWINSZ 选项对 ioctl 系统调用 /dev/tty

这是由Term::ReadKey 模块公开的——来自man perlfaq8

如何获取屏幕尺寸?

如果您从 CPAN 安装了 Term::ReadKey 模块,您可以使用它来获取以字符和像素为单位的宽度和高度:

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

【讨论】:

  • 我为没有给你“公认的解决方案”奖杯感到内疚,因为如上所述,你的解决方案是最好的。 (我知道,从 perl 调用 bash 命令是不受欢迎的。我也皱眉。)我没有说的是我也做了很多 bash 脚本,所以 bash 'tput' 命令实际上更广泛地用于我。对不起,不管我走哪条路,我晚上都睡不着。 :)
  • 所以你应该 - 随意使用来自 bash 的 tput 但是当你在 perl 脚本中时你真的应该使用 Term::ReadKey 方法而不是分叉两个额外的命令;-) p.s.您可能还想调查捕获 SIGWINCH 信号,该信号在终端窗口调整大小时发送。
【解决方案3】:

当交互运行时,bash 定义$LINES$COLUMNS。否则,使用 curses/ncurses 检索终端尺寸。

【讨论】:

  • 感谢您的及时和有益的回应!令我沮丧的是,我无法想出一种从 perl 访问 $LINES 和 $COLUMNS 的方法。它不是环境变量,尽管它可以从交互式 bash shell 中获得。我实际上使用 ncurses 编写了一个 window-size.c 程序,这将是一个可以接受的解决方案。再次感谢。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多