使用豆包做了一个Obsidian插件 使用豆包做了一个Obsidian插件,实现根据核心插件 文件列表
的排序方式,打开目录中前一个文件,后一个文件功能。
背景 Obsidian自带了前一个日记和后一个日记功能,但是没有在任意目录打开前一个/后一个文件功能,插件 File Tree Alternative
可以实现类似功能,但只能根据文件名排序,不够直观。
目标:实现一个根据核心插件 文件列表
排序方式,打开当前目录前一个/后一个文件的插件。
技术背景:懂一点JS,没有做过Obsidian插件,没有写过TS
最终依靠豆包,一行代码和注释也没有写,两个晚上完成了功能,运行良好。
搭建开发环境 Obsidian插件采用TS开发,豆包和Kimi给出的搭建开发环境的方法都跑不通。跟着官方文档 操作一遍,能跑起来。
Build a plugin - Developer Documentation ,根据文档 git clone
插件样例,按照文档 npm install
需要的包
npm run dev
生成 main.js
,再用豆包生成的 manifest.json
在Obsidian插件目录中,新建文件夹 obsidian-previous-next-file
做为插件目录, 将 main.js
和 manifest.json
符号链接到这个目录下,完成了插件安装
由于功能比较简单,源代码都在 main.ts
中,运行 npm run dev
,修改源代码,可以实时反映到 main.js
中,Obsidian
中再关闭启动插件一次,就能使修改后的代码生效
manifest.json的具体内容
1 2 3 4 5 6 7 8 9 10 { "id" : "prev-next-file-plugin" , "name" : "Previous & Next File Plugin" , "author" : "Your Name" , "version" : "0.0.3" , "minAppVersion" : "0.9.0" , "description" : "A plugin to open the previous or next file based on the order of Markdown files in the current file's folder (ordered by file name in descending order)." , "permissions" : [ ] , "isDesktopOnly" : false }
和豆包交互 整个过程中,有2个点豆包不知道,人肉搜索到解决方案,再告诉豆包修改到代码中。过程中如果要小修改代码,不要自己修改,而是告诉豆包你的意图,让豆包帮你修改。
1. 如何找到核心插件文件列表
的排序方式
File explorer API ,受到这个帖子启发,在 dev tools
里面查看
app.workspace.getLeavesOfType('file-explorer')[0].view
返回一个对象,其中 .sortOrder
是排序方式,经过测试,一共6种排序方法
2. npm run build
报错,而 npm run dev
能通过 改了两个配置文件,
1. 在 `package.json` 中去掉了 `tsc -noEmit -skipLibCheck `
2. 在 `tsconfig.json` 中增加了 `noImplicitAny: false` 和 `skipLibCheck: true`
3. 和豆包的整个交互过程 一共43步,包括了所有对话,下面清单都是我对豆包讲的话,豆包的回复主要都是代码,就省略了。#
后面是补充的情况说明,不是对话的内容。
大致分为3给阶段
1-14步,生成了一个按照文件名排序,打开前一个/后一个文件的插件
15-41步,按照第三方插件 File Tree Alternatvie
排序方式,打开前一个/后一个文件
最后两步,按照核心插件 文件列表
排序方式,打开前一个/后一个文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 1. 生成一个obsidian插件,可以按照核心插件·文件列表·的文件顺序,打开前一个文件2. main.ts:10 :22 - error TS2339: Property 'openPreviousFile' does not exist on type 'PrevFilePlugin' . 3. 读取当前文件所在文件夹的所有markdown文件,按照文件名降序排列 4. 再增加一个打开后一个文件的命令 5. 修改manifest.json相应的说明 6. 在移动app上也可以使用 7. main.ts:2 :8 - error TS1259: Module '"path"' can only be default-imported using the 'allowSyntheticDefaultImports' flag 8. getOrderedFileList(),一直返回空数组,逻辑错误的 9. 还是找不到当前目录的文件,函数一直返回空数组 10. 有没有办法使用obsidian提供的函数返回当前文件所在文件夹的文件列表 11. TypeError: Right-hand side of 'instanceof' is not an object 12. 还是出现上面的错误 13. 找到原因了,child.extension === '.md' ,应该是child.extension === 'md' 14. 如果正序排序,代码是怎么样的 15. 按照核心插件,文件列表的排序方式排序 16. 怎样取得核心插件文件列表的排序方式 17. 怎么读取第三方插件“File Tree Alternative”的排序方式 18. 怎么读取第三方插件File Tree Alternative配置文件data.json的数据 19. File Tree Alternative的排序字段在配置data.json中的sortFilesBy和sortReverse两个字段,根据这两个字段排序 20. 完善一下getPluginConfig方法 21. File Tree Alternative,实际路径为file-tree-alternative,根据实际路径修改代码,并给出完整的main.ts代码22. file-tree-alternative还收一个排序方法file-size,根据文件大小排序,请补充代码 23. file-tree-alternative的文件排序有四种方法,分别是name,created,last-update和file-size,分别对应文件名,创建时间,修改时间和文件大小,根据这四种方法修改代码 24. const pluginDataPath = path.join(this.app.vault.configDir, 'plugins' , 'file-tree-alternative' , 'data.json' );得到的配置文件路径错误 25. const pluginDataPath = path.join(this.app.vault.configDir, 'plugins' , 'file-tree-alternative' , 'data.json' );得到了obsidian安装目录,而不是vault所在的目录26. 应该是const pluginDataPath = path.join(this.app.vault.adapter.basePath, this.app.vault.configDir, 'plugins' , 'file-tree-alternative' , 'data.json' ); 27. this.app.vault.configDir只返回.obsidian,28. this.app.vault.configDir只返回.obsidian,而不是完整的路径 29. TypeError: aModifyTime.getTime is not a function 30. a.stat.mtime type : number 31. 考虑兼容性问题,修改代码32. import path from 'path' 应该是import * as path from 'path' 33. Cannot assign to "aCreationTime" because it is a constant 34. 去掉currentFolder instanceof this.app.vault.Folder的判断 35. line97, Expected "}" but found ";" 36. 有好几处类似的错误,将, 误写成 ; 找到所有错误,并修改代码 37. 读取配置文件还是失败了,增加base代码 38. 修改成 const pluginDataPath = path.join(this.app.vault.adapter.basePath, this.app.vault.configDir, 'plugins' , 'file-tree-alternative' , 'data.json' ), 测试下来能返回正确的配置文件 39. error TS2339: Property 'basePath' does not exist on type 'DataAdapter' . 40. 使用npm run dev能通过,使用npm run build就报上面的错误 41. error TS7006: Parameter 'child' implicitly has an 'any' type . 42. 根据这个命令app.workspace.getLeavesOfType('file-explorer' )[0 ].view.sortOrder确定排序方式 43. 返回6 种排序方式,alphabetical,alphabeticalReverse,byModifiedTime,byModifiedTimeReverse,byCreatedTime,byCreatedTimeReverse,分别应对文件名,文件名倒序,编辑时间,编辑时间倒序,创建时间,创建时间倒序,按照这个逻辑修改代码
#日期/2024-12-13