3

私はこれをCコードで使用しています:

system("stty -echo -icanon");

これは宿題の一部ですが、この特定の部分は、課題の要件を超えて私が取り組んでいるものです。

シェルを実装していて、最初にたくさんのコードが与えられています。コードはncurses(できれば使用します)を使用せず、それを変更するには、提供されたコードの多くを書き直す必要があります。

HOMEまたはキーを押すENDと、大文字のO(Openの場合はo)が表示され、次にHOMEandENDキーが表示されます。私はgetchar()キャラクターを取得するために使用しています。

これを行うのはこれらの2つのキーだけのようですが、よくわかりません。提供されたシステム関数呼び出しだけが異なる場合、私は100%ではありません(stdout非ブロッキングにも設定していますが、それは問題ではありません)。

本当に混乱していて、ENDキーとHOMEキーをよく使うので実装したいと思います。

あまり情報がないのでごめんなさい。system-echoと-icanonがsttyにどのような影響を与えるかを実際に理解するには、十分な知識がありません。マニュアルページを見ましたが、それでもわかりません。

編集

アレックスブラウンの答えから、私はエスケープ文字を取得していることを確認しました。私は次のようなものを持っています(悪い擬似コードで):

while (TRUE) 
    ch = getchar()
    switch (ch)
        case HOME:
        case END:
            don't print anything...
            break

        default:
            printf(ch);
            break

したがって、エスケープシーケンスからOを出力しますが、[(0x48forHOME0x46for END)は出力しません。まだ本当のキーコードを取得する方法に困惑しています...

4

2 に答える 2

4

コンソールアプリケーションの場合、HomeやなどのキーEndは通常、エスケープシーケンスとして送信されます。正確な順序は、使用しているターミナルプログラムとその構成方法によって異なります。情報は伝統的にtermcap/terminfoに保存され、ncursesは端末タイプに基づいてそこから検索します。

Gnomeターミナルは以下を送信します:

  • ESC O H0x1b 0x4f 0x48Home
  • ESC O F0x1b 0x4f 0x46)for End

KDE Konsoleとxtermの送信:

  • ESC [ H0x1b 0x5b 0x48Home
  • ESC [ F0x1b 0x5b 0x46)for End

文字の後にまたはESCが続く場合は、どのキーが押されたかを判別するために、追加の文字を読み取る必要があります。[O

于 2012-08-30T07:13:33.997 に答える
1

多くのメタ文字(矢印キー、ファンクションキー、ホーム、エンドなど)は、エスケープ文字(エスケープコードの後に​​1つ以上のバイト値が続く)として端末(したがってアプリケーション)によって受信されます。各バイトは個別のgetchar呼び出しによって受信されるため、これが発生している可能性があります。エスケープ文字が「O」と表示されている理由がわかりません。

于 2012-08-30T05:16:31.247 に答える