Qual é o equivalente de bash's! $ e !! na casca do peixe?

25

Estou usando o bash há uma década ou mais e me acostumei a digitar $ $ para repetir o último argumento, por exemplo:

$ mkdir foo
$ cd !$
cd foo

(Essa última linha é impressa pelo shell para informar a que seu comando foi avaliado). Da mesma forma eu frequentemente ao seguinte:

$ make_sandwich
-bash: make_sandwich: Permission denied
$ sudo !!
sudo make_sandwich

Eu realmente estou gostando da casca de peixe, mas minha memória muscular está bem estabelecida. Existe um equivalente em peixe? Posso configurar o fish para usar os mesmos comandos?

    
por Frank Schmitt 20.02.2014 / 19:34

5 respostas

22

Alt - Seta para cima fornece o último argumento do comando anterior. Subseqüente empurra ciclo através de argumentos anteriores.

Eu não encontrei um equivalente satisfatório para !! , exceto Acima então Ctrl - A

    
por 20.02.2014 / 21:36
10

sudo !! (ou sudo bang bang) é um dos meus comandos mais usados. Eu ainda estou usando apenas bash simples que tem tudo bem. Desculpe ouvir que o peixe não o implementa corretamente. Um pouco de googling e achei isso:

function sudo
    if test "$argv" = !!
        eval command sudo $history[1]
    else
        command sudo $argv
    end
end

Existem muito mais opções disponíveis no tópico: link

    
por 20.02.2014 / 19:48
9

Eu encontrei essa resposta perfeita na lista de usuários de peixes :

function bind_bang
    switch (commandline -t)[-1]
        case "!"
            commandline -t $history[1]; commandline -f repaint
        case "*"
            commandline -i !
    end
end

function bind_dollar
    switch (commandline -t)[-1]
        case "!"
            commandline -t ""
            commandline -f history-token-search-backward
        case "*"
            commandline -i '$'
    end
end

function fish_user_key_bindings
    bind ! bind_bang
    bind '$' bind_dollar
end
    
por 24.07.2015 / 03:50
1

Se você usar !! apenas no contexto de sudo !! , poderá definir uma atalhos de teclado para ^s (CTRL + s) que prepends sudo ao seu comando:

function prepend_command
  set -l prepend $argv[1]
  if test -z "$prepend"
    echo "prepend_command needs one argument."
    return 1
  end

  set -l cmd (commandline)
  if test -z "$cmd"
    commandline -r $history[1]
  end

  set -l old_cursor (commandline -C)
  commandline -C 0
  commandline -i "$prepend "
  commandline -C (math $old_cursor + (echo $prepend | wc -c))
end

Isso permite digitar qualquer comando e prefixar o sudo durante a digitação ou, como no seu caso, como uma substituição de sudo !!

Veja o comentário da Ahti sobre a discussão do github

    
por 11.05.2016 / 13:44
1

Eu tive o mesmo problema que você e corrigi usando oh-my-fish  (é um gerenciador de plugins para fish shell) link . Você pode instalá-lo com este comando:

curl -L https://get.oh-my.fish | fish

Em seguida, instale o plug-in bang-bang com este comando:

omf install bang-bang 
    
por 16.05.2017 / 16:33