求助思源导出 markdown 快捷键

求大佬 帮忙写一个 JS 代码,功能为为思源的导出 markdown 格式 添加快捷键。或者告知写代码方法也行,我是小白。

image.png

或者能把这下方这个 "Markdown 批量转换" 插件设置一个快捷键,能呼出转换面板 就更好啦~

image.png

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    26386 引用 • 109743 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    10154 引用 • 46139 回帖 • 61 关注

相关帖子

被采纳的回答
  • wilsons 1 赞同

    确实用 zip 解压的方式较复杂,不过还有更简单方法,比如,直接读取文档 Markdown 源码,然后把内容直接写入到文件,这样只需要两步即可。

    代码如下

    // alt+d 导出markdown文档(docId为空导出当前文档) // see https://ld246.com/article/1743689632996 { // 导出文档的id(docId为空导出当前文档) const docId = ''; // 写入markdown文件路径 // 需填写绝对路径 // windows路径需要用\转义,比如 c:\\ const toPath = '/your/path/Downloads/'; // alt+d事件 document.addEventListener('keydown', async function(event) { // 检查是否按下了 Alt 键和 D 键,并确保没有按下其他修饰键 if ( event.altKey && // Alt 键被按下 event.code === 'KeyD' && // D 键被按下 !event.shiftKey && // Shift 键未被按下 !event.ctrlKey && // Ctrl 键未被按下 !event.metaKey // Cmd 键(Meta 键)未被按下 ) { event.preventDefault(); // 阻止默认行为(可选) if(!isElectron()) { showMessage('仅在Electron客户端有效', true); return; } // 获取Markdown文本 const doc = await fetchSyncPost("/api/lute/copyStdMarkdown", {id: docId || getCurrentDocId()}); if(!doc || doc.code !== 0) { showMessage(doc.msg || '获取文档失败', true); return; } const markdown = doc.data || ''; // 写入文本到文件 const fs = require('fs'); if (!fs.existsSync(toPath)) { showMessage('保存路径不存在', true); return; } let title = '未命名文档'; if(docId) { const docInfo = fetchSyncPost('/api/block/getDocInfo',{id:docId}); if(docInfo && docInfo.data && docInfo.data.name){ title = docInfo.data.name; } } else { title = getCurrentDocTitle() || title; } const path = require('path'); fs.appendFileSync(path.join(toPath, title + '.md'), markdown, 'utf8'); showMessage('已导出成功', false, 3000); } }, true); // 获取当前文档id function getCurrentDocId() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title')?.dataset?.nodeId; } function getCurrentDocTitle() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title__input')?.textContent; } // api请求 async function fetchSyncPost(url, data, method = 'POST') { return await (await fetch(url, {method: method, body: JSON.stringify(data||{})})).json(); } function isElectron() { return navigator.userAgent.includes('Electron'); } // 发送消息 function showMessage(message, isError = false, delay = 7000) { return fetch('/api/notification/' + (isError ? 'pushErrMsg' : 'pushMsg'), { "method": "POST", "body": JSON.stringify({"msg": message, "timeout": delay}) }); } }

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • nightstars

    [js] 给笔记本添加文档数

    看看这个大佬的帖子,最后有一个附赠的 文档菜单添加“复制 Markdown 源码”。这个或许对你有帮助。

    image.png

    1 回复
  • carethink via macOS
    作者

    嗯嗯 看到了 感谢,他这个功能和我的需求还是有点不一样,我是想导出 md 文件,最终是想便捷的导出这个文件

  • 试试这个 alt+d 导出 markdown 文档(docId 为空导出当前文档)

    // alt+d 导出markdown文档(docId为空导出当前文档) // see https://ld246.com/article/1743689632996 { // 导出文档的id(docId为空导出当前文档) const docId = ''; // alt+d事件 document.addEventListener('keydown', async function(event) { // 检查是否按下了 Alt 键和 D 键,并确保没有按下其他修饰键 if ( event.altKey && // Alt 键被按下 event.code === 'KeyD' && // D 键被按下 !event.shiftKey && // Shift 键未被按下 !event.ctrlKey && // Ctrl 键未被按下 !event.metaKey // Cmd 键(Meta 键)未被按下 ) { event.preventDefault(); // 阻止默认行为(可选) const result = await fetchSyncPost('/api/export/exportMd', {id:docId||getCurrentDocId()}); window.open(result.data.zip); } }, true); // 获取当前文档id function getCurrentDocId() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title')?.dataset?.nodeId; } // api请求 async function fetchSyncPost(url, data, method = 'POST') { return await (await fetch(url, {method: method, body: JSON.stringify(data||{})})).json(); } }
    1 回复
    1 操作
    wilsons 在 2025-04-04 10:28:54 更新了该回帖
  • carethink via macOS
    作者

    感谢感谢~,我按照您的代码一次成功。导出的文件是 zip 文件夹,然后我在这个基础上用 ai 修改了一下,按 alt+d 之后,直接导出 markdown 文件,不经过浏览器下载。

    但是遇到一个问题,每个文件导出时都会弹出一个“存储为”的窗口,让我选择 文件保存路径并填写文件名,文件名的位置 默认显示"未命名文档.md",每次都要修改,这就很麻烦。如果能够把这一步绕过去,直接存储,并以思源内的原始文件名进行保存,就太好了。如果绕不过去的话,能不能在每次都弹出这个窗口时,让文件名默认显示为 我导出文档的文件名呢, 这样我每次导出只需要按一个回车。具体代码如下:

    代码.txt.zip

    1 回复
  • 要想不弹窗

    1 浏览器设置默认下载路径

    2 别用浏览器下载方式,虽然你用第三方库解析了 zip,但却是在浏览器内存中完成的,要想保存到本地,必须下载。所以,要抛弃这种实现方式。

    由于 /api/export/exportMd api 默认会把文件导出到 /temp/exports 目录中,所以,调用这个 api 后直接调用 /api/archive/unzip 解压即可,然后可以通过 node 的 file api 移动到你指定的目录即可,如果移动到思源目录,也可以调用思源文件移动 api,这样就实现了无弹窗导出。

    1 回复
  • carethink via macOS
    作者

    😂 太难了,哈哈 大概意思看懂了。感谢大佬。

    1 回复
  • wilsons 1 赞同

    确实用 zip 解压的方式较复杂,不过还有更简单方法,比如,直接读取文档 Markdown 源码,然后把内容直接写入到文件,这样只需要两步即可。

    代码如下

    // alt+d 导出markdown文档(docId为空导出当前文档) // see https://ld246.com/article/1743689632996 { // 导出文档的id(docId为空导出当前文档) const docId = ''; // 写入markdown文件路径 // 需填写绝对路径 // windows路径需要用\转义,比如 c:\\ const toPath = '/your/path/Downloads/'; // alt+d事件 document.addEventListener('keydown', async function(event) { // 检查是否按下了 Alt 键和 D 键,并确保没有按下其他修饰键 if ( event.altKey && // Alt 键被按下 event.code === 'KeyD' && // D 键被按下 !event.shiftKey && // Shift 键未被按下 !event.ctrlKey && // Ctrl 键未被按下 !event.metaKey // Cmd 键(Meta 键)未被按下 ) { event.preventDefault(); // 阻止默认行为(可选) if(!isElectron()) { showMessage('仅在Electron客户端有效', true); return; } // 获取Markdown文本 const doc = await fetchSyncPost("/api/lute/copyStdMarkdown", {id: docId || getCurrentDocId()}); if(!doc || doc.code !== 0) { showMessage(doc.msg || '获取文档失败', true); return; } const markdown = doc.data || ''; // 写入文本到文件 const fs = require('fs'); if (!fs.existsSync(toPath)) { showMessage('保存路径不存在', true); return; } let title = '未命名文档'; if(docId) { const docInfo = fetchSyncPost('/api/block/getDocInfo',{id:docId}); if(docInfo && docInfo.data && docInfo.data.name){ title = docInfo.data.name; } } else { title = getCurrentDocTitle() || title; } const path = require('path'); fs.appendFileSync(path.join(toPath, title + '.md'), markdown, 'utf8'); showMessage('已导出成功', false, 3000); } }, true); // 获取当前文档id function getCurrentDocId() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title')?.dataset?.nodeId; } function getCurrentDocTitle() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title__input')?.textContent; } // api请求 async function fetchSyncPost(url, data, method = 'POST') { return await (await fetch(url, {method: method, body: JSON.stringify(data||{})})).json(); } function isElectron() { return navigator.userAgent.includes('Electron'); } // 发送消息 function showMessage(message, isError = false, delay = 7000) { return fetch('/api/notification/' + (isError ? 'pushErrMsg' : 'pushMsg'), { "method": "POST", "body": JSON.stringify({"msg": message, "timeout": delay}) }); } }
    1 回复
  • carethink via macOS
    作者

    太牛了大佬,你这水平太高了, 请问,如果达到你这能力,都得学习什么呀,太羡慕了。这年头,没有编程能力 真是啥也干不成啊

    1 回复
  • 确实,编程有时对提高效率确实重要。

    对于思源来说会 js 和 css 就够了 。

    现在网上基本都有入门视频啥的,一般能耐心看完一套基本就入门了,深入就得靠多实践了。

    我也没系统学过 js,基本用到什么学什么,不过要深入,系统学习还是很重要的。

    1 回复
  • carethink via macOS
    作者

    感谢指导,向您学习~

请输入回帖内容 ...

推荐标签 标签

  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 17 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 39 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 733 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 818 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 662 关注
  • abitmean

    有点意思就行了

    36 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 5 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    134 引用 • 798 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 81 关注
  • 倾城之链
    23 引用 • 66 回帖 • 167 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 615 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖 • 3 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 68 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 683 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 248 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 613 关注