Me pregunto cómo implementar un programa en C que pueda completar automáticamente el comando o el texto que está ingresando en la línea de comando. Por ejemplo, digamos que su programa solicita al usuario un nombre de archivo. En su mayoría, uno usaría scanf() o de lo contrario para hacer esto. Y luego, en la línea de comando, se le pedirá al usuario que please input the file name:_ .
Digamos que hay un shakespeare.txt en el mismo directorio. Y ahora he ingresado shakes , y luego quiero que la computadora complete automáticamente el shakespeare.txt por mí, como lo hace con la mayoría de los programas cuando el usuario presiona Tab . ¿Cómo implementar eso?
Editar : para que quede más claro, otro ejemplo:
si usa grep en su línea de comando, como grep -i "shakespeare" shakespeare.txt , antes de completar shakespeare.txt usted mismo, si simplemente usa Tab , aparecerán algunos candidatos.
¿Cómo puedo implementar mi programa para que posea estas utilidades cuando intento solicitar al usuario una entrada cuando uso una función como scanf() ?
Si considera usar una utilidad existente, eche un vistazo a la biblioteca de línea de lectura GNU que proporciona una implementación bastante ordenada de lo que está buscando.
Hay algunas otras características útiles, como mover el cursor en su entrada, proporcionar un historial de entrada y un indicador similar a un shell de entrada.
La funcionalidad de esta biblioteca funciona de manera idéntica en diferentes plataformas.
Como muestra este ejemplo de Wikipedia, la clave para indicar la finalización se puede configurar fácilmente:
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <readline/readline.h> #include <readline/history.h> int main() { char* input, shell_prompt[100]; // Configure readline to auto-complete paths when the tab key is hit. rl_bind_key('\t', rl_complete); for(;;) { // Create prompt string from user name and current working directory. snprintf(shell_prompt, sizeof(shell_prompt), "%s:%s $ ", getenv("USER"), getcwd(NULL, 1024)); // Display prompt and read input (NB: input must be freed after use)... input = readline(shell_prompt); // Check for EOF. if (!input) break; // Add input to history. add_history(input); // Do stuff... // Free input. free(input); } return 0; }Debido a que en C no existe una solución portátil para saber lo que ha escrito en un aviso sin presionar Intro, necesita leer carácter por carácter.
Nota: es posible que desee utilizar getche() para repetir el carácter.
Deberá definir un búfer donde almacenará carácter por carácter todo lo que presione el usuario, hasta que el usuario presione enter o presione enter. Cuando encuentre \t, analizará el contenido del búfer y tomará una decisión basada en eso.
El siguiente código es un ejemplo simplificado:
char c; int i = 0; do { c = _getche(); if (c == '\t') { // Autocomplete // Print the rest of the word here } else { buff[i++] = c; } } while (c != '\n' && c!='\r'); buff[i] = '\0'; // Let's keep the standardNo está claro si su solicitud de finalización realizada por
Su ejemplo de grep sugiere que pregunte sobre la finalización del shell. Aquí hay un ejemplo.