A tabpanel-based dashboard for Vim with clickable widgets for git, feeds, system monitoring, a file tree, games, and more. Widgets are grouped into rotatable panels that you switch between with a single key.
2026-04-24.113840.mp4
- Vim 9.2.386 or later (
scroll/scrollbarsupport in'tabpanelopt') - Built with the
+tabpanelfeature (:echo has('tabpanel')returns 1)
With vim-plug:
Plug 'mattn/vim-supertabpanel'With Vim's built-in package system:
git clone https://github.com/mattn/vim-supertabpanel \
~/.vim/pack/plugins/start/vim-supertabpanelThe panel auto-configures on VimEnter with a default widget layout.
Three commands and three <Plug> maps are provided:
| Command | Default map | Description |
|---|---|---|
:SuperTabPanel |
,tt |
Toggle the panel open/shut |
:SuperTabPanelRotate |
,tr |
Rotate to the next panel |
:SuperTabPanelRotateBack |
,tR |
Rotate to the previous one |
:SuperTabPanelActivate {name} |
Jump to a named panel (tab-completes) |
From Vim script the same is available programmatically:
echo supertabpanel#panel_names() " ['Time', 'Feed', 'Tech', ...]
echo supertabpanel#current_panel_name() " 'Feed'
call supertabpanel#activate('Feed') " by name
call supertabpanel#activate(2) " by indexThe default maps are only installed if you haven't already bound
<Plug>(supertabpanel-toggle), <Plug>(supertabpanel-rotate) or
<Plug>(supertabpanel-rotate-back) yourself.
Most widgets are clickable: click a buffer name to open it, a PR row to open the URL in your browser, a station name to start streaming, etc.
The default layout groups widgets into these panels:
- Time — clock, calendar, weather, sunrise/sunset, moon phase, world clock
- Feed — BTC chart, stock ticker, RSS feeds (Asahi / Mainichi / Hatena Bookmark by default)
- Tech — Hacker News, GitHub trending
- Git — git status, diff hunks, stash, pull requests, GitHub notifications
- Nav — buffers, recent files, marks, jumplist, tags
- Edit — quickfix, diagnostics, registers, macros, undo, clipboard, terminals, quicklaunch
- Work — todo, pomodoro, 今日は何の日 (Japanese Wikipedia "on this day")
- Ops — system monitor (CPU/MEM/BAT), build, tests, docker, Kubernetes pods
- AI — Claude chat, explain, commit message, translate
- Game — tetris, snake, 2048, game of life
- Media — piano, web radio, podcast
- Fun — random 名言 (meigen), ASCII art
- Files — file tree
" Override the entire panel layout (see plugin/supertabpanel.vim for the default).
let g:supertabpanel_panels = [
\ #{ name: 'Time', items: ['clock', 'calendar'] },
\ #{ name: 'Git', items: ['gitstatus', 'diff'] },
\ ]
" Panel width in cells (default 32).
let g:supertabpanel_columns = 32
" Index of the panel shown first (default 0).
let g:supertabpanel_default = 0Each item in a panel's items list can take one of two forms:
- Bare widget name —
'clock'/'weather'/'supertabpanel#widgets#weather'. The widget is instantiated with default parameters. - Dict with params —
#{ widget: '<name>', params: #{ ... } }. The widget is instantiated with the given parameters. Using the dict form you can place the same widget in a panel multiple times with different parameters.
All per-widget options live in params — there are no g:supertabpanel_<widget>_*
globals any more.
let g:supertabpanel_panels = [
\ #{ name: 'Time', items: [
\ 'clock',
\ 'calendar',
\ #{ widget: 'weather', params: #{ location: 'Tokyo' } },
\ #{ widget: 'sunmoon', params: #{ lat: 35.6895, lng: 139.6917 } },
\ #{ widget: 'worldclock', params: #{ zones: [
\ #{ label: 'Tokyo', tz: 'Asia/Tokyo' },
\ #{ label: 'London', tz: 'Europe/London' },
\ #{ label: 'NYC', tz: 'America/New_York' },
\ ]}},
\ ]},
\ #{ name: 'News', items: [
\ #{ widget: 'rssfeed', params: #{
\ name: '朝日新聞',
\ url: 'https://www.asahi.com/rss/asahi/newsheadlines.rdf',
\ }},
\ #{ widget: 'rssfeed', params: #{
\ name: 'Hatena',
\ url: 'https://b.hatena.ne.jp/hotentry.rss',
\ icon: '🔖',
\ }},
\ ]},
\ #{ name: 'Podcasts', items: [
\ #{ widget: 'podcast', params: #{
\ name: 'Show A',
\ url: 'https://feeds.example.com/a.rss',
\ }},
\ #{ widget: 'podcast', params: #{
\ name: 'Show B',
\ url: 'https://feeds.example.com/b.rss',
\ }},
\ ]},
\ #{ name: 'Media', items: [
\ #{ widget: 'radio', params: #{ stations: [
\ #{ name: 'SomaFM Groove Salad', url: 'https://somafm.com/groovesalad.pls' },
\ ]}},
\ ]},
\ #{ name: 'Tech', items: [
\ #{ widget: 'github_trending', params: #{ lang: 'go' } },
\ ]},
\ #{ name: 'Ops', items: [
\ #{ widget: 'tests', params: #{ cmd: 'go test ./...', on_save: 1 } },
\ #{ widget: 'k8s_pods', params: #{ all_namespaces: 1 } },
\ ]},
\ #{ name: 'AI', items: [
\ #{ widget: 'claudechat', params: #{ model: 'claude-sonnet-4-5' } },
\ #{ widget: 'translate', params: #{ source: 'en', target: 'ja' } },
\ ]},
\ ]| widget | params |
|---|---|
rssfeed |
url (required), name, icon, max, content_selector (CSS-ish: tag / #id / .class) |
nanohi |
section (holidays / events / births / deaths), name, icon, max |
podcast |
url (required), name, icon |
radio |
stations (list of #{ name, url }) |
stockticker |
symbols (list of Yahoo tickers) |
worldclock |
zones (list of #{ label, tz }) |
weather |
location (wttr.in query, default geoip) |
sunmoon |
lat, lng |
asciiart |
arts (list of frames; each frame is a list of lines) |
quicklaunch |
items (list of #{ icon, label, cmd }) |
todo |
file |
tests |
cmd, on_save |
translate |
source, target |
claudechat, explain, commit_msg |
model |
github_trending |
lang |
k8s_pods |
all_namespaces |
Widgets degrade gracefully when their tool is missing, but for full functionality install the following:
curl— all network widgets (news, podcast, trending, weather, BTC, etc.)git— git status, diff, stashgh— GitHub PRs, notifications, trendingkubectl— k8s podsdocker— docker widgetffplay(FFmpeg) /sox(play) — radio, podcast, pianoctags— tags widget
MIT
Yasuhiro Matsumoto (a.k.a. mattn)