Quel est l'équivalent de bash's! $ Et !! dans la coquille de poisson?

30

J'utilise bash depuis une dizaine d'années et je me suis habitué à pouvoir taper! $ Pour répéter le dernier argument, par exemple:

$ mkdir foo
$ cd !$
cd foo

(Cette dernière ligne est imprimée par le shell pour vous dire à quoi votre commande a été évaluée). De même, je fais souvent ce qui suit:

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

J'aime vraiment la coquille de poisson, mais ma mémoire musculaire est assez établie. Y a-t-il un équivalent en poisson? Puis-je configurer fish pour utiliser les mêmes commandes?

Frank Schmitt
la source

Réponses:

26

Alt- Up arrowvous donne le dernier argument de la commande précédente. Les poussées suivantes font défiler les arguments précédents.

Je n'ai pas trouvé d'équivalent satisfaisant !!, sauf Upalors Ctrl-A

glenn jackman
la source
11

sudo !! (ou sudo bang bang) est l'une de mes commandes les plus utilisées. J'utilise toujours un vieux bash tout simplement parfait. Désolé d'entendre que le poisson ne l'applique pas correctement. Un peu sur Google et j'ai trouvé ceci:

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

Il y a beaucoup plus d'options sur le fil ici: https://github.com/fish-shell/fish-shell/issues/288

Carotte
la source
où dois-je entrer ce code? entrer cela dans le poisson, puis "sudo !!" renvoie quelques lignes d'erreur avec "source: Erreur lors de la lecture du fichier '-'"
Benedikt S. Vogler
11

J'ai trouvé cette réponse parfaite sur la liste de diffusion des utilisateurs de poisson :

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

Discussion plus approfondie sur le wiki de Fish's Github

glenn jackman
la source
C'est génial! Vous devriez envisager de modifier la première réponse pour inclure ceci ...
user1480704
2
J'ai créé ~/.config/fish/config.fishet collé cela. Cela a très bien fonctionné après le redémarrage du poisson.
Katu
3

J'ai eu le même problème que vous, et j'ai résolu en utilisant oh-my-fish (c'est un gestionnaire de plugins pour le fishshell) https://github.com/oh-my-fish/oh-my-fish . Vous pouvez l'installer avec cette commande:

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

Installez ensuite le plugin bang-bangavec cette commande:

omf install bang-bang 
Sidahmed
la source
1

Si vous utilisez !!uniquement dans le contexte de sudo !!, vous pouvez définir un raccourci clavier vers ^s(CTRL + s) qui ajoute sudo à votre commande:

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

Cela permet de taper n'importe quelle commande et d'ajouter sudo tout en tapant ou comme dans votre cas en remplacement de sudo !!

Voir le commentaire de l' Ahti sur la discussion github

orzechow
la source