2017-11-27 6 views
0

ncurses5で実行されていた最近、新しい環境(putty/xterm/virtualbox)でcurses6でコンパイルされたncursesプログラムをテストしています。矢印キーは正常に機能しますが、エスケープシーケンスを使用するキーだけが失敗するようです。ncursesファンクションキーのみがエスケープを返します

chtype c; 
initscr(); 
start_color(); 
noecho(); 
cbreak(); 
intrflush(stdscr, TRUE); 
keypad(stdscr, TRUE); 
c=getch(); 
printf("c=%d\n", (int)c); 

F1を押すと "c = 27"が返されます。私はパテを使用していて、TERMをxtermに設定してさまざまな設定を試みました。 cursesの外でF1は\ EOPを期待どおりに返しますが、私はTERM = xtermを使用しています。これはtermcapでファンクションキーを適切に定義するようです。私はkeypad()ルーチンがgetch/wgetchルーチンに265 KEY_F(1)に相当する数字キーを返すと仮定していると理解していますが、break、raw、notimeoutなどのさまざまな組み合わせで27を得ることはできません。

答えて

1

puttyとxtermの両方に、それらのファンクションキーにいくつかのオプションがあります。それぞれのデフォルト設定を使用すると、

infocmp putty xterm 

を使用して見ることができる、異なり、kf1(F1)は、例えば、(パテ左に、右にxterm)など多くの違いの一つであると思わ:

kent: NULL, '\EOM'. 
    kf1: '\E[11~', '\EOP'. 
    kf13: '\E[25~', '\E[1;2P'. 
    kf14: '\E[26~', '\E[1;2Q'. 
    kf15: '\E[28~', '\E[1;2R'. 
    kf16: '\E[29~', '\E[1;2S'. 
    kf17: '\E[31~', '\E[15;2~'. 
    kf18: '\E[32~', '\E[17;2~'. 
    kf19: '\E[33~', '\E[18;2~'. 
    kf2: '\E[12~', '\EOQ'. 
    kf20: '\E[34~', '\E[19;2~'. 
    kf21: NULL, '\E[20;2~'. 
    kf22: NULL, '\E[21;2~'. 
    kf23: NULL, '\E[23;2~'. 
    kf24: NULL, '\E[24;2~'. 

(ncursesのターミナルデータベースのコピーにはが最小でですが、puttyの説明を含む完全なデータベースがあります)。

設定したとおりにターミナルデータベースにキーが表示されない場合、ncursesはそれを認識せず、エスケープ文字を表示します。

+0

はい、xterm設定をチェックアウトして、ファンクションキーが正しいエスケープシーケンスを返していることを確認しました。 TERMはパテでもxtermに設定されています。問題は、実際のエスケープシーケンスの代わりに265の数値を返すようにwgetchar()に指示すると思われるkeypad()ルーチンを使用していても、ncursesは最初のchar(ESC) 。 – AJJ

+0

おそらくncursesのバグではありませんが、S/Oはダイアログにうまく対応していません。 [bug-ncurses](https://invisible-island.net/ncurses/ncurses.faq.html#how_to_report)を試してください。 –

0

Doh!最終的に、古い.bashrcファイルに "alias cmd = 'TERM = Linux cmd'というエイリアスがあることがわかりました。そのため、TERMはコマンドの実行中のみlinuxに設定されていました。愚かな単純な問題を理解するために何時間ものデバッグが必要でした。学んだ教訓。

関連する問題