由于zsh中的date命令,多行提示格式不正确

由于zsh中的date命令,多行提示格式不正确,zsh,zshrc,Zsh,Zshrc,我的.zshrc中有以下内容: setopt PROMPT_SUBST precmd(){ echo"" LEFT="$fg[cyan]$USERNAME@$HOST $fg[green]$PWD" RIGHT="$fg[yellow]$(date +%I:%M\ %P)" RIGHTWIDTH=$(($COLUMNS-${#LEFT})) echo $LEFT${(l:$RIGHTWIDTH:)RIGHT} } PROMPT="$ " 这给了我以下截图 右侧的时间部分始终

我的.zshrc中有以下内容:

setopt PROMPT_SUBST
precmd(){
  echo""
  LEFT="$fg[cyan]$USERNAME@$HOST $fg[green]$PWD"
  RIGHT="$fg[yellow]$(date +%I:%M\ %P)"
  RIGHTWIDTH=$(($COLUMNS-${#LEFT}))
  echo $LEFT${(l:$RIGHTWIDTH:)RIGHT}
}
PROMPT="$ "
这给了我以下截图

右侧的时间部分始终不会一直延伸到终端的边缘,即使调整了大小也是如此。我认为这是由于
$(日期+%I:%M\%P)
有人知道如何解决这个问题吗


编辑:放大屏幕截图

虽然你的想法值得称赞,但你遇到的问题是你的
包含ANSI转义序列(颜色),应该是零宽度字符,但是如果你天真地使用
$\name
${(l:expr:)name}

此外,作为一种风格,你最好使用Zsh的内置代码,它将人们可能希望在提示中看到的许多常见内容以短百分比转义序列封装。特别是,有内置的颜色序列,所以你不需要依赖非标准的
$fg[blah]

下面是用我喜欢的编码风格编写的提示的大致情况……不完全是这样,为了便于理解(希望如此),我将所有内容都做得非常详细。左、右预印本的长度是在剥离颜色转义序列并执行提示展开后计算出来的,这将给出正确的显示长度(我不可能在几分钟内就把它说出来;我把这个表达删掉了)

编辑:在某些终端模拟器中,精确打印
$COLUMN
字符可能会换行。在这种情况下,用

local num_filler_spaces=$((COLUMNS - preprompt_left_length - preprompt_right_length - 1))
编辑结束

这是非常可定制的,因为您可以在
precompt_left
precompt_right
中放置几乎任何内容,并且仍然可以获得正确的长度-只需记住对零宽度序列使用提示转义序列,例如
%F{}%f
对于颜色,
%B%B
对于粗体等。再次阅读提示展开时的文档:

注意:您可能注意到
%D{%I:%M%p}
扩展为
11:35 PM
。这是因为我想使用
%P
来获得
PM
,但并非所有
strftime
的实现都支持
%P
。最坏的情况是:如果您确实想要小写,但
%P
不受支持,请使用原始命令替代
$(日期+“%I:%M%P”)


另外,我正在使用
%~
而不是
%/
,因此您将得到
~/Desktop
而不是
/c/Users/johndoe/Desktop
。有些喜欢,有些不喜欢。但是,正如我所说,这很容易定制。

请将您的屏幕截图裁剪为仅显示终端(如果不放大,现在很难看到问题),不管你的背景如何好…非常感谢!我不在乎pm/pm,实际上我更喜欢大写字母(我的系统时钟使用大写字母)。但有一件事。出于某种原因,它打印到了许多空格,并最终生成了一行新行。知道为什么吗?@Lord_Zane55 Hmm这有点奇怪,但我模糊地记得,在Windows cmd和PowerShell上打印
$COLUMN
空格会使行结束(当我开发一些python库时)。能否尝试将
num\u filler\u spaces
定义替换为
local num\u filler\u spaces=$((列-预压缩左长-预压缩右长-1))
看看这是否有帮助?如果没有,请链接到一个新的屏幕截图,并在函数末尾添加
打印$COLUMNS$precompt\u left\u length$precompt\u right\u length$num\u filler\u spaces
并向我显示您得到的数字?非常好用!非常感谢!另外,由于我使用cywgin,该功能也无法使用(不幸的是,这是在windows上获得zsh的唯一方法)。路径实际上是/cygdrive/c/…试图找出如何用~替换/c/users/lord_zane是我试图找到的,我可能会调用一个python脚本,因为re模块会使它非常有用easy@Lord_Zane55顺便说一下,我相信您看到的包装行为可能是由于光标造成的d取消隐藏光标,但这更麻烦,因此如果你不关心一个悬空的空间(有吗?),那么当前的解决方案是好的。没有额外的空间了,添加-1修复了它。它看起来像我原来的屏幕截图,但时间一直在右边。
local num_filler_spaces=$((COLUMNS - preprompt_left_length - preprompt_right_length - 1))