Swift命令行工具当前窗口大小

时间:2017-01-10 02:47:58

标签: swift bash terminal command-line-interface

上下文

我正在尝试编写一个交互式swift命令行工具。其中一个关键部分是具有“writeToScreen”功能,该功能将一系列页眉,页脚和主体作为参数,并将它们很好地格式化为终端窗口的当前大小,将溢出折叠为“列表”选项。所以函数将是这样的:

func writeToScreen(_ headers: [String], _ footers: [String], _ body: String) {
    let (terminalWindowRows, terminalWindowCols) = getCurrentScreenSize()
    // perform formatting within this window size...
}

func getCurrentScreenSize() -> (Int, Int) {
    // perform some bash script like tput lines and tput cols and return result
}

例如,像writeToScreen(["h1","h2"], ["longf1","longf2"], "body...")这样的输入会为各自的屏幕尺寸产生以下内容:

22x7
_ _ _ _ _ _ _ _ _ _ _ _
|(1) h1, (2) list...  |
|                     |
| body...             |
|                     |
|                     |
|                     |
|(3) list...          |
_ _ _ _ _ _ _ _ _ _ _ _

28x7
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|(1) h1, (2) h2, (3) list...|
|                           |
| body...                   |
|                           |
|                           |
|                           |
|(4) longf1, (5) list...    |
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _

问题

我遇到的问题是,为了获得终端窗口大小,我需要运行至少一个bash脚本,比如echo "$(tput cols)-$(tput lines)",它会将屏幕大小输出为<cols>-<rows>。但是,在swift中运行bash脚本涉及使用Process()NSTask(),在我可以找到的每个用例中,它总是一个单独的进程,因此只返回默认的终端大小,而不管当前的会话窗口大小。

我尝试过使用:

  1. https://github.com/kareman/SwiftShell run("tput", "cols")(无论窗口大小如何,始终保持不变)
  2. How do I run an terminal command in a swift script? (e.g. xcodebuild)(与上面相同的问题,只是在没有API的情况下裸露出来)
  3. 问题

    在当前窗口的上下文中,我需要做些什么才能获取有关当前会话或运行bash进程的信息,特别是有关窗口大小的信息?

    我想过尝试一些我会列出当前终端会话并在其中一个中运行bash脚本的内容,但我无法弄清楚如何使其工作(类似于bash who然后选择正确的会话和工作。不确定这是否可行。):​​https://askubuntu.com/questions/496914/write-command-in-one-terminal-see-result-on-other-one

1 个答案:

答案 0 :(得分:0)

您可以使用此功能在bash中执行命令:

func shell(_ command: String) -> String {
    let task = Process()
    task.launchPath = "/bin/bash"
    task.arguments = ["-c", command]

    let pipe = Pipe()
    task.standardOutput = pipe
    task.launch()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String

    return output
}

然后只需使用:

let cols = shell("tput cols")
let lines = shell("tput lines")

它将作为String返回,因此您可能希望将输出转换为Integer。

希望有帮助。