2009-03-17 13 views
9

私はシェルに似たプログラムを書いています。起動すると、プロンプトが表示され、アプリ固有のコマンドを入力します。画面をクリアせずにNCursesの初期化

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

私はncursesライブラリを含めました。上向き矢印と下向き矢印が正しくレポートされるように、getch()で単純なhello worldテストを行いました。

私に迷惑をかけることは、私がgetch()を使うために画面をクリアするinitscr()を呼び出す必要があるようです。 OKAY

SOの質問です:

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

ありがとうございます!

EDIT:これの最良の例は、Pythonが対話モードで動作する方法です。

答えて

8

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

したがって、(n)cursesはあなたのシェルにとって間違ったツールだと思われます。おそらく、抽象化レイヤーの一歩を踏み出し、代わりに端末(標準入力)からのterminfoと非ブロック読み取りを使用する必要があります。

(これは非常に有用ではありません。申し訳ありません。)

5

あなただけrlwrap whithinからプログラムを呼び出し、痛みなしの機能を持っている可能性が...ここで

3

はこれについて別のdiscussionです。提供されるソリューションは次のとおりです。

  1. "'filter()'関数を使用すると、1行でcursesを使用できます。
  2. "setuptermを使用して 端末データを取得し、tparm、tputsを使用してフォーマットして出力することで、Cで同等のものを書くことができます。

もちろん、ncursesのソースコードを入手して修正しても画面を消去しないようにする3つ目のオプションがあります。

+0

このリンクは404が見つかりません。 :-( –

+0

が編集されました。悲しいことに、Wayback Machineには既に404を含むバージョンしかありません。しかし、デッドリンクを報告してくれてありがとう。 – schnaader

+0

ディスカッションの件名をグーグルで探すだけで、より安定したURLでアーカイブされたディスカッションが見つかりました。リンクを再導入するために編集しました。 –

0

カスタムのterminfoまたはtermcapエントリを作成して画面を消去し、プログラムを実行する前に端末設定をその権利に切り替えるという単純な方法を考えましたか?また、ncursesでnewterm()とset_term()を使用することもできます。これは、他の端末を組み込み、その機能のいくつかを上書きすることができたため、termcapでより使いやすくなっていました。

+0

これは本当に醜いハッキングであり、エンドユーザーのシステムで使用できるアプリケーションにはなりません。 –

+0

それはナンセンスです。プロセスの環境でTERMINFOを設定し、 インストール時に小さな エントリ数の代替パスの下にカスタマイズされたTERMINFOデータベースをインストールします。次に、TERM変数を の適切なエントリに設定します。理論的には、実行時に自動的にこれを行うことも可能です。つまり、TERMINFOが指す非標準の場所に格納されている代替のterminfo エントリをコンパイルするterminfoユーティリティを使用します。実行時に を実行した場合、現在の端末にconfusedエントリを置くことさえできます。 それはかなりではありませんが、あなたが主張するほど悪くはありません。 –

8

本格的なncursesに頼るよりも、readline()のようなインターフェイスを使用する方が簡単かもしれません。

+0

ncursesとreadlineは異なるライセンスを持っています。最初に確認してください! – sdgfsdh

関連する問題