1 puntos por GN⁺ 2024-07-09 | 1 comentarios | Compartir por WhatsApp

Por qué es complejo ingresar texto en la terminal

  • Cuando en Mastodon se preguntó qué era lo que más confundía a la gente sobre trabajar en la terminal, destacó “editar un comando que ya escribieron”
  • Quiero compartir por qué es difícil ingresar texto en la terminal y algunos consejos útiles

Falta de consistencia entre programas

  • Distintos programas no manejan la entrada de texto de forma consistente
    • Algunos programas (cat, nc, git commit --interactive, etc.) no soportan las teclas de flecha en absoluto
    • Muchos programas (irb, python3, etc.) usan la biblioteca readline para ofrecer funciones básicas
    • Algunos programas solo soportan funciones básicas
    • Algunos programas tienen un sistema de entrada completamente personalizado

Modo 1: estado básico

  • El estado básico en el que un programa simplemente acepta entrada de texto
    • Ofrece funciones básicas como ingresar texto, retroceso, Ctrl+W, Ctrl+U, etc.
    • Puedes ver todos los códigos Ctrl soportados con el comando stty -a

Modo 2: herramientas que usan readline

  • readline es una biblioteca de GNU que hace más cómoda la entrada de texto
    • Ofrece atajos útiles como Ctrl+E, Ctrl+A, Ctrl+left/right arrow, Ctrl+R, etc.
    • Muchos programas como bash, psql, irb, python3 y otros usan readline

Consejo: usar readline con rlwrap

  • Con rlwrap, incluso los programas que no tienen soporte para readline pueden aprovechar sus funciones

Por qué una herramienta no usa readline

  • Porque el programa es muy simple, por temas de licencia o porque tiene poca interacción, entre otros motivos

Cómo comprobar si usa readline

  • Si al presionar Ctrl+R aparece reverse-i-search, es muy probable que esté usando readline

Origen de las combinaciones de teclas de readline

  • Las combinaciones de teclas de readline provienen de Emacs

Modo 3: otras bibliotecas de entrada (libedit, etc.)

  • El /usr/bin/python3 de Mac usa libedit, por lo que solo soporta parte de las funciones de readline

Modo 4: sistema de entrada personalizado

  • Editores de texto como nano, micro, vim, emacs y shells como fish tienen sistemas de entrada personalizados
  • Los sistemas personalizados suelen estar inspirados en readline

Muchos shells soportan combinaciones de teclas de vi

  • bash, zsh, fish y otros soportan “modo vi” para ingresar texto

Entender el contexto ayuda

  • Al ingresar texto en el prompt de la línea de comandos, entender el contexto hace que todo sea más predecible y menos confuso

Lo que este artículo no cubre

  • Problemas relacionados con ssh y tmux, la variable de entorno TERM, el soporte de copiar/pegar en distintas terminales, Unicode, etc.

Resumen de GN⁺

  • Explica por qué ingresar texto en la terminal es complejo y la falta de consistencia entre distintos programas
  • Presenta formas de hacer más cómoda la entrada de texto usando bibliotecas como readline
  • Ofrece el consejo de usar rlwrap para añadir funciones de readline
  • Enfatiza la importancia de entender el contexto al usar la terminal

1 comentarios

 
GN⁺ 2024-07-09
Opiniones de Hacker News
  • Los artículos de Julia siempre son buenos

    • En scripts de shell se puede usar stty para cambiar cómo el terminal maneja la entrada
    • Comparte un experimento que puede capturar e interpretar combinaciones de teclas y gestos del mouse en terminales compatibles con VT100
    • Se puede ejecutar la demo con el comando bash -c "$(curl -L https://git.io/fjToH)"
    • Se pueden ver las secuencias de escape VT100 de programas interactivos usando vi | cat -v
  • Cosas que faltaron en el artículo

    • Caracteres de ancho amplio
    • Distintas secuencias de escape ANSI según el modo del teclado
    • Varios estados de TTY
    • Llamadas al sistema para cambiar el estado de TTY que varían según el SO
    • Diferencias en el soporte de emulación de terminal
    • Falta de consenso sobre cómo comprobar las capacidades del terminal
  • En bash, si configuras $EDITOR, puedes enviar la línea actual a $EDITOR con ctrl-x ctrl-e

  • Hace 20 años hice un editor multilínea usando readline

    • Incluía movimiento del cursor y redibujado al cambiar el tamaño del terminal
    • Me gustaría reescribirlo en Rust y publicarlo como una librería pequeña
  • Una pregunta sobre cómo funciona la función fgets()

    • Por defecto, fgets() se bloquea hasta que el usuario introduce una nueva línea
    • Se puede editar el búfer de línea con los atajos Backspace, Ctrl+W y Ctrl+U
  • Opinión de que el terminal es una de las razones por las que Linux tiene menor cuota de mercado

    • La experiencia de uso del terminal es compleja
  • Réplica a la opinión de que el shell dash no soporta las teclas de flecha

    • Si se compila con libedit, sí soporta modo de edición
    • El estándar POSIX exige soporte para "set -o vi"
  • Tres atajos básicos de readline que sería útil que la gente conociera

    • Ctrl+W: borrar la última palabra
    • Ctrl+O: ejecutar la siguiente línea del historial
    • Ctrl+R: búsqueda inversa en el historial
  • Queja sobre cómo funcionan Ctrl-C y Ctrl-V en Windows Terminal

    • Las apps de terminal en Linux no se comportan como Windows Terminal
  • Un comentario que recuerda el clásico artículo de Linus