我有这个简单的zshrc,它以提示形式显示时间并每1秒钟重置一次 以下是我的zshrc的简化版本
<div class="card">
<div class="card-header light">
Active Services
</div>
<div class="card-body server-status">
<div class="counter">
7/9
<span>
Servers running
</span>
</div>
<div class="divider" style="border-left:1px solid #0d2c4a;"></div>
<div class="chart"></div>
</div>
</div>
我在repeat_string(){
# this works fine
printf "-%.0s" $(seq 1 $(( $COLUMNS - 1)))
# this doesn't works fine
# printf "-%.0s" $(seq 1 $COLUMNS)
}
TMOUT=1
TRAPALRM() {
PROMPT="$(repeat_string)
$(date)
hello >>>"
zle reset-prompt
}
中有一个简单的函数,该函数在我的提示字符串中调用。此功能的目的是显示分隔符(-),其长度等于列的宽度。当我传递不等于$ COLUMN的重复计数时,它可以正常工作。但是,如果我通过$ COLUMN,它的行为会很奇怪,并会截断以前的提示和stdout。这是腹水链接。 https://asciinema.org/a/9FhIvtLD0XTnctEUXSRyZ9IrC
使用以下脚本快速重现问题
repeat_string
zsh版本:zsh 5.2(x86_64-apple-darwin16.0)
答案 0 :(得分:0)
在这里https://www.zsh.org/mla/users/2011/msg00052.html找到了解决方案
这是终端和terminfo或termcap描述的问题。 当终端输出一个换行符时,某些终端会默默地丢弃换行符。 正确的边距,其他人没有,只有当它 在屏幕最后一行的右边距输出。 一些终端导致光标绕到右行 当到达右边距时,其他光标离开 输出的最后一个字符的顶部,直到至少一个 字符出现。
终端描述数据库不太擅长区分 这些情况。 ZLE在这种情况下决定终端都包装 行,并且不丢弃换行符,因此它认为需要 在重画提示之前向上移动一行。您的终端 在边界处换行,但会丢弃换行符,因此ZLE的内部 屏幕外观的想法与现实不符。
您可以通过将$'\ n'替换为$'%1(l。\ n。)'来解决此问题 表示仅在ZLE认为至少有一个 自上一个(隐式)换行符以来已输出字符。如果 该行正好是$ COLUMNS宽,ZLE会认为终端 已经包装,并且此后已经输出了零个字符,所以它 不会通过发出终端丢弃的换行符来自欺欺人。
但是,在另一个终端上,您可能需要返回$'\ n' 无条件的。