在zsh($ RPROMPT)正确提示的末尾删除无用的空间


18

在zsh中,我的正确提示右边总是有一个空格字符。我尝试使用非常简单的.zshrc,例如:

PROMPT="#"
RPROMPT="*"

屏幕右侧*后面总是有一个空格。

这是显示问题的屏幕截图(我在其中一行选择了空格)。 http://i.imgur.com/cnfa2eJ.png

谢谢。

Answers:


20

TL; DR

您需要做的就是将其放入您的~/.zshrc(或与提示主题相同的文件中):

ZLE_RPROMPT_INDENT=0

细节

在ZSH的版本(最高为5.0.2)中,ZSH的C源代码中的一个值rprompt_off(设置了右边距偏移量)被硬编码为1

但是在5.0.5版本中,开发人员添加了通过设置ZLE_RPROMPT_INDENT环境变量来覆盖此默认值的功能。

这种“缩进” 的基本原理是,如果显示的最后一个单元格中包含字符,则某些较旧的终端将开始滚动。

对于5.0.5之前的ZSH版本

如果您使用的是ZSH的较旧版本且无法更新,则可以通过执行以下两项操作来摆脱该空间:

  1. 绝招 ZSH以为你RPROMPT是一个性格比它实际上是使用标准的无形序列包装较短:%{...%}
  2. 然后使用terminfo发送一个游标后退转义序列: %{terminfo[cub1]}

请查看FAQ和邮件列表中的此消息以获取更多信息。


5
这似乎也将输入光标放置在通常应位于其左侧的一个字符处。例如,使用此问题中的提示,将光标放置井号上,而不是紧靠其右侧。(对我来说,将偏移量设置为小于零的值会使提示光标出现在正确的位置。使用zsh 5.0.8和5.2观察到。)
Rob Kennedy

在5.2中对我有效。
Anthony Michael Cook

5
在5.2中对我来说有点用,但是现在我对PROMPT有问题:PROMPT中的最后一个字符消失了,切换自动补全功能将当前输入的第一个字符填充到最后一个字符中。例如,%git<Tab>转换为%ggit
roboslone '16

您不需要为新版本的ZSH使用技巧。
安东尼·迈克尔·库克

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/shellschsh -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

%{...%} 包括一个字符串作为文字转义序列。花括号中的字符串不应更改光标位置。(...)

缺点是,您将空格“移”到了PROMPT

| PROMPT =“#” |
| RPROMPT =“%{*%}” | |
|#■* |

这些|符号表示端子边缘,■光标。


另一个想法是增加COLUMNS1:

COLUMNS=$((COLUMNS + 1))

但是,人们必须考虑一种方法,该方法仅针对即时渲染而不针对命令执行此操作。这将吞噬多行命令行中每行的最后一个字符。


1
谢谢。我尝试使用%{...%}技巧,处理我在右侧显示的时间和git状态。我不在乎PROMPT上的多余空间,因为我通常有一个。但是,此解决方案有一个很大的缺点:当我使用TAB激活自动
补全功能时
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.