25

タイトルは私の実際の目標よりも少し具体的です:

私はGNUReadlineを使用するコマンドラインプログラムを持っています。これは主にコマンド履歴(つまり、上矢印を使用して以前のコマンドを取得するため)やその他の便利な機能です。現在、プログラムの出力はユーザーの入力に散在しているように見えますが、これは問題ない場合もありますが、出力は非同期であり(入力コマンドに応答してネットワーク接続を介して送信されます)、煩わしい場合があります(たとえば、ユーザーが行を出力する場合)新しい入力を入力しています)。

このプログラムに機能を追加したいと思います。出力用の個別の「ウィンドウ」です。このためにncursesを使用することを考えました。しかし、ncurses FAQから、2つのライブラリを一緒に使用するのは簡単ではないようです。

Readlineの代わりにEditlineまたはteclaを使用することを検討するかもしれませんが、どちらかが私の問題を解決するかどうかはわかりません。両方の種類の機能(テキストモードウィンドウとコマンド履歴)を提供するライブラリなど、ncurses以外のものを使用することも検討しますが、何が最適かわかりません。

ああ、そして色付きのテキストのサポートはボーナスポイントを獲得するかもしれません。Readlineでそれができるのではないかと思うので、別の問題かもしれませんが、私の問題を解決することで、出力に少し色を追加するのも簡単になるのであれば、はるかに優れています。

Ubuntu Hardy(Linux 2.6)を使用しています。

4

6 に答える 6

15

GitHub に簡単なサンプル プログラムをまとめました: https://github.com/ulfalizer/readline-and-ncurses

シームレスで効率的な端末のサイズ変更とマルチバイト/結合/ワイド文字をサポートします。コードには役立つコメントがあります。

以下のスクリーンショット:

ncurses と readline を組み合わせたプログラムのスクリーンショット

于 2015-02-25T02:14:22.417 に答える
6

私はいくつかの検索を行いましたが、あなたは運が悪いようです。

ncurses の代替として、SLangNewtTurbo Visionがあります。スラングは単なる画面処理ではなく、より複雑ですが、あなたの目的に使用できるのではないでしょうか?. Newt は画面処理を使用しており、はるかに単純ですが、目的には単純すぎてシングルスレッドモードだと思います。

Turbo Vision は Borland のテキスト モード グラフィックス ライブラリで、80 年代後半から 90 年代前半にかけてすべてのツールで使用されていました。Borland は、その種の市場が縮小したときにソース コードをリリースし、現在は Linux 用のポートがあります (ちなみに、このプロジェクトは独自のターボ ビジョンの実装を作成したようです)。そのポートは死んでいません (今年いくつかの cvs の更新があり、正常にコンパイルされました (古いリリースはそうではありませんでした))。残りをあきらめます。テレビは快適な環境だったので、これは少し残念です。TVはところでC ++です(そして、Cを使用していると思いますか?)。

readline の代替として、 ncurses と一緒に動作する可能性があるlibkinputがあります (ncurses の terminfo を使用できると書かれていますが、それが ncurses の使用法と共存できることを意味するかどうかはわかりません)。

おそらく 1 つのオプションは、 rlwrapを使用して ncurses プログラムに対して「外部的に」 readline を実行することですか?

于 2009-03-28T22:33:05.107 に答える
5

これには数時間頭をぶつけていたので、グーグルで苦労する人を救うために:

ncurses の組み込みSIGWINCHハンドラを とともに使用している場合は、デフォルトKEY_RESIZEで readline がLINESおよびCOLUMNS環境変数を設定することに注意してください。これらioctl() TIOCGWINSZは、ncurses が他の方法で行う動的サイズ計算 (通常は を使用) をオーバーライドします。つまり、端末のサイズを変更した後でも初期端末サイズを取得し続けることになります。

これは、readline を初期化する前に にrl_change_environment設定することで防ぐことができます。0

アップデート:

readline のソースから収集した追加情報を次に示します。

readline のSIGWINCH処理コード ( rl_catch_sigwinchis が 1 の場合に使用される) は updateLINESCOLUMNSを実行します。これは、ncurses には十分なようです。ただし、別の readline インターフェース (readline と ncurses を組み合わせる場合に最も意味があります) を使用する場合、シグナル ハンドラ ( 用のものを含むSIGWINCH) は各呼び出しの間だけインストールされrl_callback_read_char()ます。つまり、2 つの呼び出しの間の端末のサイズ変更rl_callback_read_char()はreadline で見られます。

于 2015-02-17T21:15:51.343 に答える
3

私はあなたが私のプログラムで説明したことを達成しました:

http://dpc.ucore.info/lab:xmppconsole

以下は、ioを処理するファイルです。

http://github.com/dpc/xmppconsole/blob/master/src/io.c

于 2010-06-09T18:54:00.877 に答える
2

どのバージョンを試したかわかりません。今日 (2012.09.14) の時点では非常に簡単です。カスタム関数を次の関数ポインターにフックするだけです。

rl_getch_function
rl_redisplay_function
rl_completion_display_matches_hook

ここで合理的なことをしました。

于 2012-09-14T05:34:58.873 に答える