Приглашение Cygwin bash переносит строки на одной строке
56
Я использую приглашение Cygwin bash, и для длинных команд текст будет перенесен на одну и ту же строку, а не на переход к следующей строке, несмотря на то, что для моей PS1 задано просто '$'.
Судя по -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
Обратите внимание , что непечатаемые символы в приглашении должны быть заключены в
\[... \].
Как упомянуто @ ak2 в комментарии к исходному вопросу, для исправления проблемы достаточно экспортировать TERM = cygwin.
октября
1
в моем случае этого было недостаточно. если PS1 содержит escape-последовательности, которые не заключены в \ [... \], проблема переноса будет сохраняться. установка переменной TERM env может быть достаточной в вашем случае, но я сомневаюсь в этом.
Дигори Ду
Для меня это устраняет проблему, заключающуюся в том, что вторая строка перезаписывает первую строку, однако, если я не использую терминал шириной 80, позиция курсора и смещение текста все еще будут неправильными (используя cygwin64, mintty 2.3.7)
MM
Добавление \ [... \] исправлено для меня.
Трисмегистос
8
У меня была такая же проблема с MinTTY. Проблема, вероятно, связана с основным приглашением (PS1).
Решением для меня было удаление последнего символа «новой строки» из PS1 (прямо перед знаком «$»):
Чтобы сделать это изменение постоянным, добавьте экспорт PS1 = '[\ e] 0; \ w \ a] \ n [\ e [32m] \ u @ \ h [\ e [33m] \ w [\ e [0m] \ $ 'в ваш файл ~ / .bashrc.
@ 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 он все еще думает, что терминал имеет предыдущий размер, что приводит к различным проблемам переноса строк.
Спасибо! хотя я не использую cygwin, это решило проблему «обтекания одной и той же строки» для меня в bash - просто разверните окно терминала, затем снова разверните его, и проблема исчезла :)
TERM
переменная среды? Для консоли Cygwin так и должно бытьcygwin
.Ответы:
Я уже использовал MinTTY, и удаление новой строки в PS1 тоже не помогло. Один совет на этой странице помог. Я выполнил эту команду bash:
В моем случае, запуск этого когда-то решал проблему, даже после выхода из системы и повторного входа. Я не уверен, что это всегда так.
источник
-WINCH
этому, это сигнализирует процессу bash, что размер окна терминала был изменен. Так что это должно быть сделано после каждого изменения размера окна терминала, я думаю.Для меня решение было добавить следующие строки в .bashrc:
Обратите внимание , что непечатаемые символы в приглашении должны быть заключены в
\[
...\]
.источник
У меня была такая же проблема с MinTTY. Проблема, вероятно, связана с основным приглашением (PS1).
Решением для меня было удаление последнего символа «новой строки» из PS1 (прямо перед знаком «$»):
см. 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.
источник
Как прокомментировали dregad и ak2 , настройки
export TERM=cygwin
в моем~/.bashrc
файле было достаточно, чтобы решить эту проблему для меня.источник
@ jtpereyda в ответ , конечно , на марке. Но по какой-то причине я не мог этого допустить и копнул немного глубже.
В продолжение этого комментария , если вы изменяете размер терминала в vim (или в любом другом полноэкранном приложении, которое берет контроль над tty вне оболочки), результат
SIGWINCH
часто не отправляется в оболочку, поэтому, когда он возвращает контроль, он не не знаю, что размер терминала был изменен.Когда вы изменяете размер своего терминала, он должен вызывать
ioctl(..., TIOCSWINSZ, ...)
на главном pty, в котором работает vim. Это, в свою очередь, приводитkillpg(SIGWINCH)
к группе процессов on vim.Проблема в том, что vim работает в своей собственной группе процессов, отличной от оболочки, из которой он был выполнен, поэтому оболочка bash не получает
SIGWINCH
и не корректирует свои строки / столбцы соответствующим образом.Если вы хотите постоянный обходной путь, добавьте
shopt -s checkwinsize
к своему.bashrc
. Это заставляет bash проверять размер окна (ioctl(..., TIOCGWINSZ, ..)
) после возврата из каждой команды и обновлять ее строки / столбцы.источник
Что-то сломано в настройках вашего терминала (возможно).
Я полагаю, вы бы уже попытались выйти из этой сессии и перезапустить новую.
Хотя у вас нет решения для терминала Cygwin, попробуйте MinTTY (на самом деле это лучше).
источник
Как прокомментировал akatakritos , вы, вероятно, изменили размер своего терминала, когда vim был открыт.
Когда это произойдет, просто измените размер терминала еще раз, и проблема исчезнет.
источник