2010-03-10 42 views
3

我正在編寫一個腳本來導航基於文本的菜單系統,使用python的telnetlib訪問串行連接。「esc」鍵盤鍵本身的VT100轉義碼是什麼

我可以愉快地按下F鍵,使用轉義碼。例如F9 =「\ 033OX」,其中「\ 033」是轉義序列。

如何編碼「esc」鍵盤鍵?我會期望只是「\ 033」,但這似乎並不奏效。

回答

5

在發送逃脫之後放置一個小小的延遲,比如說1.5s,這樣對方就會意識到這是一個孤立的轉義,而不是更長序列的一部分。

+1

謝謝。你指出我正確的方向。延遲沒有奏效,但是在轉義序列後發送了一個「」(空格)。這促使菜單系統接受「獨立」轉義鍵。 – jlb83 2010-03-10 21:57:10

5

VT-100(或使用轉義序列的其他終端)上的ESC鍵沒有「轉義序列」。

轉義字符ASCII 27用於表示以下字符序列具有特殊含義。這通常會將終端置於一個簡單的狀態機中。一般來說,規則是嚥下輸入的字符,直到看到字母或符號字符,儘管一些特殊情況例如可能抓住一個附加字符的符號(例如, ESC#6改爲雙寬字符。例如,在H-19/VT-52終端上,ESC H表示家庭,ESC E表示屏幕和家庭,ESC J表示屏幕結束等.VT-100系列使用ESC [H家用和ESC [2 J清除屏幕結束。

真正發生的是開放方括號(沒有右括號)表示參數列表(通常是數字)即將到來。 ESC [2 J中的'2'表示從遊標到頂部(零)以及從遊標到結束(一個)。將J切換到K,現在它將以同樣的方式清除線條,而不是屏幕。他們不是任意的。即使ESC [行;列H將採用數字行/列,例如, ESC [12; 34 H將轉到第12行,第34列。不提供它們採用默認值。

從理論上講,服務器不應該給你一個無意義的孤兒ESC字符,因爲終端會坐在那裏等待序列。

當你按下一個功能鍵時,終端會發送一個ESC字符,然後是一個預先設置的功能鍵,箭頭或動作序列。例如ESC [21〜是F10。

然後,這留下了如何發送文字孤兒ESC的真正問題。有兩種方法。

一,發送ESC,然後延遲一段時間。主持人有責任不僅觀看進來的內容,而且觀看時間。而且,假設終端會立即在其緩衝區中發送一個字符塊,它將在內部超時,並將ESC命名爲ESC。延遲時間不一定很長。

二,要求用戶按ESC兩次,每個文字ESC所需。由於沒有逃逸序列由雙重轉義字符構成,因此它表示了一種特殊情況。它與我們在字符串中引用反斜槓字符時所做的完全相同,「\」確實意味着「\」,因爲我們必須滿足編譯器的詞法階段。在這種情況下,它是主機服務器。請記住,在串口使用這些終端的時候,當一個字符被按下時,它立即被髮送。僅僅幾年後,我們開始模擬終端,從而提出了模仿他們的轉義序列的需求,而不是將內容流中的行爲帶出。當然,一個'無效'的ESC序列意味着ESC是字面的,但是這需要看到下面的字節是什麼,然後才能對它們進行操作(因此超時解決方案)。問題是有些時候,這些角色會對應用程序造成副作用,令人討厭,並且有趣的情況可能會在試圖天真地僞裝系統時會讓您陷入麻煩。例如,使用ESC Space強制逃生通過,ESC取消一個提示,但該空間意外地確認下一個。

問題的第三種解決方案是讓主機完全忽略特殊功能鍵,並將傳入的字節流作爲文字。例如,TECO編輯器每次按ESC時都會向用戶顯示一個美元符號,因爲它用於命令分隔符,就像今天編碼時使用分號一樣。

相關問題