Qual é o equivalente a bash's! $ E !! na casca do peixe?

30

Uso o bash há mais de uma década 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 o que seu comando avaliou). Da mesma forma, muitas vezes para o seguinte:

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

Estou gostando muito da casca do peixe, mas minha memória muscular está bem estabelecida. Existe um equivalente em peixe? Posso configurar o peixe para usar os mesmos comandos?

Frank Schmitt
fonte

Respostas:

26

Alt- Up arrowfornece o último argumento do comando anterior. Os pushs subsequentes alternam entre argumentos anteriores.

Não encontrei um equivalente satisfatório !!, exceto Upentão Ctrl-A

Glenn Jackman
fonte
11

sudo !! (ou sudo bang bang) é um dos meus comandos mais usados. Eu ainda estou usando apenas bash velho simples que tem muito bem. Lamento ouvir que o peixe não o implementa corretamente. Um pouco pesquisando e achei o seguinte:

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

Há muito mais opções sobre o tópico aqui: https://github.com/fish-shell/fish-shell/issues/288

Cenoura
fonte
onde devo inserir esse código? inserindo isso no peixe e depois em "sudo !!" retorna algumas linhas de erro com "fonte: erro ao ler o arquivo '-'"
Benedikt S. Vogler
11

Encontrei esta resposta perfeita na lista de discussão dos 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

Discussões adicionais no wiki do fish's github

Glenn Jackman
fonte
Isso é incrível! Você deve considerar a edição a resposta de cima para incluir este ...
user1480704
2
Eu criei ~/.config/fish/config.fishe colei isso. Funcionou muito bem após reiniciar o peixe.
Katu #
3

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

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

Em seguida, instale o plugin bang-bangcom este comando:

omf install bang-bang 
Sidahmed
fonte
1

Se você usar !!apenas no contexto de sudo !!, poderá definir uma combinação de teclas para ^s(CTRL + s) que antecede o 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 preceder o sudo enquanto você digita ou gosta no seu caso como uma substituição de sudo !!

Veja o comentário do Ahti na discussão do github

orzechow
fonte