2011-07-17 5 views
9

Readline Library에 대한 질문이 있습니다.완료를 위해 readline() 사용

Readline이 C 프로그램의 디렉토리에서 파일 이름을 자동 완성 할 수 있는지 알고 싶습니까?

검색 한 결과 명령 이름 완성 만 보았습니다.

미리 감사드립니다.

편집 : 파일 이름을 배열에 복사했습니다. 이러한 함수는 다음과 같습니다. 파일 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)을 사용해야한다고 생각합니까? "탭"키를 입력하면 아무 것도 호출하지 않고 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 readlineinfo 자체를 사용할 수있는 아주 좋은 설명서입니다. 그렇지 않은 경우 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

관련 문제