删除 zsh 右提示符末尾的无用空格 ($RPROMPT)

删除 zsh 右提示符末尾的无用空格 ($RPROMPT)

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

PROMPT="#"
RPROMPT="*"

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

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

谢谢。

答案1

总结

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

ZLE_RPROMPT_INDENT=0

细节

在以下 ZSH 版本中5.0.2rprompt_offZSH 的 C 源代码中名为(设置右边距偏移量)的值被硬编码为1

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

理由此“缩进”的原因是,如果显示屏的最后一个单元格中包含字符,某些较旧的终端就会开始滚动。

对于 5.0.5 之前的 ZSH 版本

如果您使用的是旧版本的 ZSH 并且无法更新,您仍然可以通过执行以下两个操作来清除该空间:

  1. 诡计ZSH 认为你的 RPROMPT 比实际使用标准不可见序列包装器时短一个字符:%{...%}
  2. 然后使用 terminfo 发送光标返回转义序列:%{terminfo[cub1]}

查看常问问题这条信息在邮件列表中获取更多信息。

答案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;
        /*

答案3

我认为右侧的空白是硬编码的。但你可以zsh使用以下设置来解决这个问题:

RPROMPT="%{*%}"

原则上,这表zsh明星号不占用任何字符;来自man zshmisc

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

缺点是,你将空白“移动”到末尾PROMPT

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

符号|表示终端边缘,■ 表示光标。


另一个想法是增加COLUMNS1:

COLUMNS=$((COLUMNS + 1))

但是我们必须想办法只对提示渲染进行此操作,而不对命令进行此操作。这将吞掉多行命令行中每行的最后一个字符。

相关内容