Readline
Compilacion
Para poder utilizar la funciΓ³n readline() en un programa de C, es necesario tener instalada la biblioteca GNU Readline o editline en el sistema. Estas bibliotecas proporcionan la funcionalidad de readline() y otras funciones adicionales.
Para incluir la biblioteca en el cΓ³digo, es necesario incluir la cabecera #include <readline/readline.h>
o #include <editline/readline.h>
dependiendo de la biblioteca que se tenga instalada, en el archivo fuente donde se quiere usar readline().
Para compilar el programa, es necesario indicar al compilador que se desea vincular con la biblioteca de readline. Esto se puede hacer utilizando la opciΓ³n -lreadline o -leditline dependiendo de la biblioteca que se tenga instalada. Por ejemplo, si se estΓ‘ usando GCC, el comando para compilar el programa serΓa algo similar a esto:
Instalar readline
Por otro lado para poder utilizar otras fucniones como rl_clear_history()
o rl_replace_line()
es necesariao tener instalada la libreria readline. Para ello tan solo tenemos que instalarla con brew, brew install readline
, y depues aΓ±adir su cabezera a nuestro fichero. #include<readline/readline.h>
.
Ademas es necesariao hacer referencia a dicha libreria a la hora de compilar:
Readline
La funciΓ³n readline() es una funciΓ³n de biblioteca que permite a los programas de C leer lΓneas de entrada del usuario de una manera conveniente.
La funciΓ³n toma un solo argumento, que es una cadena de caracteres que se utiliza como un prompt para indicar al usuario que debe ingresar informaciΓ³n. La funciΓ³n devuelve un puntero a una cadena de caracteres que contiene la lΓnea de entrada del usuario.
La forma en que la funciΓ³n readline() funciona es mediante la lectura de caracteres desde el flujo de entrada estΓ‘ndar (stdin) hasta que se encuentra un carΓ‘cter de nueva lΓnea ('\n') o se alcanza el final de archivo (EOF). Cada carΓ‘cter leΓdo se agrega a un buffer temporal, hasta que se alcanza el carΓ‘cter de nueva lΓnea o el final del archivo.
Una vez que se ha leΓdo una lΓnea completa, la funciΓ³n readline() asigna memoria dinΓ‘mica para almacenar una copia de la lΓnea de entrada. Esta memoria se debe liberar manualmente despuΓ©s de usarla con la funciΓ³n free() para evitar fugas de memoria.
AquΓ tienes un ejemplo de cΓ³mo usar la funciΓ³n readline() en un programa de C:
En este ejemplo, se incluyen las cabeceras necesarias para usar la funciΓ³n readline()
, que en este caso es readline/readline.h
. La funciΓ³n readline()
se llama con un prompt "Ingresa una lΓnea de texto: " y el resultado se almacena en una variable char* llamada "line". El contenido de la linea se imprime con printf y luego se libera la memoria con free.
Historial
El historial en readline() es una funcionalidad que permite al usuario recuperar lΓneas de entrada previamente ingresadas usando las flechas arriba y abajo. Esto es ΓΊtil cuando el usuario desea volver a ingresar una lΓnea de comando que ya ha utilizado previamente, o si desea verificar una lΓnea de comando anterior.
Cada vez que se utiliza la funciΓ³n readline()
para leer una lΓnea de entrada del usuario, esa lΓnea se agrega automΓ‘ticamente al historial. El usuario puede navegar por el historial de lΓneas utilizando las flechas arriba y abajo. Cada vez que se presiona la flecha arriba, readline() mostrarΓ‘ la lΓnea anterior en el historial, y cada vez que se presiona la flecha abajo, readline() mostrarΓ‘ la lΓnea siguiente en el historial.
AdemΓ‘s, el usuario tambiΓ©n puede buscar en el historial de lΓneas ingresadas mediante el uso de comandos como ctrl + R, esto le permitirΓ‘ buscar una lΓnea especΓfica en el historial.
La capacidad de guardar el historial de lΓneas es configurable, el usuario puede limitar la cantidad de lΓneas que se guardan en el historial o deshabilitarlo completamente. TambiΓ©n se puede cambiar la ubicaciΓ³n donde se guarda el historial, ya sea en un archivo o en memoria.
Es importante tener en cuenta que esta funcionalidad solo estarΓ‘ disponible si se tiene una biblioteca como GNU Readline o editline instalada y se incluye en el cΓ³digo.
add_history()
add_history()
es una funciΓ³n proporcionada por la biblioteca GNU Readline que permite agregar una lΓnea al historial.
La funciΓ³n add_history()
tiene un solo argumento, que es un puntero a una cadena de caracteres que representa la lΓnea que se desea agregar al historial. Este argumento es obligatorio, si no se proporciona una cadena de caracteres la funciΓ³n no agregarΓ‘ nada al historial.
line
es un puntero a una cadena de caracteres, es la lΓnea que se desea agregar al historial.
La funciΓ³n add_history()
se utiliza para agregar una lΓnea al historial, esta lΓnea se agrega al final del historial y se convierte en la lΓnea actual. Esto es ΓΊtil cuando el usuario desea agregar una lΓnea al historial despuΓ©s de haber utilizado readline()
o cuando se quieren agregar lΓneas de forma programΓ‘tica al historial. Es importante tener en cuenta que esta funciΓ³n no afecta al archivo de historial, si se tiene un archivo de historial configurado sigue existiendo.
La funciΓ³n read_history()
y write_history()
permiten trabajar con el archivo de historial, permitiendo cargarlo o guardarlo en disco, respectivamente.
AquΓ te dejo un ejemplo de cΓ³mo utilizar el historial de lΓneas utilizando readline()
y add_history()
en un programa:
rl_clear_history
rl_clear_history()
es una funciΓ³n proporcionada por la biblioteca GNU Readline que permite limpiar todas las lΓneas almacenadas en el historial. Esta funciΓ³n no requiere ningΓΊn parΓ‘metro y no devuelve ningΓΊn valor.
La funcionalidad de esta funciΓ³n es eliminar todas las lΓneas almacenadas en el historial. Una vez que se llama a esta funciΓ³n, el historial quedarΓ‘ vacΓo y no habrΓ‘ lΓneas disponibles para recuperar con las flechas arriba y abajo. Es importante tener en cuenta que esta funciΓ³n no afecta al archivo de historial, si se tiene un archivo de historial configurado sigue existiendo.
AquΓ te dejo un ejemplo de cΓ³mo utilizar esta funciΓ³n en un programa:
En este ejemplo se agrega 10 lΓneas al historial, luego se llama a la funciΓ³n rl_clear_history()
y se imprime el tamaΓ±o del historial antes y despuΓ©s de limpiarlo. El resultado seria "Historial antes de limpiar: 10" y "Historial despues de limpiar: 0"
rl_on_new_line
rl_on_new_line()
es una funciΓ³n proporcionada por la biblioteca de lectura GNU que se utiliza para indicar al sistema que se ha movido a una nueva lΓnea vacΓa. Esto es ΓΊtil para actualizar el estado interno del sistema de lectura de lΓnea de comandos, ya que permite realizar tareas como la actualizaciΓ³n del historial de comandos, la limpieza de la pantalla, la actualizaciΓ³n de la posiciΓ³n del cursor, entre otras.
La firma de la funciΓ³n es:
La funciΓ³n no recibe argumentos.
Un ejemplo de uso de rl_on_new_line()
podrΓa ser el siguiente:
En este ejemplo, la funciΓ³n rl_on_new_line()
se llama despuΓ©s de que el usuario ingresa un comando y se imprime en pantalla. Esto indica al sistema que se ha movido a una nueva lΓnea vacΓa y permite que el sistema actualice su estado interno para el prΓ³ximo comando del usuario. Sin embargo, es importante tener en cuenta que esta funciΓ³n no ejecuta ninguna acciΓ³n especΓfica, sΓ³lo indica al sistema que se ha movido a una nueva lΓnea vacΓa.
Si en el ejemplo anterior no se utiliza la funciΓ³n rl_on_new_line()
, el sistema de lectura de lΓnea de comandos no serΓa capaz de actualizar su estado interno correctamente. Esto podrΓa tener varias consecuencias, dependiendo de las funcionalidades que se estΓ©n utilizando. Algunas posibles consecuencias incluyen:
El historial de comandos podrΓa no actualizarse correctamente, lo que podrΓa dificultar el acceso a comandos previamente ingresados.
La posiciΓ³n del cursor podrΓa no actualizarse correctamente, lo que podrΓa causar problemas al ingresar nuevos comandos.
La pantalla podrΓa no limpiarse correctamente, lo que podrΓa causar problemas de visualizaciΓ³n al ingresar nuevos comandos.
En general, la falta de llamada a la funciΓ³n rl_on_new_line()
puede causar problemas en la funcionalidad del sistema de lectura de lΓnea de comandos y afectar al uso de la aplicaciΓ³n. Es importante tener en cuenta que esta funciΓ³n es necesaria para actualizar el estado interno del sistema de lectura de lΓnea de comandos, y su omisiΓ³n puede causar problemas en el funcionamiento de la aplicaciΓ³n.
rl_replace_line
La funciΓ³n rl_replace_line()
es una funciΓ³n de la biblioteca de lectura de lΓnea de comandos de GNU (readline) que se utiliza para reemplazar el contenido actual de la lΓnea de comandos con una nueva cadena de texto. Esta funciΓ³n se utiliza para actualizar la lΓnea de comandos con nueva informaciΓ³n, por ejemplo, cuando se desea mostrar informaciΓ³n adicional al usuario mientras se ingresa un comando.
La cabecera de esta funciΓ³n es la siguiente:
Los argumentos de esta funciΓ³n son:
string
: Es un puntero a una cadena de caracteres que contiene el nuevo texto que se desea utilizar para reemplazar la lΓnea actual.clear_undo
: es un valor booleano que indica si se debe limpiar el historial de deshacer al reemplazar la lΓnea de comandos.
La funciΓ³n rl_replace_line()
funciona reemplazando el contenido actual de la lΓnea de comandos con la cadena de texto especificada en el argumento string
. Si se especifica 1
en el argumento clear_undo
, el historial de deshacer se limpia automΓ‘ticamente al reemplazar la lΓnea de comandos. Si se especifica 0
, el historial de deshacer no se limpia.
AquΓ te dejo un ejemplo de cΓ³digo que utiliza solo la funciΓ³n rl_replace_line:
En este ejemplo, primero se solicita al usuario que ingrese una lΓnea de texto a travΓ©s de la funciΓ³n readline(). Luego, se imprime el valor introducido y se reemplaza la lΓnea actual con el texto "This is the new line" utilizando la funciΓ³n rl_replace_line. Se llama a rl_redisplay() para actualizar la pantalla y se vuelve a solicitar al usuario que ingrese otra lΓnea de texto. En este caso, no se utiliza la variable rl_line_buffer, pero se esta usando rl_replace_line para reemplazar el texto en la lΓnea actual y rl_redisplay para actualizar el prompt.
El output del ejemplo anterior serΓa algo similar a esto:
La funciΓ³n rl_replace_line reemplaza el contenido actual de la lΓnea de entrada en readline con el texto especificado en el primer argumento. El segundo argumento indica si se mueve el cursor al principio de la lΓnea despuΓ©s del reemplazo.
En el ejemplo que te di, despuΓ©s de llamar a rl_replace_line con el texto "This is the new line", la prΓ³xima vez que se llame a readline() el buffer de entrada tendrΓ‘ ese texto en lugar del que fue ingresado previamente. Por eso se muestra en la siguiente llamada a readline(). Esto se puede apreciar en el sigueinte ejemplo:
En este ejemplo, primero se solicita al usuario que ingrese una lΓnea de texto a travΓ©s de la funciΓ³n readline(). Luego, se imprime el valor introducido y se reemplaza la lΓnea actual con el texto "This is the new line" utilizando la funciΓ³n rl_replace_line. Se llama a rl_redisplay() para actualizar la pantalla y se vuelve a solicitar al usuario que ingrese otra lΓnea de texto. En este caso, no se utiliza la variable rl_line_buffer, pero se esta usando rl_replace_line para reemplazar el texto en la lΓnea actual y rl_redisplay para actualizar el prompt.
rl_line_buffer es una variable global proporcionada por el encabezado readline/readline.h. No es necesario inicializarla ya que ya estΓ‘ inicializada por defecto al momento de incluir el encabezado. Puede ser utilizada en cualquier parte de tu programa despuΓ©s de incluir el encabezado readline/readline.h. Esta variable almacena el contenido actual de la lΓnea de comando y se actualiza automΓ‘ticamente cada vez que se llama a una funciΓ³n de readline, como rl_replace_line.
rl_line_buffer
guarda el ΓΊltimo valor introducido a travΓ©s de una funciΓ³n de readline, como readline()
o rl_replace_line()
.
Buffer de entarda
En el contexto de la biblioteca readline, el buffer de entrada es una variable que contiene la lΓnea de texto que el usuario ha ingresado. Cada vez que se llama a la funciΓ³n readline(), el usuario ingresa una lΓnea de texto y esta lΓnea se almacena en el buffer de entrada. La funciΓ³n readline() devuelve un puntero al buffer de entrada, por lo que se puede acceder al contenido de la lΓnea ingresada mediante este puntero.
La funciΓ³n rl_replace_line(), permite modificar el contenido del buffer de entrada, permitiendo al programador reemplazar el contenido anterior con uno nuevo. Una vez llamada esta funcion, se debe llamar a rl_redisplay() para que el nuevo contenido sea mostrado en pantalla.
rl_redisplay
La funciΓ³n rl_redisplay() es una funciΓ³n de la biblioteca readline que se utiliza para actualizar la lΓnea de entrada mostrada en la pantalla. Esta funciΓ³n no tiene argumentos y no devuelve ningΓΊn valor.
La funciΓ³n rl_redisplay() se utiliza despuΓ©s de haber realizado cambios en la lΓnea de entrada mediante otras funciones de la biblioteca readline, como rl_replace_line(). Sin llamar a esta funciΓ³n, los cambios realizados en la lΓnea de entrada no se mostrarΓan en pantalla.
Esta funciΓ³n no tiene argumentos y no tiene un valor de retorno. La cabecera de la funciΓ³n es la siguiente
En cuanto a un ejemplo de uso, si tienes el siguiente cΓ³digo:
El output serΓa:
En este ejemplo, se utiliza la funciΓ³n rl_replace_line para reemplazar el contenido de la lΓnea actual con el texto "This is the new line". Luego se llama a rl_redisplay() para actualizar la lΓnea en la terminal. En la siguiente llamada a readline(), se mostrarΓ‘ el nuevo contenido de la lΓnea en lugar del valor anterior. Si no se llama a rl_redisplay() despuΓ©s de usar rl_replace_line(), el nuevo contenido de la lΓnea no se mostrarΓ‘ en la terminal.
Si no utilizas la funciΓ³n rl_redisplay, entonces la lΓnea actual de texto no se actualizarΓ‘ en la interfaz de lΓnea de comandos. Es decir, el texto que reemplazaste con la funciΓ³n rl_replace_line no se mostrarΓ‘ en pantalla, y el usuario seguirΓa viendo el texto anterior. Sin la llamada a rl_redisplay, la funciΓ³n rl_replace_line solo actualiza el buffer interno de readline, pero no actualiza lo que se ve en la pantalla.
Last updated