Skip to content

feat: multi-column results with fuzzy filtering (e.g. %p in helix) #1012

@delafthi

Description

@delafthi

Problem

When channel entries carry multiple logical fields (e.g. <name> <group>, <path> <symbol>, or <name> <id>), the fuzzy search operates on the entire concatenated string. There's no way to target a specific field independently.

Feature

Allow channel definitions to declare "columns" in the results pane. Each column maps to a named field of the entry and can optionally participate in fuzzy matching via a prompt modifier (similar to how %p already works for path filtering in Helix, see https://docs.helix-editor.com/pickers.html#filtering-picker-results).

  • Display-only columns — extra fields rendered in the results pane but not included in the default fuzzy match (useful for annotations like timestamps, tags, counts).
  • Searchable columns — fields that can be targeted explicitly in the prompt using a %<key> modifier.

Example prompt syntax:

<term for col1> %<specifier> <term for col2>

This would fuzzy-match <term for col1> against the primary column and <term for col2> against the namespace column independently.

Examples

A custom channel emitting <project> <namespace> pairs could declare:

[[channel.entries]]
columns = [
  { field = "name", searchable = true },
  { field = "group", searchable = true, modifier = "g" },
]

Prompt usage:

foo %g bar

→ fuzzy-filters entries where the name matches foo and the groups matches bar.

For a file+symbol channel:

columns = [
  { field = "path", searchable = true, modifier = "p" },
  { field = "symbol", searchable = true },
  { field = "kind", searchable = false },   # display-only (e.g. "fn", "struct")
]

Prompt:

parse %p src/parser

→ symbols matching parse inside files matching src/parser, with kind shown as an annotation column.

Additional context

This would make television significantly more powerful for structured data sources where entries are naturally multi-dimensional. The %p convention already feels familiar to Helix users, so extending it to arbitrary named columns should be intuitive. Display-only columns also open the door to richer and visually more appealing UIs.

Just putting this out here. I haven't thought about the implementation and would be happy to know what others think.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions