2011-09-23 77 views
2

我想在我的紅寶石程序陷阱控制左,Shift-F10等。通常,只使用getch,我會得到一個整數列表,例如27,91,50,50,126。不過,我擔心這些可能是系統或終端依賴。谷歌搜索後,我發現了關於use_extended_names,tigetstr等。我發現一個C程序使用這些在運行時發現鍵碼(托馬斯Dickey)。我運行它,它似乎發現擴展的鍵,但然後getch在同一個程序仍然給我通常的整數列表,例如[27,91,53,68]爲C左我正在得到。我希望得到一個它所提到的價值。ncurses捕獲擴展的鍵(控制左,Shift功能等)

我在想什麼?

這是當我按下Control-左輸出:

keypress=27 
keypress=91 
keypress=53 
keypress=68 
key=kLFT5, code=540 
key=kEND5, code=525 
key=kHOM5, code=530 
key=kHOM3, code=528 
key=kUP5, code=561 
key=kDN5, code=520 

如果我僅僅獲得540?

這裏是keytest.c:https://gist.github.com/1237091

奇怪的是,所有的代碼下TERM =屏幕上運行時顯示0。以上是TERM = xterm。 (我在使用終端的OSX上)

+0

當我運行你的示例程序時,我得到3行打印:tigetstr ...如果你沒有看到這些行,你的終端描述有問題。你在運行什麼操作系統和終端? – Craig

回答

2

Curses的設計是在人們真的在終端上做修飾符之前。它的關鍵處理模型實際上是一個枚舉值,並且不容易處理任意鍵+修飾符組合。

爲了更好的解決這個問題,我寫了libtermkey,你可能會用更多的運氣來代替它。

http://www.leonerd.org.uk/code/libtermkey/

這是一個C庫,儘管它有兩個Perl和Python綁定。我可以想象有人應該能夠很容易地爲它構建一些Ruby綁定。

+0

所以ncurses本身不能處理控制左和等? –

+0

@AndriusBentkus - 正確;這不可以。 – LeoNerd

0

由於它只知道個字符,因此ncurses本身並不知道控件,移位,元字符和alt修飾符。修飾符是特定終端知道的東西。某些終端可以將鍵盤修飾符編碼爲發送給主機的字符。 xterm,例如可以做到這一點。 terminfo(和termcap)具有特定鍵(例如光標鍵,功能鍵)的預定義列表,包括少量修改過的特殊鍵(例如右移的右箭頭)。預定義的密鑰在終端描述中具有明確定義的名稱,並在curses.h標頭中包含KEY_xxx名稱。 ncurses的提供兩種方式來延長特殊鍵

  • -x選項tic與相應use_extended_names函數(對於給定的輸入字符串定義名稱)的這些列表。
  • define_key函數(它爲getch返回一個給定輸入字符串返回的代碼)。

ncurses終端數據庫爲修改過的特殊鍵提供了最有用的定義,重點放在光標鍵和編輯鍵盤上。 有幾個問題與此:

  • 終端數據庫不提供所有定義,因爲便攜式terminfo的定義限制爲4096個字節。如果對大小沒有限制,那麼可以想象,可以爲xterm的各種鍵盤相關資源設置(字面上)的數千個組合生成完整的表。
  • 設置TERMxterm的一些終端不會發送與xterm相同的字符串。 (實際上,大多數不同,儘管少數是子集而不是簡單的區別)。
  • 對於給出的例子,terminfo中的字符串是\E[5D,它看起來不是xterm的一個。 (OP表示這是幾年前的OSX終端 - 每個OSX版本都包含對終端的更改,但沒有發佈OSX終端,但與xterm完全匹配)。它看起來不是xterm的原因是修飾符(5)出現在第一個位置而不是第二個位置。 xterm在2002年棄用(patch #167)。
  • 在沒有具體細節的問題中提到了功能鍵。在ncurses中使用的慣例是爲(獲得48個功能鍵)分配(幾乎標準的)12個PC鍵盤功能鍵以及4個最有用的移位和控制修飾符組合。 terminfo中有60個預定義的功能鍵;當這些人還有其他衆所周知的字符串時,剩餘的十幾個字符就會被填滿。

對於使用terminfo製作預定義表格(有大小和終端的問題假裝是不同的東西)這麼多。功能在尺寸上沒有限制,並且長期以來可供具有特殊需求的應用程序使用。例如,可以通過合併最常見終端的最常見變體來使用它來構建表格。