Các ký tự đầu tiên của lệnh được lặp lại trong màn hình khi hoàn thành


21

Hai ký tự đầu tiên được lặp lại trong khi tôi sử dụng Tabđể hoàn thành. Trong ảnh chụp màn hình dưới đây, cdđược lặp lại.

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

Tôi đã thử rxvt-unicdoe, xterm, terminator. Tất cả các trình giả lập thiết bị đầu cuối có vấn đề này.

Zsh phiên bản 5.0.2, tệp cấu hình trên-my-zsh


Là các ký tự được lặp lại trong lệnh mà zsh thực thi, hoặc chúng chỉ được hiển thị? Số lượng ký tự có thay đổi nếu lệnh dài hơn hai ký tự không? Số có thay đổi khi thư mục hiện tại thay đổi?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Các char lặp đi lặp lại không tồn tại trong lệnh. Tôi có thể thực thi lệnh.
jilen

Câu trả lời:


32

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, PROMPThoặ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[…mthay đổ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_CTYPELANG(người đầu tiên trong số này đó là thiết lập được áp dụng). Lệnh locale | grep LC_CTYPEcho 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 redisplayhoặc clear-screen(bị ràng buộc với Ctrl+ Ltheo mặc định) sẽ sửa nó.


Tôi đoán có lẽ tôi đang thiếu phông chữ liên quan, tôi nhận thấy char đầu tiên là lạ. ->Tôi dự kiến ​​là tôi nghĩ
jilen

@jilen Ah, đây có thể là một vấn đề khác mà tôi quên đề cập: có thể lời nhắc của bạn chứa các ký tự không phải ASCII trong một mã hóa khác với thiết bị đầu cuối của bạn, với một hoặc cả hai mã hóa là đa chuỗi. Nếu bạn muốn giúp đỡ với điều đó, hãy đăng đầu ra của localeecho $PS1 | od -t x1(và điều tương tự với bất kỳ biến nào khác được sử dụng bởi $PS1).
Gilles 'SO- ngừng trở nên xấu xa'

2
Tôi quên đặt ngôn ngữ (Tôi đang sử dụng archlinux, miền địa phương không được đặt mặc định). Sau khi thiết lập miền địa phương, vấn đề này được khắc phục. Cảm ơn rất nhiều, chàng trai !!!!
jilen

Tôi ủng hộ nó bởi vì, tốt, nó khá tuyệt vời. Nhưng thoát hoàn toàn không cần phải được bao gồm trong ngoặc nếu bạn tự xử lý số đếm con trỏ. việc gọi một hàm chia nhỏ đã hoạt động với tôi trong quá khứ - hoặc các chuyển hướng vẫn tiếp tục / dev / tty mà không liên quan đến thiết bị xuất chuẩn có thể hoạt động. Các phương pháp khác đã hoạt động - sử dụng \e{7,8}để lưu / khôi phục trạng thái con trỏ.
mikeerv

Đó là cái LC_CTYPEđã sửa nó cho tôi. Tôi đã thiết lập nó C, khi tôi bỏ đặt nó, mọi thứ đều hoạt động. Cảm ơn.
jmaloney

14

Tôi đã có cùng một vấn đề và tìm thấy giải pháp của mình ở đây: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 . Đơn giản chỉ cần đặt sau đây vào của bạn ~/.zshrc.

export LC_CTYPE=en_US.UTF-8


1
Cảm ơn gợi ý của bạn! Tôi, tuy nhiên, đã phải thiết lập lại toàn bộ localetôi đang sử dụng, nhưng nó đã làm việc cho tôi. Câu trả lời này cung cấp các bước cần thiết cho Ubuntu.
tối đa

Cảm ơn bạn rất nhiều! Giúp tôi tiết kiệm rất nhiều
Moshe

1

Tôi đã có vấn đề này trong iTerm 2 trên macOS. Cuối cùng tôi đã giải quyết nó bằng cách vào Tùy chọn -> Cấu hình -> Văn bản và đánh dấu vào "Sử dụng Unicode Phiên bản 9 Độ rộng".


Wow, điều này thực sự đã làm việc. Cảm ơn!
Paul Calabro

1

Tôi đã gặp vấn đề này khi sử dụng hình ảnh docker ub Ubuntu lts ( ubuntu:latest). Tôi đã sửa nó với hướng dẫn được cung cấp trên trang tương ứng: https://hub.docker.com/_/ubfox

apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh
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.