Skip to content

Commit 41de921

Browse files
takemi-ohamaclaude
andcommitted
fix(list): TUI メニューの色付け既定 OFF と 10件目以降の二重字下げ修正
- _STATUS_COLOR を False に: menu entry に ANSI を埋め込むと simple_term_menu の wcswidth() が -1 を返し表示幅計算/ハイライト消去が 崩れるため、実機検証まで色付けを無効化 (機能 > 装飾) - _build_menu_entries: ショートカット無し行 (10件目以降) の手動 4 スペース 字下げを除去。simple_term_menu はショートカット定義時に全行へ 4 文字 ガターを自前描画するため、二重インデントになっていた - test: 上記に合わせて 10件目の期待値を body 先頭 (字下げ無し) に更新 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 62afb69 commit 41de921

2 files changed

Lines changed: 18 additions & 10 deletions

File tree

lib/devbase/commands/project.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727
TerminalMenu = None
2828
_HAVE_TERMINAL_MENU = False
2929

30-
# STATUS 色付けの有効/無効。simple_term_menu の桁計算と ANSI が衝突する端末では
31-
# False に倒してプレーン表示にする (機能 > 装飾)。
32-
_STATUS_COLOR = True
30+
# STATUS 色付けの有効/無効。menu entry に ANSI を埋め込むと simple_term_menu の
31+
# wcswidth() が -1 を返し、表示幅計算とハイライト消去が崩れる。実機検証が完了する
32+
# まではメニューでは色を付けず False を既定とする (機能 > 装飾)。テーブル表示
33+
# (_print_table) は端末へ直接書くため影響を受けず、色付けは別途検討する。
34+
_STATUS_COLOR = False
3335

3436

3537
def _resolve_plugin_name(entry: Path) -> str | None:
@@ -150,9 +152,11 @@ def _build_menu_entries(rows: list[dict], colorize: bool = False) -> list[str]:
150152
151153
返り値の index は rows の index と 1:1 対応する (entry i ↔ rows[i])。
152154
先頭 9 件には simple_term_menu のショートカット記法 ``[n]`` (n=1..9) を付与し、
153-
数字キーで即ジャンプできるようにする。10 件目以降は ``[n] `` と同じ 4 文字幅
154-
(スペース) で字下げして桁を揃える。``colorize`` が True のとき STATUS に
155-
ANSI 色を付ける (検索/桁計算が崩れる端末向けに呼び出し側で False にできる)。
155+
数字キーで即ジャンプできるようにする。simple_term_menu はショートカットが 1 件
156+
でも定義されると全行に 4 文字幅のショートカットガターを自前描画するため、
157+
10 件目以降は body のまま渡し、桁揃えはライブラリ側のガターに委ねる
158+
(手前で字下げすると二重インデントになる)。``colorize`` が True のとき STATUS
159+
に ANSI 色を付ける (検索/桁計算が崩れる端末向けに呼び出し側で False にできる)。
156160
"""
157161
name_w = max(len("NAME"), *(len(r["name"]) for r in rows))
158162
plugin_w = max(len("PLUGIN"), *(len(r["plugin"]) for r in rows))
@@ -163,7 +167,9 @@ def _build_menu_entries(rows: list[dict], colorize: bool = False) -> list[str]:
163167
if i < 9:
164168
entries.append(f"[{i + 1}] {body}")
165169
else:
166-
entries.append(f" {body}") # "[n] " と同じ 4 文字幅で字下げ
170+
# ショートカット無し行はライブラリ側のガターが 4 文字ぶん字下げするため
171+
# body をそのまま渡す (手前で字下げすると二重インデントになる)。
172+
entries.append(body)
167173
return entries
168174

169175

tests/cli/test_project_list.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -586,10 +586,12 @@ def test_build_menu_entries_shortcuts_and_mapping():
586586
for i in range(9):
587587
assert entries[i].startswith(f"[{i + 1}] ")
588588
assert f"p{i}" in entries[i]
589-
# 10 件目以降はショートカット無し (4 スペース始まりで桁を揃える)
590-
assert entries[9].startswith(" ")
589+
# 10 件目以降はショートカット無し。桁揃え (4 文字ガター) は simple_term_menu の
590+
# ライブラリ側が描画するため、ここでは body をそのまま渡す (手前で字下げすると
591+
# 二重インデントになる)。先頭にショートカット記法も手動字下げも付けない。
592+
assert not entries[9].startswith(" ")
591593
assert not entries[9].lstrip().startswith("[")
592-
assert "p9" in entries[9]
594+
assert entries[9].startswith("p9")
593595
assert "p10" in entries[10]
594596

595597

0 commit comments

Comments
 (0)