進一步閱讀

進一步閱讀

這裡提出問題:

如果我打算實際實施此更改,我需要研究哪個庫/程式? 「終端堆疊」的哪一部分負責將新行追加到終端緩衝區的行為?

我曾經認為它會在終端原始碼中,然後是 shell,現在看起來可能是 VTE?

有什麼指點嗎?

答案1

終端仿真器的實作方式並不相同。您需要更改的內容取決於您打算修改的終端模擬器。

一般來說,這可以在兩個地方實現:在模擬部分中,將列印和控制序列解釋為對終端顯示狀態的某種形式的記憶體表示形式的修改;或者在實現部分中,呈現該顯示狀態到某種輸出設備上。

前者將會是一項非常複雜的任務。應用程式軟體,無論是提供全螢幕文字使用者介面的軟體,還是僅提供可編輯單行之類的軟體,都會對進展方向。他們假設各種各樣的事情,例如、、、、、、、、等等的方向。 (理論上,在符合ECMA-48:1991 的設備中,行進和隱式移動的方向是可以切換的。據我所知,沒有任何Unix 或Linux 終端模擬器能夠真正實現這一點。世界上大多數操作的前提是它不是t。RIINDCUDCUU

因為後者是一個相對相當容易的任務。為了好玩,我只是在我的終端模擬器中實現了它。它是兩個實現器中布林標誌的命令列開關,以及一些在多個位置執行座標轉換的條件表達式。不可否認,可見的實現視窗始終是這些實現器中字元單元大小的整數倍,這避免了一些額外的複雜性。

也就是說:使用它並與多年來從上到下閱讀的習慣作鬥爭,然後體驗到最初的期望小事情的應用程式出現問題(例如插入符號是窮人的向上箭頭和波形符是窮人的底線),然後我在手冊頁中添加了警告註釋。我正在考慮將該機制保留到下一個版本,以便人們從現在開始可以實際嘗試終端上的錯誤方式並得出他們確實這樣做的結論不是不管他們怎麼說,畢竟還是想要這個。 ☺

進一步閱讀

答案2

是什麼精確的您想要實現的行為?

首先我假設你希望有全部行的順序相反每時每刻

請注意,在我看來,在大多數情況下,這會導致非常不尋常和違反直覺(如果不是直接破壞)的行為,可能您很快就會放棄使用。

cat編輯文字檔案會顯示從下到上的行,而不是您通常閱讀文字的方向。在您最喜歡的文字編輯器和檢視器中,這些行也會顛倒過來。在應用程式中,它們的頂部欄將位於底部,底部欄將位於頂部。在 alsamixer 中,音量控制將從頂部垂下。方框圖字符(例如在 alsamixer、午夜指揮官等中)會在角落處散開。在許多應用程式中,向上和向下鍵將使遊標沿相反方向移動。

這可以透過修改您最喜歡的終端仿真器的原始程式碼(如果您使用基於 VTE 的模擬器(如 GNOME 終端),則修改 VTE)來實現。

基本上,終端模擬器追蹤邏輯內容(哪個字元單元包含具有哪些圖形屬性的字母),並將它們轉換為使用者可見的像素(精美渲染的字形)。這需要顛倒過來。我會尋找基於字元的座標和基於像素的座標之間發生轉換的位置,這是發生與單元格高度相乘或除法的所有位置。這些公式需要調整。例如,如果您看到 a y_pixel = top_padding + row * cell_height,它可能會變成y_pixel = top_padding + (number_of_rows - 1 - row) * cell_height, 或類似的東西。

在VTE中,超級平滑的滾動(使用觸控板進行逐像素滾動),加上平滑滾動時額外的底部填充(在非網格對齊的情況下,例如最大化視窗)填充內容的方式會讓你額外頭痛。

完成基本渲染後,您還必須確保發送到應用程式的滑鼠事件被正確翻轉,追蹤選擇的滑鼠事件也是如此。滾動條也應該翻轉。

第二步,您可能想要新增一個選單項,或引入一個新的自訂轉義序列(可能是新的 DEC 私人號碼),讓您可以在標準行為和這種顛倒行為之間切換。請注意,變更模式會立即將所有內容(所有螢幕內容和歷史記錄)顛倒或顛倒。能夠恢復原始行為非常方便,特別是如果它可以在您首選的編輯器前面的包裝腳本中自動完成的話。對於 VTE 和基於 VTE 的模擬器,圖形選單項目將需要兩個元件之間的新 API,因此這是採用轉義序列的另一個原因。

如果您想要比這更細粒度的東西,例如每個命令的輸出以“正常”順序出現,而命令序列是“顛倒”,那麼它就會變得更加複雜,無法在模擬器中完成它自己的,它需要獲得幫助(透過新設計的轉義序列)來知道要翻轉哪些邏輯部分。我個人的建議是忘記它,我認為這不太可行​​。

相關內容