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

时间:2017-12-12 15:55:52

标签: swift command-line command-line-tool

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

我知道这可以在"真实"命令行应用程序,因为像pico,man,pine等所有东西都根据窗口大小呈现它们的文本界面,但我似乎无法找到有关它们如何操作的任何信息。

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

1 个答案:

答案 0 :(得分:3)

来自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()