Dendron 的 Selection to Items 功能实战:把选区中的 Wiki 链接一键变成可检索条目
知识管理知识库【免费下载链接】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),仅供参考

相关新闻

流量录制回放如何做到“零数据污染”?深入解密子调用自动 Mock 与隔离

流量录制回放如何做到“零数据污染”?深入解密子调用自动 Mock 与隔离

导语: 流量回放的价值,是把真实业务请求变成可重复的回归素材;团队最担心的却是回放过程本身:订单会不会重复写入?支付和短信会不会真的发出去?消息会不会被下游消费者再次处理? 解决这个问题&a…

2026/10/16 15:49:21 阅读更多 →
时间轮定时器原理与实战:单轮、多轮实现及避坑指南

时间轮定时器原理与实战:单轮、多轮实现及避坑指南

简介:本资源是一套Java时间轮定时器的完整实现代码,面向具备一定Java基础、希望深入理解高效定时任务调度机制的开发者。内容围绕单轮与多轮两种时间轮结构展开,涵盖槽位划分、指针轮询、任务插入与移除等核心环节,可用于心跳检测…

2026/10/15 15:36:28 阅读更多 →
Arduino BLE FTMS 实战:让老健身车接入 Zwift 等训练 App

Arduino BLE FTMS 实战:让老健身车接入 Zwift 等训练 App

简介:这份资源面向嵌入式开发与室内骑行训练爱好者,提供一套基于Arduino与ESP32的BLE FTMS室内自行车健身机实现方案,用两块ESP32分别模拟功率计与智能骑行台,解决商用骑行台价格高昂、协议封闭的问题。压缩包共30个文件&#xff…

2026/10/16 17:52:40 阅读更多 →

最新新闻

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

配过的人都有体会——Anaconda装了,VSCode也装了,结果新建一个Python文件,import numpy直接给你飘红,运行的时候又说找不到模块。这时候大多数人第一个想法是“Anaconda没装好”“VSCode坏了”,但真正的原因往往是VSCo…

2026/10/16 17:55:24 阅读更多 →
分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

简介:一份关于主流分布式存储技术的综述文档,适合大数据处理、云计算及后端存储方向的开发者与架构师阅读。内容以架构与演化两条主线展开,系统梳理了谷歌文件系统、Hadoop分布式文件系统、Minio对象存储等经典方案的设计思想与适用场景。压缩…

2026/10/16 17:55:24 阅读更多 →
Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

简介:本资源是一套基于Matlab实现的SIFT特征匹配与RANSAC鲁棒估计相结合的图像拼接与融合完整方案,面向计算机视觉初学者、图像处理课程学习者及科研入门人员,解决多视角图像自动对齐、宽视场全景图生成等典型问题。压缩包共20个文件&#xf…

2026/10/16 17:55:24 阅读更多 →
用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

简介:面向网站优化人员与Python学习者的SEO数据采集与分析工具,以“SEO网络蜘蛛侠”命名,通过自动化爬虫帮助用户完成关键词挖掘、元信息检查、链接结构分析、内容质量与加载速度检测、死链排查等高频SEO任务。程序内置可执行版本&#xff0c…

2026/10/16 17:55:24 阅读更多 →
Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

简介:这份资源面向地质勘探、地震预测与环境监测领域的技术人员及Qt开发者,提供一套基于Qt3.3框架的地震数据快速可视化实现方案,重点解决大规模地震记录的读取、处理与图形化展示问题。压缩包共77个文件,约2.07MB,以h…

2026/10/16 17:55:23 阅读更多 →
Android应用目录结构全解析:从Gradle配置到资源文件管理

Android应用目录结构全解析:从Gradle配置到资源文件管理

很多刚接触Android开发的朋友,第一次用Android Studio新建项目时,看到左侧那一大坨目录树往往会有点懵。我当年也是从一个个文件夹点开、再关掉,折腾了好几天才搞清楚哪个目录是存代码的、哪个目录是放图片的、哪个文件是注册Activity的。这篇…

2026/10/16 17:54:23 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →