Приглашение Cygwin bash переносит строки на одной строке


56

Я использую приглашение Cygwin bash, и для длинных команд текст будет перенесен на одну и ту же строку, а не на переход к следующей строке, несмотря на то, что для моей PS1 задано просто '$'.

Вот скриншот,
Скриншот


11
На что установлена TERMпеременная среды? Для консоли Cygwin так и должно быть cygwin.
ak2

1
@ ak2 это решило проблему для меня, спасибо. Cygwin на Mintty.
JoshuaD

Ответы:


58

Я уже использовал MinTTY, и удаление новой строки в PS1 тоже не помогло. Один совет на этой странице помог. Я выполнил эту команду bash:

kill -WINCH $$

В моем случае, запуск этого когда-то решал проблему, даже после выхода из системы и повторного входа. Я не уверен, что это всегда так.


1
Судя по -WINCHэтому, это сигнализирует процессу bash, что размер окна терминала был изменен. Так что это должно быть сделано после каждого изменения размера окна терминала, я думаю.
ivan_pozdeev

7
@ivan_pozdeev, я только что обнаружил, что вам нужно только сделать это, вы изменяете размер при открытом vim: vim получает сигнал и перерисовывает новый размер, но он не передается в родительский процесс, и, таким образом, bash по-прежнему считает размер Экран это то, что было, когда Vim открылся.
Акатакритос

у меня это тоже сработало
конки

Это сработало и для меня, спасибо @jtpereyda!
Джейсон Р. Мик

Спасибо, это была определенно проблема для меня - изменение размера терминала в vim. Я чувствую, что исправить эту ошибку должно быть достаточно легко, но я не знаю.
Iguananaut

22

Для меня решение было добавить следующие строки в .bashrc:

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

Обратите внимание , что непечатаемые символы в приглашении должны быть заключены в \[... \].


6
Как упомянуто @ ak2 в комментарии к исходному вопросу, для исправления проблемы достаточно экспортировать TERM = cygwin.
октября

1
в моем случае этого было недостаточно. если PS1 содержит escape-последовательности, которые не заключены в \ [... \], проблема переноса будет сохраняться. установка переменной TERM env может быть достаточной в вашем случае, но я сомневаюсь в этом.
Дигори Ду

Для меня это устраняет проблему, заключающуюся в том, что вторая строка перезаписывает первую строку, однако, если я не использую терминал шириной 80, позиция курсора и смещение текста все еще будут неправильными (используя cygwin64, mintty 2.3.7)
MM

Добавление \ [... \] исправлено для меня.
Трисмегистос

8

У меня была такая же проблема с MinTTY. Проблема, вероятно, связана с основным приглашением (PS1).

Решением для меня было удаление последнего символа «новой строки» из PS1 (прямо перед знаком «$»):

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 ~ $

см. http://cygwin.com/ml/cygwin/2001-07/msg00140.html для справки.

Чтобы сделать это изменение постоянным, добавьте экспорт PS1 = '[\ e] 0; \ w \ a] \ n [\ e [32m] \ u @ \ h [\ e [33m] \ w [\ e [0m] \ $ 'в ваш файл ~ / .bashrc.


1
У меня не сработало ...
HDave

Это сработало для меня, но в дополнение к удалению последней новой строки мне пришлось также перезапустить терминал Cygwin.
Христос

5

Как прокомментировали dregad и ak2 , настройки export TERM=cygwinв моем ~/.bashrcфайле было достаточно, чтобы решить эту проблему для меня.


5

@ jtpereyda в ответ , конечно , на марке. Но по какой-то причине я не мог этого допустить и копнул немного глубже.

В продолжение этого комментария , если вы изменяете размер терминала в vim (или в любом другом полноэкранном приложении, которое берет контроль над tty вне оболочки), результат SIGWINCHчасто не отправляется в оболочку, поэтому, когда он возвращает контроль, он не не знаю, что размер терминала был изменен.

Когда вы изменяете размер своего терминала, он должен вызывать ioctl(..., TIOCSWINSZ, ...)на главном pty, в котором работает vim. Это, в свою очередь, приводит killpg(SIGWINCH)к группе процессов on vim.

Проблема в том, что vim работает в своей собственной группе процессов, отличной от оболочки, из которой он был выполнен, поэтому оболочка bash не получает SIGWINCHи не корректирует свои строки / столбцы соответствующим образом.

Если вы хотите постоянный обходной путь, добавьте shopt -s checkwinsizeк своему .bashrc. Это заставляет bash проверять размер окна ( ioctl(..., TIOCGWINSZ, ..)) после возврата из каждой команды и обновлять ее строки / столбцы.


Что Vim идти делать с вопросом? OP не использует vim.
DavidPostill

1
Я имел в виду ссылку на другой вопрос, который, как мне кажется, сделал соединение более очевидным, но вкратце возможной причиной проблемы OP является открытие полнофункционального терминального приложения, такого как vim, изменение размера терминала, а затем выход. Как я объяснил, оболочка не видит SIGWINCH, поэтому при выходе из vim он все еще думает, что терминал имеет предыдущий размер, что приводит к различным проблемам переноса строк.
Iguananaut


2

Что-то сломано в настройках вашего терминала (возможно).
Я полагаю, вы бы уже попытались выйти из этой сессии и перезапустить новую.

Хотя у вас нет решения для терминала Cygwin, попробуйте MinTTY (на самом деле это лучше).


1
Я вижу эту проблему в Cygwin на нескольких машинах, но MinTTY выглядит лучше и решает проблему обертывания. Две птицы с одним камнем!
wting

Обратите внимание, что MinTTY является терминалом по умолчанию для Cygwin с конца 2011 года .
Хью

1

Как прокомментировал akatakritos , вы, вероятно, изменили размер своего терминала, когда vim был открыт.

Когда это произойдет, просто измените размер терминала еще раз, и проблема исчезнет.


Спасибо! хотя я не использую cygwin, это решило проблему «обтекания одной и той же строки» для меня в bash - просто разверните окно терминала, затем снова разверните его, и проблема исчезла :)
Ник Хамфри,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.