2

学生プロジェクト用にIrssi インターフェイスを複製しています。テキスト インターフェイスにはNCursesを使用し、 readlineを使用して、メッセージを作成する際により優れたテキスト編集機能を提供したいと考えています。

この質問回答、およびプロジェクトは、私に素晴らしい出発点を提供してくれました。

私の問題は、次のような入力/イベントループが必要なことです:

int ch;
while (exit_condition) {
    ch = wgetch(window);
    switch (ch) {
    case ERR: continue;
    case KEY_F(1): /* do something */ break;
    case KEY_UP: /* do something else */ break;
    default: forward_to_readline(ch); break;
    }
}

しかし、一致させるには、KEY_F(n)またはKEY_UP有効にする必要がありkeypad(window, TRUE)ます。これにより、入力が変更され、readline で使用できなくなります。

マニュアルから:

キーパッドが TRUE で、ファンクション キーが押された場合、生の文字の代わりにそのファンクション キーのトークンが返されます。

ファンクション キーの先頭となる可能性のある文字 (最新の端末ではエスケープ文字を意味します) を受信すると、curses はタイマーを設定します。シーケンスの残りが指定された時間内に到着しない場合、文字は通過します。それ以外の場合は、ファンクション キーの値が返されます。このため、多くの端末では、ユーザーがエスケープ キーを押してからプログラムにエスケープが返されるまでに遅延が発生します。

ここに私の考えがあります:

  • の効果を逆にする機能はありkeypadますか?
  • の動作を自分で実装する必要がありkeypadますか? Shift + Up などのイベントをキャッチしたい場合は、これも行う必要があると思います。このような例があれば幸いです。
  • NCurses からキーの組み合わせを取得できない場合、readline でキーの組み合わせを取得できますか? 多分キーバインディングコールバックで(関連?)?

お時間をいただきありがとうございます!

4

1 に答える 1

4

それは複数の質問です。簡単に言うと:

  • 関数の逆はkeypad、パラメータが に設定された特定のウィンドウに対してそれを呼び出すことですFALSE
  • 一部のアプリケーションは独自のバージョンのkeypad/を実装してwgetchいますが ( ncurses ' でタイムアウトを制御できることを考えるとESCDELAY)、Solaris curses などに移植できるようにしたい場合を除いて、あまりメリットはありません。
  • たとえば、shift + upでは改善されません(これは端末依存のエスケープシーケンスです)
  • readline は、 Shift + Upをリストする端末データベースの機能を調べません(これは、知っている termcap のサブセットにはありません)。それができることは、文字列を readline 関数に関連付けることです。
于 2016-12-13T21:16:01.517 に答える