当提示宽度与COLUMNS相同时,zsh会截断先前的stdout

时间:2018-08-16 12:42:34

标签: shell printf command-prompt zsh

我有这个简单的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)

1 个答案:

答案 0 :(得分:0)

在这里https://www.zsh.org/mla/users/2011/msg00052.html找到了解决方案

  

这是终端和terminfo或termcap描述的问题。   当终端输出一个换行符时,某些终端会默默地丢弃换行符。   正确的边距,其他人没有,只有当它   在屏幕最后一行的右边距输出。   一些终端导致光标绕到右行   当到达右边距时,其他光标离开   输出的最后一个字符的顶部,直到至少一个   字符出现。

     

终端描述数据库不太擅长区分   这些情况。 ZLE在这种情况下决定终端都包装   行,并且不丢弃换行符,因此它认为需要   在重画提示之前向上移动一行。您的终端   在边界处换行,但会丢弃换行符,因此ZLE的内部   屏幕外观的想法与现实不符。

     

您可以通过将$'\ n'替换为$'%1(l。\ n。)'来解决此问题   表示仅在ZLE认为至少有一个   自上一个(隐式)换行符以来已输出字符。如果   该行正好是$ COLUMNS宽,ZLE会认为终端   已经包装,并且此后已经输出了零个字符,所以它   不会通过发出终端丢弃的换行符来自欺欺人。

     

但是,在另一个终端上,您可能需要返回$'\ n'   无条件的。