GNU Readline es una biblioteca de software que proporciona funciones de edición en línea e historial para programas interactivos con interfaz de línea de comandos , como Bash . Actualmente, Chet Ramey se encarga de su mantenimiento como parte del Proyecto GNU .
Permite a los usuarios mover el cursor de texto , buscar en el historial de comandos , controlar un anillo de eliminación (una versión más flexible del portapapeles para copiar y pegar) y usar la función de autocompletado con la tecla Tab en una terminal de texto . Como biblioteca multiplataforma , readline permite que las aplicaciones en distintos sistemas presenten un comportamiento de edición de línea idéntico.
Historia
Readline fue creado en 1988 por Brian Fox, empleado de la Free Software Foundation , para implementar la funcionalidad de edición de líneas requerida por POSIX para su intérprete de comandos. [ 3 ] Tras el lanzamiento de la versión 1.05, Fox cedió el control a Chet Ramey de Case Western , quien ha sido el único mantenedor desde 1998. [ 3 ] [ 4 ]
Modos de edición
Readline admite los modos de edición Emacs y vi, que determinan cómo se interpreta la entrada del teclado como comandos del editor. POSIX prescribe el modo de edición vi, dejando otros modos de edición sin especificar y a discreción de las implementaciones. [ 5 ] Readline incluyó originalmente su modo de edición Emacs debido a la influencia del modo de edición Emacs de Korn Shell. [ 3 ] [ 6 ] Emacs es el modo predeterminado. [ 7 ]
Atajos de teclado de Emacs
Las combinaciones de teclas del modo de edición de Emacs se toman del editor de texto Emacs .
En algunos sistemas, Escdebe usarse en lugar de , ya que el atajo entra en conflicto con otro. Por ejemplo, al presionar + en la ventana del emulador de terminal de Xfce , el cursor no avanza una palabra, sino que activa "Archivo" en el menú de la ventana de terminal, a menos que esta opción esté desactivada en la configuración del emulador.AltAltAltf
- Tab ↹ : Autocompleta desde la posición del cursor.
- Ctrl+a : Mueve el cursor al inicio de la línea (equivalente a la tecla ).Home
- Ctrl+b : Mueve el cursor un carácter hacia atrás (equivalente a la tecla ).←
- Ctrl+c : Envía la señal SIGINT a través de un pseudoterminal a la tarea actual, lo que la aborta y la cierra. [ d ]
- Ctrl+d
- Ctrl+e : ( fin ) mueve el cursor al final de la línea (equivalente a la tecla ).End
- Ctrl+f : Mueve el cursor un carácter hacia adelante (equivalente a la tecla ).→
- Ctrl+g : Cancela la búsqueda inversa y restaura la línea original.
- Ctrl+h : Borra el carácter anterior (igual que la tecla de retroceso).
- Ctrl+i : Equivalente a la tecla Tab.
- Ctrl+j : Equivalente a la tecla Enter.
- Ctrl+k : Borra el contenido de la línea después del cursor y lo copia en el portapapeles .
- Ctrl+l : Borra el contenido de la pantalla (equivalente al comando
clear). - Ctrl+n : ( siguiente ) recuerda el siguiente comando (equivalente a la tecla ).↓
- Ctrl+o : Ejecuta el comando encontrado en el historial y obtiene la siguiente línea relativa a la línea actual del historial para editarla.
- Ctrl+p : ( anterior ) recupera el comando anterior (equivalente a la tecla ).↑
- Ctrl+r : (búsqueda inversa) recupera el último comando que incluye los caracteres especificados. Un segundo + recupera el siguiente comando anterior que corresponde a la búsqueda.Ctrlr
- Ctrl+s : Vuelve al siguiente comando más reciente de la búsqueda inversa (ten cuidado de no ejecutarlo desde una terminal, ya que este comando también inicia su XOFF). Si modificaste esa configuración de XOFF, usa + para regresar.Ctrlq
- Ctrl+t : Transpón los dos caracteres anteriores.
- Ctrl+u : Borra el contenido de la línea anterior al cursor y lo copia en el portapapeles .
- Ctrl+v : Si la siguiente entrada también es una secuencia de control, escríbala literalmente (por ejemplo, * + + escribe "^H", un retroceso literal).CtrlvCtrlh
- Ctrl+w : Borra la palabra que está antes del cursor y la copia en el portapapeles .
- Ctrl+ + : Edita la línea actual en el programa $EDITOR, o vi si no está definido.xCtrle
- Ctrl+ + : Lee el contenido del archivo inputrc e incorpora cualquier enlace o asignación de variables que encuentres allí.xCtrlr
- Ctrl++ : Deshacer incremental, recordado por separado para cada línea.xCtrlu
- Ctrl++ : Muestra información de la versión de la instancia actual de Bash.xCtrlv
- Ctrl+ + : Alterna el cursor con su posición anterior. (Cx, porque x tiene forma de cruz).xCtrlx
- Ctrl+y : ( arrastrar ) agrega el contenido del portapapeles desde la posición del cursor.
- Ctrl+z : Envía la señal SIGTSTP a la tarea actual, lo que la suspende. Para ejecutarla en segundo plano se puede ingresar
bg. Para traerla de vuelta desde segundo plano o suspensiónfg ['process name or job id']( primer plano ) se puede emitir . - Ctrl+_ : Deshacer incremental, guardado por separado para cada línea.
- Alt+b : ( hacia atrás ) mueve el cursor una palabra hacia atrás.
- Alt+c : Pone en mayúscula el carácter que está debajo del cursor y se mueve al final de la palabra.
- Alt+d : Corta la palabra que está después del cursor.
- Alt+f : ( adelante ) mueve el cursor una palabra hacia adelante.
- Alt+l : Convierte a minúscula o minúscula cada carácter desde la posición del cursor hasta el final de la palabra actual.
- Alt+r : Cancela los cambios y restablece la línea tal como estaba en el historial.
- Alt+u : Pone en mayúscula cada carácter desde la posición del cursor hasta el final de la palabra actual.
- Alt+. : Inserta el último argumento del comando anterior (la última palabra de la entrada anterior del historial).
Licencia
GNU Readline destaca por ser una biblioteca de software libre con licencia GNU General Public License (GPL). Las bibliotecas de software libre suelen tener licencia GNU Lesser General Public License (LGPL), como por ejemplo la biblioteca GNU C , GNU gettext y FLTK . Un desarrollador de una aplicación que decida enlazar con una biblioteca con licencia LGPLv3 puede usar cualquier licencia que no restrinja la modificación de las partes de la biblioteca contenidas en la obra combinada ni la ingeniería inversa para depurar dichas modificaciones. [ 9 ] Sin embargo, enlazar con una biblioteca con licencia GPLv3, como Readline, requiere que toda la aplicación resultante se distribuya bajo la licencia GPLv3, para cumplir con la sección 5 de la GPL. [ 10 ] [ 11 ]
Esta licencia fue elegida por la FSF con la esperanza de que animara al software a cambiar a la GPL. [ 12 ] Un ejemplo importante de una aplicación que cambió su licencia para cumplir con las condiciones de copyleft de GNU Readline es CLISP , una implementación de Common Lisp . Originalmente publicada en 1987, cambió a la licencia GPL en 1992, [ 13 ] después de un intercambio de correos electrónicos entre uno de los autores originales de CLISP, Bruno Haible, y Richard Stallman , en el que Stallman argumentó [ 14 ] que el enlace de readline en CLISP significaba que Haible estaba obligado a volver a licenciar CLISP bajo la GPL si deseaba distribuir la implementación de CLISP que usaba readline. [ 15 ]
Otra respuesta ha sido no utilizar esto en algunos proyectos, haciendo que la entrada de texto utilice el controlador de terminal Unix primitivo para la edición.
Bibliotecas alternativas
Se han creado bibliotecas alternativas con otras licencias para que puedan ser utilizadas por proyectos de software que deseen implementar la funcionalidad de edición de línea de comandos, pero que se publiquen con una licencia que no sea GPL.
- Muchos sistemas BSD tienen una libedit con licencia BSD . [ 16 ] [ 17 ] MariaDB y PHP permiten al usuario seleccionar en tiempo de compilación si enlazar con GNU Readline o con libedit. [ 18 ] [ 19 ]
- linenoise es una pequeña biblioteca C que proporciona funciones de edición de líneas. [ 20 ] A partir de 2025,Es utilizado prominentemente por MongoDB y Redis . [ 21 ] [ 22 ] Se integró en Android en 2010, pero desde entonces ha sido descontinuado. [ 23 ] [ 24 ]
- Haskeline es una biblioteca tipo readline para Haskell con licencia BSD-3-Clause. Está escrita principalmente para el compilador Glasgow Haskell [ 25 ] , pero también está disponible para otros proyectos de Haskell que necesiten servicios de edición de línea [ 26 ] .
- PSReadLine es una implementación de readline con licencia BSD-2-Clause escrita en C# para PowerShell inspirada en bash y GNU Readline [ 27 ].
Código de ejemplo
El siguiente código está escrito en C y debe enlazarse con la biblioteca readline pasando la bandera -lreadline al compilador:
#include <stdlib.h> #include <stdio.h> #include <readline/readline.h> #include <readline/history.h>int main () { // Configurar readline para autocompletar rutas cuando se presiona la tecla tab. rl_bind_key ( '\t' , rl_complete );// Habilitar el historial usando_history ();while ( 1 ) { // Mostrar mensaje y leer la entrada char * input = readline ( "prompt> " );// Comprobar si hay EOF. if ( ! input ) break ;// Agrega la entrada al historial de readline. add_history ( entrada );// Haz cosas...// Libera el búfer que fue asignado por readline free ( input ); } return 0 ; }Encuadernaciones
Los lenguajes de programación que no son C y que proporcionan enlaces de lenguaje para readline incluyen:
- Módulo integrado de Python
readline; readlineMódulo integrado de Ruby ; [ 28 ]Term::ReadLineMódulo de terceros de Perl (CPAN) , específicamenteTerm::ReadLine::Gnupara GNU ReadLine.- Extensión de PHP. [ 29 ]
La compatibilidad con las alternativas de readline difiere entre estas integraciones.
Notas
- ↑ GPL-3.0 o posterior desde la versión 6.0 (2009-02-20).
- ↑ GPL-2.0 o posterior desde la versión 2.1 (5 de junio de 1997) hasta la versión 5.2 (11 de octubre de 2006).
- ↑ GPL-1.0 o posterior desde ? hasta la versión 2.0 (04/08/1994).
- ↑ Una parte de los pseudoterminales o PTY (para Linux), lo cual es evidente en las herramientas de configuración de terminales como stty ; en una distribución típica de Linux, el punto final maestro PTY trata los caracteres especiales como señales que se envían a los esclavos, por ejemplo
SIGINT[ 8 ].
Referencias
- ↑ Chet Ramey (5 de julio de 2025). "Readline-8.3-release available" . Consultado el 5 de julio de 2025 .
- ↑ "readline.git - La biblioteca GNU Readline" . Consultado el 7 de agosto de 2024 .
- 1 2 3 Target, Sinclair (22 de agosto de 2019). "Cosas que no sabías sobre GNU Readline" . Two-Bit History . Recuperado el 29 de junio de 2026 .
- ↑ Saron Yitbarek (3 de septiembre de 2019). "Héroes en una consola Bash" . Command Line Heroes (Podcast). Red Hat. El evento ocurre a las 24:38 . Recuperado el 21 de enero de 2026 .
- ↑ "sh — shell, el intérprete del lenguaje de comandos estándar" . The Open Group Base Specifications Issue 8 (IEEE Std 1003.1-2024) . 2024.
- ↑ Comparar "KSH88(1)" . 2 de julio de 2009. Archivado del original el 5 de noviembre de 2015. Recuperado el 21 de enero de 2026 .
- ↑ "Biblioteca GNU Readline" . 30 de diciembre de 2024.
El modo predeterminado de Readline es el modo Emacs.
- ↑ "pty(7) - Página del manual de Linux" . man7.org . Consultado el 30 de septiembre de 2021 .
- ↑ "Licencia Pública General Reducida de GNU" . La Licencia Pública General Reducida de GNU v3.0 - Proyecto GNU . Fundación del Software Libre. 2007. Consultado el 3 de septiembre de 2011 .
- ↑ "Licencia Pública General de GNU" . La Licencia Pública General de GNU v3.0 - Proyecto GNU . Fundación del Software Libre. 2007. Consultado el 3 de septiembre de 2011 .
- ↑ "Preguntas frecuentes sobre las licencias GNU" . Preguntas frecuentes sobre las licencias GNU - Proyecto GNU . Fundación del Software Libre. 2010. Consultado el 3 de septiembre de 2011 .
- ↑ "Por qué no deberías usar la GPL reducida para tu próxima biblioteca" . Por qué no deberías usar la GPL reducida para tu próxima biblioteca - Proyecto GNU - Fundación del Software Libre . Fundación del Software Libre. 2016. Consultado el 15 de octubre de 2019 .
- ↑ "Aviso de derechos de autor de CLISP" . Repositorio de CLISP. 1992. Consultado el 3 de septiembre de 2011 .
- ↑ "Por qué CLISP está bajo la licencia GPL" . Repositorio de CLISP. 1992. Consultado el 19 de enero de 2023 .
- ↑ "Licencia: ¿por qué GNU GPL?" . Preguntas frecuentes (con respuestas) sobre CLISP . Equipo de CLISP . Consultado el 3 de septiembre de 2011 .
- ↑ "editline(3) - Páginas del manual de NetBSD" . NetBSD . Consultado el 13 de septiembre de 2022. Biblioteca
del editor de línea de comandos (libedit, -ledit)
- ↑ Biblioteca de líneas de edición (libedit)
- ↑ "MariaDB/server/blob/10.2/BUILD/SETUP.sh" . Repositorio de MariaDB . Fundación MariaDB . Consultado el 24 de octubre de 2017 .
- ↑ "php/php-src/tree/master/ext/readline" . Repositorio PHP . The PHP Group . Consultado el 24 de octubre de 2017 .
- ↑ Sanfilippo, Salvatore (10 de mayo de 2020). "antirez/linenoise" . GitHub .
- ↑ "La base de datos MongoDB" . GitHub . Consultado el 23 de marzo de 2025 .
- ↑ "Redis" . GitHub . Consultado el 23 de marzo de 2025 .
- ↑ "Núcleo de Android" . Google Git . 25 de mayo de 2010.
- ↑ "Consola y utilidades de Android" . Google Git .
- ↑ "Aplicaciones y bibliotecas" . Wiki de Haskell . haskell.org . Consultado el 24 de octubre de 2017 .
- ↑ Judah Jacobson. "judah/haskeline: Una biblioteca de Haskell para la entrada de línea en programas de línea de comandos" . Repositorio de Haskeline . Consultado el 24 de octubre de 2017 .
- ↑ "PowerShell/PSReadLine: Una implementación de readline inspirada en bash para PowerShell" . Repositorio de PSReadLine . Consultado el 20 de diciembre de 2023 .
- ↑ "Módulo: Readline (Ruby 3.2)" .
- ↑ "PHP: Readline - Manual" . www.php.net . Consultado el 30 de abril de 2025 .
Enlaces externos
- Cosas que no sabías sobre GNU Readline
- Software libre programado en C
- Software del Proyecto GNU
- Bibliotecas de interfaz de usuario de texto
- Termcap
- Software que utiliza la Licencia Pública General de GNU.