Jaki jest odpowiednik bash! $ I !! w skorupce ryby?

30

Używam bash od około dekady i przyzwyczaiłem się do pisania! $, Aby powtórzyć ostatni argument, np .:

$ mkdir foo
$ cd !$
cd foo

(Ten ostatni wiersz jest drukowany przez powłokę, aby powiedzieć ci, na co oceniało twoje polecenie). Podobnie ja często do następujących:

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

Naprawdę lubię skorupę ryby, ale pamięć mięśni jest całkiem niezła. Czy istnieje odpowiednik w rybach? Czy mogę skonfigurować ryby tak, aby używały tych samych poleceń?

Frank Schmitt
źródło

Odpowiedzi:

26

Alt- Up arrowpodaje ostatni argument z poprzedniego polecenia. Kolejne przepychania przechodzą przez poprzednie argumenty.

Nie znalazłem zadowalającego odpowiednika !!, z wyjątkiem Uptego Ctrl-A

Glenn Jackman
źródło
11

sudo !! (lub sudo bang bang) to jedno z moich najczęściej używanych poleceń. Nadal używam zwykłego starego basha, który ma to w porządku. Przykro nam, że ryba nie implementuje go poprawnie. Trochę google i znalazłem to:

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

W wątku jest o wiele więcej opcji: https://github.com/fish-shell/fish-shell/issues/288

Marchewka
źródło
gdzie muszę wpisać ten kod? wprowadzanie tego do ryby, a następnie „sudo !!” zwraca niektóre wiersze błędu z komunikatem „źródło: błąd podczas odczytu pliku” - ””
Benedikt S. Vogler
11

Znalazłem idealną odpowiedź na liście mailingowej użytkowników ryb :

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

Dalsza dyskusja na wiki github ryb

Glenn Jackman
źródło
To jest niesamowite! Powinieneś rozważyć edycję najważniejszej odpowiedzi, aby uwzględnić to ...
user1480704
2
Stworzyłem ~/.config/fish/config.fishi wkleiłem to. Działa świetnie po ponownym uruchomieniu ryby.
Katu,
3

Miałem ten sam problem co ty i naprawiłem za pomocą oh-my-fish (to menedżer wtyczek dla fishpowłoki) https://github.com/oh-my-fish/oh-my-fish . Możesz zainstalować go za pomocą tego polecenia:

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

Następnie zainstaluj wtyczkę za bang-bangpomocą tego polecenia:

omf install bang-bang 
Sidahmed
źródło
1

Jeśli używasz !!tylko w kontekście sudo !!, możesz zdefiniować skrót klawiszowy do ^s(CTRL + s), który poprzedza sudo do twojej komendy:

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

Umożliwia to wpisanie dowolnego polecenia i dodanie sudo podczas pisania lub polubienie w twoim przypadku jako zamiennik sudo !!

Zobacz komentarz Ahti do dyskusji na githubie

orzechow
źródło