You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|**Filter & aggregation**|`src/aggregate.ts`|`aggregate()` — filters `CodeMatch[]` by repository and extract exclusion lists; normalises both `repoName` and `org/repoName` forms. |
97
-
|**Team grouping**|`src/group.ts`|`groupByTeamPrefix()` — groups `RepoGroup[]` into `TeamSection[]` keyed by team slug; `flattenTeamSections()` — converts back to a flat list for the TUI row builder. |
98
-
|**Row builder**|`src/render/rows.ts`|`buildRows()` — converts `RepoGroup[]` into `Row[]` with expanded/collapsed state; `rowTerminalLines()` — measures wrapped height; `isCursorVisible()` — viewport clipping. |
|**Filter stats**|`src/render/filter.ts`|`buildFilterStats()` — produces the `FilterStats` object (visible count, total count, active filter string) used by the TUI status bar. |
101
-
|**Selection helpers**|`src/render/selection.ts`|`applySelectAll()` — marks all visible rows as selected; `applySelectNone()` — deselects all. |
102
-
|**Syntax highlighter**|`src/render/highlight.ts`|`highlightFragment()` — maps file extension to a language token ruleset and applies ANSI escape sequences. Falls back to plain text for unknown extensions. |
103
-
|**Output formatter**|`src/output.ts`|`buildOutput()` — entry point for both `--format markdown` and `--format json` serialisation of the confirmed selection. |
|**Filter & aggregation**|`src/aggregate.ts`|`aggregate()` — filters `CodeMatch[]` by repository and extract exclusion lists; normalises both `repoName` and `org/repoName` forms. |
110
+
|**Team grouping**|`src/group.ts`|`groupByTeamPrefix()` — groups `RepoGroup[]` into `TeamSection[]` keyed by team slug; `flattenTeamSections()` — converts back to a flat list for the TUI row builder. |
111
+
|**Row builder**|`src/render/rows.ts`|`buildRows()` — converts `RepoGroup[]` into `Row[]` filtered by the active target (path / content / repo); `rowTerminalLines()` — measures wrapped height; `isCursorVisible()` — viewport clipping. |
|**Filter stats**|`src/render/filter.ts`|`buildFilterStats()` — produces the `FilterStats` object (visible repos, files, matches) used by the TUI filter bar live counter. |
114
+
|**Pattern matchers**|`src/render/filter-match.ts`|`makeExtractMatcher()` — builds a case-insensitive substring or RegExp test function for path or content targets; `makeRepoMatcher()` — wraps the same logic for repo-name matching. |
115
+
|**Selection helpers**|`src/render/selection.ts`|`applySelectAll()` — marks all visible rows as selected (respects filter target); `applySelectNone()` — deselects all visible rows. |
116
+
|**Syntax highlighter**|`src/render/highlight.ts`|`highlightFragment()` — maps file extension to a language token ruleset and applies ANSI escape sequences. Falls back to plain text for unknown extensions. |
117
+
|**Output formatter**|`src/output.ts`|`buildOutput()` — entry point for both `--format markdown` and `--format json` serialisation of the confirmed selection. |
104
118
105
119
## Design principles
106
120
107
121
-**No I/O.** Every component in this layer is a pure function: given the same inputs it always returns the same outputs. This makes them straightforward to test with Bun's built-in test runner.
108
122
-**Single responsibility.** Each component owns exactly one concern (rows, summary, selection, …). The TUI composes them at render time rather than duplicating logic.
109
-
-**`types.ts` as the contract.** All components share the interfaces defined in `src/types.ts` (`TextMatchSegment`, `TextMatch`, `CodeMatch`, `RepoGroup`, `Row`, `TeamSection`, `OutputFormat`, `OutputType`). Changes to these types require updating all components.
123
+
-**`types.ts` as the contract.** All components share the interfaces defined in `src/types.ts` (`TextMatchSegment`, `TextMatch`, `CodeMatch`, `RepoGroup`, `Row`, `TeamSection`, `OutputFormat`, `OutputType`, `FilterTarget`). Changes to these types require updating all components.
110
124
-**`render.ts` as façade.** External consumers import from `src/render.ts`, which re-exports all symbols from the `src/render/` sub-modules plus the top-level `renderGroups()` and `renderHelpOverlay()` functions.
description: "Advanced filter targets (content, path, repo), regex mode in the filter bar, word-jump shortcuts, and several TUI accuracy fixes."
4
+
date: 2026-03-01
5
+
---
6
+
7
+
# What's new in github-code-search v1.5.0
8
+
9
+
> Full release notes: <https://github.com/fulll/github-code-search/releases/tag/v1.5.0>
10
+
11
+
## Highlights
12
+
13
+
### Advanced filter targets
14
+
15
+
The filter bar (press `f`) can now search across three different targets. Outside filter mode, press **`t`** to cycle targets; inside the filter bar, use **Shift+Tab**:
|`[content]`| Code snippet text inside each extract |
21
+
|`[repo]`| Repository name (short or `org/repo` form) |
22
+
23
+
The active target badge is always visible in the filter bar, including in the default `[path]` mode, so you always know what you are filtering against.
24
+
25
+
### Regex mode
26
+
27
+
Press **Tab** while the filter bar is open to toggle regex mode. When active, the filter input is interpreted as a regular expression — the badge shows `[…·regex]` to make it obvious. Invalid patterns match nothing gracefully (zero visible rows, no crash).
28
+
29
+
### Word-jump shortcuts in the filter bar
30
+
31
+
Three equivalent key combinations now move the cursor one word at a time:
32
+
33
+
-**⌥←/→** (macOS Option+Arrow — the most natural shortcut on macOS terminals)
34
+
-**Ctrl+←/→** (common on Linux/Windows terminals)
35
+
-**Alt+b / Alt+f** (readline-style mnemonics)
36
+
37
+
**⌥⌫** (Option+Backspace) / **Ctrl+W** delete the word before the cursor, as before.
38
+
39
+
### Accurate scroll position
40
+
41
+
The viewport used by the scroll engine now accounts for the filter bar height (0–2 lines depending on the active filter mode and badge visibility). Previously, the static `termHeight − 6` estimate could cause the cursor to stop scrolling before it was actually visible. The fix ensures `isCursorVisible` uses exactly the same window as `renderGroups`.
42
+
43
+
### Search-match highlighting on the cursor extract row
44
+
45
+
When the cursor is positioned on an extract row, the file path now shows the search-match highlight (yellow on magenta background) — consistent with how the highlighted repo row already behaved.
0 commit comments