{"format":1,"manifest":{"name":"bookmarks","publisher":"vyloxi","version":"1.2.0","displayName":"Bookmarks","description":"Mark lines, jump to the next or previous bookmark, and list bookmarks across files. They are remembered.","engines":{"ferrum":"^0.1.1"},"categories":["Productivity"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","main":"extension.js","activationEvents":["onStartup"],"permissions":["workspace.read"],"contributes":{"commands":[{"command":"bookmarks.toggle","title":"Toggle Bookmark","category":"Bookmarks"},{"command":"bookmarks.next","title":"Go to Next Bookmark","category":"Bookmarks"},{"command":"bookmarks.previous","title":"Go to Previous Bookmark","category":"Bookmarks"},{"command":"bookmarks.list","title":"List All Bookmarks","category":"Bookmarks"},{"command":"bookmarks.clearFile","title":"Clear Bookmarks in This File","category":"Bookmarks"},{"command":"bookmarks.clearAll","title":"Clear All Bookmarks","category":"Bookmarks"},{"command":"bookmarks.goto","title":"Bookmarks (internal)","category":"Bookmarks","hidden":true}],"viewsContainers":[{"id":"bookmarks","title":"Bookmarks","icon":"bookmark"}],"views":[{"id":"bookmarks.list","name":"Bookmarks","container":"bookmarks","type":"tree"}],"keybindings":[{"command":"bookmarks.toggle","key":"Shift+Alt+B"},{"command":"bookmarks.next","key":"Shift+Alt+N"},{"command":"bookmarks.previous","key":"Shift+Alt+P"}]}},"files":{"icon.png":{"encoding":"base64","content":"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"},"extension.js":{"encoding":"utf8","content":"// Bookmarks: mark lines, jump between them and list them. They are remembered for each file.\n\nconst KEY = 'bookmarks.v1';\n\nfunction toggle(list, line) {\n  return list.includes(line) ? list.filter((l) => l !== line) : [...list, line].sort((a, b) => a - b);\n}\nfunction next(list, line, dir) {\n  if (!list.length) return null;\n  if (dir > 0) return list.find((l) => l > line) ?? list[0];\n  return [...list].reverse().find((l) => l < line) ?? list[list.length - 1];\n}\n/** Bookmarks follow their line when text is inserted or removed above them, as far as we can tell. */\nfunction shiftAfterEdit(list, oldLines, newLines, at) {\n  const d = newLines - oldLines;\n  if (!d) return list;\n  return list.map((l) => (l > at ? l + d : l)).filter((l) => l >= 0);\n}\n\nexports._test = { toggle, next, shiftAfterEdit };\n\nexports.activate = function (context) {\n  const reg = (id, fn) => context.subscriptions.push(ferrum.commands.register(id, fn));\n  const all = () => ferrum.storage.get(KEY, {});\n  const save = (v) => ferrum.storage.set(KEY, v);\n  const key = (doc) => doc.path || '(unsaved) ' + doc.name;\n  const star = ferrum.editor.createDecorationType({ gutterText: '\\u2605', gutterColor: '#f59e0b', backgroundColor: 'rgba(245, 158, 11, 0.12)', isWholeLine: true });\n  context.subscriptions.push(star);\n\n  // The sidebar: files with bookmarks, and their lines under each.\n  const view = ferrum.window.registerTreeView('bookmarks.list', {\n    getChildren: async (element) => {\n      const data = await all();\n      if (!element) {\n        return Object.entries(data)\n          .filter(([, lines]) => lines.length)\n          .map(([file, lines]) => ({ id: 'f:' + file, label: file.split(/[\\\\/]/).pop(), description: lines.length + (lines.length === 1 ? ' bookmark' : ' bookmarks'), icon: 'file', tooltip: file, collapsible: 'expanded' }));\n      }\n      const file = String(element.id).slice(2);\n      return (data[file] || []).map((l) => ({ id: 'l:' + file + ':' + l, label: 'Line ' + (l + 1), icon: 'bookmark', color: '#f59e0b', command: 'bookmarks.goto', args: [file, l] }));\n    },\n  });\n  context.subscriptions.push(view);\n\n  async function status() {\n    const doc = await ferrum.editor.active();\n    const data = await all();\n    view.setBadge(Object.values(data).reduce((n, l) => n + l.length, 0));\n    view.refresh();\n    if (!doc) return ferrum.window.setStatusBar('bookmarks.status', { text: '' });\n    const lines = data[key(doc)] || [];\n    await ferrum.editor.setDecorations(star, lines.map((l) => ({ start: { line: l, col: 0 }, end: { line: l, col: 0 } })));\n    const n = lines.length;\n    ferrum.window.setStatusBar('bookmarks.status', n ? { text: 'Bookmarks: ' + n, tooltip: n + ' bookmarks in this file. Click to list them.', command: 'bookmarks.list' } : { text: '' });\n  }\n\n  reg('bookmarks.toggle', async () => {\n    const doc = await ferrum.editor.active();\n    if (!doc) return ferrum.window.showMessage('Open a file first.', 'warn');\n    const data = await all();\n    const line = doc.selection.start.line;\n    data[key(doc)] = toggle(data[key(doc)] || [], line);\n    if (!data[key(doc)].length) delete data[key(doc)];\n    await save(data);\n    ferrum.window.showMessage(((data[key(doc)] || []).includes(line) ? 'Bookmark added on line ' : 'Bookmark removed from line ') + (line + 1) + '.');\n    status();\n  });\n\n  const jump = (dir) => async () => {\n    const doc = await ferrum.editor.active();\n    if (!doc) return;\n    const list = (await all())[key(doc)] || [];\n    const l = next(list, doc.selection.start.line, dir);\n    if (l === null) return ferrum.window.showMessage('No bookmarks in this file.', 'warn');\n    await ferrum.editor.setSelection({ line: l, col: 0 });\n  };\n  reg('bookmarks.next', jump(1));\n  reg('bookmarks.previous', jump(-1));\n\n  reg('bookmarks.list', async () => {\n    const data = await all();\n    const items = [];\n    for (const [file, lines] of Object.entries(data)) for (const l of lines) items.push({ label: file.split(/[\\\\/]/).pop() + ':' + (l + 1), detail: file, file, line: l });\n    if (!items.length) return ferrum.window.showMessage('No bookmarks yet. Use \"Bookmarks: Toggle\" on a line.');\n    const pick = await ferrum.window.showQuickPick(items, { placeholder: 'Jump to a bookmark' });\n    if (!pick) return;\n    if (pick.file.startsWith('(unsaved)')) return ferrum.window.showMessage('That file is not saved.', 'warn');\n    await ferrum.editor.openFile(pick.file, { line: pick.line, col: 0 });\n  });\n\n  reg('bookmarks.goto', async (file, line) => {\n    if (typeof file !== 'string' || file.startsWith('(unsaved)')) return;\n    await ferrum.editor.openFile(file, { line: Number(line) || 0, col: 0 });\n  });\n  reg('bookmarks.clearFile', async () => {\n    const doc = await ferrum.editor.active();\n    if (!doc) return;\n    const data = await all();\n    delete data[key(doc)];\n    await save(data);\n    status();\n  });\n  reg('bookmarks.clearAll', async () => {\n    if (await ferrum.window.confirm('Remove every bookmark in every file?', 'Remove all')) {\n      await save({});\n      status();\n    }\n  });\n\n  context.subscriptions.push(ferrum.events.on('activeChanged', status), ferrum.events.on('open', status), ferrum.events.on('change', status), ferrum.events.on('save', status));\n  status();\n};\n\nexports.deactivate = function () {};\n"},"README.md":{"encoding":"utf8","content":"# Bookmarks\n\nMark a line (Shift+Alt+B), jump to the next (Shift+Alt+N) or previous (Shift+Alt+P) bookmark in the file, or list all bookmarks in all files and jump to one. A counter shows in the status bar. Bookmarks are saved by the editor and come back next time.\n\nBookmarks are tied to line numbers, so after big edits above a bookmark it may point a few lines off.\n\nPermissions: workspace.read (to open the file when you pick a bookmark from another file).\n\n## Sidebar\n\nSince 1.1.0 an icon in the activity bar lists every bookmark, grouped by file. Bookmarked lines show a star in the gutter and a soft highlight.\n"}}}