Skip to content

Commit b3c7ea2

Browse files
takemi-ohamaclaude
andcommitted
feat(list): list TUI サブメニューの「戻る」に ← を追加し即応化
Esc は矢印キーのエスケープシーケンス先頭バイトと衝突するため、 prompt_toolkit のフラッシュ待ち (約0.5秒) 分の遅延が体感される。 左矢印 (\x1b[D) は完結した曖昧さの無いシーケンスなので、これを running 操作サブメニューの主たる「戻る」キーとして即時反応させる。 Esc は互換のため残す。プロンプト文言も「← ・Esc 戻る」に更新。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 7ccb4d5 commit b3c7ea2

2 files changed

Lines changed: 22 additions & 5 deletions

File tree

lib/devbase/commands/project.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,15 +224,25 @@ def _cancel(event):
224224

225225

226226
def _with_escape_back(question):
227-
"""Esc 単独押下で ``_MENU_BACK`` を返す select を返す。
227+
"""← / Esc 押下で ``_MENU_BACK`` を返す select を返す。
228228
229-
Ctrl-C は questionary 既定どおり中止 (``ask()`` が ``None``) のまま残し、Esc
230-
だけを「1 つ前のメニューへ戻る」シグナルに割り当てる。サブメニュー用。
229+
Ctrl-C は questionary 既定どおり中止 (``ask()`` が ``None``) のまま残し、← と
230+
Esc を「1 つ前のメニューへ戻る」シグナルに割り当てる。サブメニュー用。
231+
232+
Esc (``\\x1b``) は矢印キーのエスケープシーケンスの先頭バイトと衝突するため
233+
prompt_toolkit のフラッシュ待ち分の遅延が体感される。左矢印 (``\\x1b[D``) は
234+
完結した曖昧さの無いシーケンスなので、これを主たる「戻る」キーとして即時に
235+
反応させ、Esc は互換のため残す。サブメニューは検索絞り込み (use_search_filter)
236+
を使わないため、← をカーソル移動と衝突させずに割り当てられる。
231237
"""
238+
from prompt_toolkit.keys import Keys
239+
232240
def _back(event):
233241
event.app.exit(result=_MENU_BACK)
234242

235-
return _add_escape_binding(question, _back)
243+
_add_escape_binding(question, _back) # Esc(互換・低速)
244+
question.application.key_bindings.add(Keys.Left)(_back) # ←(即時)
245+
return question
236246

237247

238248
def _show_menu(rows: list[dict]) -> int | None:
@@ -271,7 +281,7 @@ def _show_action_menu(name: str):
271281
]
272282
question = questionary.select(
273283
f"'{name}' は起動中です。操作を選択 "
274-
"(↑↓ 移動 / Enter 決定 / Esc 戻る / Ctrl-C 中止):",
284+
"(↑↓ 移動 / Enter 決定 / ← ・Esc 戻る / Ctrl-C 中止):",
275285
choices=choices,
276286
use_arrow_keys=True,
277287
use_shortcuts=False,

tests/cli/test_project_list.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,13 @@ def test_with_escape_back_returns_sentinel_on_escape():
809809
esc[0].handler(types.SimpleNamespace(app=fake_app))
810810
assert captured == {"result": project_mod._MENU_BACK}
811811

812+
# ← (Left) も「戻る」に割り当て、Esc のフラッシュ待ち遅延を回避して即応させる
813+
left = [b for b in q.application.key_bindings.bindings if Keys.Left in b.keys]
814+
assert len(left) == 1
815+
captured.clear()
816+
left[0].handler(types.SimpleNamespace(app=fake_app))
817+
assert captured == {"result": project_mod._MENU_BACK}
818+
812819

813820
def test_tui_running_action_escape_returns_to_top_menu(monkeypatch):
814821
"""running 行のサブメニューで Esc (_MENU_BACK) を押すとトップメニューへ戻る。"""

0 commit comments

Comments
 (0)