2

curses.h のファンクション キーに問題があります。私はこの小さなプログラムをさまざまなウェブサイト/チュートリアルで見ています

#include <ncurses.h>

int main()
{       int ch;

    initscr();                      /* Start curses mode            */
    raw();                          /* Line buffering disabled      */
    keypad(stdscr, TRUE);           /* We get F1, F2 etc..          */
    noecho();                       /* Don't echo() while we do getch */

    printw("Type any character to see it in bold\n");
    ch = getch();
    while (ch != KEY_F(1))
    {
            if(ch == KEY_F(1))      
                    printw("F1 Key pressed: Ending program.\n");

            else
            {       printw("The pressed key is ");
                    attron(A_BOLD);
                    printw("%c\n", ch);
                    attroff(A_BOLD);
            }

            refresh();     

            ch = getch();

    }
    printw("end\n");
    endwin();                       /* End curses mode                */

    return 0;
}

キー F6-F12 は問題なく動作し、返されるコードも問題ありません (たとえば、F6 が押された場合は 270)。しかし、F5 を押すと 269 が返されず、本来のように返されず、代わりに次のことが起こっています (F5 を 1 回押すだけです)。

Type any character to see it in bold
The pressed key is ^[
27
The pressed key is [
91
The pressed key is 1
49
The pressed key is 5
53
The pressed key is ~
126

したがって、エスケープ シーケンス全体が返されると思います。この問題についてインターネットで読んだところ、TERM 変数を xterm または vt100 に変更する方法を説明するヒントが 2 回ありました。そこで、TERM を vt 220 と xterm に変更しようとしましたが、何も変わりません。vt100に変えたらF6-F12も効かなくなった。

ユーザーが F1-F5 を押したかどうかを認識する方法を教えてもらえますか? Enter、Backspace、上、下などのキーは正常に認識されます。

よろしくお願いします

4

1 に答える 1

6

terminfo端末が送信する内容と実際に行う内容との間に不一致があるように思えます。terminfoターゲット マシンのファイルが正しくない、$TERM設定が間違っている、またはさまざまな原因が考えられます。

何を比較することから始めますか

$ infocmp -L

実行時に端末が実際に送信するものと比較して、ターゲットマシンで言うcat.

xtermを実行している場合~/.Xresources、ファンクション キーを変換するファイルがある可能性があります。VMS ユーザーは、F1 から F5 キーをそのように再マップすることがよくあります。また、多くの端末エミュレータ (Putty など) には、これらのキーを再マップするオプションがあります。

于 2012-10-22T13:36:10.220 に答える