Підказка Cygwin bash - це обгортання ліній на одній лінії


56

Я використовую підказку Cygwin bash, і для довгих команд текст буде загортатися на тому ж рядку, на відміну від переходу до наступного рядка, незважаючи на те, що PS1 просто встановив значення "$".

Ось скріншот,
скріншот


11
На що TERMвстановлена ​​змінна середовище? Для консолі Cygwin це має бути cygwin.
ak2

1
@ ak2 це вирішило проблему для мене, дякую. Сигвін на Монетному дворі.
ДжошуаD

Відповіді:


58

Я вже використовував MinTTY, і видалення нового рядка в PS1 теж не допомогло. Порада на цій сторінці допомогла. Я виконав цю команду bash:

kill -WINCH $$

У моєму випадку після запуску цього рішення виправлена ​​проблема навіть після виходу з системи та входу назад. Я не впевнений, чи завжди це так.


1
Судячи з -WINCHцього, це сигналізує про баш-процес, що вікно терміналу було змінено. Отже, це потрібно робити після кожного розміру вікна терміналу, я думаю.
ivan_pozdeev

7
@ivan_pozdeev, я просто виявив, що вам потрібно зробити це лише ви змінити розмір, поки vim відкритий: vim отримує сигнал і перемальовується на новий розмір, але він не передається до його батьківського процесу, і, таким чином, bash все ще вважає розмір екран - це все, що було, коли vim відкрився.
акатакрітос

це теж працювало для мене
konqui

Це працювало і для мене, дякую @jtpereyda!
Джейсон Р. Мік

Дякую, це, безумовно, було проблемою для мене - зміни розміру терміналу в режимі vim. Я відчуваю, що це має бути досить легко виправити цю помилку, але я не знаю.
Ігуананавт

22

Для мене рішенням було додати наступні рядки до .bashrc:

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

Зверніть увагу , що недруковані символи в запрошенні повинні бути укладені в \[... \].


6
Як зазначає @ ak2 у коментарі під оригінальним запитанням, експорт TERM = cygwin є достатнім, щоб вирішити проблему.
dregad

1
у моєму випадку це було недостатньо якщо PS1 містить послідовності евакуації, які не укладені в \ [... \], проблема з обгортанням зберігатиметься. встановлення змінної TERM env у вашому випадку може бути достатнім, але я сумніваюся.
digory doo

Для мене це виправляє проблему, що другий рядок замінює перший рядок, однак, якщо я не використовую термінал точно 80 ширини, положення курсору та зміщення тексту все ще химерні (використовуючи cygwin64, монетний двір 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.
christosc

5

Як коментують dregad та ak2 , налаштування export TERM=cygwinв моєму ~/.bashrcфайлі було достатньо, щоб вирішити цю проблему для мене.


5

@ jtpereyda відповідь , безумовно, значить. Але я чомусь не міг цього відпустити, і копав трохи глибше.

Розширюючись на цей коментар , якщо ви змінюєте розмір терміналу під час in vim (або будь-яке інше повне екранне додаток, яке приймає контроль над tty від оболонки), отриманий результат SIGWINCHчасто не надсилається до оболонки, тому коли він повертається назад, він не робить Я не знаю, що термінал був змінений.

Коли ви змінюєте розмір свого терміналу, він повинен викликати ioctl(..., TIOCSWINSZ, ...)головний pty, у якому запущено vim. Це в свою чергу призводить killpg(SIGWINCH)до групи процесів v vim.

Проблема полягає в тому, що vim працює у власній групі процесів, відмінній від оболонки, з якої він був виконаний, тому оболонка bash не отримує SIGWINCHсвої лінійки / стовпці належним чином.

Якщо ви хочете постійного вирішення, додайте shopt -s checkwinsizeдо свого .bashrc. Це змушує bash перевірити розмір вікна ( ioctl(..., TIOCGWINSZ, ..)) після повернення з кожної команди та оновити його рядки / стовпці.


Що робити з питанням vim? OP не використовує vim.
DavidPostill

1
Я мав на увазі інше питання, яке, на мою думку, зробило з'єднання більш очевидним, але коротше кажучи, можливою причиною проблеми ОП є відкриття повної програми терміналу, наприклад, vim, зміна розміру терміналу, а потім вихід. Як я пояснив, SIGWINCH не бачиться оболонкою, тому при виході з vim він все ще вважає, що термінал має попередній розмір, внаслідок чого виникають різні проблеми з обгортанням рядків.
Ігуананавт


2

Щось порушено у налаштуваннях вашого терміналу (ймовірно).
Я думаю, ви б вже намагалися вийти з цього сеансу та перезапустити новий.

Поки ви не знайдете рішення для терміналу Cygwin, спробуйте MinTTY (насправді краще).


1
Я бачу цю проблему в Cygwin на декількох машинах, але MinTTY виглядає краще і вирішує проблему обгортання. Дві птахи з одним каменем!
Wting

Зауважте, що MinTTY є терміналом за замовчуванням для Cygwin з кінця 2011 року .
Х'ю Ш

1

Як коментує акатакріто , ви, ймовірно, змінили розмір терміналу, поки vim був відкритий.

Коли це станеться, просто змініть розмір терміналу ще раз і проблема усунеться.


Дякую! хоча я не використовую cygwin, це вирішило проблему "обгортання на тій самій лінії" для мене в баші - просто не максимізуйте вікно терміналу, потім знову максимізуйте його і проблема пішла :)
Нік Хамфрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.