2011-07-17 31 views
9

Readline Libraryについて質問があります。readline()を使用して完了

ReadlineがCプログラムのディレクトリからファイル名を自動補完できるかどうか知りたいですか?

私は検索したが、コマンド名補完しか見なかった。

ありがとうございます。

EDIT:ファイル名を配列にコピーしました。 私が使用するこれらの関数: ファイルrline.c、char * command_generator、char ** tab_completion(const char * text、int start、int end)、void initialize_readline()。 char * filename_completion_function(char * text、int state)を使用しなければならないと思いますか? "tab"キーをタイプすると何も呼び出されず、bind()は使われていないようです。正しい機能を使っているかどうか知っていますか? ありがとうございます!

+3

おそらくこの[リンク](http://cc.byexamples.com/2008/06/16/gnu-readline-implement-custom-auto-complete/)でコンパイルすることができる –

答えて

12

ファイル名の補完機能はreadlineの組み込み機能です。ファイル名リストなどを設定する必要はありません。ここでは、readline 6.1では、デフォルトでファイル名の補完が可能です。

#include <stdio.h> 
#include <stdlib.h> 

#include <readline/readline.h> 
#include <readline/history.h> 

int main() 
{ 
    printf("%s\n", readline("test> ")); 
    return 0; 
} 

このメカニズムをカスタマイズする方法があります。 rl_filename_quoting_functionrl_filename_dequoting_functionのようないくつかの関数を指定すると、アプリケーションの適切なファイル名の引用符をreadlineで指定することができます。

これはあなたのために動作しない場合は、あなたのバージョンのreadlineを指定する必要があると思います。 /etc/inputrcの内容も調べてください。 readlineを使用するbashがありますか?ファイル名補完は期待通りに機能しますか? とにかくinfo readlineは、info自体を使用することができれば、非常に良いドキュメントです:)そうでない場合は、Programming with GNU Readlineをご覧ください。

+0

これは完璧に動作します!ありがとう – lilawood

+1

使用するコンパイラに応じて、-lreadlineフラグが必要な場合があります。 –

1

私が読んでいたreadlineについては混乱しましたが、あなたがGNUライブラリのものを意味していたことが私に指摘されました。

この例は、FredrikがそのようなGNU Readlineライブラリへのリンクを参照してください。

string cmd[]の代わりにこれを適用するには、現在のディレクトリ内のすべてのファイル名の配列を使用する必要があり、残りのコードはほぼ同じである必要があります。

+0

downvoteはしませんが、彼はhttp://www.gnu.org/software/readline/について話しています。 – cnicutar

+0

@cnicutarこれを指摘してくれてありがとう、私はちょうど見たFredrikのコメントへの参考に編集しました。 –

+0

ありがとう!配列をフルフィルするには、system( "ls")を使用すれば動作しますか?または他のC関数を使用しますか? – lilawood

5

readlineライブラリを使用するには、-lreadlineをコンパイラに指定します。次のコードは、

cc -lreadline some.c -o some 


#include <stdio.h> 

#include <readline/readline.h> 
#include <readline/history.h> 

int main() 
{ 
     char *inpt; 

     int i = 0; 

     while (i < 10) 
     { 
       inpt = readline("Enter text: "); 
       add_history(inpt); 
       printf("%s", inpt); 
       printf("\n"); 
       ++i; 
     } 

     return 0; 

} 
+0

printfの後でinptを解放する必要はありませんか? – netskink

関連する問題