Dấu nhắc bash Cygwin đang gói các dòng trên cùng một dòng


56

Tôi đang sử dụng dấu nhắc bash Cygwin và đối với các lệnh dài, văn bản sẽ bao quanh trên cùng một dòng thay vì đi đến dòng tiếp theo mặc dù đặt PS1 của tôi chỉ đơn giản là '$'.

Đây là một ảnh chụp màn hình,
ảnh chụp màn hình


11
Là gì TERMbiến môi trường thiết lập để? Đối với bảng điều khiển Cygwin, nó nên được cygwin.
ak2

1
@ ak2 này đã khắc phục sự cố cho tôi, cảm ơn bạn. Cygwin trên Mintty.
JoshuaD

Câu trả lời:


58

Tôi đã sử dụng MinTTY và việc xóa dòng mới trong PS1 cũng không giúp được gì. Một lời khuyên trên trang này đã giúp. Tôi đã thực hiện lệnh bash này:

kill -WINCH $$

Trong trường hợp của tôi, việc chạy này một lần đã khắc phục sự cố, ngay cả sau khi đăng xuất và đăng nhập lại. Tôi không chắc liệu đây có phải là trường hợp không.


1
Đánh giá theo -WINCH, điều này báo hiệu quá trình bash rằng cửa sổ đầu cuối đã được thay đổi kích thước. Vì vậy, điều này nên được thực hiện sau khi thay đổi kích thước cửa sổ thiết bị đầu cuối, tôi đoán.
ivan_pozdeev

7
@ivan_pozdeev, tôi chỉ thấy bạn chỉ phải làm điều này là bạn thay đổi kích thước trong khi vim đang mở: vim nhận được tín hiệu và vẽ lại ở kích thước mới, nhưng nó không được chuyển đến quy trình cha mẹ của nó và do đó bash vẫn nghĩ kích thước của Màn hình là bất cứ điều gì khi vim mở.
akatakritos 16/1/2015

điều này cũng làm việc cho tôi
konqui

Điều này cũng làm việc cho tôi, cảm ơn @jtpereyda!
Jason R. Mick

Cảm ơn, đây chắc chắn là vấn đề đối với tôi - thay đổi kích thước thiết bị đầu cuối khi ở vim. Tôi cảm thấy nó đủ dễ để sửa lỗi này nhưng tôi không biết.
Iguananaut

22

Đối với tôi, giải pháp là thêm các dòng sau vào .bashrc:

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

Lưu ý rằng các ký tự không thể in được trong cửa sổ phải được đặt trong \[... \].


6
Như được đề cập bởi @ ak2 trong một bình luận dưới câu hỏi ban đầu, xuất TERM = cygwin là đủ để khắc phục vấn đề.
dregad

1
nó không đủ trong trường hợp của tôi nếu PS1 chứa các chuỗi thoát không được bao trong \ [... \], thì vấn đề gói sẽ tồn tại. thiết lập biến TERM env có thể là đủ trong trường hợp của bạn, nhưng tôi nghi ngờ nó.
digoo doo

Đối với tôi, điều này khắc phục vấn đề là dòng thứ hai ghi đè lên dòng đầu tiên, tuy nhiên trừ khi tôi sử dụng chính xác thiết bị đầu cuối 80 chiều rộng, vị trí con trỏ và bù văn bản vẫn rất khó khăn (sử dụng cygwin64, mintty 2.3.7)
MM

Thêm \ [... \] đã khắc phục sự cố cho tôi.
Trismegistos

8

Tôi cũng gặp vấn đề tương tự với MinTTY. Vấn đề có thể có liên quan đến dấu nhắc chính (PS1).

Giải pháp cho tôi là xóa ký tự 'dòng mới' cuối cùng khỏi PS1 (ngay trước dấu '$'):

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

xem http://cygwin.com/ml/cygwin/2001-07/msg00140.html để tham khảo.

Để thực hiện thay đổi này liên tục, hãy thêm xuất PS1 = '[\ e] 0; \ w \ a] \ n [\ e [32m] \ u @ \ h [\ e [33m] \ w [\ e [0m] \ $ 'vào tệp ~ / .bashrc của bạn.


1
Không làm việc cho tôi ...
HDave

Điều này đã làm việc cho tôi, nhưng ngoài việc loại bỏ dòng mới cuối cùng, tôi cũng phải khởi động lại thiết bị đầu cuối Cygwin.
christosc

5

Theo nhận xét của dregadak2 , cài đặt export TERM=cygwintrong ~/.bashrctệp của tôi là đủ để khắc phục sự cố này cho tôi.


5

Câu trả lời của @ jtpereyda chắc chắn là đúng. Nhưng vì lý do nào đó tôi không thể để điều này xảy ra, và đào sâu hơn một chút.

Mở rộng trên nhận xét này , nếu bạn thay đổi kích thước thiết bị đầu cuối trong khi ở vim (hoặc bất kỳ ứng dụng toàn màn hình nào khác kiểm soát tty khỏi vỏ), kết quả SIGWINCHthường không được gửi đến trình bao, vì vậy khi nó được điều khiển trở lại 't biết rằng thiết bị đầu cuối đã được thay đổi kích thước.

Khi bạn thay đổi kích thước thiết bị đầu cuối của mình, nó sẽ gọi một ioctl(..., TIOCSWINSZ, ...)pty chính mà vim đang chạy. Điều này lần lượt dẫn đến một killpg(SIGWINCH)nhóm quy trình của vim.

Vấn đề là vim chạy trong nhóm quy trình riêng của nó khác với shell mà nó được thực thi, vì vậy shell bash không nhận được SIGWINCHvà không điều chỉnh các dòng / cột của nó một cách thích hợp.

Nếu bạn muốn một cách giải quyết lâu dài, hãy thêm shopt -s checkwinsizevào của bạn .bashrc. Điều đó làm cho bash kiểm tra kích thước cửa sổ ( ioctl(..., TIOCGWINSZ, ..)) sau khi trở về từ mỗi lệnh và cập nhật các dòng / cột của nó.


Vim đi làm gì với câu hỏi? OP không sử dụng vim.
DavidPostill

1
Tôi có ý định tham khảo một câu hỏi khác mà tôi nghĩ làm cho kết nối rõ ràng hơn, nhưng tóm lại, một nguyên nhân có thể của vấn đề OP là mở một ứng dụng thiết bị đầu cuối đầy đủ như vim, thay đổi kích thước thiết bị đầu cuối, và sau đó thoát. Như tôi đã giải thích, SIGWINCH không được nhìn thấy bởi shell nên khi bạn thoát vim, nó vẫn nghĩ thiết bị đầu cuối có kích thước trước đó, dẫn đến các vấn đề gói dòng khác nhau.
Iguananaut


2

Một cái gì đó bị hỏng trong cài đặt thiết bị đầu cuối của bạn (có thể).
Tôi đoán bạn đã thử thoát phiên đó và khởi động lại phiên mới.

Mặc dù bạn không nhận được giải pháp cho thiết bị đầu cuối Cygwin, hãy dùng thử MinTTY (nó thực sự tốt hơn).


1
Tôi thấy vấn đề này ở Cygwin trên nhiều máy, nhưng MinTTY có vẻ tốt hơn và giải quyết vấn đề gói. Hai con chim với một đá!
wting

Lưu ý rằng MinTTY là thiết bị đầu cuối mặc định cho Cygwin kể từ cuối năm 2011 .
Hugh W

1

Theo nhận xét của akatakritos , có lẽ bạn đã thay đổi kích thước thiết bị đầu cuối của mình trong khi vim đã mở.

Khi điều này xảy ra, chỉ cần thay đổi kích thước thiết bị đầu cuối một lần nữa và vấn đề sẽ biến mất.


cám ơn! mặc dù tôi không sử dụng cygwin, nhưng điều này đã khắc phục sự cố "gói trên cùng một dòng" đối với tôi trong bash - chỉ cần tối đa hóa cửa sổ đầu cuối, sau đó tối đa hóa lại và vấn đề đã biến mất :)
Nick Humphrey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.