Jak edytować poprzednie linie w poleceniu wieloliniowym w Bash?

24

Kiedy wprowadzam polecenie obejmujące wiele linii w Bash, jak mogę edytować poprzednie linie? Jestem użytkownikiem Linux Mint (Lisa) używającym terminala GNOME.

Załóżmy na przykład, że piszę:

$ echo "foo bar
> baz
>

A kiedy już zamierzam wpisać trzeci wiersz polecenia, nagle uświadom sobie, że chcę, aby „foo” i „bar” znajdowały się w osobnych wierszach. Jak zmienić położenie kursora między „foo” a „paskiem”, tak że mógłbym nacisnąć Enter i umieścić je w osobnych wierszach?

(Nie jest to łatwe, jak mogłoby się wydawać. Strzałka w górę nie działa, podobnie jak Ctrl-P. Proszę więc wypróbować przed opublikowaniem! Dzięki!)

Asher Walther
źródło
Przyjęta odpowiedź mówi, że nie ma rozwiązania, ale jest. Zobacz poniżej
cdosborn,

Odpowiedzi:

16

To niestety zależy bashod terminala. Twoje opcje to:

  1. Używaj średników zamiast znaków nowej linii, chociaż nawet wtedy nie możesz przesunąć linii ekranu w górę, ale musisz używać poleceń ruchu znaków lub słów. (Dziwne, zshprzynajmniej pozwala poruszać się po poleceniu złożonym podczas edycji historii, ale nie w bieżącym poleceniu.) Czasami fc(który wrzuca cię do edytora za pomocą poprzedniego polecenia) jest najłatwiejszym sposobem obsługi poleceń złożonych.

  2. Jeśli używasz Bash, użyj następującej kombinacji klawiszy:

    ctrl x e

    Otworzy się polecenie, nad którym pracujesz za pomocą edytora tekstu. Zapisz plik i wyjdź. (Znalazłem polecenie w prezentacji Shell Hatera .) Użytkownicy Zsh mają tę alternatywę .

geekozaur
źródło
1
Strona podręcznika użytkownika bash wyjaśnia, jak zmienić używany edytor: edit-and-execute-command (C-xC-e) - Wywołaj edytor w bieżącym wierszu poleceń i wykonaj wynik jako polecenia powłoki. Bash próbuje wywołać $ VISUAL, $ EDITOR i emacs jako edytor, w tej kolejności.
Matthew
Istnieje rozwiązanie bez otwierania edytora.
cdosborn
Technicznie nie jest to bash - ale biblioteka „readline”, której bash używa do pobierania danych wejściowych.
Christian Herenz,
11

Rozwiązaniem jest, aby nigdy nie wprowadzać polecenia, dopóki linia nie będzie odpowiednia, po prostu wpisz: CtrlvCtrlj kiedy chcesz przejść do następnego wiersza. Metabcofnąć słowo.

rozwiązanie

podziękowania dla odpowiedzi @ rici

cdosborn
źródło
4

Zabawne Ctrl+Cjest to, czego szukasz.

kiedy jesteś włączony

$ echo "foo bar
> baz
>

wystarczy nacisnąć Ctrl+C(edytowany wiersz poleceń zawiesi się) i nacisnąć Up(poprzednia historia). Twoje pytanie brzmi: (zauważ brak>)

$ echo "foo bar
baz

Teraz możesz się poruszać Left Rightnawet z przeskokami linii.

Jest tylko jedno dziwactwo, musisz być na ostatnim znaku, aby dodać kolejną linię, więc poruszaj się, aby edytować istniejące linie (przejdź od początku Ctrl+A) i naciśnij, Enter jeśli to wystarczy lub goto end ( Ctrl+E), aby dodać więcej linii Enter. Kolejną wadą jest to, że Ctrl+_(Cofnij) przywraca tylko zmiany od ostatniegoCtrl+C

albfan
źródło
-2

Skopiuj polecenia i wklej je do notatnika, a następnie sformatuj je stamtąd. Następnie możesz skopiować swoje polecenia z powrotem do terminala.

Pacheko
źródło