riched 1.6.2__tar.gz → 1.6.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {riched-1.6.2 → riched-1.6.4}/PKG-INFO +15 -14
- {riched-1.6.2 → riched-1.6.4}/README.md +14 -13
- {riched-1.6.2 → riched-1.6.4}/pyproject.toml +1 -1
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/app.py +1 -11
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/bindings.yaml +3 -5
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/keybindings.py +2 -71
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/screens.py +0 -4
- {riched-1.6.2 → riched-1.6.4}/tests/helpers.py +2 -32
- {riched-1.6.2 → riched-1.6.4}/tests/test_markdown_preview.py +29 -4
- {riched-1.6.2 → riched-1.6.4}/uv.lock +78 -75
- {riched-1.6.2 → riched-1.6.4}/.gitignore +0 -0
- {riched-1.6.2 → riched-1.6.4}/.python-version +0 -0
- {riched-1.6.2 → riched-1.6.4}/AGENTS.md +0 -0
- {riched-1.6.2 → riched-1.6.4}/docs/command-palette.svg +0 -0
- {riched-1.6.2 → riched-1.6.4}/docs/markdown-preview.svg +0 -0
- {riched-1.6.2 → riched-1.6.4}/docs/python-buffer.svg +0 -0
- {riched-1.6.2 → riched-1.6.4}/docs/search-replace.svg +0 -0
- {riched-1.6.2 → riched-1.6.4}/plans/esc-unified-sidebar-escape.md +0 -0
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/__init__.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/cli.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/editor.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/formatting.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/quick_open.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/settings.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/src/rich_editor/syntax.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/__init__.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/runner.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_cli.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_command_palette.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_create_file.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_dirty_buffers.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_editor_shortcuts.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_file_io.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_footer.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_formatting.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_quick_open.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_refresh.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_replace.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_sidebar.py +0 -0
- {riched-1.6.2 → riched-1.6.4}/tests/test_syntax.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: riched
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.4
|
|
4
4
|
Summary: Terminal Editor with VS Code Keybindings
|
|
5
5
|
Project-URL: Repository, https://github.com/hoishing/riched
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -82,17 +82,17 @@ Key bindings are generated from the YAML in `src/rich_editor/bindings.yaml`.
|
|
|
82
82
|
|
|
83
83
|
App shortcuts:
|
|
84
84
|
|
|
85
|
-
| Shortcut
|
|
86
|
-
|
|
|
87
|
-
| `⌘S`
|
|
88
|
-
| `F1`
|
|
89
|
-
| `⌘B` / `⌃B`
|
|
90
|
-
| `⌘P`
|
|
91
|
-
| `⌃H`
|
|
92
|
-
| `⌃N`
|
|
93
|
-
| `⌃⇧V`
|
|
94
|
-
| `⌥⇧F`
|
|
95
|
-
| `⌘R`
|
|
85
|
+
| Shortcut | Action |
|
|
86
|
+
| ------------- | ----------------------- |
|
|
87
|
+
| `⌘S` | Save |
|
|
88
|
+
| `F1` | Command palette |
|
|
89
|
+
| `⌘B` / `⌃B` | Toggle sidebar |
|
|
90
|
+
| `⌘P` | Quick open |
|
|
91
|
+
| `⌃H` | Replace |
|
|
92
|
+
| `⌃N` | Create file |
|
|
93
|
+
| `⌘⇧V` / `⌃⇧V` | Toggle Markdown preview |
|
|
94
|
+
| `⌥⇧F` | Format document |
|
|
95
|
+
| `⌘R` | Refresh |
|
|
96
96
|
|
|
97
97
|
Editor shortcuts:
|
|
98
98
|
|
|
@@ -137,7 +137,7 @@ Riched persists the selected Textual theme in `settings.yaml` under the user con
|
|
|
137
137
|
|
|
138
138
|
## Markdown Preview
|
|
139
139
|
|
|
140
|
-
Use `⌃⇧V
|
|
140
|
+
Use `⌘⇧V` (`⌃⇧V` if Ghostty still owns `⌘⇧V`), the `Preview` button in the footer, or `F1` → `Toggle Markdown preview` to toggle an in-terminal rendered preview for Markdown files. The preview uses the current editor buffer, so unsaved edits are shown without writing them to disk.
|
|
141
141
|
|
|
142
142
|
When Markdown preview is open, the header shows a `☰` button on the right. Click it to show or hide the Markdown table of contents. The button is hidden while editing the text buffer.
|
|
143
143
|
|
|
@@ -201,7 +201,7 @@ On stock Ghostty, `⌘⌫` is delivered to terminal apps as `⌃U`, so Riched bi
|
|
|
201
201
|
|
|
202
202
|
### Ghostty hotkey conflicts
|
|
203
203
|
|
|
204
|
-
- some hotkeys are bound by Ghostty by default. eg. `⌘Z`, `⌘⇧Z`, `⌘Enter`, `⌘⇧Enter`, `⌘[`, `⌘]`, `⌘W`, `⌘Q`...etc
|
|
204
|
+
- some hotkeys are bound by Ghostty by default. eg. `⌘Z`, `⌘⇧Z`, `⌘⇧V`, `⌘Enter`, `⌘⇧Enter`, `⌘[`, `⌘]`, `⌘W`, `⌘Q`...etc
|
|
205
205
|
- Riched detects conflicted shortcuts at startup.
|
|
206
206
|
- Conflicted shortcuts are hidden from the footer until they are unbound in Ghostty config, unless the command has another available alternative.
|
|
207
207
|
- The key bindings popup marks conflicted shortcuts with `⚠️` and shows a Ghostty config reminder.
|
|
@@ -225,6 +225,7 @@ keybind = super+enter=unbind
|
|
|
225
225
|
keybind = super+shift+enter=unbind
|
|
226
226
|
keybind = super+z=unbind
|
|
227
227
|
keybind = super+shift+z=unbind
|
|
228
|
+
keybind = super+shift+v=unbind
|
|
228
229
|
```
|
|
229
230
|
|
|
230
231
|
Then reload Ghostty config with `⌘⇧,` or restart Ghostty. To inspect Ghostty's defaults before changing them:
|
|
@@ -67,17 +67,17 @@ Key bindings are generated from the YAML in `src/rich_editor/bindings.yaml`.
|
|
|
67
67
|
|
|
68
68
|
App shortcuts:
|
|
69
69
|
|
|
70
|
-
| Shortcut
|
|
71
|
-
|
|
|
72
|
-
| `⌘S`
|
|
73
|
-
| `F1`
|
|
74
|
-
| `⌘B` / `⌃B`
|
|
75
|
-
| `⌘P`
|
|
76
|
-
| `⌃H`
|
|
77
|
-
| `⌃N`
|
|
78
|
-
| `⌃⇧V`
|
|
79
|
-
| `⌥⇧F`
|
|
80
|
-
| `⌘R`
|
|
70
|
+
| Shortcut | Action |
|
|
71
|
+
| ------------- | ----------------------- |
|
|
72
|
+
| `⌘S` | Save |
|
|
73
|
+
| `F1` | Command palette |
|
|
74
|
+
| `⌘B` / `⌃B` | Toggle sidebar |
|
|
75
|
+
| `⌘P` | Quick open |
|
|
76
|
+
| `⌃H` | Replace |
|
|
77
|
+
| `⌃N` | Create file |
|
|
78
|
+
| `⌘⇧V` / `⌃⇧V` | Toggle Markdown preview |
|
|
79
|
+
| `⌥⇧F` | Format document |
|
|
80
|
+
| `⌘R` | Refresh |
|
|
81
81
|
|
|
82
82
|
Editor shortcuts:
|
|
83
83
|
|
|
@@ -122,7 +122,7 @@ Riched persists the selected Textual theme in `settings.yaml` under the user con
|
|
|
122
122
|
|
|
123
123
|
## Markdown Preview
|
|
124
124
|
|
|
125
|
-
Use `⌃⇧V
|
|
125
|
+
Use `⌘⇧V` (`⌃⇧V` if Ghostty still owns `⌘⇧V`), the `Preview` button in the footer, or `F1` → `Toggle Markdown preview` to toggle an in-terminal rendered preview for Markdown files. The preview uses the current editor buffer, so unsaved edits are shown without writing them to disk.
|
|
126
126
|
|
|
127
127
|
When Markdown preview is open, the header shows a `☰` button on the right. Click it to show or hide the Markdown table of contents. The button is hidden while editing the text buffer.
|
|
128
128
|
|
|
@@ -186,7 +186,7 @@ On stock Ghostty, `⌘⌫` is delivered to terminal apps as `⌃U`, so Riched bi
|
|
|
186
186
|
|
|
187
187
|
### Ghostty hotkey conflicts
|
|
188
188
|
|
|
189
|
-
- some hotkeys are bound by Ghostty by default. eg. `⌘Z`, `⌘⇧Z`, `⌘Enter`, `⌘⇧Enter`, `⌘[`, `⌘]`, `⌘W`, `⌘Q`...etc
|
|
189
|
+
- some hotkeys are bound by Ghostty by default. eg. `⌘Z`, `⌘⇧Z`, `⌘⇧V`, `⌘Enter`, `⌘⇧Enter`, `⌘[`, `⌘]`, `⌘W`, `⌘Q`...etc
|
|
190
190
|
- Riched detects conflicted shortcuts at startup.
|
|
191
191
|
- Conflicted shortcuts are hidden from the footer until they are unbound in Ghostty config, unless the command has another available alternative.
|
|
192
192
|
- The key bindings popup marks conflicted shortcuts with `⚠️` and shows a Ghostty config reminder.
|
|
@@ -210,6 +210,7 @@ keybind = super+enter=unbind
|
|
|
210
210
|
keybind = super+shift+enter=unbind
|
|
211
211
|
keybind = super+z=unbind
|
|
212
212
|
keybind = super+shift+z=unbind
|
|
213
|
+
keybind = super+shift+v=unbind
|
|
213
214
|
```
|
|
214
215
|
|
|
215
216
|
Then reload Ghostty config with `⌘⇧,` or restart Ghostty. To inspect Ghostty's defaults before changing them:
|
|
@@ -42,8 +42,6 @@ from .keybindings import (
|
|
|
42
42
|
display_key_with_symbols,
|
|
43
43
|
ghostty_conflicted_hotkey_triggers,
|
|
44
44
|
running_in_ghostty,
|
|
45
|
-
running_in_wezterm,
|
|
46
|
-
wezterm_conflicted_hotkey_triggers,
|
|
47
45
|
)
|
|
48
46
|
from .quick_open import (
|
|
49
47
|
MAX_QUICK_OPEN_INDEX_FILES,
|
|
@@ -564,15 +562,8 @@ class RichedApp(App):
|
|
|
564
562
|
self._ghostty_conflicted_hotkey_triggers = (
|
|
565
563
|
ghostty_conflicted_hotkey_triggers()
|
|
566
564
|
)
|
|
567
|
-
self.
|
|
568
|
-
wezterm_conflicted_hotkey_triggers()
|
|
569
|
-
)
|
|
570
|
-
self._conflicted_hotkey_triggers = (
|
|
571
|
-
self._ghostty_conflicted_hotkey_triggers
|
|
572
|
-
| self._wezterm_conflicted_hotkey_triggers
|
|
573
|
-
)
|
|
565
|
+
self._conflicted_hotkey_triggers = set(self._ghostty_conflicted_hotkey_triggers)
|
|
574
566
|
self._in_ghostty = running_in_ghostty()
|
|
575
|
-
self._in_wezterm = running_in_wezterm()
|
|
576
567
|
|
|
577
568
|
def _save_theme(self, theme: str) -> None:
|
|
578
569
|
try:
|
|
@@ -637,7 +628,6 @@ class RichedApp(App):
|
|
|
637
628
|
binding.key,
|
|
638
629
|
conflicted_triggers=self._conflicted_hotkey_triggers,
|
|
639
630
|
in_ghostty=self._in_ghostty,
|
|
640
|
-
in_wezterm=self._in_wezterm,
|
|
641
631
|
)
|
|
642
632
|
return display_key_with_symbols(key)
|
|
643
633
|
|
|
@@ -33,13 +33,11 @@ app:
|
|
|
33
33
|
preferred_key: ctrl+n
|
|
34
34
|
- name: toggle_markdown_preview
|
|
35
35
|
description: Toggle Markdown preview
|
|
36
|
-
key: ctrl+shift+v,shift+ctrl+v,ctrl+V,alt+shift+v,shift+alt+v,alt+shift+V,shift+alt+V,alt+v
|
|
37
|
-
preferred_key:
|
|
36
|
+
key: cmd+shift+v,shift+cmd+v,super+shift+v,shift+super+v,cmd+V,shift+cmd+V,super+V,shift+super+V,cmd+shift+V,super+shift+V,ctrl+shift+v,shift+ctrl+v,ctrl+V,alt+shift+v,shift+alt+v,alt+shift+V,shift+alt+V,alt+v
|
|
37
|
+
preferred_key: cmd+shift+v,shift+cmd+v,super+shift+v,shift+super+v
|
|
38
38
|
display_keys:
|
|
39
|
+
- cmd+shift+v
|
|
39
40
|
- ctrl+shift+v
|
|
40
|
-
wezterm_display_keys:
|
|
41
|
-
- ctrl+shift+v
|
|
42
|
-
- alt+shift+v
|
|
43
41
|
- name: format_document
|
|
44
42
|
description: Format document
|
|
45
43
|
key: alt+shift+f,shift+alt+f,alt+shift+F,shift+alt+F,alt+F
|
|
@@ -138,15 +138,12 @@ def app_binding_display_key(
|
|
|
138
138
|
*,
|
|
139
139
|
conflicted_triggers: set[str] | None = None,
|
|
140
140
|
in_ghostty: bool = False,
|
|
141
|
-
in_wezterm: bool = False,
|
|
142
141
|
) -> str:
|
|
143
142
|
conflicted_triggers = conflicted_triggers or set()
|
|
144
143
|
item = _app_command_or_none(action)
|
|
145
144
|
if item is None:
|
|
146
145
|
return display_key(key)
|
|
147
|
-
for display_key_candidate in _item_display_keys(
|
|
148
|
-
item, in_ghostty=in_ghostty, in_wezterm=in_wezterm
|
|
149
|
-
):
|
|
146
|
+
for display_key_candidate in _item_display_keys(item, in_ghostty=in_ghostty):
|
|
150
147
|
display = display_key(display_key_candidate)
|
|
151
148
|
if not _display_key_conflicted(display, conflicted_triggers):
|
|
152
149
|
return display
|
|
@@ -170,17 +167,11 @@ def _help_display_key(item: dict[str, Any]) -> str:
|
|
|
170
167
|
)
|
|
171
168
|
|
|
172
169
|
|
|
173
|
-
def _item_display_keys(
|
|
174
|
-
item: dict[str, Any], *, in_ghostty: bool = False, in_wezterm: bool = False
|
|
175
|
-
) -> list[str]:
|
|
170
|
+
def _item_display_keys(item: dict[str, Any], *, in_ghostty: bool = False) -> list[str]:
|
|
176
171
|
if in_ghostty:
|
|
177
172
|
ghostty_display_keys = item.get("ghostty_display_keys")
|
|
178
173
|
if isinstance(ghostty_display_keys, list):
|
|
179
174
|
return [str(key) for key in ghostty_display_keys]
|
|
180
|
-
if in_wezterm:
|
|
181
|
-
wezterm_display_keys = item.get("wezterm_display_keys")
|
|
182
|
-
if isinstance(wezterm_display_keys, list):
|
|
183
|
-
return [str(key) for key in wezterm_display_keys]
|
|
184
175
|
display_keys = item.get("display_keys")
|
|
185
176
|
if isinstance(display_keys, list):
|
|
186
177
|
return [str(key) for key in display_keys]
|
|
@@ -253,11 +244,6 @@ def running_in_ghostty(env: Mapping[str, str] | None = None) -> bool:
|
|
|
253
244
|
return env.get("TERM_PROGRAM") == "ghostty" or env.get("TERM") == "xterm-ghostty"
|
|
254
245
|
|
|
255
246
|
|
|
256
|
-
def running_in_wezterm(env: Mapping[str, str] | None = None) -> bool:
|
|
257
|
-
env = environ if env is None else env
|
|
258
|
-
return env.get("TERM_PROGRAM") == "WezTerm"
|
|
259
|
-
|
|
260
|
-
|
|
261
247
|
def ghostty_conflicted_hotkey_triggers(
|
|
262
248
|
env: Mapping[str, str] | None = None,
|
|
263
249
|
run_command: Callable[..., CompletedProcess[str]] = run,
|
|
@@ -364,58 +350,3 @@ def _ghostty_config_conflicted_triggers(
|
|
|
364
350
|
|
|
365
351
|
def _ghostty_config_has_conflict(config: str) -> bool:
|
|
366
352
|
return False
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
WEZTERM_CONFIG_TIMEOUT_SECONDS = 1.0
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
def wezterm_conflicted_hotkey_triggers(
|
|
373
|
-
env: Mapping[str, str] | None = None,
|
|
374
|
-
run_command: Callable[..., CompletedProcess[str]] = run,
|
|
375
|
-
find_binary: Callable[[str], str | None] = which,
|
|
376
|
-
) -> set[str]:
|
|
377
|
-
env = environ if env is None else env
|
|
378
|
-
if not running_in_wezterm(env):
|
|
379
|
-
return set()
|
|
380
|
-
wezterm = find_binary("wezterm")
|
|
381
|
-
if wezterm is None:
|
|
382
|
-
# WezTerm default binds Ctrl+Shift+V to Paste, so assume conflict
|
|
383
|
-
# when we cannot inspect the config.
|
|
384
|
-
return {"ctrl+shift+v"}
|
|
385
|
-
try:
|
|
386
|
-
result = run_command(
|
|
387
|
-
[wezterm, "show-keys"],
|
|
388
|
-
stdout=PIPE,
|
|
389
|
-
stderr=PIPE,
|
|
390
|
-
text=True,
|
|
391
|
-
timeout=WEZTERM_CONFIG_TIMEOUT_SECONDS,
|
|
392
|
-
check=False,
|
|
393
|
-
)
|
|
394
|
-
except Exception:
|
|
395
|
-
return {"ctrl+shift+v"}
|
|
396
|
-
if result.returncode != 0:
|
|
397
|
-
return {"ctrl+shift+v"}
|
|
398
|
-
if "PasteFrom" not in result.stdout:
|
|
399
|
-
return set()
|
|
400
|
-
# If show-keys still lists Ctrl+Shift+V -> Paste, it is intercepted.
|
|
401
|
-
conflicted: set[str] = set()
|
|
402
|
-
for line in result.stdout.splitlines():
|
|
403
|
-
if "PasteFrom" not in line:
|
|
404
|
-
continue
|
|
405
|
-
# WezTerm show-keys lines contain e.g. "CTRL V" or "SHIFT | CTRL V"
|
|
406
|
-
# Any Paste binding involving V with CTRL+SHIFT implies conflict.
|
|
407
|
-
if "CTRL" in line and "V" in line:
|
|
408
|
-
if "SHIFT" in line or line.strip().startswith("CTRL"):
|
|
409
|
-
conflicted.add("ctrl+shift+v")
|
|
410
|
-
break
|
|
411
|
-
return conflicted
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
def wezterm_markdown_preview_hotkey_conflicted(
|
|
415
|
-
env: Mapping[str, str] | None = None,
|
|
416
|
-
run_command: Callable[..., CompletedProcess[str]] = run,
|
|
417
|
-
find_binary: Callable[[str], str | None] = which,
|
|
418
|
-
) -> bool:
|
|
419
|
-
return "ctrl+shift+v" in wezterm_conflicted_hotkey_triggers(
|
|
420
|
-
env, run_command, find_binary
|
|
421
|
-
)
|
|
@@ -660,10 +660,6 @@ class KeysHelpScreen(_DismissOnCloseScreen, ModalScreen[None]):
|
|
|
660
660
|
yield Static(description, classes="binding-description")
|
|
661
661
|
if has_warnings:
|
|
662
662
|
legend = "⚠️ Unbind this shortcut in your terminal config to use it in Riched."
|
|
663
|
-
if any(
|
|
664
|
-
"ctrl+shift+v" in t for t in self._conflicted_triggers
|
|
665
|
-
):
|
|
666
|
-
legend = "⚠️ Unbind Ctrl+Shift+V in WezTerm config (DisableDefaultAssignment) or use Alt+Shift+V."
|
|
667
663
|
yield Static(
|
|
668
664
|
legend,
|
|
669
665
|
classes="binding-legend",
|
|
@@ -53,9 +53,7 @@ def _make_app(
|
|
|
53
53
|
root: Path | None = None,
|
|
54
54
|
markdown_preview_hotkey_conflicted: bool | None = None,
|
|
55
55
|
ghostty_conflicted_hotkey_triggers: set[str] | None = None,
|
|
56
|
-
wezterm_conflicted_hotkey_triggers: set[str] | None = None,
|
|
57
56
|
in_ghostty: bool | None = None,
|
|
58
|
-
in_wezterm: bool | None = None,
|
|
59
57
|
**init_kwargs,
|
|
60
58
|
):
|
|
61
59
|
cls = type(
|
|
@@ -64,37 +62,11 @@ def _make_app(
|
|
|
64
62
|
{"BINDINGS": mod.build_bindings()},
|
|
65
63
|
)
|
|
66
64
|
app = cls(path, root or path.parent, **init_kwargs)
|
|
67
|
-
# Preserve original auto-detection when not overridden, but ensure
|
|
68
|
-
# WezTerm outside detection does not pollute tests that explicitly
|
|
69
|
-
# configure Ghostty. Tests that pass ghostty params expect generic
|
|
70
|
-
# display ("⌘⇧V") even when the runner is inside WezTerm.
|
|
71
65
|
if in_ghostty is not None:
|
|
72
66
|
app._in_ghostty = in_ghostty
|
|
73
|
-
if in_wezterm is not None:
|
|
74
|
-
app._in_wezterm = in_wezterm
|
|
75
67
|
if ghostty_conflicted_hotkey_triggers is not None:
|
|
76
68
|
app._ghostty_conflicted_hotkey_triggers = ghostty_conflicted_hotkey_triggers
|
|
77
|
-
|
|
78
|
-
# unless explicitly provided, to keep footer tests stable in WezTerm env.
|
|
79
|
-
if wezterm_conflicted_hotkey_triggers is None and in_wezterm is None:
|
|
80
|
-
app._in_wezterm = False
|
|
81
|
-
app._wezterm_conflicted_hotkey_triggers = set()
|
|
82
|
-
if wezterm_conflicted_hotkey_triggers is not None:
|
|
83
|
-
app._wezterm_conflicted_hotkey_triggers = wezterm_conflicted_hotkey_triggers
|
|
84
|
-
if ghostty_conflicted_hotkey_triggers is None and in_ghostty is None:
|
|
85
|
-
# When WezTerm explicitly configured but Ghostty not, keep Ghostty empty
|
|
86
|
-
pass
|
|
87
|
-
# Recompute combined if either was overridden
|
|
88
|
-
if (
|
|
89
|
-
ghostty_conflicted_hotkey_triggers is not None
|
|
90
|
-
or wezterm_conflicted_hotkey_triggers is not None
|
|
91
|
-
or in_ghostty is not None
|
|
92
|
-
or in_wezterm is not None
|
|
93
|
-
):
|
|
94
|
-
app._conflicted_hotkey_triggers = (
|
|
95
|
-
app._ghostty_conflicted_hotkey_triggers
|
|
96
|
-
| app._wezterm_conflicted_hotkey_triggers
|
|
97
|
-
)
|
|
69
|
+
app._conflicted_hotkey_triggers = ghostty_conflicted_hotkey_triggers
|
|
98
70
|
if markdown_preview_hotkey_conflicted is not None:
|
|
99
71
|
conflicts = set(app._ghostty_conflicted_hotkey_triggers)
|
|
100
72
|
if markdown_preview_hotkey_conflicted:
|
|
@@ -102,9 +74,7 @@ def _make_app(
|
|
|
102
74
|
else:
|
|
103
75
|
conflicts.discard("super+shift+v")
|
|
104
76
|
app._ghostty_conflicted_hotkey_triggers = conflicts
|
|
105
|
-
app._conflicted_hotkey_triggers = conflicts
|
|
106
|
-
app, "_wezterm_conflicted_hotkey_triggers", set()
|
|
107
|
-
)
|
|
77
|
+
app._conflicted_hotkey_triggers = conflicts
|
|
108
78
|
return app
|
|
109
79
|
|
|
110
80
|
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from textual.widgets import DirectoryTree, Markdown, MarkdownViewer, Static
|
|
4
4
|
|
|
5
|
-
from .helpers import _editor, _file_app, _key_help_rows, _press
|
|
5
|
+
from .helpers import _directory_app, _editor, _file_app, _key_help_rows, _press
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
async def test_markdown_preview_toggles_from_primary_key() -> None:
|
|
@@ -27,8 +27,19 @@ async def test_markdown_preview_toggles_from_primary_key() -> None:
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
async def test_markdown_preview_opens_from_alias_keys() -> None:
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
keys = (
|
|
31
|
+
"cmd+shift+v",
|
|
32
|
+
"shift+cmd+v",
|
|
33
|
+
"super+shift+v",
|
|
34
|
+
"shift+super+v",
|
|
35
|
+
"cmd+V",
|
|
36
|
+
"super+V",
|
|
37
|
+
"ctrl+shift+v",
|
|
38
|
+
"shift+ctrl+v",
|
|
39
|
+
"ctrl+V",
|
|
40
|
+
)
|
|
41
|
+
for key in keys:
|
|
42
|
+
_, _, app = _file_app("README.md", "# Title", root_is_tmp=True, edit_mode=True)
|
|
32
43
|
async with app.run_test() as pilot:
|
|
33
44
|
await pilot.pause()
|
|
34
45
|
await _press(pilot, key)
|
|
@@ -85,6 +96,20 @@ async def test_markdown_preview_toc_button_only_shows_for_preview() -> None:
|
|
|
85
96
|
assert toc_button.styles.display == "none"
|
|
86
97
|
|
|
87
98
|
|
|
99
|
+
async def test_markdown_preview_hotkeys_warn_without_open_buffer() -> None:
|
|
100
|
+
for key in ("cmd+shift+v", "super+shift+v", "ctrl+shift+v"):
|
|
101
|
+
_, app = _directory_app()
|
|
102
|
+
notifications: list[tuple[str, str | None]] = []
|
|
103
|
+
app.notify = lambda message, **kwargs: notifications.append(
|
|
104
|
+
(str(message), kwargs.get("severity"))
|
|
105
|
+
)
|
|
106
|
+
async with app.run_test() as pilot:
|
|
107
|
+
await pilot.pause()
|
|
108
|
+
await _press(pilot, key)
|
|
109
|
+
assert not list(app.query("#markdown-preview")), key
|
|
110
|
+
assert notifications == [("No file open", "warning")], key
|
|
111
|
+
|
|
112
|
+
|
|
88
113
|
async def test_cmd_shift_v_warns_for_non_markdown_file() -> None:
|
|
89
114
|
_, _, app = _file_app("notes.txt", "# Plain text", root_is_tmp=True)
|
|
90
115
|
notifications: list[tuple[str, str | None]] = []
|
|
@@ -205,5 +230,5 @@ async def test_keys_help_warns_for_ghostty_conflicted_markdown_preview() -> None
|
|
|
205
230
|
assert ("⚠️ ⌘⇧V / ⌃⇧V", "Toggle Markdown preview") in rows
|
|
206
231
|
assert (
|
|
207
232
|
app.screen.query_one(".binding-legend", Static).content
|
|
208
|
-
== "⚠️ Unbind this shortcut in
|
|
233
|
+
== "⚠️ Unbind this shortcut in your terminal config to use it in Riched."
|
|
209
234
|
)
|
|
@@ -4,26 +4,26 @@ requires-python = ">=3.12"
|
|
|
4
4
|
|
|
5
5
|
[[package]]
|
|
6
6
|
name = "basedpyright"
|
|
7
|
-
version = "1.39.
|
|
7
|
+
version = "1.39.10"
|
|
8
8
|
source = { registry = "https://pypi.org/simple" }
|
|
9
9
|
dependencies = [
|
|
10
10
|
{ name = "nodejs-wheel-binaries" },
|
|
11
11
|
]
|
|
12
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
12
|
+
sdist = { url = "https://files.pythonhosted.org/packages/68/43/ad2999f3b09eb2b1e59931d88fac0f7bcc9c17fc18c903268779bd10cc97/basedpyright-1.39.10.tar.gz", hash = "sha256:c8eaf5302f3265e275c7df4fba194d7afa7c1cb53fbfd448e90098360aca2c2e", size = 24740347, upload-time = "2026-08-13T17:09:02.51Z" }
|
|
13
13
|
wheels = [
|
|
14
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
14
|
+
{ url = "https://files.pythonhosted.org/packages/be/2a/a224054d75a58786c482f63b8ff2a09fc3362268bd1ebd0a61fb3f982153/basedpyright-1.39.10-py3-none-any.whl", hash = "sha256:cbd75d83c0be841329bcfef2d2f1182f152a6d975b8eb199e75cf5b8e9a3de78", size = 13482322, upload-time = "2026-08-13T17:08:59.074Z" },
|
|
15
15
|
]
|
|
16
16
|
|
|
17
17
|
[[package]]
|
|
18
18
|
name = "linkify-it-py"
|
|
19
|
-
version = "2.1.
|
|
19
|
+
version = "2.1.1"
|
|
20
20
|
source = { registry = "https://pypi.org/simple" }
|
|
21
21
|
dependencies = [
|
|
22
22
|
{ name = "uc-micro-py" },
|
|
23
23
|
]
|
|
24
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
24
|
+
sdist = { url = "https://files.pythonhosted.org/packages/53/3e/79f35b8c31a1881893b7e62be80b2573f06e38db47c33065749293ee1b97/linkify_it_py-2.1.1.tar.gz", hash = "sha256:a78f40fee177eb912e9d2375074108378523c38d3fde5d3ee804f465b6cfbfee", size = 30889, upload-time = "2026-08-24T17:16:57.028Z" }
|
|
25
25
|
wheels = [
|
|
26
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
26
|
+
{ url = "https://files.pythonhosted.org/packages/eb/3d/e34b19cd144071c583317268c4feb2c59c03ac57eef69753410c7abb11c0/linkify_it_py-2.1.1-py3-none-any.whl", hash = "sha256:8539a6b470efce90ba9b69e39b848e5b15b7ad89f7f98ca17d3532c243f987dc", size = 20532, upload-time = "2026-08-24T17:16:55.965Z" },
|
|
27
27
|
]
|
|
28
28
|
|
|
29
29
|
[[package]]
|
|
@@ -66,27 +66,27 @@ wheels = [
|
|
|
66
66
|
|
|
67
67
|
[[package]]
|
|
68
68
|
name = "nodejs-wheel-binaries"
|
|
69
|
-
version = "24.
|
|
69
|
+
version = "24.19.0"
|
|
70
70
|
source = { registry = "https://pypi.org/simple" }
|
|
71
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
71
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c0/76/7e97195e14346598565a0de4ca8bdbd5e634b3fb5b1ba590b7b1b89f8a63/nodejs_wheel_binaries-24.19.0.tar.gz", hash = "sha256:db217eef8cab8551667863379b08db4d9067403f6cbbe87481eb40edceb8aa9b", size = 8058, upload-time = "2026-08-19T21:47:19.671Z" }
|
|
72
72
|
wheels = [
|
|
73
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
74
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
75
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
76
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
77
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
78
|
-
{ url = "https://files.pythonhosted.org/packages/01/
|
|
79
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
80
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
73
|
+
{ url = "https://files.pythonhosted.org/packages/8c/52/0774b52c7be8151ad9d5aff44edc100c3f13d6d8eb3765f63ffa40e69fe8/nodejs_wheel_binaries-24.19.0-py2.py3-none-macosx_13_0_arm64.whl", hash = "sha256:e12cbfd69089504e42fb14194ce734a9dcf3eb38c820ca63dd511d36fb964e9c", size = 56047203, upload-time = "2026-08-19T21:46:43.448Z" },
|
|
74
|
+
{ url = "https://files.pythonhosted.org/packages/67/3a/4fdbbfecf2c23d52c0e3f68de7f7c1b3c97a26d328c69c5f6c49c48e340e/nodejs_wheel_binaries-24.19.0-py2.py3-none-macosx_13_0_x86_64.whl", hash = "sha256:1c890adf4b7e6556ccc1ca66c866bb81884b6c9a581dee4e530dc7f78fb9d514", size = 56219459, upload-time = "2026-08-19T21:46:48.45Z" },
|
|
75
|
+
{ url = "https://files.pythonhosted.org/packages/5f/a8/0147149415195c59b8a72a594916bfb80d6be4d586f9fbfda313889e0efc/nodejs_wheel_binaries-24.19.0-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:4e029dadfae1295876063c96b236f673487e8c27379fe146c1e2250283520227", size = 60588256, upload-time = "2026-08-19T21:46:53.298Z" },
|
|
76
|
+
{ url = "https://files.pythonhosted.org/packages/f4/89/6631d0982353da1bb7bc00bb1988f702822c62b42634f57999ee53b5c337/nodejs_wheel_binaries-24.19.0-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:4196a947bcc883f2003ab101762d729f3e99b5e86b75bd09151563403e2eceb8", size = 61123607, upload-time = "2026-08-19T21:46:58.117Z" },
|
|
77
|
+
{ url = "https://files.pythonhosted.org/packages/32/a2/fa30f0841e4602995782e124359f9b910c7b481d98decf61ef0b2fc3ebfb/nodejs_wheel_binaries-24.19.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:352e048ab4dd35e7de5f338d1cc4fcbf77a0e93da30bf7336a8217ee246b31d7", size = 62632842, upload-time = "2026-08-19T21:47:03.42Z" },
|
|
78
|
+
{ url = "https://files.pythonhosted.org/packages/18/01/22d97ca72213f66cc386ee638db30c2e62757fdf761c6029074bced83d1c/nodejs_wheel_binaries-24.19.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:28d078b2ced9e2069516e652dc4b1380e7a1a7f2d3934eccd1611586d283ba4c", size = 63250653, upload-time = "2026-08-19T21:47:07.938Z" },
|
|
79
|
+
{ url = "https://files.pythonhosted.org/packages/88/d1/e3be8fa327a795bcaf7a19cd84299e338a7bce32ff0665fdce9cfa22573c/nodejs_wheel_binaries-24.19.0-py2.py3-none-win_amd64.whl", hash = "sha256:67e3abeb9c3830cae8c8487ae8a2af7cc27dfa75af06145cee5ca7d1857c81bd", size = 42448503, upload-time = "2026-08-19T21:47:12.093Z" },
|
|
80
|
+
{ url = "https://files.pythonhosted.org/packages/1d/37/34cf28ba1691a060174948a9927fe61091982d6048b2e403071a9acce443/nodejs_wheel_binaries-24.19.0-py2.py3-none-win_arm64.whl", hash = "sha256:d9074c665ea68b04e183d82482c86dc907d3a9bd15eb6cf85542cb785266bb36", size = 40090155, upload-time = "2026-08-19T21:47:16.032Z" },
|
|
81
81
|
]
|
|
82
82
|
|
|
83
83
|
[[package]]
|
|
84
84
|
name = "platformdirs"
|
|
85
|
-
version = "4.
|
|
85
|
+
version = "4.11.5"
|
|
86
86
|
source = { registry = "https://pypi.org/simple" }
|
|
87
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
87
|
+
sdist = { url = "https://files.pythonhosted.org/packages/ea/06/cf1564dcc2e2261c8c8c6c05628dc8b418943bdae2a4e58640ceb2f770fa/platformdirs-4.11.5.tar.gz", hash = "sha256:e8b31f4f8bcbbedef91a6b57a706255e4f148d2a4e01648382a0a47342539173", size = 34823, upload-time = "2026-08-27T21:36:37.46Z" }
|
|
88
88
|
wheels = [
|
|
89
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
89
|
+
{ url = "https://files.pythonhosted.org/packages/c7/12/6f3fcd5067a9cbf4f8664b32957973498da8b083455203c8d9cab83a725c/platformdirs-4.11.5-py3-none-any.whl", hash = "sha256:89f8d42695853b89c7170bd49bc3dc593f98a71e695ede88e06a3b247bc4563b", size = 23900, upload-time = "2026-08-27T21:36:36.227Z" },
|
|
90
90
|
]
|
|
91
91
|
|
|
92
92
|
[[package]]
|
|
@@ -119,11 +119,11 @@ wheels = [
|
|
|
119
119
|
|
|
120
120
|
[[package]]
|
|
121
121
|
name = "pygments"
|
|
122
|
-
version = "2.
|
|
122
|
+
version = "2.21.0"
|
|
123
123
|
source = { registry = "https://pypi.org/simple" }
|
|
124
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
124
|
+
sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" }
|
|
125
125
|
wheels = [
|
|
126
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
126
|
+
{ url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" },
|
|
127
127
|
]
|
|
128
128
|
|
|
129
129
|
[[package]]
|
|
@@ -187,7 +187,7 @@ wheels = [
|
|
|
187
187
|
|
|
188
188
|
[[package]]
|
|
189
189
|
name = "riched"
|
|
190
|
-
version = "1.6.
|
|
190
|
+
version = "1.6.4"
|
|
191
191
|
source = { editable = "." }
|
|
192
192
|
dependencies = [
|
|
193
193
|
{ name = "pyyaml" },
|
|
@@ -227,27 +227,27 @@ dev = [
|
|
|
227
227
|
|
|
228
228
|
[[package]]
|
|
229
229
|
name = "ruff"
|
|
230
|
-
version = "0.
|
|
231
|
-
source = { registry = "https://pypi.org/simple" }
|
|
232
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
233
|
-
wheels = [
|
|
234
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
235
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
236
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
237
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
238
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
239
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
240
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
241
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
242
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
243
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
244
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
245
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
246
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
247
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
248
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
249
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
250
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
230
|
+
version = "0.16.5"
|
|
231
|
+
source = { registry = "https://pypi.org/simple" }
|
|
232
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f3/85/c8e12473c93018f92d19dd988a294202e1c27426c47ec4de53ffb847b8d8/ruff-0.16.5.tar.gz", hash = "sha256:1b88500f9ffbcab3dedb0082c9f9492e91ec3d618aac1236a3e0189938f7040b", size = 4912003, upload-time = "2026-08-27T16:34:18.258Z" }
|
|
233
|
+
wheels = [
|
|
234
|
+
{ url = "https://files.pythonhosted.org/packages/c6/b6/77c90a970fe2dae17a723acbd011043ea97c98d7deacccefdc4ba74ec512/ruff-0.16.5-py3-none-linux_armv6l.whl", hash = "sha256:12e5f673e774c35fbb62f288809c7653b73445f8ecec6b6063fd6ea3521aa14b", size = 10011941, upload-time = "2026-08-27T16:33:41.287Z" },
|
|
235
|
+
{ url = "https://files.pythonhosted.org/packages/4b/46/6cf67cf6411885a1d6f7f6d801682f155536a85176d10b605e2ceffed8bd/ruff-0.16.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:eda58a5802de40e7ed5b32b64e0b32539338cc6fcd2c78f61e3ad6a0d79f51c3", size = 10204049, upload-time = "2026-08-27T16:33:44.056Z" },
|
|
236
|
+
{ url = "https://files.pythonhosted.org/packages/46/fd/c8720ca7a090abf0c2fef4abe8a5ef6e5127ed15196d8886ff75a2b370e2/ruff-0.16.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5ae9a7b9a8875131f40f8fe967cc86abf899779efd663cb7ce3d572d01da7eb", size = 9809037, upload-time = "2026-08-27T16:33:46.257Z" },
|
|
237
|
+
{ url = "https://files.pythonhosted.org/packages/43/45/a684caacdedaca180f52bacccc40bf0789d2c5a7c75f25324853e9eaedb5/ruff-0.16.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b719b0a1f4d59710d283ab2965f621684a108a9e41da622e3b23f0326cd0025", size = 9964129, upload-time = "2026-08-27T16:33:48.352Z" },
|
|
238
|
+
{ url = "https://files.pythonhosted.org/packages/9e/f2/5d2bcdaca6b5b93d1b4dfc166cd2aebf7680143a1b38a28759df13a94d31/ruff-0.16.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2298f2780ed1be0c5cb1361e32ab7b1467f3cce7dabe101d2210a314f2fe42e9", size = 9821518, upload-time = "2026-08-27T16:33:50.57Z" },
|
|
239
|
+
{ url = "https://files.pythonhosted.org/packages/aa/ff/011cce29accf9257d5974145b733fc653a37985ed6825413a3987cefbfe0/ruff-0.16.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:258f29035a2dd021e7861e631b227a5b3f14e50c1184c9a6a122c5f4576154d7", size = 10534835, upload-time = "2026-08-27T16:33:52.522Z" },
|
|
240
|
+
{ url = "https://files.pythonhosted.org/packages/d7/5a/f0cf109bada9bba0e96c90c21c9f9251803f57225c32d293327a03c710d6/ruff-0.16.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9a4f0432966834019c74d1b7e5c51224305d7713f3d7faf3e7451f1a3be3cde", size = 11252550, upload-time = "2026-08-27T16:33:54.521Z" },
|
|
241
|
+
{ url = "https://files.pythonhosted.org/packages/63/4d/1d481aaea2046c6a7ed7c291f9004c669cce3c087b6b376ed5b08271e3fe/ruff-0.16.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5eb3a8c3d0ade9cea42b591fd530368e8798380e30e0a308b85a5cf718f09ea", size = 10777949, upload-time = "2026-08-27T16:33:56.88Z" },
|
|
242
|
+
{ url = "https://files.pythonhosted.org/packages/ee/34/ee245ca55f64443233034b3d02b03236b19242004281247c079390b7facd/ruff-0.16.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef0f69e191a13a3c9816f63163c88790cb12cd157bbbb384e9c44745702ab105", size = 10311656, upload-time = "2026-08-27T16:33:59.12Z" },
|
|
243
|
+
{ url = "https://files.pythonhosted.org/packages/a7/4d/c33a333e341c0a2b96c715b52d89a606f5a34cd4ac493cd9b8d0187186b8/ruff-0.16.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0eeab41fbea2c42f98dfb9822cdccda9d24ba38d49f6dc945b5c236d48f0ef29", size = 10532125, upload-time = "2026-08-27T16:34:01.166Z" },
|
|
244
|
+
{ url = "https://files.pythonhosted.org/packages/30/e1/a64cef78b40192497bb98a27a8aa8f2c98ee9ee15bc97f7712d94ef32937/ruff-0.16.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f0768e9df4300713fff30733c87575f68b6f1d8de41184e505b7fdd9c0c95eaf", size = 10097648, upload-time = "2026-08-27T16:34:03.16Z" },
|
|
245
|
+
{ url = "https://files.pythonhosted.org/packages/cc/4e/4cdc9ed3c3e109d2f71e62572a37457298d7bc7501ec3138babb7ed32bbd/ruff-0.16.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:95cc70cdc7aa80c338de356279d2adbeb2de0f520b9ecd8aba75b94e95e02f91", size = 9829344, upload-time = "2026-08-27T16:34:05.134Z" },
|
|
246
|
+
{ url = "https://files.pythonhosted.org/packages/39/4a/31ed35ce31729955fc583ee0d176d6e784c1290cb0b0a75cb2134c1ab72a/ruff-0.16.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d185c8398ded1bfd91c0c2cb258346307571eccc473a8490af8c3977399c384a", size = 10277117, upload-time = "2026-08-27T16:34:07.425Z" },
|
|
247
|
+
{ url = "https://files.pythonhosted.org/packages/a8/a0/60356d86687b4b666d593df213f4dc3041750d024cb7bf2cfa81cfd65c2e/ruff-0.16.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fb8e3a3c4c6a784150a7ced53b015f4b253fc2bf97a610886419ead64b4756ef", size = 10711653, upload-time = "2026-08-27T16:34:09.712Z" },
|
|
248
|
+
{ url = "https://files.pythonhosted.org/packages/ed/20/656d67f5b25ca9bda4e02b1de25867b2954e1d19e03648060f167ad0f4cc/ruff-0.16.5-py3-none-win32.whl", hash = "sha256:288b0a5f080492fe5635db849f9e2e84aa3cce7b7f0e955997d416c507c76a26", size = 10034250, upload-time = "2026-08-27T16:34:11.8Z" },
|
|
249
|
+
{ url = "https://files.pythonhosted.org/packages/5b/42/ee8e68a207b9127fcde6c3d7e197def432f346cb1af159e1fa14ca0d1cdc/ruff-0.16.5-py3-none-win_amd64.whl", hash = "sha256:ddc6385fb2137f616357ca03d6c74f4be987f80fed4008566b754f6032b8546f", size = 10516714, upload-time = "2026-08-27T16:34:13.963Z" },
|
|
250
|
+
{ url = "https://files.pythonhosted.org/packages/73/e3/7df5a396e445b9ba49ce9a9437439a4d80042c61c0ade199abf8d16de1ac/ruff-0.16.5-py3-none-win_arm64.whl", hash = "sha256:a64abe90968719b851bb7cedffaa8753fbdbdadab483089682db623f3edc587e", size = 10391564, upload-time = "2026-08-27T16:34:16.064Z" },
|
|
251
251
|
]
|
|
252
252
|
|
|
253
253
|
[[package]]
|
|
@@ -261,7 +261,7 @@ wheels = [
|
|
|
261
261
|
|
|
262
262
|
[[package]]
|
|
263
263
|
name = "textual"
|
|
264
|
-
version = "8.2.
|
|
264
|
+
version = "8.2.8"
|
|
265
265
|
source = { registry = "https://pypi.org/simple" }
|
|
266
266
|
dependencies = [
|
|
267
267
|
{ name = "markdown-it-py", extra = ["linkify"] },
|
|
@@ -271,9 +271,9 @@ dependencies = [
|
|
|
271
271
|
{ name = "rich" },
|
|
272
272
|
{ name = "typing-extensions" },
|
|
273
273
|
]
|
|
274
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
274
|
+
sdist = { url = "https://files.pythonhosted.org/packages/00/21/39a76b01bd5eea82a04baaca7580e105d8c59450df03998345bb2cfb307b/textual-8.2.8.tar.gz", hash = "sha256:3f106a9fbc73e39dd266c9712432087de78a6d644084c7c241d6a25c3169115b", size = 1860502, upload-time = "2026-06-30T06:51:24.495Z" }
|
|
275
275
|
wheels = [
|
|
276
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
276
|
+
{ url = "https://files.pythonhosted.org/packages/fb/be/35261223d9416a0751cdff1c7b4a6f881387218a12d439fe22fefebc8c04/textual-8.2.8-py3-none-any.whl", hash = "sha256:267375fd402dc8d981457212efa71f0e3365fd17bba144ba9bb3ed7563cb374a", size = 731418, upload-time = "2026-06-30T06:51:26.364Z" },
|
|
277
277
|
]
|
|
278
278
|
|
|
279
279
|
[package.optional-dependencies]
|
|
@@ -308,31 +308,34 @@ sdist = { url = "https://files.pythonhosted.org/packages/f7/6c/d51b36377c35e4f9e
|
|
|
308
308
|
|
|
309
309
|
[[package]]
|
|
310
310
|
name = "tree-sitter"
|
|
311
|
-
version = "0.
|
|
312
|
-
source = { registry = "https://pypi.org/simple" }
|
|
313
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
314
|
-
wheels = [
|
|
315
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
316
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
317
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
318
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
319
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
320
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
321
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
322
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
323
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
324
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
325
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
326
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
327
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
328
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
329
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
330
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
331
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
332
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
333
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
334
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
335
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
311
|
+
version = "0.26.0"
|
|
312
|
+
source = { registry = "https://pypi.org/simple" }
|
|
313
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f7/03/5600b84aff2e6c4fe80cfebb4063fe2f50299521befe5f6092ab8c082f4a/tree_sitter-0.26.0.tar.gz", hash = "sha256:b40c219edccc4564530c96f8f1556f6202b37cda964d1cbd7bd2b7e68b40a245", size = 191423, upload-time = "2026-06-30T12:14:27.933Z" }
|
|
314
|
+
wheels = [
|
|
315
|
+
{ url = "https://files.pythonhosted.org/packages/87/ca/565702c44815393e3a973552ad546db4e5ca081ca8698640b4e93d809f51/tree_sitter-0.26.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6cb2bd20efb2544c19ac54486ab7cb8ec7b36f913bbe1ce95df84acb96743d9c", size = 148934, upload-time = "2026-06-30T12:14:01.188Z" },
|
|
316
|
+
{ url = "https://files.pythonhosted.org/packages/54/6f/8bb61957f16ec1b1d92410a006cdc84a952b6352a7313b2ad299f2d21484/tree_sitter-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:918d89529786873f0982a0f59c2a303cd065fbfd1b903d71a8e4e1584f67b42e", size = 140820, upload-time = "2026-06-30T12:14:02.087Z" },
|
|
317
|
+
{ url = "https://files.pythonhosted.org/packages/78/0a/8a6f08559182643a814a4ab559948ae817b2851890fd9b995a4fff6541ce/tree_sitter-0.26.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30a88be89ff1f2755297f81e8080d88b795dd98720c3f9fa2acf93873182cc95", size = 638844, upload-time = "2026-06-30T12:14:03.428Z" },
|
|
318
|
+
{ url = "https://files.pythonhosted.org/packages/8a/2f/6e6781b31677231366cb3cf27bc8269157f6d4b03c9032865a4f5f2bbe7e/tree_sitter-0.26.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a6b333b0282d8bb0af741f9b018bd2523d4eecb2686bf6717066a625fecfaa4", size = 667487, upload-time = "2026-06-30T12:14:04.669Z" },
|
|
319
|
+
{ url = "https://files.pythonhosted.org/packages/02/0b/0483078c8567445557a7015b0e5b187f6d7d4fda73464df9c4bdea7f7f3c/tree_sitter-0.26.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f3c44339dd34fe8eb2b8d5aa7610660499a795f70376b130bbee7a437337280", size = 647975, upload-time = "2026-06-30T12:14:05.797Z" },
|
|
320
|
+
{ url = "https://files.pythonhosted.org/packages/27/68/da83ca72c984e96ab4eb3bee0db1a6ffb5de1c8c455f92bd9f420cde7f0e/tree_sitter-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94550e13b6ae576969da40246f4c4abb206380b5375ad43f26dd9151d55438e3", size = 665018, upload-time = "2026-06-30T12:14:07.278Z" },
|
|
321
|
+
{ url = "https://files.pythonhosted.org/packages/d1/36/4d67927fd47b89af4a00f65f55a7370e28778cd50e972c2430487e3ecc27/tree_sitter-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca89e361a276dbc934b28a43dd881199e25d34ff5493ee0ce45f3c52a6124a37", size = 129619, upload-time = "2026-06-30T12:14:08.373Z" },
|
|
322
|
+
{ url = "https://files.pythonhosted.org/packages/ed/72/cdefad523eb78710679c6da6a79e3d90f5afd32b1c6aa5a17bac7eef99f6/tree_sitter-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:bc6cb01d5ee75c85424aa1f1c72a82d8f07fd52539a0f3c4a6ed3e8721079b84", size = 116545, upload-time = "2026-06-30T12:14:09.273Z" },
|
|
323
|
+
{ url = "https://files.pythonhosted.org/packages/cb/b0/465257cf8f972ad9f9812ec1cbaa8ec210ebebb601ade9a15881aa2436b4/tree_sitter-0.26.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed0889dbed843ce45ede9f5169c0b2dea2222f12685844a03fadb81f12705867", size = 148893, upload-time = "2026-06-30T12:14:10.541Z" },
|
|
324
|
+
{ url = "https://files.pythonhosted.org/packages/a1/ec/19d093e854b45e807fecfdd26105c266f43aeecc39c4dc97992a7074ad5a/tree_sitter-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6189c6c340c7384357711e3d92645e96bfb79f7a502f86de1ebdb23eb43f7dab", size = 140829, upload-time = "2026-06-30T12:14:11.626Z" },
|
|
325
|
+
{ url = "https://files.pythonhosted.org/packages/9b/ee/87e74671ed63a837e7a1f17ab94aa3913871e033b27523d8e7b83d6f7ad0/tree_sitter-0.26.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ff2e0750b7daa722302838356d7b65e303829b7eb73c915df127ddba115e1d1", size = 639334, upload-time = "2026-06-30T12:14:12.836Z" },
|
|
326
|
+
{ url = "https://files.pythonhosted.org/packages/66/e7/f7e04cd9dff6b6ac0adf23922796fbc76accd4cf4bcda50542748d485679/tree_sitter-0.26.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7075ef857ef86f327dbb72d1e2574dda78db5754b3a1fca6506acd7fe5d561a7", size = 668102, upload-time = "2026-06-30T12:14:14.035Z" },
|
|
327
|
+
{ url = "https://files.pythonhosted.org/packages/d3/90/0bfb16b7894fea728c774a89d5af421a9368a2f913bbd4e8dcab7caaecfb/tree_sitter-0.26.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:26c996c1edfee86e977bb3f5462e74fcec0d0b0db1e85a3c475875763caa03be", size = 648560, upload-time = "2026-06-30T12:14:15.302Z" },
|
|
328
|
+
{ url = "https://files.pythonhosted.org/packages/cd/e6/0fe05ba396e9623b0ae40ccf34171336b8701ec8d7bd0ee9f5224d638665/tree_sitter-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00289bfe7978f3e0dc0ce69813a20fa9f44ea4c100b3ec62043e5eb74ccfc3a2", size = 665121, upload-time = "2026-06-30T12:14:16.403Z" },
|
|
329
|
+
{ url = "https://files.pythonhosted.org/packages/eb/d2/a944b1ca35bed6068dc84a9967aaf3049d8cc0b7a36179eea8787270a6ab/tree_sitter-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:93e220cab7e6a823efeb2046c49171427de92ef71c7c681c01820d14d8d3721f", size = 129615, upload-time = "2026-06-30T12:14:17.463Z" },
|
|
330
|
+
{ url = "https://files.pythonhosted.org/packages/09/ef/c7ca48293580d2249f36940c4eed5b4ddeb9ce75baf9a4ef30621987e0c7/tree_sitter-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:b31a8195d2f224224c530ac814632d98c1dcc123d227442c07c736e86b70d564", size = 116525, upload-time = "2026-06-30T12:14:18.53Z" },
|
|
331
|
+
{ url = "https://files.pythonhosted.org/packages/c5/7a/4d84e6f6ae2c3e757490dd84de251712c31e293dfe31f28da1ec019cefa2/tree_sitter-0.26.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5a3c93a352b7e6f70f73e121bbfa2d0117ba7478bd51114ed35c91b0b78814fa", size = 148901, upload-time = "2026-06-30T12:14:19.452Z" },
|
|
332
|
+
{ url = "https://files.pythonhosted.org/packages/b0/d9/efe62ec65dc9d096e834d27b8c058127e2146e42ff3380b822a233f016a6/tree_sitter-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5fc2f41bf246ff2f70a9cc3690be35ec7580a4923151873d898c8bcb1a4503d3", size = 140805, upload-time = "2026-06-30T12:14:20.478Z" },
|
|
333
|
+
{ url = "https://files.pythonhosted.org/packages/c4/2c/c82326b7b97e3c485c18679883b16f89e5e913c639d3b219d3da70c9e67e/tree_sitter-0.26.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8ea92a255c91671a7ec4625aba3ab7bb5220c423630ffbf83c45d7312abe084", size = 640586, upload-time = "2026-06-30T12:14:21.527Z" },
|
|
334
|
+
{ url = "https://files.pythonhosted.org/packages/e2/7a/f56e7d8282859452611024c7cbc623bfba5b24b8cb9b8f8bc88c5219fe9a/tree_sitter-0.26.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f665510f0fcf4636fb9696f1f7853bed7a3bd764b7bb0cb8494e619c14ed5a0c", size = 668300, upload-time = "2026-06-30T12:14:22.728Z" },
|
|
335
|
+
{ url = "https://files.pythonhosted.org/packages/91/51/240ee81b9d5e9ca0a6cb1528e8605ffa70ab58c89ce126631be96d3e4bae/tree_sitter-0.26.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:253df7ab82cc0a9d311cd65f06e9f99fb3eac55996ae9fc94da22f123a861b90", size = 649627, upload-time = "2026-06-30T12:14:23.819Z" },
|
|
336
|
+
{ url = "https://files.pythonhosted.org/packages/6a/54/760035cefedf9eb44f0f84c4ac22f1322e73155853e272576ee876336312/tree_sitter-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ff80d4833d330a73184a3ac5132abe93c575d2dea31975c6f15c0d21fef238aa", size = 664885, upload-time = "2026-06-30T12:14:25.064Z" },
|
|
337
|
+
{ url = "https://files.pythonhosted.org/packages/c9/1b/0b36fe2a984ecedc4ce6aefd5d56447a6626a8e9b595c4e48658510ce8f8/tree_sitter-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:a4033fecc8f606c7f2e8b8014d0057b74668a7f0152763606f7bc25c5f9ec64c", size = 132688, upload-time = "2026-06-30T12:14:26.106Z" },
|
|
338
|
+
{ url = "https://files.pythonhosted.org/packages/4d/74/ebc041a13fbf40144afdb0d4b447e48e0b4012ca866c63de8b48f801f0c1/tree_sitter-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:823251c4b6725a7c03ed497a339135ede7ae4bdde75bb8be7ef5e305aeb4ff52", size = 120287, upload-time = "2026-06-30T12:14:26.991Z" },
|
|
336
339
|
]
|
|
337
340
|
|
|
338
341
|
[[package]]
|
|
@@ -611,11 +614,11 @@ wheels = [
|
|
|
611
614
|
|
|
612
615
|
[[package]]
|
|
613
616
|
name = "typing-extensions"
|
|
614
|
-
version = "4.
|
|
617
|
+
version = "4.16.0"
|
|
615
618
|
source = { registry = "https://pypi.org/simple" }
|
|
616
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
619
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
|
|
617
620
|
wheels = [
|
|
618
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
621
|
+
{ url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
|
|
619
622
|
]
|
|
620
623
|
|
|
621
624
|
[[package]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|