Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

quarto emits ANSI cursor-control sequences when stderr is not a terminal

オープン 初心者向け
#14,419 コメント 1 件 リアクション 1 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
74/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
静か
技術スタック
typescript
領域
cli

調査の方向性

src/core/console.ts から始め、次に src/core/platform.ts の isInteractiveTerminal() と、src/core/log.ts の関連する処理を読みます。quarto check versions 2>\u00261 | cat -v で問題を再現し、カーソル制御と進捗出力をインタラクティブな stderr ターミナルの場合に限定します。リダイレクトまたはパイプされた出力に生の ANSI カーソル制御シーケンスが含まれず、ターミナルでの動作が引き続きインタラクティブであれば完了です。

索引モデルが issue の本文から書いたものです。

説明

bug

When quarto's stderr is piped, redirected to a file, or consumed by an editor build tool (e.g. Emacs M-x compile, VS Code tasks), progress and spinner helpers still emit ANSI cursor-control sequences. These appear as raw escape bytes in the output buffer:

^[[0G^[[2K^[[J^[[0G^[[2K^[[J^[[0G

Reported in https://github.com/orgs/quarto-dev/discussions/14403

Root cause

src/core/console.ts emits cursor-control bytes without checking whether the output stream is a terminal. Specifically, clearLine() calls ansi.eraseLine.cursorLeft() unconditionally, and spinner() and progressBar() gate their output on runningInCI() but not on whether stderr is actually a TTY. withSpinner()'s cancel path always calls clearLine(), regardless of where output goes.

https://github.com/quarto-dev/quarto-cli/blob/d5c1f1d51a9628b065da0c1a9f45009bcc8fd00e/src/core/console.ts#L180-L182

https://github.com/quarto-dev/quarto-cli/blob/d5c1f1d51a9628b065da0c1a9f45009bcc8fd00e/src/core/console.ts#L110-L124

NO_COLOR does not cover this — it governs colors only. --log-format plain governs the log file format, not console output.

The codebase already has the right helper: isInteractiveTerminal() in src/core/platform.ts, which returns Deno.stderr.isTerminal(). It is already used in command/create/cmd.ts and command/publish/cmd.ts to gate interactive prompts, but not in src/core/console.ts.

https://github.com/quarto-dev/quarto-cli/blob/d5c1f1d51a9628b065da0c1a9f45009bcc8fd00e/src/core/platform.ts#L97-L99

src/core/log.ts's LogFileHandler.format() already handles this for file output — messages starting with \r are dropped because they are progress lines. The same "progress is terminal-only" notion is not applied to the stderr console handler or to clearLine().

https://github.com/quarto-dev/quarto-cli/blob/d5c1f1d51a9628b065da0c1a9f45009bcc8fd00e/src/core/log.ts#L232-L237

Reproduction

Any quarto command that uses withSpinner or progressBar shows this when stderr is piped. The cleanest CLI-only form:

quarto check versions 2>&1 | cat -v
quarto install tinytex 2>&1 | cat -v

leading to something like

$ quarto check versions 2>&1 | cat -v
Quarto 1.10.3
^M[>] Checking versions of quarto binary dependencies...
      Pandoc version 3.8.3: OK
      Dart Sass version 1.87.0: OK
      Deno version 2.4.5: OK
      Typst version 0.14.2: OK
^M[>] Checking versions of quarto dependencies......OK

Or via Emacs M-x compile running quarto render example.qmd --to html, where the compilation buffer is not a TTY.

Suggested direction

Gate clearLine(), spinner(), and progressBar() on isInteractiveTerminal() (extending the !runningInCI() check that is already there to also require a TTY). This matches the idiom already used for interactive prompts in create/publish, and aligns console behavior with the file-handler behavior in log.ts.

主要言語
JavaScript
スター
6k
フォーク
461
平均マージ
13時間 37分
マージ済み PR(30日)
53

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

quarto-dev/quarto-cli のほかの issue

quarto-dev/quarto-cli の issue をすべて見る

似ている issue

JavaScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。