9

シェルに似たプログラムを書いています。起動するとプロンプトが表示され、アプリ固有のコマンドをいくつか入力します。

これまでのところ、これはうまく機能します。ただし、Bash のようなコマンド履歴のサポートを追加したいので、ユーザーは上矢印または下矢印を押して、以前に入力したコマンドを表示できます。

ncurses ライブラリを含め、getch() を使用して単純な hello world テストを実行し、上下の矢印が正しく報告されることを確認しました。

私を悩ませているのは、getch() を使用するために画面をクリアする initscr() を呼び出す必要があるように思われることです。

質問は次のとおりです。

最初に initscr() を呼び出さずに ncurses getch() 関数を使用する方法を知っている人はいますか? そうでない場合、画面をクリアしないようにすることはできますか? 基本的に、私は getch() が getchar() と同じように動作することを期待しています。

前もって感謝します!

編集: これの最も良い例は、Python が対話モードで実行される方法だと思います。

4

5 に答える 5

13

Curses は、画面を完全に制御し、特に低速のシリアル回線で画面への書き込みを最適化したいと考えています。これを行うには、画面に何が表示されているかを知る必要があり、ほとんどの端末でこれを行う唯一の合理的な方法は、空の画面から開始して、端末に書き込む内容を追跡することです。

したがって、(n)curses はシェルにとって不適切なツールであると思われます。おそらく、抽象化レイヤーのステップを下って、端末 (標準入力) からの terminfo とノンブロッキング読み取りを使用する必要があります。

(これはあまり役に立ちません。申し訳ありません。)

于 2009-03-17T14:30:59.393 に答える
6

rlwrap内からプログラムを呼び出すだけで、問題なく機能を利用できます...

于 2009-03-17T14:31:13.870 に答える
4

これについては、別の議論があります。提供されるソリューションは次のとおりです。

  1. 「'filter()' 関数を使用すると、curses を単一行として使用できます。」
  2. 「setupterm を使用して端末データを取得し、tparm、tputs を書式設定および出力に使用して、C で同等のものを作成できます。」

もちろん、ncurses のソース コードを取得して変更し、画面がクリアされないようにする 3 番目のオプションがあります。

于 2009-03-17T14:31:29.547 に答える
-1

画面をクリアするシーケンスがないカスタムterminfoまたはtermcapエントリを作成し、プログラムを実行する直前にターミナル設定をそれに切り替えるという簡単な方法を検討しましたか?ncursesでnewterm()とset_term()を使用することもできます。これは、別の端末を含めてその機能の一部をオーバーライドできるため、termcapを使用すると簡単になりました。

于 2009-03-18T04:14:43.120 に答える