Odwrotne wyszukiwanie historii w bash, a następnie klawisze strzałek powoduje wyświetlanie kursora w niewłaściwym miejscu

10

Zauważyłem, że wiele razy przeszukuję historię wstecz z wiersza poleceń za pomocą CTRL+ r, jeśli chcę edytować polecenie, czasami kursor przeskakuje do niewłaściwej pozycji po naciśnięciu klawisza strzałki lub wpisaniu CTRL+ alub CTRL+ e. Określona pozycja, do której przeskakuje, wydaje się być przesunięciem równym rozmiarowi wiersza polecenia ustawionemu w PS1.

Powoduje to trudności, ponieważ rzeczywista lokalizacja kursora różni się od tego, co jest renderowane na ekranie; przyszłe zmiany polecenia są renderowane tak, jakby kursor był w miejscu, do którego przeskoczył, ale rzeczywiste polecenie zachowuje poprawną lokalizację bez żadnego skoku.

Czy ktoś wie, co to powoduje lub jak to naprawić?

EDYCJA: Jeśli dodam nowy wiersz na końcu PS1problem wydaje się zniknąć. Wolałbym jednak wpisać polecenie w tym samym wierszu co wiersz zachęty.

Jerry
źródło

Odpowiedzi:

6

Jest to często spowodowane poleceniami w twojej historii, które są dłuższe niż 1 linia. Gdy wybierzesz krótszy element z historii, wydaje się, że nie bierze on pod uwagę szerokości wiersza przy ponownym renderowaniu wiersza poleceń, więc wszystko po tym długim poleceniu jest niespokojne.

Najprostszym rozwiązaniem, jakie znalazłem, jest naciśnięcie klawisza głównego, wstawienie „echa” i naciśnięcie klawisza Enter. Następnie przywołaj ostatnie polecenie i stamtąd edytuj. (Najpierw usuwam echo. :)

cabbey
źródło
Dzięki, naprawdę próbowałem tego chwilę temu. W moim przypadku byłem nieostrożny i zdmuchnąłem plik, ponieważ w poleceniu była rura, która połknęła echo. Masz rację, zgodnie z moim eksperymentem wydaje się, że wpływa to tylko na długie polecenia.
poniedziałek
Lepsze rozwiązanie niż echo, które właśnie znalazłem: dodaj „#” na początku linii zamiast echa. W ten sposób bash traktuje całą linię jak komentarz.
poniedziałek
1
Jeszcze lepiej: problem wydaje się znikać, jeśli bieżąca linia jest przerysowana. Klawisz Cl, aby wyczyścić ekran i przerysować bieżącą linię, lub utworzyć powiązanie klawisza dla niezwiązanej funkcji przerysuj-prąd-linię.
poniedziałek
Zapomniałem wspomnieć o rozwiązaniu Cl, ponieważ naprawdę nie lubię tracić bufora przewijania, ale tak, jest to tymczasowy błąd renderowania z nawigacji historii, więc wymuszenie przerysowania to naprawi. linia przerysowana-prąd brzmi jak jeszcze lepsze rozwiązanie!
cabbey,
13

Być może masz niedrukowalne sekwencje specjalne w PS1 nie ujęte w \ [i \].

Upewnij się, że umieściłeś je wszystkie w ten sposób:

\[\e[33m\]\w\[\e[31m\] $ \[\e[0m\]
Aleksandr Somow
źródło
1
Działa świetnie, jeśli dołączysz tylko sekwencje niedrukowalne w ( \[i \]potrzebujesz wielu grup tych bloków)
Andomar