Atalho de teclado do histórico da Bash para! *

8

No Bash, existem alguns operadores úteis para repetir partes do último comando:

  • !^ expande para o primeiro argumento do comando anterior, por exemplo,

    $ echo one "two three"
    one two three
    $ echo !^
    echo one
    one
    
  • !$ expande para o último argumento do comando anterior, por exemplo,

    $ echo one "two three"
    one two three
    $ echo !$
    echo "two three"
    two three
    
  • !* se expande para todos os argumentos do comando anterior, por exemplo,

    $ echo one "two three"
    one two three
    $ echo !*
    echo one "two three"
    one two three
    

(Até onde eu sei, são açúcar sintático para !!:^ , !!:$ e !!:* respectivamente, onde !! é um designador de evento que se expande para o comando anterior e ^ , $ e * são designadores de palavras, consulte o Manual de referência do Bash ou man bash .)

Geralmente são muito úteis. Mas fica ainda mais legal com os atalhos de teclado:

  • Quando você apertar Alt + . ou Alt + _ , o último argumento do O comando anterior é inserido no comando atual, da mesma forma como se você tivesse escrito !$ nesse ponto.

  • Também é possível pressionar Alt + Ctrl + y para inserir o primeiro argumento do comando anterior, como se você escreveu !^ nesse ponto.

(Veja a Biblioteca Readline do GNU ou info readline .)

Eu costumo preferir os atalhos de teclado nos operadores de histórico do Bash, porque eu posso ver o que estou inserindo antes de realmente executar o comando. No entanto, parece não haver um atalho que me permita inserir todas as palavras do comando anterior, ou seja, uma que execute o trabalho de !* . Pelo menos eu não consegui encontrá-lo.

Existe tal atalho? Se não, é possível configurar a biblioteca readline para adicionar uma, e como?

    
por Malte Skoruppa 25.03.2014 / 19:24

1 resposta

5

Se você observar a saída do seguinte comando:

bind -l

ou melhor:

bind -l | grep arg

você pode ver que não existe nenhuma função readline para todos os argumentos como, por exemplo, yank-last-arg para o último argumento - que pode inserir o último argumento para o comando anterior (a última palavra da entrada do histórico anterior). Então, se tal função não existe, provavelmente não existe um atalho para realizar o que você deseja.

Vamos tentar criar uma abordagem ao seu pedido ...

Primeiro, procure por exemplo na saída do seguinte comando:

bind -p | grep yank-nth-arg

A saída é:

"\e\C-y": yank-nth-arg

e pode ser traduzido como segue: yank-nth-arg (que insere o primeiro argumento ao comando anterior - com um argumento n, insere o enésimo argumento do comando anterior) está vinculado a Alt + Ctrl + y .

Da mesma forma, pode ser interpretada qualquer linha da saída do comando bind -p .

Agora, preste atenção nos seguintes cenários:

  • Se você definir a seguinte ligação:

    bind '"\ea": "\e2\e."'
    

    Alt + Um será mapeado para Alt + 2 Alt + . , que é mapeado para inserir o segundo argumento do comando anterior. Então, depois de pressionar Alt + A , o argumento segundo do comando anterior é inserido no comando atual.

  • Se você definir:

    bind '"\ea": "\e1\e. \e2\e."'
    

    Depois de pressionar Alt + A , os argumentos primeiro dois do comando anterior são inseridos no comando atual. Se o número dos argumentos do comando anterior for no máximo 2, é claro que todos do comando anterior é inserido no comando atual.

  • Se você definir:

    bind '"\ea": "\e1\e. \e2\e. \e3\e."'
    

    Depois de pressionar Alt + A , os argumentos primeiros três do comando anterior são inseridos no comando atual. Se o número dos argumentos do comando anterior for no máximo 3 (como no seu caso), é claro que todo do comando anterior é inserido no comando atual.

  • E assim por diante.

Para os primeiros 10 argumentos, você pode usar:

bind '"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."'

E eu acho que isso é longo o suficiente, tanto quanto eu não uso muitas vezes comandos com tantos argumentos.

Para torná-lo persistente, adicione a seguinte linha de linha ao seu arquivo ~/.inputrc :

"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."

Neste exemplo eu escolhi Alt + A para inserir todos os argumentos (se o número de argumentos não for maior que 10) do comando anterior, mas você pode escolher qualquer outra combinação, substituindo no comando anterior a string \ea .

Recursos:

por Radu Rădeanu 25.03.2014 / 21:34