Podpowiedź Cygwin bash powoduje zawijanie linii na tej samej linii


56

Używam zachęty Cygwin bash, a dla długich poleceń tekst będzie zawijał się w tym samym wierszu, w przeciwieństwie do przejścia do następnego wiersza, pomimo ustawienia na PS1 po prostu „$”.

Oto zrzut ekranu
zrzut ekranu


11
Jaka jest TERMzmienna środowiskowa? W przypadku konsoli Cygwin tak powinno być cygwin.
ak2

1
@ ak2 rozwiązało to problem, dziękuję. Cygwin na Mintty.
JoshuaD,

Odpowiedzi:


58

Już korzystałem z MinTTY i usunięcie nowej linii z PS1 też nie pomogło. Jedna rada na tej stronie pomogła. Wykonałem to polecenie bash:

kill -WINCH $$

W moim przypadku uruchomienie tego raz rozwiązało problem, nawet po wylogowaniu i ponownym zalogowaniu. Nie jestem pewien, czy tak jest zawsze.


1
Sądząc po -WINCH, oznacza to, że proces bash zmienia rozmiar okna terminala. To chyba powinno być zrobione po zmianie rozmiaru każdego okna terminala.
ivan_pozdeev

7
@ivan_pozdeev, właśnie znalazłem, że musisz to zrobić tylko zmienić rozmiar, gdy vim jest otwarty: vim otrzymuje sygnał i przerysowuje w nowym rozmiarze, ale nie jest przekazywany do procesu nadrzędnego i dlatego bash nadal myśli, że rozmiar screen jest tym, czym był po otwarciu vima.
akatakritos

to również zadziałało dla mnie
konqui

To zadziałało również dla mnie, dzięki @jtpereyda!
Jason R. Mick

Dzięki, to zdecydowanie był dla mnie problem - zmiana rozmiaru terminalu w vimie. Wydaje mi się, że naprawienie tego błędu powinno być dość łatwe, ale nie wiem.
Iguananaut

22

Dla mnie rozwiązaniem było dodanie następujących wierszy do .bashrc:

PS1='\[\e[32m\]\u@\h:\W> \[\e[0m\]'
TERM=cygwin
export PS1
export TERM

Należy pamiętać, że znaki niedrukowalne w wierszu musi być ujęty w \[... \].


6
Jak wspomniano w @ ak2 w komentarzu do oryginalnego pytania, eksport TERM = cygwin jest wystarczający do rozwiązania problemu.
dregad

1
w moim przypadku nie było to wystarczające. jeśli PS1 zawiera sekwencje specjalne, które nie są zawarte w \ [... \], problem z zawijaniem będzie się utrzymywał. ustawienie zmiennej env TERM może być w twoim przypadku wystarczające, ale wątpię w to.
digory doo

Dla mnie rozwiązuje to problem polegający na tym, że druga linia zastępuje pierwszą linię, jednak jeśli nie użyję terminalu o szerokości dokładnie 80, pozycja kursora i przesunięcie tekstu są nadal niepewne (przy użyciu cygwin64, mintty 2.3.7)
MM

Dodanie \ [... \] naprawiło problem.
Trismegistos

8

Miałem ten sam problem z MinTTY. Problem prawdopodobnie ma coś wspólnego z monitem podstawowym (PS1).

Rozwiązaniem było dla mnie usunięcie ostatniego znaku „nowej linii” z PS1 (tuż przed znakiem „$”):

user@host ~
$ echo $PS1
\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$

user@host ~
$ export PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\$ '

user@host ~ $

patrz http://cygwin.com/ml/cygwin/2001-07/msg00140.html w celach informacyjnych.

Aby ta zmiana była trwała, dodaj eksport PS1 = '[\ e] 0; \ w \ a] \ n [\ e [32m] \ u @ \ h [\ e [33m] \ w [\ e [0m] \ $ 'do pliku ~ / .bashrc.


1
Nie działało dla mnie ...
HDave

To działało dla mnie, ale oprócz usunięcia ostatniego nowego wiersza musiałem zrestartować terminal Cygwin.
christosc

5

Jak skomentowali dregad i ak2 , ustawienie export TERM=cygwinw moim ~/.bashrcpliku wystarczyło, aby naprawić ten problem.


5

@ jtpereyda za odpowiedź z pewnością jest na znaku. Ale z jakiegoś powodu nie mogłem odpuścić i kopałem trochę głębiej.

Rozwijając ten komentarz , jeśli zmienisz rozmiar terminalu w vimie (lub innej aplikacji pełnoekranowej, która przejmuje kontrolę nad tty od powłoki), wynikowy SIGWINCHczęsto nie jest wysyłany do powłoki, więc kiedy odzyskuje kontrolę, nie robi tego nie wiem, czy rozmiar terminala został zmieniony.

Kiedy zmieniasz rozmiar terminala, powinien on wywoływać ioctl(..., TIOCSWINSZ, ...)komendę master na pty, w którym działa vim. To z kolei prowadzi do killpg(SIGWINCH)grupy procesów w vimie.

Problem polega na tym, że vim działa we własnej grupie procesów innej niż powłoka, z której został wykonany, więc powłoka bash nie odbiera SIGWINCHi nie dostosowuje odpowiednio swoich linii / kolumn.

Jeśli chcesz mieć stałe obejście, dodaj shopt -s checkwinsizedo swojego .bashrc. To sprawia, że ​​bash sprawdza rozmiar okna ( ioctl(..., TIOCGWINSZ, ..)) po powrocie z każdego polecenia i aktualizuje jego linie / kolumny.


Co vim ma wspólnego z tym pytaniem? OP nie używa vima.
DavidPostill

1
Chciałem odnieść się do innego pytania, które moim zdaniem uczyniło połączenie bardziej oczywistym, ale w skrócie możliwą przyczyną problemu OP jest otwarcie pełnej aplikacji terminalowej, takiej jak vim, zmiana rozmiaru terminalu, a następnie zamknięcie. Jak wyjaśniłem, SIGWINCH nie jest widziany przez powłokę, więc kiedy wyjdziesz z vima, nadal myśli, że terminal ma poprzedni rozmiar, co powoduje różne problemy z zawijaniem linii.
Iguananaut


2

Coś jest zepsute w ustawieniach twojego terminalu (prawdopodobnie).
Myślę, że już próbowałbyś wyjść z tej sesji i zrestartować nową.

Chociaż nie dostajesz rozwiązania dla terminalu Cygwin, wypróbuj MinTTY (jest rzeczywiście lepszy).


1
Widzę ten problem w Cygwin na wielu komputerach, ale MinTTY wygląda lepiej i rozwiązuje problem zawijania. Dwa ptaki z jednym kamieniem!
wting

Należy pamiętać, że MinTTY jest domyślnym terminalem dla Cygwin od końca 2011 roku .
Hugh W

1

Jak skomentował akatakritos , prawdopodobnie zmieniłeś rozmiar swojego terminalu, gdy vim był otwarty.

Gdy tak się stanie, wystarczy zmienić rozmiar terminala jeszcze raz, a problem zniknie.


dzięki! chociaż nie używam cygwina, to naprawiło problem „zawijania na tej samej linii” w bashu - po prostu zmaksymalizuj okno terminala, a następnie zmaksymalizuj go ponownie, a problem zniknie :)
Nick Humphrey
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.