การลบช่องว่างที่ไร้ประโยชน์เมื่อสิ้นสุดพรอมต์ขวาของ zsh ($ RPROMPT)


18

ใน zsh มีอักขระเว้นวรรคอยู่ทางด้านขวาของพรอมต์ขวาของฉัน ฉันพยายามด้วย. zshrc ง่าย ๆ เช่น:

PROMPT="#"
RPROMPT="*"

มีช่องว่างหลังจาก * ทางด้านขวาของหน้าจอเสมอ

นี่คือภาพหน้าจอที่แสดงปัญหา (ฉันเลือกพื้นที่บนหนึ่งบรรทัด) http://i.imgur.com/cnfa2eJ.png

ขอบคุณ

คำตอบ:


20

TL; DR

สิ่งที่คุณต้องทำคือใส่สิ่งนี้ลงใน~/.zshrc(หรือในไฟล์เดียวกับธีมแจ้งของคุณ):

ZLE_RPROMPT_INDENT=0

รายละเอียด

ในเวอร์ชันของ ZSH ที่มีค่าสูงสุด5.0.2ค่าในซอร์สโค้ด C ของ ZSH ที่เรียกว่าrprompt_off(ซึ่งตั้งค่าออฟเซ็ตระยะขอบขวา) นั้นมีการกำหนดรหัสแบบยากไว้1คือการกำหนดค่าตายตัวไป

แต่ในรุ่น5.0.5นักพัฒนาเพิ่มความสามารถในการแทนที่ค่าเริ่มต้นนี้โดยการตั้งค่าZLE_RPROMPT_INDENTตัวแปรสภาพแวดล้อม

เหตุผลสำหรับเรื่องนี้ "เยื้อง" เป็นเพราะบางขั้วเก่าจะเริ่มเลื่อนถ้าเซลล์สุดท้ายของจอแสดงผลมีตัวละครที่อยู่ในนั้น

สำหรับเวอร์ชันของ ZSH ก่อน 5.0.5

หากคุณใช้ ZSH เวอร์ชันเก่ากว่าและไม่สามารถอัปเดตได้คุณยังสามารถกำจัดพื้นที่นั้นได้ด้วยการทำทั้งสองอย่างต่อไปนี้:

  1. เคล็ดลับ ZSH ให้คิดว่า RPROMPT ของคุณเป็นตัวละครที่สั้นกว่าที่เป็นจริงโดยใช้ตัวคลุมลำดับที่มองไม่เห็น:%{...%}
  2. จากนั้นส่งลำดับของเคอร์เซอร์ย้อนกลับโดยใช้ terminfo %{terminfo[cub1]}

ตรวจสอบคำถามที่พบบ่อยและข้อความนี้ในรายชื่อผู้รับจดหมายสำหรับข้อมูลเพิ่มเติม


5
สิ่งนี้ดูเหมือนว่าจะวางเคอร์เซอร์อินพุตหนึ่งอักขระทางด้านซ้ายของที่ซึ่งปกติจะเป็น การใช้ระบบแจ้งในคำถามนี้เช่นเคอร์เซอร์วางอยู่บนเครื่องหมายมากกว่าทันทีไปทางขวาของมัน (สำหรับฉันการตั้งค่าออฟเซ็ตเป็นค่าน้อยกว่าศูนย์จะทำให้พรอมต์และเคอร์เซอร์ปรากฏขึ้นในตำแหน่งที่ถูกต้องสังเกตด้วย zsh 5.0.8 และ 5.2)
Rob Kennedy

ทำงานได้ดีสำหรับฉันใน 5.2
Anthony Michael Cook

5
มันทำงานได้ดีสำหรับฉันใน 5.2 แต่ตอนนี้ฉันมีปัญหากับ PROMPT: อักขระตัวสุดท้ายใน PROMPT หายไปและสลับการเติมข้อความอัตโนมัติเติมอักขระตัวสุดท้ายที่มีอักขระตัวแรกของอินพุตปัจจุบัน ตัวอย่างเช่น%git<Tab>เปลี่ยนเป็น%ggit
roboslone

คุณไม่จำเป็นต้องใช้ลูกเล่นสำหรับ ZSH เวอร์ชันใหม่
Anthony Michael Cook

5
หลังจากตั้งค่า ZLE_RPROMPT_INDENT = 0 ฉันสังเกตเห็นความผิดพลาดของการวาดรูปแบบเดียวกันกับพรอมต์ด้านซ้ายที่คนอื่น ๆ พูดถึงข้างต้น อย่างไรก็ตามเกือบทุกอย่างทำงานได้อย่างที่คาดไว้ถ้าฉันใช้ -1 แทนที่จะเป็น 0 นั่นคือ ZLE_RPROMPT_INDENT = -1 ผมเห็นว่าในปลายgithub.com/bhilburn/powerlevel9k/issues/... เกือบแล้วด้วย -1 จะไม่ใช้บรรทัดล่างสุดของหน้าต่างเทอร์มินัลใน macOS
Marc Liyanage

2

ฉันได้ส่งรายงานข้อผิดพลาดไปยังผู้ดูแล zsh แต่ดูเหมือนว่าพฤติกรรมนี้เกิดจากการออกแบบ อย่างไรก็ตามปัญหานี้ทำให้ฉันรำคาญมากจนฉันตัดสินใจที่จะแก้ไขและรวบรวม zsh ด้วยตนเองเป็นการแก้ไขชั่วคราว หากคุณใช้ OS X และใช้ Homebrew (คุณควร) จากนั้นคุณสามารถติดตั้ง zsh รวมถึงโปรแกรมแก้ไขของฉันได้ด้วยการเรียกใช้:

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

คุณอาจจะต้องการที่จะเพิ่ม/usr/local/bin/zshไป/etc/shellsและchsh -s /usr/local/bin/zshหลังจากนั้น ท้ายสุดนี่คือข้อแตกต่างสำหรับผู้ที่สนใจ:

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 (ผู้ดูแลระบบ zsh) เพิ่งโพสต์แพตช์ขยายดังนั้นการเยื้อง RPROMPT ควรอยู่ในแหล่งที่มาของทางการในไม่ช้า
mpy

ขอบคุณสำหรับการโพสต์ลิงค์ รอคอยที่จะปล่อยรุ่นต่อไป!
Patrick Oscity

1

ฉันคิดว่าพื้นที่สีขาวทางด้านขวาเป็นรหัสที่ยาก แต่คุณสามารถหลอกลวงzshด้วยการตั้งค่าต่อไปนี้:

RPROMPT="%{*%}"

ซึ่งโดยหลักการแล้วบอกzshว่าดาวนั้นไม่มีตัวละคร จากman zshmisc:

%{...%} รวมสตริงเป็นลำดับ escape ตามตัวอักษร สตริงภายในเครื่องหมายปีกกาไม่ควรเปลี่ยนตำแหน่งเคอร์เซอร์ ( ... )

ข้อเสียคือคุณ "เลื่อน" ช่องว่างไปที่ท้ายPROMPT:

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

|สัญลักษณ์แสดงถึงขอบขั้ว■เคอร์เซอร์


ความคิดอื่นจะเพิ่มขึ้นCOLUMNS1:

COLUMNS=$((COLUMNS + 1))

แต่ต้องคิดวิธีที่จะทำเช่นนี้เฉพาะสำหรับการเรนเดอร์พรอมต์ แต่ไม่ใช่สำหรับคำสั่ง และสิ่งนี้จะกลืนอักขระตัวสุดท้ายของแต่ละบรรทัดบนบรรทัดคำสั่งหลายบรรทัด


1
ขอบคุณ ฉันพยายามเล่นด้วยเคล็ดลับ% {... %} ซึ่งเกี่ยวข้องกับเวลาและสถานะของฉันที่แสดงทางด้านขวา ฉันไม่สนใจพื้นที่พิเศษของ PROMPT เพราะฉันมักจะมีที่หนึ่ง อย่างไรก็ตามมีข้อเสียเปรียบครั้งใหญ่ด้วยวิธีนี้: เมื่อฉันเปิดใช้งานการเติมอัตโนมัติด้วย TAB พื้นที่พิเศษจะถูกลบออกและมันก็ทำสิ่งแปลก ๆ :)
Frozax
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.