2009-03-27 4 views
21

タイトルは私の実際の目標より少し具体的です:GNU Readlineの使用。同じプログラムにncursesを追加するにはどうすればいいですか?

私は、主にコマンド履歴(上矢印を使って前のコマンドを取り出す)といくつかの細かい点についてGNU Readlineを使用するコマンドラインプログラムを持っています。現在、プログラムの出力はユーザーの入力に散在しているようですが、出力は非同期です(入力コマンドに応じてネットワーク接続を経由して出力されます)、時には迷惑になります新しい入力をタイプしています)。

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

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

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

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

+0

は、あなたが解決策を見つけたことがありますか? –

+0

私はあきらめました(そして、readlineで立ち往生しました)。 –

答えて

6

私はいくつかの検索を行いました。あなたは運が不足しているようです。

ncursesの代替品には、SLang,NewtおよびTurbo Visionがあります。スラングは画面の操作だけではなく、より多くのものがあります。 複雑ですが、目的に合わせて使用​​することができますか? Newtは画面 の処理を使用していますが、はるか簡単ですが、シンプルでシングルスレッドモード と思っています。

ターボビジョンは、ボーランドのテキストモードのグラフィックスライブラリで、 で使用されているすべてのツールを80年代後半から90年代前半に使用しています。 Borlandはソースコードを としてリリースしましたが、その種の市場が縮小し、現在は がLinux用のポートです(サイドノート、this projectは独自のターボビジョン実装 と書かれているようです)。そのポートは死んでいません(今年は はありませんでした)。しかし、私が見つけたテレビの例はどれも最新ではありませんでした。私は しか持っていませんでしたコンパイルして残りの部分をあきらめること。 これはちょっと残念です。なぜなら、テレビは素晴らしい環境だからです。 テレビはbtw C++です(あなたはCを使っていると思います)。多分ncursesベースと一緒に を働くreadlineのための代替のために

libkinputがあり、(それはそれはncursesのterminfoのを使用することができると言います。しかし、私はそれはそれはncursesベースの使用状況と一緒に共存することができることを意味している場合わから ないです)?

1つの選択肢は、ncursesプログラム にreadlineを「外部的に」実行することです。これはrlwrapを使用していますか?

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

次は、ファイルの取り扱いIOです:あなたは私のプログラムで説明してきた私が達成した

+0

スラングはそれ自身の言語であることが判明しました。また、最新バージョンのGPL2ライセンスのみです。私はそれが図書館であることを期待していました。 – matiu

+0

NewtはSLang上のレイヤーです。それは使いやすいかもしれませんが、まさに別の選択肢です。 –

2

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

 
rl_getch_function 
rl_redisplay_function 
rl_completion_display_matches_hook 

私は妥当な何かをでした。

+0

歴史を作る方法についてのアイデアはありますか? – nccc

+1

OK、わかりました。 'rl_display_prompt'を表示し、次に' rl_line_buffer'を表示し、カーソルオフセットを 'rl_point + strlen(rl_display_prompt)'に設定する必要があります。 – nccc

3

したがって、gdbはreadlineとncursesの両方を使用しています。あなたがこれを行うに興味があるなら、私はあなたが彼らの実装チェックアウトすることをお勧めします。「あなたの場合は

http://sourceware.org/git/?p=gdb.git;a=blob;f=gdb/tui/tui-io.c

+0

うわー、ありがとう。そして、StackOverflow、Guillaumeへようこそ。 :) –

5

をこれは私がこれだけの人が、いくつかの痛みをグーグルで保存するために、数時間のために私の頭を叩いていましたncursesの組み込みのSIGWINCHハンドラをとすると、readlineはデフォルトでLINESCOLUMNSの環境変数を設定することに注意してください。これらは、ncursesが行う動的サイズ計算(通常はioctl()TIOCGWINSZ)よりも優先されます。つまり、ターミナルのサイズを変更しても初期の端末サイズを維持し続けることになります。

これは、readlineを初期化する前にrl_change_environment0に設定することによって防止できます。

更新:

ここで私はreadlineのソースから収集いくつかの追加情報があります:(rl_catch_sigwinchが1である場合に使用される)

のreadlineのSIGWINCH処理コードは、それのように思える更新LINESCOLUMNSを行いますncursesには十分でなければなりません。しかし、readlineとncursesを組み合わせたときに最も効果的な代替のreadlineインターフェイスを使用すると、のシグナルハンドラを含むシグナルハンドラは、rl_callback_read_char()の呼び出しの間だけインストールされます。 rl_callback_read_char()はreadlineには見えません。

+1

あなたの答えを[formatting](http://stackoverflow.com/help/formatting)と考えてください。コマンド/コードは読みにくいです。 – ryanyuyu

+1

@dotctor私のためにフォーマットしてくれてありがとう! – Ulfalizer

9

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

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

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

Screenshot of program combining ncurses and readline

+0

素晴らしい!コードライセンスとは何ですか?可能であれば、MITでライセンスされた資料と統合したいと思います。ありがとう! – cxw

+0

うれしいことにうってつけ!もしそれが最小の面倒であれば、私はMITの下に置くことができました。私はそうでなければISCに行ってしまいました。そして、MITは似ています。また、https://github.com/ulfalizer/botniklasのために、select()ループ(またはこの場合はepoll())を実行するバージョンもあります。あなたが興味をそそられるならば、それはまだ分かれていて、まだそれを押していないが、私はそれのための枝を作ることができる。 – Ulfalizer

+0

そのバージョンはSIGWINCHハンドラをインストールします(ただし、通常のハンドラの代わりにsignalfd()を使用します)。そして、readlineをstdinから直接読み込ませます。それはまた、検索文字とマルチバイト文字で問題を解決します。 – Ulfalizer