{"format":1,"manifest":{"name":"cheat-sheets","publisher":"vyloxi","version":"1.0.0","displayName":"Cheat Sheets","description":"Searchable reference panels for Git, regular expressions, Vim, Markdown, HTTP status codes, CSS Flexbox and CSS Grid.","engines":{"ferrum":"^0.1.0"},"categories":["Productivity"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","main":"extension.js","activationEvents":["onCommand:cheatSheets.pick","onCommand:cheatSheets.search","onCommand:cheatSheets.git","onCommand:cheatSheets.regex","onCommand:cheatSheets.vim","onCommand:cheatSheets.markdown","onCommand:cheatSheets.http","onCommand:cheatSheets.flexbox","onCommand:cheatSheets.grid"],"permissions":[],"contributes":{"commands":[{"command":"cheatSheets.pick","title":"Open a Cheat Sheet...","category":"Cheat Sheets"},{"command":"cheatSheets.search","title":"Search All Cheat Sheets...","category":"Cheat Sheets"},{"command":"cheatSheets.git","title":"Git Cheat Sheet","category":"Cheat Sheets"},{"command":"cheatSheets.regex","title":"Regular expressions Cheat Sheet","category":"Cheat Sheets"},{"command":"cheatSheets.vim","title":"Vim Cheat Sheet","category":"Cheat Sheets"},{"command":"cheatSheets.markdown","title":"Markdown Cheat Sheet","category":"Cheat Sheets"},{"command":"cheatSheets.http","title":"HTTP status codes Cheat Sheet","category":"Cheat Sheets"},{"command":"cheatSheets.flexbox","title":"CSS Flexbox Cheat Sheet","category":"Cheat Sheets"},{"command":"cheatSheets.grid","title":"CSS Grid Cheat Sheet","category":"Cheat Sheets"}],"keybindings":[{"command":"cheatSheets.search","key":"Ctrl+Alt+K"}]}},"files":{"icon.png":{"encoding":"base64","content":"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"},"extension.js":{"encoding":"utf8","content":"// Cheat Sheets: searchable reference panels for Git, regular expressions, Vim, Markdown, HTTP status codes, CSS Flexbox and CSS Grid.\n// Click a row to put its code into your file. No permissions.\n\nconst SHEETS = {\n  git: {\n    title: 'Git',\n    groups: {\n      'Start': [['git init', 'Create a repository in this folder'], ['git clone <url>', 'Copy a repository'], ['git clone --depth 1 <url>', 'Copy only the latest snapshot (fast)'], ['git config --global user.name \"Name\"', 'Set your name'], ['git config --global user.email \"me@example.com\"', 'Set your email']],\n      'Save work': [['git status', 'What changed'], ['git add <file>', 'Stage a file'], ['git add -p', 'Stage piece by piece'], ['git add .', 'Stage everything'], ['git commit -m \"message\"', 'Save the staged changes'], ['git commit --amend', 'Change the last commit'], ['git commit --amend --no-edit', 'Add staged files to the last commit'], ['git diff', 'Unstaged changes'], ['git diff --staged', 'Staged changes']],\n      'Branches': [['git branch', 'List branches'], ['git switch -c <name>', 'Create and switch to a branch'], ['git switch <name>', 'Switch branch'], ['git branch -d <name>', 'Delete a merged branch'], ['git branch -D <name>', 'Delete a branch for sure'], ['git branch -m <new>', 'Rename the current branch'], ['git merge <name>', 'Merge a branch into this one'], ['git merge --abort', 'Stop a merge in trouble'], ['git rebase <name>', 'Replay your commits on top of another branch'], ['git rebase -i HEAD~3', 'Edit the last 3 commits'], ['git cherry-pick <commit>', 'Copy one commit here']],\n      'Remotes': [['git remote -v', 'List remotes'], ['git remote add origin <url>', 'Add a remote'], ['git fetch', 'Download without merging'], ['git pull', 'Download and merge'], ['git pull --rebase', 'Download and replay your commits'], ['git push', 'Upload commits'], ['git push -u origin <branch>', 'Upload a new branch and remember it'], ['git push --force-with-lease', 'Safer force push'], ['git push origin --delete <branch>', 'Delete a remote branch']],\n      'History': [['git log --oneline --graph --decorate', 'Short history with branches'], ['git log -p <file>', 'History of a file with changes'], ['git log --author=\"name\"', 'Commits by a person'], ['git log -S\"text\"', 'Commits that added or removed text'], ['git show <commit>', 'One commit'], ['git blame <file>', 'Who wrote each line'], ['git shortlog -sn', 'Commits per person'], ['git reflog', 'Everything HEAD did (find lost commits)']],\n      'Undo': [['git restore <file>', 'Throw away changes in a file'], ['git restore --staged <file>', 'Unstage a file'], ['git reset --soft HEAD~1', 'Undo the last commit, keep changes staged'], ['git reset HEAD~1', 'Undo the last commit, keep changes'], ['git reset --hard HEAD~1', 'Undo the last commit and its changes'], ['git revert <commit>', 'Make a new commit that undoes one'], ['git clean -fd', 'Delete untracked files and folders'], ['git checkout -- .', 'Throw away all unstaged changes (old way)']],\n      'Stash': [['git stash', 'Put changes aside'], ['git stash -u', 'Also stash untracked files'], ['git stash list', 'List stashes'], ['git stash pop', 'Bring the last stash back'], ['git stash apply stash@{1}', 'Apply a stash and keep it'], ['git stash drop', 'Delete the last stash']],\n      'Tags': [['git tag', 'List tags'], ['git tag -a v1.0.0 -m \"Release 1.0.0\"', 'Make an annotated tag'], ['git push origin v1.0.0', 'Upload one tag'], ['git push --tags', 'Upload all tags'], ['git tag -d v1.0.0', 'Delete a local tag']],\n    },\n  },\n  regex: {\n    title: 'Regular expressions',\n    groups: {\n      'Characters': [['.', 'Any character except a newline'], ['\\\\d', 'A digit'], ['\\\\D', 'Not a digit'], ['\\\\w', 'Letter, digit or underscore'], ['\\\\W', 'Not a word character'], ['\\\\s', 'Whitespace'], ['\\\\S', 'Not whitespace'], ['[abc]', 'a, b or c'], ['[^abc]', 'Anything but a, b, c'], ['[a-z]', 'A range'], ['\\\\.', 'A real dot (escape special characters)'], ['\\\\p{L}', 'Any letter in any language (u flag)']],\n      'Anchors': [['^', 'Start of the line'], ['$', 'End of the line'], ['\\\\b', 'A word boundary'], ['\\\\B', 'Not a word boundary'], ['\\\\A', 'Start of the text (some engines)'], ['\\\\z', 'End of the text (some engines)']],\n      'Quantifiers': [['*', '0 or more'], ['+', '1 or more'], ['?', '0 or 1'], ['{3}', 'Exactly 3'], ['{3,}', '3 or more'], ['{3,5}', '3 to 5'], ['*?', '0 or more, as few as possible (lazy)'], ['+?', '1 or more, lazy']],\n      'Groups': [['(abc)', 'Capture group'], ['(?:abc)', 'Group without capturing'], ['(?<name>abc)', 'Named group'], ['\\\\1', 'The text of group 1 again'], ['a|b', 'a or b'], ['(?=abc)', 'Followed by abc (lookahead)'], ['(?!abc)', 'Not followed by abc'], ['(?<=abc)', 'Preceded by abc (lookbehind)'], ['(?<!abc)', 'Not preceded by abc']],\n      'Flags': [['i', 'Ignore case'], ['g', 'Find all matches'], ['m', '^ and $ match at each line'], ['s', 'Dot also matches newlines'], ['u', 'Unicode mode'], ['x', 'Allow spaces and comments (some engines)']],\n      'Replace': [['$1', 'Insert group 1 (JavaScript, Rust, sed -E uses \\\\1)'], ['$&', 'Insert the whole match (JavaScript)'], ['\\\\1', 'Insert group 1 (Python, sed, editors)'], ['$<name>', 'Insert a named group (JavaScript)']],\n      'Common': [['^[\\\\w.+-]+@[\\\\w-]+(?:\\\\.[\\\\w-]+)+$', 'Email address (simple)'], ['https?://[\\\\w.-]+(?:/[^\\\\s]*)?', 'Web address'], ['\\\\d{4}-\\\\d{2}-\\\\d{2}', 'Date as 2026-10-22'], ['^#(?:[0-9a-fA-F]{3}){1,2}$', 'Hex color'], ['^\\\\s+|\\\\s+$', 'Spaces at both ends'], ['\\\\b(\\\\w+)\\\\s+\\\\1\\\\b', 'A repeated word']],\n    },\n  },\n  vim: {\n    title: 'Vim',\n    groups: {\n      'Modes': [['i', 'Insert before the cursor'], ['a', 'Insert after the cursor'], ['o', 'New line below'], ['O', 'New line above'], ['v', 'Select characters'], ['V', 'Select lines'], ['Ctrl+v', 'Select a block'], ['Esc', 'Back to normal mode'], [':', 'Command line']],\n      'Move': [['h j k l', 'Left, down, up, right'], ['w / b', 'Next / previous word'], ['e', 'End of the word'], ['0 / ^ / $', 'Line start / first character / end'], ['gg / G', 'Top / bottom of the file'], ['{n}G', 'Go to line n'], ['{ / }', 'Previous / next paragraph'], ['%', 'Matching bracket'], ['Ctrl+u / Ctrl+d', 'Half page up / down'], ['f{c} / t{c}', 'To a character on the line / just before it'], ['* / #', 'Next / previous match of the word']],\n      'Edit': [['x', 'Delete a character'], ['dd', 'Delete the line'], ['dw', 'Delete a word'], ['D', 'Delete to the end of the line'], ['cw', 'Change a word'], ['cc', 'Change the line'], ['yy', 'Copy the line'], ['p / P', 'Paste after / before'], ['u', 'Undo'], ['Ctrl+r', 'Redo'], ['.', 'Repeat the last change'], ['>> / <<', 'Indent / outdent'], ['J', 'Join the next line'], ['~', 'Toggle case'], ['ciw', 'Change the word under the cursor'], ['di\"', 'Delete inside quotes']],\n      'Search': [['/text', 'Search forward'], ['?text', 'Search backward'], ['n / N', 'Next / previous match'], [':%s/old/new/g', 'Replace everywhere'], [':%s/old/new/gc', 'Replace, ask each time'], [':noh', 'Clear highlighting']],\n      'Files': [[':w', 'Save'], [':q', 'Quit'], [':wq', 'Save and quit'], [':q!', 'Quit without saving'], [':e file', 'Open a file'], [':sp / :vsp', 'Split horizontally / vertically'], ['Ctrl+w w', 'Switch window'], [':bn / :bp', 'Next / previous buffer']],\n      'Macros and marks': [['qa', 'Record a macro in register a'], ['q', 'Stop recording'], ['@a', 'Play macro a'], ['ma', 'Set mark a'], [\"'a\", 'Jump to mark a'], ['\"ayy', 'Copy a line into register a'], ['\"ap', 'Paste register a']],\n    },\n  },\n  markdown: {\n    title: 'Markdown',\n    groups: {\n      'Text': [['# Heading 1', 'Heading level 1 (use ## for 2, ### for 3)'], ['**bold**', 'Bold'], ['*italic*', 'Italic'], ['~~strike~~', 'Strikethrough'], ['`code`', 'Inline code'], ['> quote', 'Quote'], ['---', 'Horizontal line'], ['text  \\n', 'Line break (two spaces at the end)']],\n      'Lists': [['- item', 'Bullet list'], ['1. item', 'Numbered list'], ['- [ ] task', 'Task, not done'], ['- [x] task', 'Task, done'], ['  - nested', 'Nested item (indent by 2 spaces)']],\n      'Links and images': [['[text](https://example.com)', 'Link'], ['[text](https://example.com \"title\")', 'Link with a title'], ['![alt text](image.png)', 'Image'], ['<https://example.com>', 'Automatic link'], ['[text][ref]\\n\\n[ref]: https://example.com', 'Reference link'], ['[![alt](badge.svg)](https://example.com)', 'Image that is a link']],\n      'Code': [['```js\\ncode\\n```', 'Code block with a language'], ['    code', 'Code block by indenting 4 spaces']],\n      'Tables': [['| A | B |\\n| --- | --- |\\n| 1 | 2 |', 'Table'], ['| Left | Center | Right |\\n| :--- | :---: | ---: |', 'Column alignment']],\n      'Extras': [['[^1]\\n\\n[^1]: The note.', 'Footnote'], ['<details>\\n<summary>Title</summary>\\n\\nText\\n\\n</details>', 'Collapsible section'], ['<!-- comment -->', 'Comment'], ['\\\\*', 'Show a special character']],\n    },\n  },\n  http: {\n    title: 'HTTP status codes',\n    groups: {\n      '1xx Information': [['100', 'Continue'], ['101', 'Switching Protocols'], ['103', 'Early Hints']],\n      '2xx Success': [['200', 'OK'], ['201', 'Created'], ['202', 'Accepted (will be done later)'], ['204', 'No Content'], ['206', 'Partial Content (range request)']],\n      '3xx Redirection': [['301', 'Moved Permanently'], ['302', 'Found (temporary redirect)'], ['303', 'See Other (go GET another page after a POST)'], ['304', 'Not Modified (use your cache)'], ['307', 'Temporary Redirect, same method'], ['308', 'Permanent Redirect, same method']],\n      '4xx Client error': [['400', 'Bad Request'], ['401', 'Unauthorized (not signed in)'], ['403', 'Forbidden (signed in, not allowed)'], ['404', 'Not Found'], ['405', 'Method Not Allowed'], ['406', 'Not Acceptable'], ['408', 'Request Timeout'], ['409', 'Conflict'], ['410', 'Gone (removed for good)'], ['413', 'Payload Too Large'], ['415', 'Unsupported Media Type'], ['418', \"I'm a teapot\"], ['422', 'Unprocessable Content (validation failed)'], ['429', 'Too Many Requests (rate limit)'], ['451', 'Unavailable For Legal Reasons']],\n      '5xx Server error': [['500', 'Internal Server Error'], ['501', 'Not Implemented'], ['502', 'Bad Gateway'], ['503', 'Service Unavailable'], ['504', 'Gateway Timeout']],\n    },\n  },\n  flexbox: {\n    title: 'CSS Flexbox',\n    groups: {\n      'Container': [['display: flex;', 'Start a flex container'], ['display: inline-flex;', 'Flex container that sits inline'], ['flex-direction: row;', 'Left to right (also row-reverse, column, column-reverse)'], ['flex-wrap: wrap;', 'Let items go to the next line'], ['gap: 1rem;', 'Space between items'], ['justify-content: center;', 'Along the main axis (flex-start, flex-end, space-between, space-around, space-evenly)'], ['align-items: center;', 'Across the main axis (flex-start, flex-end, stretch, baseline)'], ['align-content: space-between;', 'Space between lines when wrapping']],\n      'Items': [['flex: 1;', 'Grow to share the free space'], ['flex: 0 0 200px;', 'Fixed width, never grows or shrinks'], ['flex-grow: 1;', 'How much it grows'], ['flex-shrink: 0;', 'Do not shrink'], ['flex-basis: 30%;', 'Starting size'], ['align-self: flex-end;', 'Override align-items for this item'], ['order: -1;', 'Move to the front'], ['margin-left: auto;', 'Push this item and the next ones to the right']],\n      'Recipes': [['display: flex;\\njustify-content: center;\\nalign-items: center;', 'Center something both ways'], ['display: flex;\\njustify-content: space-between;\\nalign-items: center;', 'A navigation bar'], ['display: flex;\\nflex-direction: column;\\nmin-height: 100vh;', 'Sticky footer layout: give main flex: 1'], ['display: flex;\\nflex-wrap: wrap;\\ngap: 1rem;', 'Cards that wrap']],\n    },\n  },\n  grid: {\n    title: 'CSS Grid',\n    groups: {\n      'Container': [['display: grid;', 'Start a grid'], ['grid-template-columns: 1fr 2fr;', 'Two columns, the second twice as wide'], ['grid-template-columns: repeat(3, 1fr);', 'Three equal columns'], ['grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));', 'As many columns as fit'], ['grid-template-rows: auto 1fr auto;', 'Header, content, footer'], ['gap: 1rem;', 'Space between cells'], ['grid-template-areas: \"header header\" \"side main\";', 'Name the areas'], ['justify-items: center;', 'Align items inside cells, horizontally'], ['align-items: center;', 'Align items inside cells, vertically'], ['place-items: center;', 'Both of the above'], ['justify-content: center;', 'Place the whole grid in its box'], ['grid-auto-flow: dense;', 'Fill holes']],\n      'Items': [['grid-column: 1 / 3;', 'From line 1 to line 3'], ['grid-column: span 2;', 'Cover two columns'], ['grid-row: 1 / -1;', 'From the first to the last row line'], ['grid-area: header;', 'Put it in a named area'], ['justify-self: end;', 'Align this item horizontally'], ['align-self: start;', 'Align this item vertically']],\n      'Recipes': [['display: grid;\\ngrid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\\ngap: 1rem;', 'A responsive card grid'], ['display: grid;\\nplace-items: center;\\nmin-height: 100vh;', 'Center something in the page'], ['display: grid;\\ngrid-template-columns: 240px 1fr;\\ngrid-template-rows: auto 1fr auto;\\nmin-height: 100vh;', 'Sidebar layout with header and footer'], ['aspect-ratio: 16 / 9;', 'Keep a shape (works on grid items too)']],\n    },\n  },\n};\n\nconst esc = (s) => String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\n/** Every row of a sheet as { group, code, note }. */\nfunction rows(key) {\n  const sheet = SHEETS[key];\n  if (!sheet) return [];\n  return Object.entries(sheet.groups).flatMap(([group, list]) => list.map(([code, note]) => ({ group, code, note })));\n}\n\nfunction filter(key, q) {\n  const s = String(q || '').trim().toLowerCase();\n  return rows(key).filter((r) => !s || r.code.toLowerCase().includes(s) || r.note.toLowerCase().includes(s) || r.group.toLowerCase().includes(s));\n}\n\nfunction page(key) {\n  const sheet = SHEETS[key];\n  const body = Object.entries(sheet.groups)\n    .map(([g, list]) => `<h4>${esc(g)}</h4>${list.map(([code, note]) => `<div class=\"r\" data-c=\"${esc(code)}\" data-q=\"${esc((g + ' ' + code + ' ' + note).toLowerCase())}\"><code>${esc(code).replace(/\\n/g, '<br>')}</code><span>${esc(note)}</span></div>`).join('')}`)\n    .join('');\n  return `<style>\n  body { font-family: var(--ui); } h3 { margin: 0 0 8px; } h4 { margin: 18px 0 6px; color: var(--accent); font-size: 12px; text-transform: uppercase; letter-spacing: .05em; }\n  input { width: 100%; box-sizing: border-box; background: var(--raised, transparent); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; padding: 8px 10px; font: 14px var(--ui); outline: none; } input:focus { border-color: var(--accent); }\n  .r { display: grid; grid-template-columns: minmax(150px, 1fr) 1.3fr; gap: 14px; padding: 5px 8px; border-radius: 5px; cursor: pointer; align-items: baseline; } .r:hover { background: var(--raised, rgba(128,128,128,.15)); }\n  code { font: 12.5px/1.5 var(--mono, monospace); word-break: break-all; } .r span { color: var(--fg-dim); font-size: 13px; } .dim { color: var(--fg-dim); font-size: 12px; margin-top: 6px; }\n  #none { display: none; color: var(--fg-dim); margin-top: 14px; } @media (max-width: 560px) { .r { grid-template-columns: 1fr; gap: 2px; } }\n</style>\n<h3>${esc(sheet.title)} cheat sheet</h3>\n<input id=\"q\" placeholder=\"Search this sheet\" autofocus>\n<div class=\"dim\">Click a row to put its code at the cursor of your file.</div>\n<div id=\"all\">${body}</div><div id=\"none\">Nothing matches.</div>\n<script>\n  const q = document.getElementById('q'), none = document.getElementById('none');\n  q.addEventListener('input', () => {\n    const s = q.value.trim().toLowerCase(); let n = 0;\n    document.querySelectorAll('.r').forEach((r) => { const ok = !s || r.dataset.q.includes(s); r.style.display = ok ? '' : 'none'; if (ok) n++; });\n    document.querySelectorAll('h4').forEach((h) => { let x = h.nextElementSibling, any = false; while (x && x.classList.contains('r')) { if (x.style.display !== 'none') any = true; x = x.nextElementSibling; } h.style.display = any ? '' : 'none'; });\n    none.style.display = n ? 'none' : 'block';\n  });\n  document.getElementById('all').addEventListener('click', (e) => { const r = e.target.closest('.r'); if (r) ferrumPanel.postMessage({ type: 'insert', code: r.dataset.c }); });\n</script>`;\n}\n\nexports._test = { SHEETS, rows, filter, page };\n\nexports.activate = function (context) {\n  const open = {};\n  async function show(key) {\n    const html = page(key);\n    if (open[key]) { open[key].setHtml(html); return; }\n    const p = await ferrum.window.showPanel({ title: SHEETS[key].title + ' cheat sheet', html });\n    open[key] = p;\n    p.onDidClose(() => delete open[key]);\n    p.onMessage(async (m) => {\n      if (m.type !== 'insert') return;\n      const doc = await ferrum.editor.active();\n      if (!doc) return ferrum.window.showMessage('Open a file to insert into.', 'warn');\n      await ferrum.editor.insert(String(m.code || '').slice(0, 2000));\n    });\n  }\n  for (const key of Object.keys(SHEETS)) context.subscriptions.push(ferrum.commands.register('cheatSheets.' + key, () => show(key)));\n  context.subscriptions.push(\n    ferrum.commands.register('cheatSheets.search', async () => {\n      const q = await ferrum.window.showInputBox({ prompt: 'Search every cheat sheet', placeholder: 'undo, center, 404, flex, replace...' });\n      if (!q) return;\n      const hits = Object.keys(SHEETS).flatMap((k) => filter(k, q).map((r) => ({ ...r, sheet: SHEETS[k].title })));\n      if (!hits.length) return ferrum.window.showMessage('Nothing found for \"' + q + '\".');\n      const pick = await ferrum.window.showQuickPick(hits.slice(0, 80).map((r) => ({ label: r.code.split('\\n')[0], detail: r.note, description: r.sheet + ' · ' + r.group, code: r.code })), { placeholder: hits.length + ' results. Pick one to insert it.' });\n      if (pick) await ferrum.editor.insert(pick.code);\n    }),\n    ferrum.commands.register('cheatSheets.pick', async () => {\n      const pick = await ferrum.window.showQuickPick(Object.entries(SHEETS).map(([k, s]) => ({ label: s.title, detail: Object.values(s.groups).reduce((n, l) => n + l.length, 0) + ' entries', key: k })), { placeholder: 'Open a cheat sheet' });\n      if (pick) await show(pick.key);\n    }),\n  );\n};\n\nexports.deactivate = function () {};\n"},"README.md":{"encoding":"utf8","content":"# Cheat Sheets\n\nSeven reference sheets, each in a panel with a search box. **Click a row to put its code in your file** at the cursor.\n\n| Sheet | What is in it |\n| --- | --- |\n| **Git** | Start, save work, branches, remotes, history, undo, stash, tags |\n| **Regular expressions** | Characters, anchors, quantifiers, groups, lookarounds, flags, replacements, common patterns |\n| **Vim** | Modes, movement, editing, search and replace, files, macros and marks |\n| **Markdown** | Text, lists, links, images, code, tables, footnotes, collapsible sections |\n| **HTTP status codes** | 1xx to 5xx with a plain explanation |\n| **CSS Flexbox** | Container and item properties and common recipes |\n| **CSS Grid** | Container and item properties and common recipes |\n\n**Search All Cheat Sheets...** looks in all of them at once (\"undo\", \"center\", \"404\", \"replace\") and inserts the pick.\n\nThe sheets are built into the extension, so they work offline. No permissions needed.\n"}}}