Nếu các ký tự trên dòng lệnh của bạn đôi khi được hiển thị ở phần bù, điều này thường là do zsh đã tính sai độ rộng cho dấu nhắc. Các triệu chứng là màn hình hiển thị trông ổn miễn là bạn thêm ký tự hoặc di chuyển từng ký tự nhưng bị cắt xén (với một số ký tự xuất hiện đúng hơn mức cần thiết) khi bạn sử dụng các lệnh khác di chuyển con trỏ ( Home, hoàn thành, v.v. ) hoặc khi lệnh chồng lên một dòng thứ hai.
Zsh cần biết chiều rộng của dấu nhắc để biết vị trí các ký tự của lệnh được đặt. Nó giả định rằng mỗi nhân vật chiếm một vị trí trừ khi được nói khác đi.
Một khả năng là lời nhắc của bạn chứa các chuỗi thoát không được phân định chính xác. Các chuỗi thoát thay đổi màu sắc hoặc các khía cạnh định dạng khác của văn bản hoặc thay đổi tiêu đề cửa sổ hoặc các hiệu ứng khác, có chiều rộng bằng không. Chúng cần được bao gồm trong một cấu trúc niềng răng phần trăm%{…%}
. Tổng quát hơn, một chuỗi thoát như %42{…%}
nói với zsh giả định rằng những gì bên trong niềng răng có chiều rộng 42 ký tự.
Vì vậy, hãy kiểm tra cài đặt nhắc nhở của bạn ( PS1
, PROMPT
hoặc các biến mà chúng tham chiếu) và đảm bảo rằng tất cả các chuỗi thoát (chẳng hạn như \e[…m
thay đổi thuộc tính văn bản - lưu ý rằng nó có thể xuất hiện thông qua một số biến như $fg[red]
) ở bên trong %{…%}
. Vì bạn đang sử dụng oh-my-zsh, hãy kiểm tra cả cài đặt của riêng bạn và các định nghĩa bạn đang sử dụng từ oh-my-zsh.
Vấn đề tương tự phát sinh trong bash. Có trình tự chiều rộng bằng không trong một dấu nhắc cần phải được đính kèm \[…\]
.
Một khả năng khác là lời nhắc của bạn chứa các ký tự không phải ASCII và zsh (hoặc bất kỳ ứng dụng nào khác) và thiết bị đầu cuối của bạn có một ý tưởng khác về độ rộng của chúng. Điều này có thể xảy ra nếu có sự không phù hợp giữa mã hóa của thiết bị đầu cuối của bạn và mã hóa được khai báo trong shell và hai mã hóa dẫn đến độ rộng khác nhau cho các chuỗi byte nhất định. Thông thường, bạn có thể gặp phải vấn đề này khi sử dụng thiết bị đầu cuối không phải là Unicode nhưng khai báo ngôn ngữ Unicode hoặc ngược lại.
Các ứng dụng dựa trên các biến môi trường để biết miền địa phương; các thiết lập liên quan là LC_CTYPE
, được xác định từ các biến môi trường LANGUAGE
, LC_ALL
, LC_CTYPE
và LANG
(người đầu tiên trong số này đó là thiết lập được áp dụng). Lệnh locale | grep LC_CTYPE
cho bạn biết cài đặt hiện tại của bạn. Thông thường cách tốt nhất để tránh các vấn đề cục bộ là để trình giả lập thiết bị đầu cuối thiết lập LC_CTYPE
, vì nó biết mã hóa mà nó mong đợi; nhưng nếu điều đó không hiệu quả với bạn, hãy đảm bảo đặt LC_CTYPE
.
Các triệu chứng tương tự có thể xảy ra khi lệnh trước hiển thị một số đầu ra không kết thúc trong một dòng mới, để lời nhắc được hiển thị ở giữa dòng nhưng trình bao không nhận ra điều đó. Trong trường hợp này điều đó sẽ chỉ xảy ra sau khi chạy một lệnh như vậy, không kiên trì.
Nếu một dòng không được hiển thị đúng, lệnh redisplay
hoặc clear-screen
(bị ràng buộc với Ctrl+ Ltheo mặc định) sẽ sửa nó.