--- title: television description: 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](https://github.com/alexpasmantier/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 | Key | Value | | --- | --- | | `default_channel` | `files` | | `ui.theme` | `cyberdream-transparent` | | `ui.input_bar.position` | `top`, prompt `>` | | Borders | `rounded` on the input bar, results, and preview | | `ui.preview_panel.size` | `50` | | `ui.help_panel.hidden` | `true` | 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`](/shell/scripts#mtime-sort), which orders lines newest-first by the mtime of the path in the line's last tab-separated field (`--repo` stats `/.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`](#ghq-repos) | `cable/ghq-repos.toml` | ctrl-o (`gho`) | | [`git-files`](#git-files) | `cable/git-files.toml` | ctrl-e | | [`pj`](#pj) | `cable/pj.toml` | ctrl-p, down on an empty prompt (`pj`) | | [`files`](#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](/shell/fish#key-bindings) and [bash and zsh](/shell/bash-zsh). ### ghq-repos Entries are `namepath`: 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 && nvim .` on `/dev/tty` | | ctrl-b | `browse`: `cd && gop` in fork mode, so tv stays open ([gop](/shell/scripts#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`, the preview panel is 40% wide, and enter runs `pj --run`. Running `pj` scans the project and opens this cable with its own records. See [pj](/shell/scripts#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`.