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.

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. :)


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\]

1
Działa świetnie, jeśli dołączysz tylko sekwencje niedrukowalne w ( \[i \]potrzebujesz wielu grup tych bloków)
Andomar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.