2017-11-11 280 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