Xóa khoảng trống vô dụng ở cuối dấu nhắc đúng của zsh ($ RPROMPT)


17

Trong zsh, luôn có một ký tự khoảng trắng ở bên phải dấu nhắc bên phải của tôi. Tôi đã thử với một .zshrc rất đơn giản như:

PROMPT="#"
RPROMPT="*"

Luôn có một khoảng trắng sau dấu * bên phải màn hình.

Dưới đây là một ảnh chụp màn hình cho thấy vấn đề (tôi đã chọn khoảng trắng trên một trong các dòng). http://i.imgur.com/cnfa2eJ.png

Cảm ơn.

Câu trả lời:


19

TL; DR

Tất cả những gì bạn cần làm là đặt cái này trong ~/.zshrc(hoặc trong cùng một tệp với chủ đề nhắc nhở của bạn):

ZLE_RPROMPT_INDENT=0

Chi tiết

Trong các phiên bản ZSH dẫn đến 5.0.2, một giá trị trong mã nguồn C của ZSH được gọi rprompt_off(đặt phần bù lề phải) được mã hóa cứng 1.

Nhưng trong bản phát hành 5.0.5, các nhà phát triển đã thêm khả năng ghi đè giá trị mặc định này bằng cách đặt ZLE_RPROMPT_INDENTbiến môi trường.

Các lý do cho điều này "thụt lề" là do một số nhà ga cũ sẽ bắt đầu di chuyển nếu ô cuối cùng của màn hình có một nhân vật trong đó.

Đối với các phiên bản ZSH trước 5.0.5

Nếu bạn đang sử dụng phiên bản ZSH cũ hơn và không thể cập nhật, bạn vẫn có thể thoát khỏi không gian đó bằng cách thực hiện cả hai cách sau:

  1. Lừa ZSH để nghĩ RPROMPT của bạn là một ký tự ngắn hơn thực tế đang sử dụng trình bao bọc chuỗi vô hình tiêu chuẩn:%{...%}
  2. Sau đó gửi một chuỗi thoát con trỏ trở lại bằng terminfo: %{terminfo[cub1]}

Kiểm tra Câu hỏi thường gặpthông báo này trong danh sách gửi thư để biết thêm thông tin.


5
Điều này dường như cũng đặt con trỏ đầu vào một ký tự ở bên trái của nơi nó thường có. Ví dụ, sử dụng các lời nhắc trong câu hỏi này, con trỏ được đặt trên dấu băm, thay vì ngay bên phải. (Đối với tôi, việc điều chỉnh bù đắp cho một giá trị nhỏ hơn không làm cho các hướng dẫn con trỏ xuất hiện ở các vị trí chính xác quan sát với zsh 5.0.8 và 5.2..)
Rob Kennedy

Làm việc cho tôi trong 5.2.
Anthony Michael Cook

5
Nó hoạt động với tôi trong 5.2, nhưng bây giờ tôi có vấn đề với PROMPT: ký tự cuối cùng trong PROMPT biến mất và bật tắt tự động hoàn thành ký tự cuối cùng với ký tự đầu tiên của đầu vào hiện tại. Ví dụ: %git<Tab>chuyển đổi thành%ggit
roboslone

Bạn không cần sử dụng các thủ thuật cho các phiên bản ZSH mới hơn.
Anthony Michael Cook

5
Sau khi đặt ZLE_RPROMPT_INDENT = 0, tôi nhận thấy các vấn đề trục trặc tương tự với lời nhắc bên trái mà một số người khác đề cập ở trên. Tuy nhiên, hầu hết mọi thứ hoạt động như mong đợi nếu tôi sử dụng -1 thay vì 0, tức là ZLE_RPROMPT_INDENT = -1. Tôi đã thấy mẹo đó tại github.com/bhilburn/powerlevel9k/issues/ ,. Hầu như, bởi vì với -1, nó không bao giờ sử dụng dòng dưới cùng của cửa sổ đầu cuối trên macOS.
Marc Liyanage

2

Tôi đã gửi một báo cáo lỗi cho những người duy trì zsh, nhưng có vẻ như hành vi này là do thiết kế. Tuy nhiên, vấn đề này làm tôi khó chịu đến mức tôi quyết định tự vá và biên dịch zsh như một cách khắc phục tạm thời. Nếu bạn đang dùng OS X và sử dụng Homebrew (bạn nên), thì bạn có thể cài đặt zsh bao gồm bản vá của tôi bằng cách chạy:

brew install https://gist.github.com/padde/7963205/raw/eaedcc557859a40db87282fc39256fccd52d0aad/zsh.rb

bạn có thể muốn thêm /usr/local/bin/zshvào /etc/shellschsh -s /usr/local/bin/zshsau đó. Cuối cùng, đây là khác biệt thô cho bất cứ ai quan tâm:

diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 17b78ce..f136178 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -1576,7 +1576,7 @@ zrefresh(void)
    else
        put_rpmpt = rprompth == 1 && rpromptbuf[0] &&
        !strchr(rpromptbuf, '\t') &&
-       (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 1;
+       (int)ZR_strlen(nbuf[0]) + rpromptw < winw;
     } else {
 /* insert >.... on first line if there is more text before start of screen */
    ZR_memset(nbuf[0], zr_sp, lpromptw);
@@ -1631,9 +1631,9 @@ zrefresh(void)
    if (put_rpmpt && !iln && !oput_rpmpt) {
        int attrchange;

-       moveto(0, winw - 1 - rpromptw);
+       moveto(0, winw - rpromptw);
        zputs(rpromptbuf, shout);
-       vcs = winw - 1;
+       vcs = winw;
    /* reset character attributes to that set by the main prompt */
        txtchange = pmpt_attr;
        /*

PWS (người duy trì zsh) vừa đăng một bản vá mở rộng , vì vậy việc thụt RPROMPT sẽ sớm có trong các nguồn ,, chính thức ''.
mpy

Cảm ơn bạn đã đăng các liên kết. Mong chờ phiên bản tiếp theo!
Patrick Oscarity

1

Tôi nghĩ rằng khoảng trắng bên phải là mã hóa cứng. Nhưng bạn có thể lừa zshvới cài đặt sau:

RPROMPT="%{*%}"

mà về nguyên tắc nói zshrằng ngôi sao không có nhân vật; từ man zshmisc:

%{...%} Bao gồm một chuỗi như một chuỗi thoát theo nghĩa đen. Chuỗi trong dấu ngoặc nhọn không được thay đổi vị trí con trỏ. (...)

Hạn chế là, bạn "chuyển" khoảng trống sang cuối PROMPT:

| PROMPT = "#" |
| RPROMPT = "% {*%}" |
| # ■ * |

Các |biểu tượng biểu thị các cạnh của thiết bị đầu cuối, ■ con trỏ.


Một ý tưởng khác là tăng thêm COLUMNS1:

COLUMNS=$((COLUMNS + 1))

Nhưng người ta phải nghĩ ra cách làm điều này chỉ để hiển thị lời nhắc chứ không phải cho các lệnh. Và điều này sẽ nuốt ký tự cuối cùng trên mỗi dòng trên một dòng lệnh nhiều dòng.


1
Cảm ơn. Tôi đã thử chơi với thủ thuật% {...%}, xử lý thời gian và trạng thái git của tôi được hiển thị ở bên phải. Tôi không bận tâm đến không gian thêm trên KHUYẾN MÃI vì tôi thường có một cái. Tuy nhiên, có một nhược điểm lớn với giải pháp này: khi tôi kích hoạt tự động hoàn thành với TAB, không gian thừa sẽ bị xóa và nó đang làm những điều kỳ lạ :)
Frozax
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.