- This is a Sublime Text package, not a standalone app.
- Runtime target is Sublime Text's Python 3.14 plugin host.
main.pyis the only entry file; it clears cachedplugin.*modules before star-importingplugin.- Keep exported plugin symbols in
plugin/__init__.py; implementation lives underplugin/.
- State is in-memory per window, keyed by
window.id()inplugin/state.py. - MRU order is per window.
TabStackListener.on_activatedupdates history unless a quick-panel session is active.TabStackListener.on_closeprunes closed sheets and removes empty window state.- Tab captions come from
plugin/captions.py; widgets, panels, and transient/non-tab views are excluded from MRU. - Ctrl-release detection lives in
plugin/ctrl_release/. - Uner Linux, Ctrl-release polling uses the X11 key state API, so Sublime must run under X11 or XWayland; a native Wayland session has no pollable global key state and Sublime exposes no key-release API.
tab_stack_openopens the quick panel, starts a Ctrl-release poller, and commits when Ctrl is released.- Wrap-around cycling is implemented by intentionally closing and reopening the quick panel at the opposite boundary. That handoff keeps the session active and reuses the existing Ctrl-release poller.
tab_stack.session_activeis the quick-panel session context key.- Boundary-only contexts are
tab_stack.quick_panel_at_topandtab_stack.quick_panel_at_bottom. - When
tab_stack.session_activeisfalse,ctrl+tabstartstab_stack_open.ctrl+shift+tabis bound as a no-op to prevent accidental presses. - When
tab_stack.session_activeistrue, non-boundaryctrl+tab,ctrl+shift+tab,ctrl+up, andctrl+downcallmove, boundary presses calltab_stack_cycle, andctrl+escapecallstab_stack_cancel.
- Use
uv run ruff check .for linting. - Use
uv run ruff format .for formatting. pyproject.tomlonly defines Ruff settings; there is no repo-local test runner.