这段来自获取终端宽度的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库(参考链接:
获取C语言中的终端宽度?)。
import Darwin.ncurses
initscr()
let s = "rows: \(LINES), cols: \(COLS)"
mvaddstr(1, 1, s);
refresh();
getch()
endwin()
为了追踪窗口调整大小事件,您需要处理SIGWINCH信号,可参考
在Swift命令行应用程序中捕获信号。
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()
LINES
和COLUMNS
环境变量提供了屏幕大小。但是,在Mac上使用Swift命令行工具时,这些变量在ProcessInfo.processInfo.environment
中并不会出现。 - rmaddyioctl
在终端中获取宽度和高度,但这在XCode的调试窗口中不起作用[即使你将“行为”更改为在新选项卡中启动调试控制台]。 - rustyMagnet