日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

通往開源庫 Terminus 的曲折路徑。

在生物學(xué)中,像鱷魚這樣的動(dòng)物有時(shí)被稱為活化石,因?yàn)樗鼈兯坪跖c過去地質(zhì)層中發(fā)現(xiàn)的標(biāo)本幾乎沒有什么不同。計(jì)算機(jī)技術(shù)有一些自己的活化石。終端,或更可能的終端仿真器,就是一個(gè)這樣的例子。 70 年代的終端(如 VT100)是具有鍵盤、屏幕和有限邏輯的物理設(shè)備,可以使用共享計(jì)算機(jī)發(fā)送和接收命令。快進(jìn)到 2022 年。終端仍然有大量使用。基于云的服務(wù)、Web 服務(wù)、遠(yuǎn)程工作和腳本編寫是我想到的幾個(gè)例子。今天我想講一個(gè)開發(fā)者的故事,它涉及在 swift 中尋求命令行工具,與 ncurses 的史詩般的戰(zhàn)斗,以及最終開發(fā) Terminus,一個(gè)開源包,我希望你們中的一些讀者,將考慮給予嘗試。

用于 Swift 中的命令行應(yīng)用程序開發(fā)的包

在完成了生物醫(yī)學(xué)信息學(xué)方面的培訓(xùn)后,我大量使用了 shell 和 R 和 Python/ target=_blank class=infotextkey>Python 等語言,然后通過學(xué)習(xí) Swift 回到了 Apple 設(shè)備編程。我很快意識到 Swift 是一門了不起的語言,我希望看到它成長為我可以在所有編程任務(wù)中使用的東西,而不僅僅是用于編寫 IOS 和 mac 應(yīng)用程序。遺憾的是,在 Swift 中做其他事情的基礎(chǔ)設(shè)施還有很多成熟的工作要做。

我喜歡在數(shù)據(jù)科學(xué)領(lǐng)域做的很多事情(探索性數(shù)據(jù)分析、數(shù)據(jù)處理、機(jī)器學(xué)習(xí)等)都在命令行上進(jìn)行。 當(dāng)我的屏幕左側(cè)有一個(gè)腳本而右側(cè)有 iPython 時(shí),我有賓至如歸的感覺。


 

對于那些不熟悉的人,iPython 是一個(gè)交互式 Python shell,或在終端中運(yùn)行的 REPL(讀取-評估-打印-循環(huán))。它提供了語法高亮、代碼完成和一大堆其他漂亮的功能。我心想……你可以在 iPython 中用著色和編輯文本做這么多巧妙的事情,而且自動(dòng)完成菜單系統(tǒng)真的很酷。我們在 Swift 中有什么可以讓我們在終端中做一些引人注目的事情?

經(jīng)過一番谷歌搜索后,我確實(shí)設(shè)法找到了一些用于命令行工具的有趣包。請隨意閱讀以下列表:

 

  • Rainbow— 一個(gè)漂亮的文本著色和樣式包
  • ANSITerminal— 提供文本顏色和樣式、光標(biāo)功能(移動(dòng)、隱藏/顯示、保存/恢復(fù))、屏幕功能(清除屏幕、清除行等)和鍵盤捕獲(一次一個(gè)字符,沒有內(nèi)置行編輯器)。
  • Swift CommandLineKit— 來自 google 的 Matthias Zenger。包括用于處理命令行參數(shù)、文本顏色和樣式、單行和多行輸入、文本完成和提示的系統(tǒng)。
  • ConsolKit— 來自 Vapor(Swift 中的后端 Web 框架)的制造商。一個(gè)強(qiáng)大的包,提供活動(dòng)指示、參數(shù)處理(標(biāo)志、選項(xiàng)等)、文本樣式和著色、日志記錄等。

 

所有這些包都提供了對文本顏色和樣式的基本支持,ConsolKit 和 CommandLineKit 具有大量高級功能。我遇到的問題是我想要菜單,對在屏幕上移動(dòng)光標(biāo)的細(xì)粒度支持,以及更好地控制選擇顏色。這讓我想到了著名的 ncurses C 庫。

我與 ncurses 的史詩般的戰(zhàn)斗

對于那些不熟悉的人,ncurses 是一個(gè) C 包,最初是在 80 年代初編寫的,旨在在各種終端上創(chuàng)建用戶界面。成百上千的程序使用 ncurses 來創(chuàng)建文本用戶界面 (TUI)。由于 Swift 與 C 的配合非常好,我認(rèn)為圍繞 ncurses 編寫一個(gè) Swift 包裝器是一個(gè)好主意,它具有一些感興趣的功能,例如菜單。


 

在大多數(shù)情況下,將 C 庫合并到 Swift 中是一個(gè)相對輕松的過程。 您提供一個(gè)模塊映射,告訴編譯器您的 C 庫位于何處(在本地項(xiàng)目或系統(tǒng)中)以及在包裝文件中使用 import 時(shí)模塊的名稱應(yīng)該是什么。 從那里您可以開始以您喜歡的任何方式圍繞 C 庫編寫包裝器。 我的計(jì)劃是在我的包清單中使用 Homebrew(linux 上的 apt),并將我的包與系統(tǒng)安裝的 ncurses 庫鏈接,如下所示:

// swift-tools-version:5.5// The swift-tools-version declares the minimum version of Swift required to build this package.import PackageDescriptionlet package = Package(name: "SwiftNCurses",products: [,targets: [.systemLibrary(name: "Cncurses", pkgConfig: pkgConfig, providers: [.apt(["ncurses"]), .brew(["ncurses"])]),

如果你在 Linux 系統(tǒng)上,每一個(gè)都很好。 事實(shí)上,我是從 TheCoderMerlin 的這個(gè)項(xiàng)目開始的,它就是這樣做的。 但這是我從 Mac 上的編譯器收到的令人討厭的消息:


 

好粗魯。事實(shí)證明,Darwin 模塊引入了它自己的 ncurses 版本,該版本包含在 MacOS 開發(fā)人員 SDK 中!這意味著頭文件已經(jīng)被導(dǎo)入,我們正在嘗試重新定義之前聲明的東西。此外,MacOS SDK 中的 ncurses 版本在 5.8 版上已經(jīng)過時(shí)了……據(jù)我所知,這大約是 2011 年。為什么?!我花了幾個(gè)小時(shí)在 StackOverflow 上尋找修復(fù)程序,就在我準(zhǔn)備在我的電腦上郵寄時(shí),我遇到了一個(gè)解決方案。簡而言之,您可以在運(yùn)行 swift build 時(shí)傳遞 -Xcc -D__NCURSES_H ,這會(huì)告訴編譯器忽略所有 ncurses 頭文件。這樣做的問題是,同樣的問題也出現(xiàn)在 brew 安裝的 ncurses 版本中......并且要解決這個(gè)問題,您必須在本地復(fù)制所有 ncurses 標(biāo)頭并用其他東西替換 __NCURSES_H 的實(shí)例。

為了使這個(gè)冗長的故事簡短,我終于得到了在 Mac 和 Linux 上編譯和工作的東西,但是所有的頭文件混合都會(huì)讓維護(hù)變得非常痛苦,而且仍然有一個(gè)交易破壞者。任何對使用 wrapper 包感興趣的用戶都必須在他們自己的項(xiàng)目中包含 -Xcc -D__NCURSES_H C 編譯器標(biāo)志。這不會(huì)給開發(fā)人員帶來愉快的體驗(yàn)……所以我存檔了項(xiàng)目并繼續(xù)前進(jìn)。安息吧 SwiftNCurses。

終點(diǎn)站

從那時(shí)起,我編寫了一個(gè)純粹基于 ANSI 的 Swift 包,名為 Terminus,現(xiàn)在我想與您分享。

這是演示如何使用樣式和顏色寫入終端的示例代碼:

import Terminuslet Terminal = Terminal.sharedterminal.write("I am bold and underlined.n", attributes: [.bold, .underline])let greenColor = Color(r:0, g:255, b:0)terminal.write("Grass is green.n", attributes: [.color(greenColor)])let palette = XTermPalette()let blueOneYellow = ColorPair(foreground: palette.Blue1, background: palette.Yellow1)terminal.write("Blue on yellow", attributes: [.colorPair(blueOneYellow)])


 

請注意,您可以為文本添加任意數(shù)量的樣式和/或顏色。 可以使用 RGB 或使用來自內(nèi)置調(diào)色板之一的命名顏色來指定顏色,例如我在此處使用的 XTerm 調(diào)色板。 該文檔為每個(gè)調(diào)色板提供了一個(gè)可視化圖表。


 

Terminus 還支持 AttributedStrings。

import Foundationimport Terminuslet terminal = Terminal.sharedvar attributedString = AttributedString("Hello, bold, underlined, world.")if let boldRange = attributedString.range(of: "bold") {attributedString[boldRange].terminalTextAttributes = [.bold]if let underlinedRange = attributedString.range(of: "underlined") {attributedString[underlinedRange].terminalTextAttributes = [.underline]terminal.write(attributedString: attributedString)


 

現(xiàn)在來看一些更有趣的東西。 這是制作菜單的一些代碼。

import Foundationimport Terminuslet terminal = Terminal.sharedterminal.clearScreen()terminal.cursor.moveToHome()let palette = XTermPalette()let itemColor = palette.Aquamarine2let selectionColor = palette.Green5let menuItems = ["Life", "Death", "Taxes"]let menu = Menu(items: menuItems, maxColumns: 1, scrollDirection: .vertical, itemAttributes: [.color(itemColor)], selectionAttributes: [.reverse, .color(selectionColor)])let selection = menu.getSelection()


 

最后但并非最不重要的......使用采用文本突出顯示的行編輯器。

import Terminuslet terminal = Terminal.sharedlet lineEditor = LineEditor()lineEditor.bufferHandler = {var shouldWriteBuffer = falseif let greenRange = lineEditor.buffer.range(of: "green") {lineEditor.buffer[greenRange].terminalTextAttributes = [.color(Color(r: 0, g: 255, b: 0))]shouldWriteBuffer = trueif let yellowRange = lineEditor.buffer.range(of: "yellow") {lineEditor.buffer[yellowRange].terminalTextAttributes = [.color(Color(r: 255, g: 255, b: 0))]shouldWriteBuffer = trueif let redRange = lineEditor.buffer.range(of: "red") {lineEditor.buffer[redRange].terminalTextAttributes = [.color(Color(r: 255, g: 0, b: 0))]shouldWriteBuffer = truereturn shouldWriteBufferlet input = lineEditor.getInput()


 

結(jié)論

對于那些堅(jiān)持到最后的人,感謝您的閱讀! Terminus 是一個(gè)新的軟件包,絕不是完整的。 我正在積極尋找合作者來添加功能、修復(fù)錯(cuò)誤等。

分享到:
標(biāo)簽:Swift
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定