O que é isso “(arg: 1)” aparecendo no terminal / tty depois que eu pressionei uma combinação de teclas?

18

Em um terminal virtual eu (acidentalmente) pressione Win + 1 e obtive uma nova linha que consiste em

(arg: 1)

Enquanto mantiver Win pressionado, todos os números que pressionar serão anexados ao número entre parênteses, por exemplo, Win e 1 + 4 rende (arg:14) .

Quando eu (depois de liberar Win ) pressiono qualquer tecla, esse caractere é impresso quantas vezes o número for lido e a expressão (arg: ...) for substituída pelo prompt padrão.

Alguém sabe o que acontece aqui?

    
por guntbert 09.06.2018 / 23:20

1 resposta

21

Esse é um argumento de dígito , um recurso da biblioteca de readline incorporada bash :

digit-argument (M-0, M-1, ..., M--)
    Add  this digit to the argument already accumulating, or start a
    new argument. M-- starts a negative argument.

Esse recurso simplifica a adição ou exclusão de texto na linha de comando editada atualmente. Digamos que você queira escrever echo gggg :

  1. Insira echo seguido por espaço
  2. Pressione a tecla Meta (que pode ser Win , Alt e / ou Esc para você) e digite 4g

Mas com que frequência você precisa digitar uma única letra tantas vezes que isso economizaria alguma coisa? O recurso é projetado principalmente para comandos readline , consulte capítulos 8.2.1–8.2.3 do Manual de Referência (“C” significa Ctrl , “M” significa Meta).

Você pode mover uma palavra para trás com Meta e B , mas e se você quiser mover várias palavras de uma só vez? Você pode segurar Alt e pressionar B várias vezes, ou usar o argumento numérico:

  1. Há um erro de digitação na sua linha de comando cinco palavras atrás:

    $ echo one two tree four five six seven█
    
  2. Pressione a tecla Meta, digite 5 e pressione Meta e B . Et violà:

    $ echo one two █ree four five six seven
    
  3. Corrija o erro e pressione Enter para disparar ou End ou Ctrl + E para mover para o fim da linha novamente.

Você pode excluir uma única palavra pressionando Meta e Backspace , mas e se você quiser excluir várias palavras de uma só vez?

  1. Você esqueceu uma palavra na sua linha de comando:

    $ echo one two four five six seven█
    
  2. Pressione a tecla Meta, digite 4 e pressione Meta e Backspace .

    $ echo one two █
    
  3. Digite a palavra que está faltando seguida por espaço e pressione Ctrl + Y para colar o que acabou de ser apagado. Et violà:

    $ echo one two three four five six seven█
    

Você está certo, você também poderia ter se mudado para lá como explicado sem excluir nada. Estamos no Linux, há sempre várias maneiras de fazer a mesma coisa.

E o que é um "argumento negativo"? Ele faz o mesmo, mas na direção oposta, então Meta -2 Meta Backspace exclui as próximas duas palavras da linha de comando. “Mas alguém poderia usar Meta 1 Meta D para fazer a mesma coisa!” Fico feliz que você tenha recebido isso, bem-vindo à sua linha de comando.

Leitura adicional:

por dessert 09.06.2018 / 23:49