2017-11-11 281 views
-1

;继续打开终端窗口并键入:如何在Swift 4中编写一个命令行界面,其功能类似于Unix手册页?例如:

man ls 

查看;请注意,您可以使用箭头键在文本中上下移动,并且现在缺少终端历​​史记录。

使用“q”退出。

现在返回终端历史记录。

我试图了解如何编写一个上面的界面:终端历史消失并重新出现在退出和最重要的是接口能够将按键作为输入而不是使用readLine( )。

在清屏前,我管理的ANSI转义代码:

从而清除屏幕并从底部开始的光标,但只有真正实现换行和推动旧内容关闭屏幕不同于删除可滚动历史的手册页。所以目前不是我想要实现的。

至于以按键输入,我一直没能找到很多,但基金会有3个引用:

standardInput

开发者文档列出他们FileHandle,NSUserUnixTask &进程。我希望他们中的一个可能可以听按键,然后用一个通知来响应,我可以用正确的屏幕更新我的界面,清除并重新定位文本或者执行一个动作(如退出并返回到正常提示为“man”对“q”的按下)。

希望对此有所帮助,谢谢!

+0

仅供参考 - 当你运行'男人ls',然后与输出互动,你实际上是现在运行取决于'PAGER'环境的价值'more'(或'less')命令变量。所以你要问的是如何实现类似'more'或'less'命令的东西。 – rmaddy

+0

@rmaddy这是正确的;但我主要是在他们如何实现上面列出的两个主要功能之后。 – ANoobSwiftly

回答

0

标准的macOS Cocoa GUI使用事件;代表鼠标点击,键盘按压等;将用户输入传达给您的应用。阅读事件处理,你可以让你的应用程序退出,用户输入“q”。这是键盘输入的基本机制,也是您的readLine()的替代选择。

然而,你所描述的不仅仅是按键处理,你需要终端式的屏幕控制;向后滚动,清除屏幕等等。在Unix上这样做的最初方式是使用低级别的tty设备接口并发布屏幕本身理解的控制代码。现代人经常在你的Cocoa接口中实现这些相同的控制代码,这允许输出标准的Unix级命令;例如男子;被解释。这是什么Terminal.app呢。标准的Cocoa文本控件还实现了对其中某些内容的支持,特别是支持Emacs风格的光标移动的子集。

开源iTerm2是一个Objective-C替代Terminal.app,源可以用GitHub。如果你阅读了这篇文章,你可以学习如何在Objective-C的Cocoa中实现一个终端窗口界面,你必须弄清楚Swift等价物。

HTH