簡體   English   中英

如何創建支持ANSI轉義碼序列的可滾動控制台應用程序

[英]How to create scrollable console application that support ANSI escape code sequences

我在此基於我所了解的技術做出一些假設,但也歡迎其他技術建議。

我的目標:編寫一個ANSI Art查看器,使其盡可能類似於在DOS機器上進行查看,最好不要運行dosbox。 這將在Raspberry Pi上運行。

我已經有了控制台,可以使用適當的字符,顏色等適當地顯示ANSI。“查看器”的好處是我希望能夠使用箭頭鍵在文檔中上下滾動,就像,例如,“較少”命令可以。

根據我的研究,詛咒是一個完美的選擇。 問題是curses不支持ANSI轉義碼序列。 有一個使用C ++編寫的ANSI編輯器,它使用curses,但是它為解析轉義碼序列建立了自己的支持。 現在這是我的不得已的方法。

所以我的問題是:是否有更好的方法來創建可滾動的控制台模式應用程序,以在Linux上的python中查看ANSI Art(代碼頁437 + ANSI轉義代碼序列)?

實際上只有兩種可能性:將ANSI序列解析為curses可以接受的內容,或者按原樣使用ANSI序列。

起初,后者似乎更具吸引力。 大多數限制與您無關,或者很容易處理:

  • 它僅適用於靜態ANSI藝術作品,不適用於動畫文件。 這非常合理,因為“向上滾動”動畫文件沒有多大意義。 (當然,您可以動態地將其渲染到畫布上,然后在其中上下滾動一個窗口,但是一旦您開始考慮渲染和窗口化的含義是什么……就在解析ANSI藝術。)但是聽起來像您只需要靜態ANSI藝術。
  • 僅當您的終端與ANSI兼容(足夠接近)時,它才起作用。但是,它是(或可以這樣做),或者cat命令不起作用。 (您可能仍然對顏色設置有疑問,但是我想您也知道如何解決該問題。)
  • 它僅在您的終端是cp437時才有效,這可能是一個更大的問題……但是解決這個問題並不容易。 只需decode('cp437')然后在您的代碼中進行適當編碼即可; 轉義序列將原樣通過。
  • 您可能需要原始鍵盤輸入。 但這就像tty.setraw(sys.stdin.fileno())一樣簡單,只需將stdin讀取為無緩沖文件即可。 (好吧,您可能想tcgetattr原始tcgetattr以便以后可以恢復它,但這並不難。)
  • 您必須自己解析鍵盤輸入轉義序列。 通常,這需要做很多工作……但是,只需處理與ANSI藝術兼容的終端的上下箭頭就很容易。
  • 您將必須知道如何將ANS文件映射到實際行。

最后一個聽起來很簡單,但事實並非如此。 例如,我抓取了一個隨機文件GR-BANT 它只有33行,但其中有154條換行符。 這將非常普遍。 在許多情況下,以esc-[-A開頭的只是“重疊線”,您必須將其視為上一行的一部分,這並不難做到,但是在很多情況下,都需要不僅如此。

因此,無論如何,您都必須至少進行一些 ANSI解析。

一旦開始,我想您將通過完全解析並手動繪制到詛咒板上的“最后一招”找到更輕松的時間。 (當然,這樣做的副作用是可以處理動畫文件,在非ANSI終端上工作,更輕松地在所有終端上處理“小鍵盤”鍵……)

但是,如果您想采用第二種方法, 這里有一個快速的技巧可以幫助您入門。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM