¿Cuál es el equivalente de bash! $ Y !! en la concha de pescado?

30

He estado usando bash durante una década más o menos y me he acostumbrado a poder escribir! $ Para repetir el último argumento, por ejemplo:

$ mkdir foo
$ cd !$
cd foo

(La última línea la imprime el shell para indicarle a qué se evaluó su comando). Del mismo modo a menudo a lo siguiente:

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

Me gusta mucho la concha de pescado, pero mi memoria muscular está bastante establecida. ¿Hay un equivalente en pescado? ¿Puedo configurar fish para usar los mismos comandos?

Frank Schmitt
fuente

Respuestas:

26

Alt- Up arrowle da el último argumento del comando anterior. Los empujes posteriores pasan por los argumentos anteriores.

No he encontrado un equivalente satisfactorio para !!, excepto Upentonces Ctrl-A

Glenn Jackman
fuente
11

sudo !! (o sudo bang bang) es uno de mis comandos más utilizados. Todavía estoy usando simplemente bash viejo que lo tiene muy bien. Lamento escuchar que el pez no lo implementa correctamente. Un poco de google y encontré esto:

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

Hay muchas más opciones en el hilo aquí: https://github.com/fish-shell/fish-shell/issues/288

Zanahoria
fuente
¿Dónde tengo que ingresar ese código? entrando eso en pescado y luego "sudo !!" devuelve algunas líneas de error con "fuente: Error al leer el archivo '-'"
Benedikt S. Vogler el
11

Encontré esta respuesta perfecta en la lista de correo de usuarios de peces :

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

Discusión adicional en wiki de github de pescado

Glenn Jackman
fuente
Eso es asombroso! Debería considerar editar la respuesta principal para incluir esto ...
user1480704
2
He creado ~/.config/fish/config.fishy pegar esto. Funcionó muy bien después de reiniciar el pescado.
Katu
3

Tuve el mismo problema que tú y lo solucioné usando oh-my-fish (es un administrador de complementos para fishshell) https://github.com/oh-my-fish/oh-my-fish . Puede instalarlo con este comando:

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

Luego instale el complemento bang-bangcon este comando:

omf install bang-bang 
Sidahmed
fuente
1

Si usa !!solo en el contexto de sudo !!, puede definir una combinación de ^steclas para (CTRL + s) que antepone sudo a su 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

Esto permite escribir cualquier comando y anteponer sudo mientras escribe o le gusta en su caso como una sustitución de sudo !!

Vea el comentario de Ahti sobre la discusión de Github

orzechow
fuente