television
tv config symlinked from the repo, a transparent cyberdream theme, and the custom cables behind gho, pj, and ctrl-e in fish, zsh, and bash.
television (tv) is a fuzzy picker built on “cables”: TOML files that define a source command, a preview, and actions. Every shell picker in the repo runs on a tv cable, with the same keys in fish, zsh, and bash.
| Source | television/config.toml, television/cable/*.toml, television/themes/cyberdream-transparent.toml |
| Link | dot_config/symlink_television.tmpl → ~/.config/television is a symlink to {{ .chezmoi.sourceDir }}/television |
| Target | ~/.config/television/ |
| Ignore | .chezmoiignore.tmpl lists television, so it is not copied to ~/television |
| Install | Not listed in .chezmoidata/packages.yaml; install separately |
The whole directory is a symlink into the source tree, so edits apply without chezmoi apply. cable/ holds tv’s stock cables plus the repo’s own and overridden ones.
config.toml
The UI is minimal: no borders, a hidden status bar, and padding in place of frames.
| Key | Value |
|---|---|
default_channel |
files |
ui.theme |
cyberdream-transparent |
ui.input_bar |
position top, prompt ❯, border_type = "none", padding left 1, right 1, bottom 1 |
ui.status_bar.hidden |
true (f12 toggles it) |
ui.results_panel |
border_type = "none", padding left 1, right 1 |
ui.preview_panel |
size = 50, scrollbar = false, border_type = "none", padding left 2, right 1 |
ui.help_panel.hidden |
true |
tv 0.15 has no config key for inline mode (--inline and --height are CLI-only), so every call site passes --inline: gho (tv ghq-repos --inline), pj (tv pj --inline …), ctrl-e (tv git-files --inline), and bash ctrl-t (tv --autocomplete-prompt … --inline). Actions that re-exec tv pass it too: files (tv files .. --inline), dirs (tv dirs .. --inline), and channels (tv {} --inline). tv --inline opens on the line below the prompt and leaves the cursor there on exit; the shell key bindings move the prompt back (fish, bash and zsh).
A channel that sets its own [ui.preview_panel] replaces the whole table with tv’s defaults (rounded border, scrollbar). The stock cables that override it (alias, cargo-commands, crontab, env, fonts, gh-issues, journal, man-pages, npm-scripts, opencode-sessions, ports, tea-issues, tea-prs, text, todo-comments) therefore repeat border_type = "none", scrollbar = false, and padding left 2, right 1.
Global keys added on top of the defaults:
| Key | Action |
|---|---|
| ctrl-e | actions:edit: the channel’s edit action |
| ctrl-h | actions:goto_parent_dir; the help panel loses ctrl-h |
| end | go_to_input_end (unchanged) |
Theme
themes/cyberdream-transparent.toml is a separate file because tv 0.15’s builtin cyberdream shadows a user theme of the same name and paints an opaque #16181a background. This theme omits background, so kitty’s translucent background shows through (tv 0.15 rejects background = 'none').
| Key | Color |
|---|---|
border_fg |
#3c4048 |
text_fg, input_text_fg, result_value_fg |
#ffffff |
dimmed_text_fg |
#7b8496 |
result_name_fg |
#5ea1ff |
result_line_number_fg |
#f1ff5e |
match_fg |
#5ef1ff |
selection_fg / selection_bg |
#5eff6c on #3c4048 |
preview_title_fg |
#ffaecf |
result_count_fg |
#ffbd5e |
channel_mode_bg |
#5ef1ff on #16181a |
remote_control_mode_bg |
#5eff6c on #16181a |
action_picker_mode_bg |
#bd5eff on #16181a |
Sorting
Every custom cable pipes its source through mtime-sort, which orders lines newest-first by the mtime of the path in the line’s last tab-separated field (--repo stats <path>/.git/index first). tv then ranks match quality and frecency on top of that order. All custom cables set shell = "bash", because $SHELL is fish.
Custom cables
| Cable | File | Opened by |
|---|---|---|
ghq-repos |
cable/ghq-repos.toml |
ctrl-o (gho) |
git-files |
cable/git-files.toml |
ctrl-e |
pj |
cable/pj.toml |
ctrl-p, down on an empty prompt (pj) |
files |
cable/files.toml |
tv, ctrl-t autocomplete |
The keys are bound in fish (fish_user_key_bindings.fish), zsh (keybinds.zsh), and bash (keybinds.bash). See fish and bash and zsh.
ghq-repos
Entries are name<TAB>path: tv shows and matches the name and prints the path. ctrl-s cycles between the two sources.
| Source | Entries | Sort |
|---|---|---|
| Repos | ghq list under ghq root, plus the chezmoi source (~/.local/share/chezmoi) listed as github.com/prdlk/dotfiles |
mtime-sort --repo |
| Vaults | Every directory under ~/Documents/Obsidian (depth 3) that contains .obsidian, named relative to that directory |
mtime-sort |
Preview. onefetch --no-art for git directories, otherwise eza --tree --level 2 (falling back to ls -la).
| Key | Action |
|---|---|
| enter | Print the path. The gho function cds into it, clears, and runs onefetch in git repos |
| ctrl-e | edit: cd <path> && nvim . on /dev/tty |
| ctrl-b | browse: cd <path> && gop in fork mode, so tv stays open (gop) |
Needs: ghq, fd, onefetch, mtime-sort.
git-files
| Source | Entries |
|---|---|
| Tracked | git ls-files of the whole repo (from the toplevel), or fd -t f outside a repo |
| All | fd -t f -H -E .git |
Both are sorted with mtime-sort. The preview is bat -n with BAT_THEME=ansi. enter runs edit: nvim {} on /dev/tty.
Needs: git, fd, bat, mtime-sort.
pj
Source pj --list; tv shows the display column. The preview runs pj --preview in the global 50% panel, and enter runs pj --run. Running pj scans the project and opens this cable with its own records. See pj.
Needs: pj, mtime-sort.
files
Overrides tv’s stock files cable. Sources Default (fd -t f) and Hidden (fd -t f -H), both piped through mtime-sort. The edit action opens the selection in nvim on /dev/tty, so it also works from ctrl-t, where the shell captures tv’s stdout.
Needs: fd, bat, mtime-sort.