簡體   English   中英

如何在bash中查詢當前光標位置或屏幕上任何位置的字符

[英]How to query the character under the current cursor position or anywhere on the screen in bash

我知道以下語句是查詢當前光標位置的一種方法:

echo -en '\033[6n'

有誰知道如何查詢光標下的字符或用當前屏幕/窗口的內容填充數組? 我已經搜索過ANSI終端命令,但是很多這些命令都是非常抽象的,看起來它們看起來不會這么做。 我也考慮過用tcup命令做這tcup而沒有運氣。

謝謝您的幫助。

ANSI終端並不需要能夠告訴您屏幕上的內容。 如果你需要這些信息,你應該記住自己。 例如,流行的ncurses庫可以實現這一點,盡管它只允許您將屏幕導出到文件,並且沒有記錄文件格式。 無論如何, bash不使用ncurses ,所以它實際上對控制台的狀態一無所知。

最有可能的是,您所談論的屏幕實際上是某些終端仿真程序(如xterm的工件。 這些程序在用戶空間中運行,很少(如果有的話)具有外部查詢接口。 但是,linux確實有一個控制台(實際上,有許多模擬控制台,但使用顯示器的控制台模式)並且它維護這些控制台的顯示內存。 此外,它提供了一個用於讀取控制台內存的接口,通常可用作/dev/vcsN (對於0之間的N值和linux編譯的虛擬控制台的數量)。 /dev/vcs0是“當前”控制台(可見的控制台)。

大多數Linux發行版都限制對/dev/vcsN訪問,因此如果您想要使用它們,您將需要特殊權限,或者您需要使用root權限來更改設備文件的訪問權限。 (Ubuntu似乎為組tty用戶提供rw訪問權限;請檢查ls -l /dev/vcs0以查看系統是如何進行的。)(當然,您需要找到控制台:-)嘗試Ctl Alt 1 ; Ctl Alt 7可能會回復你的GUI。)

一旦解決了訪問問題,就可以執行類似cp /dev/vcs0 console_memory來查看它。 您會發現它只是一個沒有換行符的2D字符數組,並且沒有指示尺寸是什么。 (您可以使用ioctl或通過查看環境變量$LINES$COLUMNS來獲取維度。)

您可以使用/dev/vcsa0代替; 它的格式略有不同,每個字符使用兩個字節,以便存儲顯示屬性(主要是前景色和背景色)以及字符。 此外, /dev/vcsaN的前四個字節是屏幕尺寸和光標位置(每個坐標一個字節),這將為您節省查詢光標位置的工作。

請注意,控制台不支持完整的Unicode字符集。 實際上,它一次只能顯示512個不同的字形。 為了最大化可用的字形空間,Linux可能會將某些代碼重新分配給所需的符號,並且此映射不是控制台內存的一部分。 因此從控制台內存中提取的代碼可能沒有明顯的映射到Unicode代碼,但它應該適用於標准ANSI字符。

暫無
暫無

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

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