知识管理知识库【免费下载链接】dendronThe personal knowledge management (PKM) tool that grows as you do!项目地址https://gitcode.com/gh_mirrors/de/dendron点击查看免费下载本篇技术指南聚焦于 Dendron 笔记插件中Selection to Items选中转条目功能的完整使用与实现原理。该功能允许你在当前笔记中框选一段包含 Wiki 链接wikilink的文本随即在 Lookup 面板中自动生成与这些链接对应的笔记条目从而把一段链接清单快速转化为可批量跳转、复制链接甚至继续创建新笔记的候选列表。读完本文你将掌握触发该功能的三种入口、选区链接的解析规则别名、跨 vault 前缀、重复链接去重、它与Selection to Link、Selection Extract的差异以及背后从选区到 Lookup 条目的完整源码调用链。功能概述一段选区如何变成 Lookup 条目Selection to Items是 Dendron 的 Note Lookup笔记查找流程中的一种选择修饰模式selection modifier。它的核心行为可以用一句话概括当你选中一段包含多个 wikilink 的文本并启用该模式后Lookup 快速选择面板不再从整个层级树中检索笔记而是直接把选区中每个链接指向的笔记作为候选项列出。在源码层面这一行为对应枚举LookupSelectionTypeEnum中的selection2Items值它与其他两种选择模式并列定义于 packages/common-all/src/types/lookup.tsexport enum LookupSelectionTypeEnum { selection2link selection2link, selectionExtract selectionExtract, selection2Items selection2Items, none none, }从 UI 角度Dendron 在 Lookup 面板中为它提供了一个独立的切换按钮Selection2ItemsBtn其按钮定义位于 packages/plugin-core/src/components/lookup/buttons.tsexport class Selection2ItemsBtn extends DendronBtn { static create(opts: { pressed?: boolean; canToggle?: boolean }) { const { pressed, canToggle } _.defaults(opts, { pressed: false, canToggle: true, }); return new Selection2ItemsBtn({ title: Selection to Items, description: MODIFIER_DESCRIPTIONS[selection2Items], iconOff: checklist, iconOn: menu-selection, type: selection2Items, pressed, canToggle, }); } }按钮的说明文案description来自 packages/common-all/src/constants/lookup.ts原话是Wikilinks in highlighted text will be used to create selectable items in lookup即高亮文本中的 Wiki 链接将用于在 Lookup 中生成可选条目。这正是该功能的设计意图。输入素材什么样的选区能被识别本仓库的测试工作区中保存了一份专门用于演示和验证该功能的笔记 test-workspace/vault/dendron.selection-to-items.md其正文内容就是一段典型的、可直接被Selection to Items消费的选区[[foo|dendron.apples]] [[blog|dendron.blog]] [[bar]] [[dendron.cat]] [[wow|dendron://vault/dendron.journal]]这份素材涵盖了该功能支持的五种 wikilink 书写形态选区内容链接形式解析含义[[foo\|dendron.apples]]带别名的标准链接别名foo目标笔记dendron.apples[[blog\|dendron.blog]]带别名的标准链接别名blog目标笔记dendron.blog[[bar]]无别名链接目标笔记就是bar本身[[dendron.cat]]无别名链接目标笔记dendron.cat[[wow\|dendron://vault/dendron.journal]]带 vault 前缀的跨库链接显式指定目标位于vault库中的dendron.journal这些目标笔记在本仓库的vault中均真实存在如 test-workspace/vault/dendron.apples.md、test-workspace/vault/dendron.blog.md、test-workspace/vault/bar.md、test-workspace/vault/dendron.cat.md、test-workspace/vault/dendron.journal.md因此这份笔记可以直接作为手动测试该功能的输入样例全选正文 → 触发 Note Lookup → 启用Selection to Items面板中应当出现 5 个去重后对应条目。三步操作从选区到条目列表1. 选中包含 wikilink 的文本在任意笔记Vault 内中用鼠标或键盘选中一段文本要求其中至少含有一个[[...]]形式的 wikilink。选区中可以混合上面表格中的多种链接形态。2. 打开 Note Lookup 并启用 Selection to Items通过命令面板或快捷键触发 Dendron 的 Note Lookup 命令对应源码 packages/plugin-core/src/commands/NoteLookupCommand.ts。在 Lookup 面板底部的按钮区找到Selection to Items复选框图标并点击启用。启用后Lookup 的输入框会被清空quickPick.value 面板的候选列表被替换为选区解析出的条目。3. 在条目列表中继续操作由于Selection to Items产出的仍然是一个标准的 Lookup 列表你可以沿用 Lookup 的全部既有能力上下键浏览、回车跳转到目标笔记配合multiSelect按钮一次选中多个条目配合copyNoteLink按钮把选中条目以 wikilink 形式批量复制到剪贴板。其中批量复制链接的逻辑由onCopyNoteLinkBtnToggled实现位于 packages/plugin-core/src/components/lookup/LookupControllerV3.ts它会对选中条目逐个执行NoteUtils.createWikiLink({ note, alias: { mode: title } })并用换行符拼接后写入剪贴板。源码级剖析选区到条目的完整调用链入口按钮切换回调Selection to Items按钮的切换逻辑由LookupControllerV3中的onSelect2ItemsBtnToggled方法承担位于 packages/plugin-core/src/components/lookup/LookupControllerV3.tsprivate async onSelect2ItemsBtnToggled(enabled: boolean) { const quickPick this._quickPick!; if (enabled) { const pickerItemsFromSelection await NotePickerUtils.createItemsFromSelectedWikilinks(); quickPick.prevValue quickPick.value; quickPick.value ; quickPick.itemsFromSelection pickerItemsFromSelection; } else { quickPick.value NotePickerUtils.getPickerValue(quickPick); quickPick.itemsFromSelection undefined; return; } }启用时它调用NotePickerUtils.createItemsFromSelectedWikilinks()完成选区解析并把结果写入quickPick.itemsFromSelection关闭时则清空该字段并恢复 Lookup 默认的输入值。核心解析createItemsFromSelectedWikilinks真正完成选区 → 条目转换的是NotePickerUtils.createItemsFromSelectedWikilinks完整实现位于 packages/plugin-core/src/components/lookup/NotePickerUtils.ts。其处理流程可分为四步读取选区文本通过VSCodeUtils.getSelection()拿到当前编辑器的选中内容若没有选区则直接返回undefined。提取 wikilink调用LinkUtils.extractWikiLinks(text)从选区中解析出全部 wikilink。按链接值去重_.uniqBy(wikiLinks, value)保证同一个目标笔记只出现一次。解析目标笔记并增强为面板条目调用LinkUtils.getNotesFromWikiLinks把链接解析为真实笔记对象NoteProps再通过DNodeUtils.enhancePropForQuickInputV3为每个笔记补充 schema、vault 等展示信息最终得到DNodePropsQuickInputV2[]类型的面板条目。底层解析器extractWikiLinkswikilink 的提取与语法解析由LinkUtils.extractWikiLinks承担实现在 packages/unified/src/remark/utils.tsstatic extractWikiLinks(source: string) { // chop up the source. const regExp new RegExp(\\[\\[(.?)?\\]\\], g); const matched [...source.matchAll(regExp)].map((match) { return LinkUtils.parseLinkV2({ linkString: match[1] }); }); return matched.filter((match) !_.isNull(match)) as ParseLinkV2Resp[]; }它先用正则\[\[(.?)?\]\]切出所有 wikilink 的内部字符串再交给LinkUtils.parseLinkV2进行语义解析——这正是上一节表格中别名、vault 前缀等语法被正确拆解的地方。例如[[wow|dendron://vault/dendron.journal]]会被解析出别名wow、跨库前缀vault与目标笔记名dendron.journal。条目注入itemsFromSelection 如何生效itemsFromSelection字段定义在 Lookup 面板对象类型中packages/plugin-core/src/components/lookup/types.ts。Lookup 的条目刷新逻辑会优先消费该字段见 packages/plugin-core/src/components/lookup/NoteLookupProvider.tsif (picker.itemsFromSelection) { picker.items picker.itemsFromSelection; if (picker.selectAll) { picker.selectedItems picker.items; } return; }也就是说只要Selection to Items处于启用状态Lookup 的候选列表就完全由选区中的 wikilink 决定不再走常规的模糊检索逻辑若同时开启了全选selectAll这些条目还会被自动标记为已选中。三种选择模式定位与互斥Selection to Items与另外两种选择模式共享同一个状态位且在同一时刻只能启用其一。三种模式的官方说明packages/common-all/src/constants/lookup.ts对比如下模式按钮标题官方行为描述selection2ItemsSelection to Items高亮文本中的 wikilink 用于在 Lookup 中生成可选条目selection2linkSelection to Link高亮文本将被转换为指向新创建笔记的 wikilinkselectionExtractSelection Extract高亮文本被复制到新笔记并在原笔记中留下一个 note reference引用三者互斥的实现集中在两个地方视图模型selectionState是LookupSelectionTypeEnum类型的双向绑定packages/plugin-core/src/components/lookup/LookupViewModel.ts控制器监听该状态变化切换前先关闭旧模式、再开启新模式packages/plugin-core/src/components/lookup/LookupControllerV3.ts。测试 packages/plugin-core/src/test/suite-integ/components/lookup/LookupViewModel.test.ts 明确验证了这一互斥关系当selectionState切到selection2Items时selection2Items按钮为按下状态而selectionExtract与selection2link按钮均处于未按下状态。另外值得说明的是selection2Items的产物条目列表与selection2link/selectionExtract的产物改写当前文档性质完全不同——前两者会修改你正在编辑的笔记替换选区为链接或抽取文本而Selection to Items只读取选区、不写任何文件这是它在安全性上的显著优势。配置文件中的关联设置Selection to Items属于 Note Lookup 的修饰能力与它同屏出现的按钮默认状态由commands.lookup.note.selectionMode配置决定。该配置项在 packages/common-all/src/constants/configs/commands.ts 中定义了三个可选值配置值含义默认对应的按钮extract默认值Lookup 默认启用 Selection ExtractSelectionExtractBtnlinkLookup 默认启用 Selection to LinkSelection2LinkBtnnone不预设任何选择模式三个按钮均不按下注意selectionMode目前只覆盖extract/link/none三种取值并不包含selection2Items——Selection to Items通常需要你在打开 Lookup 面板后手动点击按钮启用。这一映射逻辑位于 packages/plugin-core/src/commands/NoteLookupCommand.ts。本仓库的示例配置 test-workspace/dendron.yml 展示了commands.lookup.note节点的完整写法commands: lookup: note: selectionMode: extract confirmVaultOnCreate: true leaveTrace: false bubbleUpCreateNew: true vaultSelectionModeOnCreate: smart fuzzThreshold: 0.2其中与选择模式配合使用的关键项包括confirmVaultOnCreate创建新笔记前是否询问目标 vaultleaveTrace使用selectionExtract时是否在原笔记中保留指向新笔记的引用其含义在 packages/common-all/src/constants/configs/commands.ts 中有官方描述bubbleUpCreateNew是否把 Create New 选项置顶显示fuzzThresholdLookup 的模糊匹配阈值。边界情况与设计决策结合集成测试 packages/plugin-core/src/test/suite-integ/components/lookup/LookupControllerV3.test.tsselection2Itemssuite可以确认该功能在三个关键边界场景下的行为1. 跨库同名笔记歧义 vault会被全部列出。当选区中的 wikilink 不带 vault 前缀、而多个 vault 中存在同名笔记时解析器会把所有同名笔记都作为独立条目展示交由用户自行选择。测试中[[pican]]在 vault2 与 vault3 各有一份最终面板出现两个 label 均为pican的条目。2. 指向同一笔记的链接会被去重。测试用例构造了三种指向dendron.ginger的写法——[[dendron.ginger]]、[[Ginger|dendron.ginger]]、[[Lots of Ginger|dendron.ginger]]——去重后只保留 1 个条目。这与源码中_.uniqBy(wikiLinks, value)的实现完全对应。3. 正常选区按链接顺序产出全部条目。对包含 3 个不同链接的选区面板条目的 label 依次为dendron.ginger、dendron.dragonfruit、dendron.clementine顺序与选区中的书写顺序一致。此外还有两点使用提示若选区中混入无效链接或链接目标不存在对应条目会缺失但不会中断整体流程该功能只对 wikilink 生效普通 Markdown 链接text与纯文本不在解析范围内因此适合链接清单类的批量场景而非任意文本。小结Selection to Items是 Dendron Lookup 流程中一种零写入的高效批量操作选中含 wikilink 的文本一次点击即可把链接清单转化为可跳转、可多选、可复制链接的 Lookup 条目。其实现以NoteLookupCommand为入口由LookupControllerV3的按钮回调驱动核心解析逻辑封装在NotePickerUtils.createItemsFromSelectedWikilinks与LinkUtils.extractWikiLinks中并通过itemsFromSelection字段注入 Lookup 候选列表。配合本仓库 test-workspace/vault/dendron.selection-to-items.md 中的五种链接样例你可以直接在本地测试工作区验证这一功能的全部行为。赞分享知识管理知识库【免费下载链接】dendronThe personal knowledge management (PKM) tool that grows as you do!项目地址https://gitcode.com/gh_mirrors/de/dendron点击查看免费下载相关推荐Skill Seekers 与 ChromaDB 集成实战把文档技能一键转为可检索的本地向量库Skill Seekers 与 ChromaDB 集成实战把文档技能一键转为可检索的本地向量库 本篇技术指南围绕 Skill Seekers 仓库中的 Chr人工智能AI 应用AI 技能RAGMCP 服务网页爬虫Understand Anything 实战把任意代码库变成可探索、可检索的知识图谱Understand Anything 实战把任意代码库变成可探索、可检索的知识图谱 Understand Anything 是一个面向 AI 编码代理ClAI 技能AI 插件开发工具知识图谱agentmemory filesystem-watcher 接入指南把目录变更变成可检索的持久化记忆agentmemory filesystem watcher 接入指南把目录变更变成可检索的持久化记忆 导读 agentmemory 是面向 AI 编码 A人工智能AI 应用Agent 记忆RAGMCP 服务知识图谱创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考