Tại sao ZSH kết thúc một dòng có ký hiệu phần trăm được tô sáng?


46

Tôi đã nhận thấy điều này nhân dịp với một loạt các ứng dụng. Tôi thường nghĩ rằng đó là vì đầu ra đã bị hủy sớm (ví dụ: ctrl + c) hoặc một cái gì đó tương tự, và zsh đang điền vào một ký tự dòng mới. Nhưng bây giờ sự tò mò đã thu hút tôi nhất, vì dường như nó không làm điều này trong bash.

zsh

zsh

bash

nhập mô tả hình ảnh ở đây

Các Sequencechương trình là một cái gì đó tôi kéo ra từ một cuốn sách khi đọc trên chứng chỉ Java và chỉ muốn xem nếu nó sẽ biên dịch và chạy. Tôi đã nhận thấy rằng nó không sử dụng println()phương thức từ System.outgói / lớp. Thay vào đó, nó sử dụng đơn giản cũ print().

Là việc thiếu một nhân vật dòng mới là lý do tôi có được biểu tượng này?

Câu trả lời:


57

Vâng, điều này xảy ra bởi vì nó là một "dòng một phần". Và theo mặc định, zsh đi đến dòng tiếp theo để tránh che nó bằng dấu nhắc .

Khi một dòng một phần được bảo toàn, theo mặc định, bạn sẽ thấy một ký tự nghịch đảo + in đậm ở cuối dòng một phần: "%" cho người dùng bình thường hoặc "#" cho root. Nếu được đặt, tham số shell PROMPT_EOL_MARK có thể được sử dụng để tùy chỉnh cách hiển thị kết thúc của một phần dòng.


3
Để kiểm tra, hãy làm điều này: print -n "this is a test"sau đóprint "this is a test"
SergioAraujo

5
Bây giờ tôi đã đưa PROMPT_EOL_MARK=''vào .zshrc của mình để ẩn sự khác biệt giữa dòng mới theo dõi hoặc không xuất ra lệnh.
geekQ

14

Đó là một tính năng cụ thể của zsh(và bây giờ fishcũng vậy) để cho phép bạn thấy rõ các dòng bị hủy trong đầu ra của lệnh.

Trong các shell truyền thống, nếu một lệnh xuất ra một số dữ liệu sau ký tự dòng mới cuối cùng, hay nói cách khác, nếu nó để con trỏ đầu cuối không ở đầu dòng, thì dấu nhắc tiếp theo của shell sẽ được nối với dòng bị hủy cuối cùng đó như trong:

bash-4.4$ printf XXX
XXXbash-4.4$

Điều đó mang lại lời nhắc, và thật dễ dàng để bỏ lỡ điều XXXđó đặc biệt là nếu bạn có một lời nhắc nhanh như thế. Nó cũng ảnh hưởng đến định vị con trỏ gây ra sự cố hiển thị khi bạn di chuyển con trỏ xung quanh.

zshhoạt động xung quanh đó, bằng cách hiển thị rằng đầu ra có một dòng bị hủy với một %ký tự trong video in đậm và ngược lại và đưa ra lời nhắc tiếp theo ở đầu dòng tiếp theo:

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

Nó thực hiện điều đó bằng cách xuất video ngược %ở cuối mỗi lệnh (trước mỗi dấu nhắc), nhưng theo sau là 79 khoảng trắng (giả sử thiết bị đầu cuối rộng 80 ký tự), ký tự CR (một ký tự khiến con trỏ quay trở lại đầu tiên cột) và chuỗi để xóa đến cuối dòng (và sau đó là dấu nhắc).

Theo cách đó, nếu có một dòng bị hủy, vì con trỏ không ở vị trí đầu tiên, 80 ký tự đó sẽ làm cho con trỏ di chuyển đến dòng tiếp theo (và nó %sẽ ở lại). Nếu không, thì %79 khoảng trống đó sẽ nằm trên một dòng sẽ bị xóa sau đó.

Bây giờ, điều đó chỉ hoạt động nếu thiết bị đầu cuối thực hiện ngắt dòng (ví dụ, điều đó sẽ không hoạt động đúng sau đó tput rmam). Nếu bạn có một thiết bị đầu cuối chậm (như trên dòng nối tiếp 9600 baud), bạn thực sự có thể thấy những thiết %bị đang được hiển thị và sau đó bị xóa sau mỗi lệnh, vì vậy hãy zshcho phép bạn tắt tính năng đó:

unsetopt prompt_cr prompt_sp

Bằng cách đó, zshhành xử giống như vỏ ốc truyền thống.

Bạn cũng có thể thay đổi nhãn hiệu đó với $PROMPT_EOL_MARKbiến.

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.