|
1 | | -# Out of scope |
| 1 | +# Out of Scope & Wishlist |
2 | 2 |
|
3 | | -Things that have been considered, intentionally not implemented, and may stay that way — or may graduate to a real plan later. Add to this list when something is deferred during design / review; remove when an item ships. |
| 3 | +A living list of items raised during design, implementation, or feature sweeps |
| 4 | +that are either explicitly deferred, decided against, or noted as "maybe |
| 5 | +later". Also doubles as a wishlist — items under "Waiting" are things worth |
| 6 | +building once someone explicitly asks. Kept here so ideas don't disappear |
| 7 | +into the black hole of spec files after each release. |
4 | 8 |
|
5 | | -## Platform |
| 9 | +Organized into four buckets by reason for non-inclusion. When an item ships, |
| 10 | +remove it from this file and note the shipping version in the CHANGELOG |
| 11 | +entry rather than leaving a crossed-out line here. |
6 | 12 |
|
7 | | -- **Windows support.** Code uses POSIX pager invocation, libc SIGPIPE reset, and assumes Unix-style `~/.config/`. Targeting Win would require a separate code path in `pager::setup` and config-path resolution, plus a Windows CI matrix. (`term_width` already uses `crossterm::terminal::size`, so that piece is portable.) |
| 13 | +- **Waiting** — can be done; nobody's asked for it. |
| 14 | +- **Deferred** — possible to implement; actively put off (scope/complexity |
| 15 | + trade-off or waiting on a concrete use case). |
| 16 | +- **Not yet supported** — blocked by upstream / ecosystem maturity; may ship |
| 17 | + when the blocker clears. |
| 18 | +- **Out of scope** — fundamentally can't be implemented, architecturally |
| 19 | + mismatched, or intentionally declined by policy. |
8 | 20 |
|
9 | | -## Rendering |
| 21 | +--- |
| 22 | + |
| 23 | +## Waiting |
| 24 | + |
| 25 | +### Rendering |
10 | 26 |
|
11 | | -- **`--diff-context` filters output.** Today it's only passed to `git2::DiffOptions`; the printer still emits all lines. Real bat shows only changed regions ± context lines when `--diff` is on. |
12 | 27 | - **Word-boundary wrapping.** `--wrap=character` and `--wrap=auto` currently break at column boundaries (mid-word if necessary). Real word-boundary wrap (break at spaces, hyphenate gracefully) is a different algorithm — fine for prose, arguably wrong for source code anyway, so deferred unless asked. |
13 | 28 | - **`--wrap=auto` adapting on stdout-not-a-tty.** Real bat treats `auto` as "wrap when stdout is a TTY, never otherwise." We currently treat `auto` and `character` identically. Could add the TTY-aware nuance if someone pipes batty to a tool that chokes on inserted line breaks. |
| 29 | + |
| 30 | +### Theming |
| 31 | + |
| 32 | +- **Custom theme loading from disk.** Themes come exclusively from `two-face::theme::extra()`. A real `--theme-file path/to/theme.tmTheme` flag is not wired. |
| 33 | + |
| 34 | +### Interactive mode |
| 35 | + |
| 36 | +- **Persisted cursor position across runs.** `~/.local/state/batty/positions.toml` or similar — not implemented. |
| 37 | + |
| 38 | +### Markdown rendering |
| 39 | + |
| 40 | +- **Configurable markdown skin.** termimad's `MadSkin::default()` is used; no `--markdown-skin` flag. |
| 41 | + |
| 42 | +### Rhai grammar gaps |
| 43 | + |
| 44 | +- **Char literal scope** — single-quoted `'a'` are technically char literals in Rhai, but we color them as `string.quoted.single` for theme compatibility. Could be revisited if a theme really needs different coloring. |
| 45 | + |
| 46 | +--- |
| 47 | + |
| 48 | +## Deferred |
| 49 | + |
| 50 | +### Rendering |
| 51 | + |
| 52 | +- **`--diff-context` filters output.** Today it's only passed to `git2::DiffOptions`; the printer still emits all lines. Real bat shows only changed regions ± context lines when `--diff` is on. |
14 | 53 | - **Sub-paragraph row precision in markdown.** The source ↔ rendered map is block-granular: a wrapped 6-row paragraph shows the source-line on row 1 with continuations blank in the gutter. Per-row precision would require replacing termimad with a custom renderer (we walk pulldown_cmark events but defer rendering to termimad for layout). |
15 | 54 | - **8-bit color downsampling.** Output uses truecolor (`as_24_bit_terminal_escaped`); 256-color terminals get whatever the terminal emulator does at render time. Real bat uses `ansi_colours` to emit nearest-color escapes when truecolor isn't supported. |
16 | 55 | - **HTML output mode.** Bat's `html_for_string`/`html_for_file` APIs in syntect aren't exposed. |
17 | 56 | - **Image rendering** (kitty / iTerm2 protocols) — `--show-images` not implemented. |
18 | 57 |
|
19 | | -## Theming |
20 | | - |
21 | | -- **Custom theme loading from disk.** Themes come exclusively from `two-face::theme::extra()`. A real `--theme-file path/to/theme.tmTheme` flag is not wired. |
22 | | - |
23 | | -## Interactive mode |
| 58 | +### Interactive mode |
24 | 59 |
|
25 | 60 | - **Search (`/pattern`)** — vim-style search not implemented. |
26 | 61 | - **Mouse support** — keyboard only. No click-to-position-cursor, no scroll-wheel. |
27 | 62 | - **Mouse-driven link follow** in markdown view — also keyboard-only. |
28 | 63 | - **Multiple files in one session.** Today `-i` rejects `>1` file. A tabstrip / `:n` `:p` switching would be a fair amount of work. |
29 | | -- **Persisted cursor position across runs.** `~/.local/state/batty/positions.toml` or similar — not implemented. |
30 | 64 | - **`--wrap` is forced off in interactive mode.** Long lines truncate at the terminal edge. Honoring `--wrap` here would let one source line span multiple visual rows, which breaks the cursor / viewport / status-bar math (all currently 1 source line = 1 row). A proper fix needs per-visual-row scrolling; deferred until someone asks. |
31 | 65 | - **Horizontal scroll** for long lines that exceed the terminal width when `--wrap` is off — they're truncated by the terminal. |
32 | 66 |
|
33 | | -## Follow / tail mode |
| 67 | +### Follow / tail mode |
34 | 68 |
|
35 | 69 | - **Low-latency file watching.** v1 polls every 200 ms via `fs::metadata`. A real `notify` / `inotify` / `kqueue` / `FSEvents` watcher would deliver appended bytes immediately at the cost of a fairly heavy dep + per-platform code. |
36 | 70 | - **Highlighter state preservation across polls.** Each poll re-creates the `Highlighter`, so a multi-line construct (block comment, multi-line string) that begins in one poll's contents and ends in another may briefly miscolor at the boundary. Fix would require persisting `syntect::easy::HighlightLines` state across iterations and replaying only new lines. |
37 | 71 | - **Multiple files concurrently.** v1 enforces single file. Real `tail -f a.log b.log` interleaves output with `==> file <==` headers. |
38 | 72 |
|
39 | | -## Markdown rendering |
| 73 | +### Markdown rendering |
40 | 74 |
|
41 | 75 | - **Inline syntax highlighting of fenced code blocks.** termimad's support is limited; we don't pre-process fences with syntect first. Code blocks render with termimad's default code styling. |
42 | | -- **Configurable markdown extension list.** `is_markdown_path()` matches `.md` / `.markdown` / `.mdown` / `.mkd` literally. If you want `.rmd` or `.txt` to auto-render, pass `--markdown` explicitly. |
43 | | -- **Content-based markdown detection.** No first-line sniffing for markdown-y patterns. Extension-based is the user's mental model; sniffing would mis-fire on plaintext with `# headers`. |
44 | | -- **Configurable markdown skin.** termimad's `MadSkin::default()` is used; no `--markdown-skin` flag. |
45 | 76 |
|
46 | | -## Rhai grammar gaps |
| 77 | +--- |
| 78 | + |
| 79 | +## Not yet supported |
| 80 | + |
| 81 | +### Rhai grammar gaps |
47 | 82 |
|
48 | 83 | - **Closure pipe syntax** `|x| x + 1` — `|` is matched as bitwise-or, no special closure context. Disambiguating from bitwise OR requires backtracking-style context the grammar engine can't easily express; most users won't notice since identifier and operator both color reasonably. |
49 | | -- **Full semantic awareness** of `Fn(...)`, `this`, `global`, etc. — we tokenize them (Fn as builtin; this/global as variable.language) but don't reflect Rhai's special semantics (e.g., `this` only valid inside method-style functions). That's intelligence beyond TextMate scope. |
50 | | -- **Char literal scope** — single-quoted `'a'` are technically char literals in Rhai, but we color them as `string.quoted.single` for theme compatibility. Could be revisited if a theme really needs different coloring. |
51 | 84 |
|
52 | | -## Code-quality nits (intentionally tolerated) |
| 85 | +--- |
53 | 86 |
|
54 | | -(empty — flush 0.5.0 cleared the `PrinterConfig::wrap` placeholder.) |
| 87 | +## Out of scope |
| 88 | + |
| 89 | +### Platform |
| 90 | + |
| 91 | +- **Windows support.** Code uses POSIX pager invocation, libc SIGPIPE reset, and assumes Unix-style `~/.config/`. Targeting Win would require a separate code path in `pager::setup` and config-path resolution, plus a Windows CI matrix. (`term_width` already uses `crossterm::terminal::size`, so that piece is portable.) |
| 92 | + |
| 93 | +### Markdown rendering |
| 94 | + |
| 95 | +- **Configurable markdown extension list.** `is_markdown_path()` matches `.md` / `.markdown` / `.mdown` / `.mkd` literally. If you want `.rmd` or `.txt` to auto-render, pass `--markdown` explicitly. |
| 96 | +- **Content-based markdown detection.** No first-line sniffing for markdown-y patterns. Extension-based is the user's mental model; sniffing would mis-fire on plaintext with `# headers`. |
| 97 | + |
| 98 | +### Rhai grammar gaps |
| 99 | + |
| 100 | +- **Full semantic awareness** of `Fn(...)`, `this`, `global`, etc. — we tokenize them (Fn as builtin; this/global as variable.language) but don't reflect Rhai's special semantics (e.g., `this` only valid inside method-style functions). That's intelligence beyond TextMate scope. |
0 commit comments