1 pontos por GN⁺ 2024-07-09 | 1 comentários | Compartilhar no WhatsApp

Por que a entrada de texto no terminal é complexa

  • Quando perguntou no Mastodon o que confundia as pessoas sobre trabalhar no terminal, algo que se destacou foi "editar um comando que você já digitou"
  • Quer compartilhar por que a entrada de texto no terminal é difícil e algumas dicas úteis

Falta de consistência entre programas

  • Diferentes programas não tratam a entrada de texto de forma consistente
    • Alguns programas (cat, nc, git commit --interactive etc.) não oferecem suporte às teclas de seta
    • Muitos programas (irb, python3 etc.) usam a biblioteca readline para fornecer funcionalidades básicas
    • Alguns programas oferecem apenas recursos básicos
    • Alguns programas têm um sistema de entrada totalmente personalizado

Modo 1: estado básico

  • O estado básico em que o programa simplesmente aceita entrada de texto
    • Oferece funções básicas como entrada de texto, backspace, Ctrl+W, Ctrl+U etc.
    • Você pode ver todos os códigos Ctrl suportados com o comando stty -a

Modo 2: ferramentas que usam readline

  • readline é uma biblioteca GNU que torna a entrada de texto mais conveniente
    • Oferece atalhos úteis como Ctrl+E, Ctrl+A, Ctrl+left/right arrow, Ctrl+R etc.
    • Muitos programas como bash, psql, irb, python3 usam readline

Dica: usar readline com rlwrap

  • Com rlwrap, até programas sem suporte a readline podem usar os recursos de readline

Por que uma ferramenta não usa readline

  • Porque o programa é muito simples, por questões de licença ou por ter pouca interação, entre outros motivos

Como verificar se está usando readline

  • Se ao pressionar Ctrl+R aparecer reverse-i-search, é bem provável que o programa esteja usando readline

A origem dos atalhos de teclado do readline

  • Os atalhos de teclado do readline vieram do Emacs

Modo 3: outras bibliotecas de entrada (libedit etc.)

  • O /usr/bin/python3 do Mac usa libedit e por isso oferece suporte apenas a parte dos recursos do readline

Modo 4: sistema de entrada personalizado

  • Editores de texto como nano, micro, vim, emacs e shells como fish têm sistemas de entrada personalizados
  • Sistemas personalizados muitas vezes se inspiram no readline

Muitos shells oferecem suporte a atalhos do vi

  • bash, zsh, fish etc. oferecem um "modo vi" para entrada de texto

Entender o contexto ajuda

  • Ao digitar texto no prompt de linha de comando, entender o contexto torna tudo mais previsível e menos confuso

O que este texto não aborda

  • Problemas relacionados a ssh e tmux, a variável de ambiente TERM, suporte a copiar/colar em diferentes terminais, Unicode etc.

Resumo do GN⁺

  • Explica por que a entrada de texto no terminal é complexa e por que há falta de consistência entre diferentes programas
  • Mostra como bibliotecas como readline podem tornar a entrada de texto mais prática
  • Dá a dica de usar rlwrap para adicionar recursos do readline
  • Reforça que entender o contexto ao usar o terminal é importante

1 comentários

 
GN⁺ 2024-07-09
Comentários do Hacker News
  • Os textos da Julia são sempre bons

    • Em scripts de shell, é possível usar stty para mudar a forma como o terminal processa a entrada
    • Compartilhou um experimento capaz de capturar e interpretar combinações de teclas e gestos do mouse em terminais compatíveis com VT100
    • É possível executar a demonstração com o comando bash -c "$(curl -L https://git.io/fjToH)"
    • Dá para usar vi | cat -v para ver as sequências de escape VT100 de programas interativos
  • Pontos que ficaram de fora do texto

    • Caracteres de largura ampla
    • Diferentes sequências de escape ANSI conforme o modo do teclado
    • Vários estados de TTY
    • Chamadas de sistema diferentes entre sistemas operacionais para alterar o estado do TTY
    • Diferenças no suporte à emulação de terminal
    • Falta de consenso sobre como verificar os recursos do terminal
  • No bash, se $EDITOR estiver definido, ctrl-x ctrl-e pode enviar a linha atual para o $EDITOR

  • Há 20 anos, alguém criou um editor multilinha usando readline

    • Incluía movimentação do cursor e redesenho ao redimensionar o terminal
    • Gostaria de reescrevê-lo em Rust e lançá-lo como uma pequena biblioteca
  • Pergunta sobre como a função fgets() funciona

    • fgets() normalmente bloqueia até que o usuário insira uma nova linha
    • É possível editar o buffer da linha com os atalhos Backspace, Ctrl+W e Ctrl+U
  • Opinião de que o terminal é uma das razões para a menor participação de mercado do Linux

    • A experiência de uso do terminal é complexa
  • Contestação à afirmação de que o shell dash não suporta as teclas de seta

    • Se for compilado com libedit, ele oferece modo de edição
    • O padrão POSIX exige suporte a set -o vi
  • Três atalhos básicos do readline que seria útil mais gente conhecer

    • Ctrl+W: apagar a última palavra
    • Ctrl+O: executar a próxima linha do histórico
    • Ctrl+R: busca reversa no histórico
  • Reclamação sobre o comportamento de Ctrl-C e Ctrl-V no Windows Terminal

    • Aplicativos de terminal no Linux não funcionam como o Windows Terminal
  • Comentário de que isso relembra o texto clássico do Linus