Làm cách nào tôi có thể đặt một dòng mới trong lời nhắc zsh của mình mà không gây ra sự cố vẽ lại thiết bị đầu cuối?


12

Tôi đang cố gắng khắc phục sự cố nhỏ (nhưng gây phiền nhiễu) với dấu nhắc zsh của mình. Vấn đề tôi gặp phải là khi tôi sử dụng thiết bị đầu cuối trong môi trường GUI OS (ví dụ: Terminal.app hoặc iTerm 2 trên OS X 10.7.2) và thay đổi kích thước cửa sổ thiết bị đầu cuối, thiết bị đầu cuối được vẽ lại với lời nhắc thêm .

Tôi đã tái tạo vấn đề trên một .zshrc sạch có chứa các phần sau:

export PROMPT=">
"

Để rõ ràng, đó là một tập tin hai dòng. Có một dòng mới theo nghĩa đen trong chuỗi, mà tôi đã đọc ở một số nơi ( cũ được thừa nhận ) là cách để đi. Điều này hoạt động cho đến khi tôi thay đổi kích thước cửa sổ terminal, tại thời điểm đó tôi kết thúc bằng các chuỗi nhắc trùng lặp. Ví dụ: nếu tôi mở một cửa sổ mới, tôi thấy ( *đang được sử dụng một trình giữ chỗ cho con trỏ của tôi):

Last login: Wed Jan 25 19:05:06 on ttys000
>
*

Sau đó, khi tôi thay đổi kích thước cửa sổ, làm cho nó ngắn hơn, tôi kết thúc bằng:

Last login: Wed Jan 25 19:05:06 on ttys000
>
>
>
>
*

Số lượng bản in nhắc thêm dường như tỷ lệ thuận với số lượng tôi thay đổi kích thước cửa sổ - thường là theo chiều dọc. Nếu tôi xóa dòng mới khỏi chuỗi nhắc, vấn đề sẽ biến mất.

Tôi đã thử nhiều thứ, như $(print ">\n"), hoặc cố gắng đưa dòng mới vào %{%}. Tôi giả định rằng điều này có liên quan đến thực tế là dòng mới gây nhầm lẫn bất cứ điều gì đang vẽ wrt chuỗi thời gian thực sự là bao lâu, hoặc một cái gì đó. Là vấn đề này có thể sửa chữa hoặc tôi chỉ phải sống với nó?

Câu trả lời:


13

Vấn đề này là do cách ZSH in lại quảng cáo về việc thay đổi kích thước các sự kiện và cũng làm tôi khó chịu trước đây. Giải pháp là tạo $PROMPTmột dòng đơn và in dòng đầu tiên của dấu nhắc bằng cách sử dụng tiền tố.

Vì vậy, trong ví dụ của bạn đơn giản là:

precmd() { print ">" }
export PROMPT=""

hoặc cho một ví dụ phức tạp hơn với mở rộng nhanh chóng trong câu lệnh in sử dụng các -rPtham số:

precmd() { print -rP "%~" }
export PROMPT="%# "

Nếu bạn có nhiều hơn một premd đã đăng ký, bạn cần sử dụng add-zsh-hook precmd(xem man zshcontrib).


1
Đối với những người mới như tôi, bạn có thể thấy -rP có nghĩa là gì ở đây: cs.elte.hu/zsh-manual/zsh_17.html . Có vẻ như đó printlà một lệnh dành riêng cho ZSH và "bản in linux" của Google không mang lại cho bạn kết quả rất tốt.
MikeWyatt

printlà một phần của zsh. Bạn có thể thấy sự giúp đỡ cho nó trong man zshbuiltins. Bash có tương đương riêng, nhưng tôi không chắc chúng tương thích.
Jim Stewart

10

Còn những thứ như thế này thì sao:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"

Tôi thích giải pháp này tốt hơn câu trả lời được chấp nhận. nó dễ mang theo hơn và cho phép tôi duy trì cùng một kịch bản giữa môi trường zsh và bash của tôi
verboze
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.