swift - 从 Swift 中的命令行应用程序确定视口(viewport)大小(以字符为单位)?

标签 swift command-line command-line-tool

我正在 Swift 中构建一个命令行工具,我想知道是否有任何方法可以在运行应用程序时确定视口(viewport)的当前宽度,以便将屏幕上的文本限制为不换行的适合大小。

我知道这在“真正的”命令行应用程序中是可能的,因为 pico、man、pine 等都根据窗口大小呈现它们的文本界面,但我似乎找不到任何信息他们是怎么做到的。

事实上,您甚至可以在它们运行时调整窗口大小,它们会刷新。有谁知道这是如何工作的,以及是否可以向用 Swift 编写的命令行工具添加支持?

最佳答案

来自 Getting terminal width in C? 的 C 代码很容易翻译成 Swift:

import Darwin

var w = winsize()
if ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0 {
    print("rows:", w.ws_row, "cols", w.ws_col)
}

(出于某种原因,这在 Xcode 调试器控制台中不起作用, 您必须在终端窗口中调用可执行文件。)

或者,使用 ncurses 库(来自 Getting terminal width in C? ):

import Darwin.ncurses

initscr()
let s = "rows: \(LINES), cols: \(COLS)"
mvaddstr(1, 1, s);
refresh();
getch()
endwin()

要跟踪窗口调整大小事件,您必须处理 SIGWINCH信号,比较Trapping signals in a Swift command line application :

import Darwin
import Dispatch

var w = winsize()
if ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0 {
    print("rows:", w.ws_row, "cols", w.ws_col)
}

let sigwinchSrc = DispatchSource.makeSignalSource(signal: SIGWINCH, queue: .main)
sigwinchSrc.setEventHandler {
    if ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0 {
        print("rows:", w.ws_row, "cols", w.ws_col)
    }
}
sigwinchSrc.resume()

dispatchMain()

关于swift - 从 Swift 中的命令行应用程序确定视口(viewport)大小(以字符为单位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47776658/

相关文章:

arrays - 如何快速存储元组数组

swift - 在 Swift 中,舍入没有按预期发生

Java Processbuilder 返回 255

ios - iOS UI Automation 可以在没有真实设备或模拟器的情况下运行吗?

c - getopt() 函数表现出奇怪的行为

generics - Swift - 无法将 BST 节点转换为通用节点

java - 如何从命令行执行 Eclipse 的 "export jar"

command-line-tool - 如何在 vifm 版本 > 0.4 中的单独屏幕窗口中编辑文件

installation - Xcode 4.4 : Preferences : Downloads : Components : Command Line Tools fails with "Failed with HTTP status 403: forbidden"

regex - Swift 正则表达式错误