GNU Readline - GNU Readline

GNU Readline
Heckert GNU white.svg
Autor (es) original (is) Brian Fox
Desenvolvedor (s) Chet Ramey
lançamento inicial 1989 ; 32 anos atras ( 1989 )
Versão estável
8.1 / 7 de dezembro de 2020 ; 10 meses atrás ( 2020-12-07 )
Repositório
Escrito em C
Modelo Biblioteca
Licença GNU General Public License
Local na rede Internet tiswww .case .edu / php / chet / readline / rltop .html

GNU Readline é uma biblioteca de software que fornece recursos de edição de linha e histórico para programas interativos com uma interface de linha de comando , como o Bash . Atualmente é mantido por Chet Ramey como parte do Projeto GNU .

Ele permite aos usuários mover o cursor de texto , pesquisar o histórico de comandos , controlar um kill ring (uma versão mais flexível de uma área de transferência de copiar / colar) e usar o preenchimento de tabulação em um terminal de texto . Como uma biblioteca de plataforma cruzada , readline permite que aplicativos em vários sistemas exibam comportamento de edição de linha idêntico.

Modos de edição

Readline suporta os modos de edição Emacs e vi, que determinam como a entrada do teclado é interpretada como comandos do editor. Veja Editor war # Diferenças entre vi e Emacs .

Atalhos de teclado Emacs

Os atalhos de teclado do modo de edição do Emacs são obtidos do editor de texto Emacs .

Em alguns sistemas, Escdeve ser usado em vez de Alt, porque o Altatalho está em conflito com outro atalho. Por exemplo, pressionar Alt+ fna janela do emulador de terminal do Xfce não move o cursor uma palavra para a frente, mas ativa "Arquivo" no menu da janela do terminal, a menos que esteja desabilitado nas configurações do emulador.

  • Tab ↹ : Autocompleta a partir da posição do cursor.
  • Ctrl+ a : Move o cursor para o início da linha (equivalente à tecla Home).
  • Ctrl+ b : Move o cursor um caractere para trás (equivalente à tecla ).
  • Ctrl+ c : Envia o sinal SIGINT via pseudoterminal para a tarefa atual, que a aborta e fecha.
  • Ctrl+d
    • Envia um marcador EOF, que (a menos que desabilitado por uma opção) fecha o shell atual (equivalente ao comando exit). (Somente se não houver texto na linha atual)
    • Se houver texto na linha atual, exclui o caractere atual (então equivalente à tecla Delete).
  • Ctrl+ e : ( fim ) move o cursor para o fim da linha (equivalente à tecla End).
  • Ctrl+ f : Avança o cursor um caractere (equivalente à tecla ).
  • Ctrl+ g : Aborta a busca reversa e restaura a linha original.
  • Ctrl+ h : Exclui o caractere anterior (o mesmo que backspace).
  • Ctrl+ i : Equivalente à tecla tab.
  • Ctrl+ j : Equivalente à tecla Enter.
  • Ctrl+ k : Limpa o conteúdo da linha após o cursor e o copia para a área de transferência .
  • Ctrl+ l : Limpa o conteúdo da tela (equivalente ao comando clear).
  • Ctrl+ n : ( próximo ) chama o próximo comando (equivalente à tecla ).
  • Ctrl+ o : Executa o comando encontrado do histórico e busca a próxima linha relativa à linha atual do histórico para edição.
  • Ctrl+ p : ( anterior ) chama o comando anterior (equivalente à tecla ).
  • Ctrl+ r : (pesquisa reversa) chama o último comando incluindo os caracteres especificados. Um segundo Ctrl+ rlembra o próximo comando anterior que corresponde à pesquisa
  • Ctrl+ s : Volte para o próximo comando mais recente da busca reversa (cuidado para não executá-lo de um terminal porque este comando também inicia seu XOFF). Se você alterou a configuração de XOFF, use Ctrl+ qpara retornar.
  • Ctrl+ t : Transpõe os dois caracteres anteriores.
  • Ctrl+ u : Limpa o conteúdo da linha antes do cursor e o copia para a área de transferência .
  • Ctrl+ v : Se a próxima entrada também for uma sequência de controle, digite-a literalmente (por exemplo, * Ctrl+ v Ctrl+ hdigita "^ H", um backspace literal.)
  • Ctrl+ w : Limpa a palavra antes do cursor e a copia para a área de transferência .
  • Ctrl+ x Ctrl+ e : Edita a linha atual no programa $ EDITOR, ou vi se indefinido.
  • Ctrl+ x Ctrl+ r : Leia o conteúdo do arquivo inputrc e incorpore quaisquer ligações ou atribuições de variáveis ​​encontradas lá.
  • Ctrl+ x Ctrl+ u : Desfazer incremental, lembrado separadamente para cada linha.
  • Ctrl+ x Ctrl+ v : Exibe informações sobre a versão da instância atual do Bash.
  • Ctrl+ x Ctrl+ x : Alterna o cursor com sua posição anterior. (Cx, porque x tem uma forma cruzada).
  • Ctrl+ y : ( arrancar ) adiciona o conteúdo da área de transferência a partir da posição do cursor.
  • Ctrl+ z : Envia o sinal SIGTSTP para a tarefa atual, que a suspende. Para executá-lo em segundo plano, pode-se entrar bg. Para trazê-lo de volta do fundo ou suspensão fg ['process name or job id']( primeiro plano ) pode ser emitida.
  • Ctrl+ _ : Desfazer incremental, lembrado separadamente para cada linha.
  • Alt+ b : ( para trás ) move o cursor uma palavra para trás.
  • Alt+ c : Coloca em maiúscula o caractere sob o cursor e move-se para o final da palavra.
  • Alt+ d : Corta a palavra após o cursor.
  • Alt+ f : ( avançar ) move o cursor uma palavra para a frente.
  • Alt+ l : Diminui a caixa de cada caractere da posição do cursor até o final da palavra atual.
  • Alt+ r : Cancela as alterações e recoloca a linha como estava no histórico.
  • Alt+ u : Capitaliza todos os caracteres da posição do cursor até o final da palavra atual.
  • Alt+ . : Insere o último argumento do comando anterior (a última palavra da entrada anterior do histórico).

Escolha da GPL como licença GNU Readline

GNU Readline é notável por ser uma biblioteca de software livre licenciada sob a GNU General Public License (GPL). Bibliotecas de software livre são licenciadas com muito mais frequência sob a GNU Lesser General Public License (LGPL), por exemplo, a GNU C Library , GNU gettext e FLTK . Um desenvolvedor de um aplicativo que opta por se vincular a uma biblioteca licenciada LGPL pode usar qualquer licença para o aplicativo. Mas o link para uma biblioteca licenciada GPL , como Readline, requer que todo o aplicativo resultante combinado seja licenciado sob a GPL quando distribuído, para cumprir com a seção 5 da GPL.

Esta licença foi escolhida pela FSF na esperança de encorajar o software a mudar para a GPL. Um exemplo importante de um aplicativo que muda seu licenciamento para cumprir as condições copyleft do GNU Readline é o CLISP , uma implementação do Common Lisp . Lançado originalmente em 1987, ele mudou para a licença GPL em 1992, após uma troca de e-mail entre um dos autores originais do CLISP, Bruno Haible, e Richard Stallman , no qual Stallman argumentou que o link de readline no CLISP significava que Haible era obrigado a refazer -license CLISP sob a GPL se quisesse distribuir a implementação de CLISP que readline usado.

Outra resposta foi não usar isso em alguns projetos, fazendo com que a entrada de texto usasse o driver de terminal Unix primitivo para edição.

Bibliotecas alternativas

Bibliotecas alternativas foram criadas com outras licenças para que possam ser usadas por projetos de software que desejam implementar a funcionalidade de edição de linha de comando, mas podem ser lançadas com uma licença não GPL.

  • Muitos sistemas BSD possuem um libedit licenciado por BSD . MariaDB e PHP permitem que o usuário selecione no momento da construção se deseja vincular-se ao GNU Readline ou ao libedit. A libreadline do macOS é, na verdade, um shim sobre a libedit, um arranjo conhecido como editline .
  • linenoise é uma pequena biblioteca C que fornece funções de edição de linha.
  • Haskeline é uma biblioteca do tipo readline para Haskell. Ele foi escrito principalmente para o Compilador Glasgow Haskell , mas está disponível para outros projetos Haskell que também precisam de serviços de edição de linha.

Código de amostra

O código a seguir está em C e deve ser vinculado à biblioteca readline passando um sinalizador -lreadline para o compilador:

#include <stdlib.h>
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    // Configure readline to auto-complete paths when the tab key is hit.
    rl_bind_key('\t', rl_complete);

    while (1) {
        // Display prompt and read input
        char* input = readline("prompt> ");

        // Check for EOF.
        if (!input)
            break;

        // Add input to readline history.
        add_history(input);

        // Do stuff...

        // Free buffer that was allocated by readline
        free(input);
    }
    return 0;
}

Bindings

As linguagens de programação não C que fornecem ligações de linguagem para readline incluem

  • readlineMódulo integrado do Python ;
  • readlineMódulo integrado do Node.js ;
  • readlineMódulo embutido do Ruby ;
  • Term::ReadLineMódulo de terceiros (CPAN) do Perl , especificamente Term::ReadLine::Gnupara GNU ReadLine.

O suporte para alternativas readline difere entre essas ligações.

Notas

Referências

links externos