ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
Learn Vim, Neovim, and tmux in the browser with interactive levels, drills, and a real Vim mode. Free and open source.
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Learn Vim / Neovim and tmux keys right in your browser — no install, no config. Like LearnGitBranching, you see the goal state and close the gap with your keyboard.
▶ https://s3onghyun.github.io/nvim-edu/
When you run AI coding agents (Claude Code, Codex, …) in a terminal, the editing you still do by hand happens in Neovim and tmux. This site trains exactly those keys until your fingers remember them.
| Mode | |
|---|---|
| Levels (41) | Motions → editing → text objects → visual & macros → real-world cleanup (:%s, :g, applying an AI code review) → tmux → guru combos (code, logs, config, docs: * n ., :v, :sort u, :g+:norm, regex groups, macro + Ctrl-a). Each chapter shows a difficulty badge (Beginner → Intermediate → Advanced → Guru) in the file tree and help panel. ★1–3 based on keystrokes vs. par |
| Step-by-step replay | After clearing a level (or from "Solution"), your keys and the reference solution are split into Vim commands and replayed: key → meaning → resulting line, so you can see where the extra keys went |
| tmux chapter | Only the keys a human still types while an agent runs: sessions, splits, pane moves, zoom, copy mode to scroll and copy errors, windows, detach/attach, switching sessions |
| Drills | 10 random tasks in a row (motion, delete, change, tmux). Best time and keystrokes are saved |
| Daily challenge | Date-seeded, so everyone gets the same tasks that day. Keeps a 🔥 streak |
| Free practice | No goal, just practice |
| Real Vim mode (beta) | Solve the same levels in an actual Vim 8.2 running in the browser (vim.wasm), configured with Neovim defaults (nostartofline, nrformats=bin,hex, Y=y$, …) |
Neovim-style UI: neo-tree sidebar, bufferline, lualine, cmdline messages, relative line numbers, ~ past the end of the buffer,
:colorscheme tokyonight | catppuccin | gruvbox | tokyonight-day.
Habit training: arrow keys are blocked in chapter 1 (motions) and the motion drill, the mouse is blocked; typing with a non-Latin input method (Korean, Japanese, Chinese IME) in NORMAL mode shows a hint.
Languages: English, Korean and Simplified Chinese. Picked from ?lang=en|ko|zh-CN (zh also works), then your saved choice, then the browser language (any zh* locale, including zh-TW/zh-HK, gets Simplified Chinese).
This site uses cookie-free GoatCounter analytics. It records page views and only aggregate product events (a level or drill finished, opening real Vim mode, and a Korean/English/Chinese language change); it never sends keystrokes, solutions, or other text you enter. Analytics is disabled when Do Not Track or Global Privacy Control is enabled.
Levels run on the @replit/codemirror-vim emulator for speed, and real Neovim is the reference:
tests/nvim-diff.mjs feeds the same keys (common commands from :help plus every level solution, 180 cases) into nvim --headless and into the site's editor, then compares text, cursor and mode. CI runs it on every push with Neovim 0.11.0.patches/ (applied by patch-package).npm run test:nvim # needs nvim on PATH
npm install
npm run dev # http://localhost:5173
npm test # build, then solve every level and drill in a real Chromium
npm run test:en # English UI: every level, plus a scan that no Korean text is left
npm run test:zh # Simplified Chinese UI: the same, plus no `undefined` or raw data-* text
npm test needs a Playwright browser: npx playwright-core install chromium. Run with BROWSER=firefox or BROWSER=webkit for other engines.
| File | Purpose |
|---|---|
src/levels/vim-levels.json | Vim level data (schema in src/levels/schema.js, checked by npm test). solution is both the reference answer and the par |
src/levels.js | Loads the Vim levels, tmux levels, chapters |
src/levels.en.js | English text for levels (same ids) |
src/levels.zh-CN.js | Simplified Chinese text for levels (same ids, applied on top of the English text) |
src/i18n.js | Language selection and the language menu; t('한국어', 'English', '中文') for inline strings (missing Chinese falls back to English) |
src/drill.js | Drill task generators |
src/tmux.js | tmux simulator (pure state machine: session/window/pane tree, prefix keys, vi copy mode, a tiny shell) |
src/tmux-view.js | tmux state → HTML |
src/main.js | Editor (CodeMirror 6 + codemirror-vim), scoring, UI |
src/analytics.js | Cookie-free GoatCounter page views and events; skipped under Do Not Track / GPC |
src/real.js, real/index.html | Real Vim mode. State comes from Vim's titlestring (injecting commands from JS mid-command freezes Vim) |
patches/ | Emulator fixes to match real Neovim |
tests/ | nvim-diff (vs. real Neovim), regress (bugs found in real use), levels, real, i18n, tmux, analytics, levels-schema (level data schema), level-report (readable per-level failure messages) |
Add one object to src/levels/vim-levels.json (its English text to src/levels.en.js and its Chinese text to src/levels.zh-CN.js):
{
"id": "my-level", "chapter": "edit", "title": "제목",
"desc": "Description (HTML)", "keys": ["dd"], "lang": "js",
"start": "first\nsecond", "cursor": [0, 0],
"goal": { "text": "first" },
"solution": "jdd"
}
goal is { "text": ... } or { "cursor": [line, col] }; solution uses <Esc> <CR> <C-a> notation and its key count is the par.
npm test checks that the solution really clears the level, in the emulator and in real Vim. See CONTRIBUTING.md for step-by-step instructions and par guidelines. PRs welcome!
tests/nvim-diff.mjs.C-b : command prompt, mouse or resizing).SharedArrayBuffer. GitHub Pages cannot send COOP/COEP headers, so coi-serviceworker adds them, which does not work reliably in Safari (a notice is shown). It downloads about 0.8MB (compressed) the first time; the Vim runtime is trimmed to the files the levels need at build time. Extremely fast input (0 ms between keys, as in automation) can be reordered by vim.wasm; human typing speed (40 ms+) was fine.MIT