在 zsh 中,我的右提示符右侧总是有一个空格字符。我尝试使用一个非常简单的 .zshrc,例如:
PROMPT="#"
RPROMPT="*"
屏幕右侧的 * 后面总是有一个空格。
这是显示该问题的屏幕截图(我选择了其中一行上的空格)。
谢谢。
答案1
总结
您需要做的就是将其放入您的~/.zshrc
(或与您的提示主题放在同一文件中):
ZLE_RPROMPT_INDENT=0
细节
在以下 ZSH 版本中5.0.2rprompt_off
ZSH 的 C 源代码中名为(设置右边距偏移量)的值被硬编码为1
。
但在5.0.5发布开发人员添加了通过设置环境变量来覆盖此默认值的功能ZLE_RPROMPT_INDENT
。
这理由此“缩进”的原因是,如果显示屏的最后一个单元格中包含字符,某些较旧的终端就会开始滚动。
对于 5.0.5 之前的 ZSH 版本
如果您使用的是旧版本的 ZSH 并且无法更新,您仍然可以通过执行以下两个操作来清除该空间:
- 诡计ZSH 认为你的 RPROMPT 比实际使用标准不可见序列包装器时短一个字符:
%{...%}
- 然后使用 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="%{*%}" | |# ■ *|
符号|
表示终端边缘,■ 表示光标。
另一个想法是增加COLUMNS
1:
COLUMNS=$((COLUMNS + 1))
但是我们必须想办法只对提示渲染进行此操作,而不对命令进行此操作。这将吞掉多行命令行中每行的最后一个字符。