2011-07-17 13 views
9

Tengo una pregunta acerca de Readline Library.usando readline() para completar

Quiero saber si Readline puede autocompletar el nombre de archivo de los directorios en un programa en C?

He buscado y solo he visto completar el nombre del comando.

gracias de antemano.

EDITAR: He copiado el nombre del archivo en una matriz. Estas son las funciones que uso: en el archivo rline.c, char * command_generator, char ** tab_completion (const char * text, int start, int end), void initialize_readline(). Creo que tengo que usar char * filename_completion_function (char * text, int state)? Cuando escribo en la tecla "tab", no llama nada, bind() no parece ser utilizado. ¿Sabes si uso las funciones correctas? gracias !!

+3

tal vez esta [link] (http://cc.byexamples.com/2008/06/16/gnu-readline-implement-custom-auto-complete/) –

Respuesta

12

La finalización del nombre de archivo es una función incorporada de readline, no es necesario rellenar las listas de nombres de archivo, etc. Aquí, con readline 6.1, el siguiente programa permite completar el nombre del archivo de forma predeterminada.

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

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

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

Existen formas de personalizar este mecanismo, p. puede especificar algunas funciones como rl_filename_quoting_function y rl_filename_dequoting_function para ayudar a readline a proporcionar una cita de nombre de archivo adecuada para su aplicación.

Creo que necesita especificar su versión de readline si esto no funciona para usted. /etc/inputrc contenido debe examinarse también. ¿Tiene bash, que usa readline? ¿La finalización del nombre de archivo funciona allí como se esperaba? De todos modos, info readline es una muy buena documentación siempre que pueda usar info sí mismo :) Si no, mira Programming with GNU Readline.

+0

¡Funciona perfectamente! gracias – lilawood

+1

Podría querer decir que puede necesitar la línea de indicador de pabellón dependiendo del compilador que use. –

1

Estaba confundido acerca de la línea de lectura a la que se refería pero se me indicó que quería decir la de las bibliotecas de GNU.

Para ver un ejemplo de esto, consulte el enlace de Fredrik a la biblioteca GNU Readline que hace precisamente eso.

Para aplicar esto a sus necesidades en vez del string cmd[] que ve que necesita usar una matriz de todos los nombres de archivo en el directorio actual y el resto del código debe ser aproximadamente el mismo.

+0

No lo votará a la baja, pero él está hablando de http://www.gnu.org/software/readline/ – cnicutar

+0

@cnicutar. Gracias por señalar eso, edité una referencia al comentario de Fredrik que acabo de ver. –

+0

gracias! Para completar la matriz, si uso system ("ls"), ¿funciona? o uso otra función C? – lilawood

5

Para usar la biblioteca readline, especifique -lreadline en su compilador. El siguiente fragmento de código se puede compilar con

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

¿No necesita liberar inpt después del printf? – netskink

Cuestiones relacionadas