Biblioteca de software
GNU Readline es una biblioteca de software que ofrece funciones de edición en línea e historial para programas interactivos con una interfaz de línea de comandos , como Bash . Actualmente, Chet Ramey la mantiene 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 de un portapapeles de copiar/pegar) y utilizar la función de completar tabulaciones en una terminal de texto . Como biblioteca multiplataforma , readline permite que las aplicaciones en varios sistemas muestren un comportamiento de edición de línea idéntico.
Modos de edición
Readline admite los modos de edición de Emacs y vi, que determinan cómo se interpreta la entrada del teclado como comandos del editor. Consulte Editor war § Comparación .
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, Escse debe utilizar en lugar de , porque el acceso directo entra en conflicto con otro acceso directo. Por ejemplo, al presionar + en la ventana del emulador de terminal de Xfce no se mueve el cursor una palabra hacia adelante, sino que se activa "Archivo" en el menú de la ventana de terminal, a menos que esté deshabilitado en la configuración del emulador.AltAltAltf
- Tab ↹ : Se completa automáticamente 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 vía pseudoterminal a la tarea actual, que la aborta y la cierra. [d]
- Ctrl+d
- Envía un marcador EOF que (a menos que esté deshabilitado por una opción) cierra el shell actual (equivalente al comando
exit
). (Solo si no hay texto en la línea actual) - Si hay texto en la línea actual, elimina el carácter actual (entonces equivale a la tecla ).Delete
- 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 : Anula la búsqueda inversa y restaura la línea original.
- Ctrl+ h : Elimina el carácter anterior (igual que la tecla de retroceso).
- Ctrl+ i : Equivalente a la tecla de tabulación.
- 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) recuerda 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úsquedaCtrlr
- Ctrl+ s : Regresa al siguiente comando más reciente de la búsqueda inversa (ten cuidado de no ejecutarlo desde una terminal porque este comando también lanza su XOFF). Si cambiaste la configuración de XOFF, usa + para regresar.Ctrlq
- Ctrl+ t : Transpone los dos caracteres anteriores.
- Ctrl+ u : Borra el contenido de la línea antes del 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).Ctrlv Ctrlh
- Ctrl+ w : Borra la palabra 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.x Ctrle
- Ctrl+ + : Lee el contenido del archivo inputrc e incorpora cualquier enlace o asignación de variables que se encuentre allí.x Ctrlr
- Ctrl+ + : Deshacer incremental, recordado por separado para cada línea.x Ctrlu
- Ctrl++ : Muestra información de la versión de la instancia actual de Bash.x Ctrlv
- Ctrl+ + : Alterna el cursor con su posición anterior. (Cx, porque x tiene forma de cruz).x Ctrlx
- Ctrl+ y : (yank) agrega el contenido del portapapeles desde la posición del cursor.
- Ctrl+ z : Envía la señal SIGTSTP a la tarea actual, la cual la suspende. Para ejecutarla en segundo plano se puede ingresar
bg
. Para recuperarla del estado de segundo plano o suspensión fg ['process name or job id']
(primer plano) se puede emitir . - Ctrl+ _ : Deshacer incremental, recordado 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 debajo del cursor y se mueve al final de la palabra.
- Alt+ d : Corta la palabra después del cursor.
- Alt+ f : (adelante) mueve el cursor una palabra hacia adelante.
- Alt+ l : Reduce el tamaño de cada carácter desde la posición del cursor hasta el final de la palabra actual.
- Alt+ r : Cancela los cambios y vuelve a colocar la línea 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 del historial anterior).
Elección de la GPL como licencia de GNU Readline
GNU Readline es conocida por ser una biblioteca de software libre que se encuentra bajo la Licencia Pública General GNU (GPL). Las bibliotecas de software libre se encuentran con mucha más frecuencia bajo la Licencia Pública General Reducida GNU (LGPL), por ejemplo, la Biblioteca C GNU , GNU gettext y FLTK . Un desarrollador de una aplicación que elija enlazar a una biblioteca con licencia LGPLv3 puede utilizar cualquier licencia que no "restringa la modificación de las partes de la Biblioteca contenidas en el Trabajo Combinado y la ingeniería inversa para depurar dichas modificaciones". [4] Pero enlazar a una biblioteca con licencia GPLv3 como Readline requiere que toda la aplicación resultante combinada esté licenciada bajo la GPLv3 cuando se distribuya, para cumplir con la sección 5 de la GPL. [5] [6]
La FSF eligió esta licencia con la esperanza de que alentara al software a cambiarse a la GPL. [7] 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 . Lanzada originalmente en 1987, cambió a la licencia GPL en 1992, [8] 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ó [9] 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. [10]
Otra respuesta ha sido no usar esto en algunos proyectos, haciendo que la entrada de texto utilice el controlador de terminal Unix primitivo para editar.
Bibliotecas alternativas
Se han creado bibliotecas alternativas con otras licencias para que puedan ser utilizadas por proyectos de software que quieran 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 un libedit con licencia BSD . [11] [12] MariaDB y PHP permiten al usuario seleccionar en el momento de la compilación si desea vincularse con GNU Readline o con libedit. [13] [14]
- linenoise es una pequeña biblioteca C que proporciona funciones de edición de línea. [15]
- Haskeline es una biblioteca similar a readline con licencia BSD-3-Clause para Haskell. Está escrita principalmente para el compilador Glasgow Haskell , [16] pero también está disponible para otros proyectos Haskell que necesiten servicios de edición de líneas. [17]
- PSReadLine es una implementación de readline con licencia BSD-2-Clause escrita en C# para PowerShell inspirada en bash y GNU Readline [18]
Código de muestra
El siguiente código está en C y debe vincularse con la biblioteca readline pasando un indicador -lreadline al compilador:
#include <stdlib.h> #include <stdio.h> #include <readline/readline.h> #include <readline/history.h> int main () { // Configurar readline para completar automáticamente las rutas cuando se presiona la tecla de tabulación. rl_bind_key ( '\t' , rl_complete ); // Habilitar el historial using_history (); mientras ( 1 ) { // Mostrar el mensaje y leer la entrada char * input = readline ( "prompt> " ); // Verificar EOF. if ( ! input ) break ; //Agrega entrada al historial de readline. add_history ( input ); // Hacer cosas... // Buffer libre que fue asignado por readline free ( entrada ); } return 0 ; }
Encuadernaciones
Los lenguajes de programación distintos de C que proporcionan enlaces de lenguaje para readline incluyen
- Módulo incorporado de Python
readline
; readline
Módulo integrado de Ruby ; [19]Term::ReadLine
Módulo de terceros de Perl (CPAN) , específicamente Term::ReadLine::Gnu
para GNU ReadLine.
El soporte para alternativas de readline difiere entre estos enlaces.
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 (1997-06-05) hasta la versión 5.2 (2006-10-11).
- ^ GPL-1.0-o-posterior desde ? hasta la versión 2.0 (1994-08-04).
- ^ Una parte de los pseudoterminales o PTY (para Linux), que es evidente a partir de 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 deben enviar a los esclavos, por ejemplo,
SIGINT
[3]
Referencias
- ^ Chet Ramey (26 de septiembre de 2022). «Readline-8.2 Release available» (La versión 8.2 de Readline ya está disponible) . Consultado el 26 de septiembre de 2022 .
- ^ "readline.git - La biblioteca GNU Readline" . Consultado el 7 de agosto de 2024 .
- ^ "pty(7) - Página del manual de Linux". man7.org . Consultado el 30 de septiembre de 2021 .
- ^ "Licencia Pública General Reducida de GNU". Licencia Pública General Reducida de GNU v3.0 - Proyecto GNU . Free Software Foundation. 2007 . Consultado el 3 de septiembre de 2011 .
- ^ "Licencia Pública General GNU". Licencia Pública General GNU v3.0 - Proyecto GNU . Free Software Foundation. 2007. Consultado el 3 de septiembre de 2011 .
- ^ "Preguntas frecuentes sobre las licencias GNU". Preguntas frecuentes sobre las licencias GNU - Proyecto GNU . Free Software Foundation. 2010. Consultado el 3 de septiembre de 2011 .
- ^ "Por qué no deberías usar la GPL menor para tu próxima biblioteca". Por qué no deberías usar la GPL menor para tu próxima biblioteca - Proyecto GNU - Free Software Foundation . Free Software Foundation. 2016 . Consultado el 15 de octubre de 2019 .
- ^ "Aviso de copyright de CLISP". Repositorio CLISP. 1992. Consultado el 3 de septiembre de 2011 .
- ^ "Por qué CLISP está bajo licencia GPL". Repositorio CLISP. 1992. Consultado el 19 de enero de 2023 .
- ^ "Licencia - ¿por qué GNU GPL?". Preguntas frecuentes (con respuestas) sobre CLISP . Equipo 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 Editline (libedit)
- ^ "MariaDB/server/blob/10.2/BUILD/SETUP.sh". Repositorio 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 .
- ^ "Aplicaciones y bibliotecas". Wiki de Haskell . haskell.org . Consultado el 24 de octubre de 2017 .
- ^ Judah Jacobson. «judah/haskeline: una biblioteca Haskell para la entrada de línea en programas de línea de comandos». Repositorio Haskeline . Consultado el 24 de octubre de 2017 .
- ^ "PowerShell/PSReadLine: una implementación de readline inspirada en bash para PowerShell". Repositorio PSReadLine . Consultado el 20 de diciembre de 2023 .
- ^ "Módulo: Readline (Ruby 3.0.2)".
Enlaces externos
- Cosas que no sabías sobre GNU Readline