2011-10-14 41 views
9

我在瀏覽器中建立一個終端窗口(某物。像ajaxterm),不知道哪個轉義序列發送的CTRL +箭頭終端轉義序列(左,右,...)到SSH隧道(通過paramiko.SSHClient().invoke_shell(term='linux')打開)。什麼是TERM = linux的

我已經找到了key logger及使用$ TERM =='Linux的嘗試了在終端,但它返回相同的序列ctrl+leftleft(27,91,68)。

如果我嘗試在鍵盤記錄器的另一終端(含$ TERM == '的xterm')我得到的代碼(27,91,49,59,53,68)。但是這些代碼不會移動從SSH通道中生成預期的輸出(這會將光標移到正常的linux外殼上留下一個字)。即使我用term ='xterm'開始paramiko也是如此。

任何想法,我應該用什麼順序?或者爲什麼上述順序不起作用?

更新:我會很樂意使用其他終端類型(而不是「LINUX」),但不幸的是pyte作品與VTxxx終端只(我相信「Linux」是VT220類終端 - 無論如何,它的工作原理)所以xterm不能正常工作。

+0

一個典型的默認readline配置(bash使用readline)對**後向字**有'Alt-B'。 terminfo甚至沒有用於「Ctrl-←」的條目。 – ninjalj

+0

但它可以在xterm控制檯上工作...您能否詳細介紹terminfo,最好是在答案中? – johndodo

+0

Linux控制檯甚至不能*關閉*到vt220。它是(不太能力的)vt100的子集。這個問題的每個答案都有至少一個錯誤。 –

回答

21

端子是該包括一個鍵盤和一個輸出設備(最初的硬拷貝打印機,以後CRT監視器)的硬件設備。一臺大型計算機可能有幾個遠程終端連接到它。每個終端都有一個與計算機進行有效通信的協議,對於基於CRT的終端,這包括具有特殊的「控制序列」來改變光標位置,擦除當前行/屏幕的部分,切換到備用全屏模式。 ..

終端仿真器是模擬那些年長端子中的一個的應用程序。它允許執行像光標定位,設置前景色和背景色等功能,...終端仿真程序試圖仿效一些特定的終端協議,但每個都有自己的一組怪異和偏差。

Unix系統具有描述終端和終端仿真器數據庫,所以應用程序從在使用中的特定終端(或終端仿真器)抽象出來。較舊的數據庫是termcap(5),而terminfo(5)是較新的數據庫。這些數據庫允許應用程序查詢正在使用的終端的功能。功能可以是布爾值,數字功能,甚至字符串功能,例如:如果特定的終端類型具有/支持F12鍵,它將具有「key_f12」(長terminfo名稱),「kf12」(短terminfo名稱),描述密鑰產生的字符串的「F2」(termcap名稱)。試一下:tput kf12 | od -tx1

由於直接與功能的編程可能會很麻煩,應用程序通常使用更高級別的圖書館像詛咒/ ncurses的,俚語等..

有一個叫TERM一個特殊的環境變量,告訴應用什麼樣的終端類型他們正在交談。爲了獲得最佳結果,如果該變量存在於數據庫中,則應將此變量設置爲確切的終端類型。這只是告訴應用終端理解哪些精確的協議和協議偏差。更改TERM變量確實是而不是更改終端類型,它只是更改應用程序認爲它正在與之通話的終端類型。

所有這一切,Ctrl+arrow是一個xterm行爲(取決於配置選項),在terminfo/termcap數據庫中根本沒有反映,所以大多數應用程序將不知道它。無論哪種方式,無論是你的終端模擬器(在你的情況下​​)支持它或不。

代替

假設你的主要應用是bash或使用該readline庫一些其他的應用程序,你可以逃脫使用的ReadLine的backward-word(元-B/ALT-B/ESC b。通過默認情況下,配置在inputrc)。

8

快速檢查與od -c揭示了GNOME-termainal生成這些值:

左箭頭產生ESC - [ - D

控制左陣列geneates ESC - [ - 1 - ; - 5 - D

+0

好的,但gnome-terminal是TERM = xterm ...那麼linux呢? – johndodo

+1

Linux控制檯爲這兩種擊鍵都生成'ESC'' ['-'D']。 –

+0

我知道它的確如此,我寫的是這樣:)但是,這是特定於控制檯還是特定於終端的? – johndodo

4

按Ctrl +箭頭鍵碼是由xterm的引入,侏儒終端和KDE的Konsole的喜歡儘量兼容於Xterm 。實際的VT100和VT220終端沒有用於這種組合的單獨鍵碼。據我所知,Linux控制檯的目標是與VT100兼容,但增加了一些功能,而xterm模擬VT220,並增加了大量功能。

+0

Linux控制檯開始嘗試模擬VT100,但是在20世紀90年代後期增加了UTF-8支持時,一大塊(在字符集之間切換)丟失了。 Linux控制檯基於VT220(或20世紀90年代早期的xterm實現)實現了功能鍵(不屬於VT100的功能)。與xterm不同,Linux功能鍵功能沒有擴展。 –