Was ist das Äquivalent von Bash! $ Und !! in der fischschale?

30

Ich benutze Bash seit ungefähr einem Jahrzehnt und habe mich daran gewöhnt,! $ Zu tippen, um das letzte Argument zu wiederholen, zB:

$ mkdir foo
$ cd !$
cd foo

(Diese letzte Zeile wird von der Shell gedruckt, um Ihnen mitzuteilen, wie Ihr Befehl ausgewertet wurde.) Ebenso habe ich oft folgendes zu beachten:

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

Ich mag die Fischschale sehr, aber mein Muskelgedächtnis ist ziemlich gut. Gibt es ein Äquivalent bei Fisch? Kann ich fish so konfigurieren, dass dieselben Befehle verwendet werden?

Frank Schmitt
quelle

Antworten:

26

Alt- Up arrowgibt Ihnen das letzte Argument aus dem vorherigen Befehl. Nachfolgende Pushs durchlaufen alle vorherigen Argumente.

Ich habe kein zufriedenstellendes Äquivalent zu gefunden !!, außer Updann Ctrl-A

Glenn Jackman
quelle
11

sudo !! (oder sudo bang bang) ist einer meiner am häufigsten verwendeten Befehle. Ich verwende immer noch nur einfaches altes Bash, das es in Ordnung bringt. Es tut mir leid zu hören, dass Fisch es nicht richtig umsetzt. Ein bisschen googeln und ich fand das:

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

Es gibt viel mehr Optionen im Thread hier: https://github.com/fish-shell/fish-shell/issues/288

Karotte
quelle
wo muss ich den code eingeben Geben Sie das in Fisch und dann "sudo !!" gibt einige Fehlerzeilen mit "source: Fehler beim Lesen der Datei '-'" zurück
Benedikt S. Vogler
11

Ich fand diese perfekte Antwort auf der Mailingliste der Fischnutzer :

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

Weitere Diskussion zum Fisch-Github-Wiki

Glenn Jackman
quelle
Das ist fantastisch! Sie sollten erwägen, die Top-Antwort so zu bearbeiten, dass sie
Folgendes
2
Ich habe das erstellt ~/.config/fish/config.fishund eingefügt. Nach dem Neustart des Fisches hat es wunderbar funktioniert.
Katu
3

Ich hatte das gleiche Problem wie Sie und habe oh-my-fish es mit https://github.com/oh-my-fish/oh-my-fish behoben (es ist ein Plugin-Manager für die fishShell) . Sie können es mit diesem Befehl installieren:

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

Dann installiere das Plugin bang-bangmit diesem Befehl:

omf install bang-bang 
Sidahmed
quelle
1

Wenn Sie !!nur im Kontext von verwenden sudo !!, können Sie eine Tastenkombination für ^s(STRG + s) definieren, die Ihrem Befehl sudo voranstellt:

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

Dadurch können Sie jeden Befehl eingeben und sudo voranstellen, während Sie in Ihrem Fall als Ersatz für eingeben sudo !!

Siehe den Kommentar von Ahti zur Github-Diskussion

orzechow
quelle