遇到的问题
我想要在日记中的“###今日任务”后通过quickadd插件插入待办,但我上文有“### 今日任务总揽”及dataview代码块中引用的三级标题“### 今日任务”,通过修改quickadd插件中的选项,只能在“### 今日任务总揽”这个子标题下插入待办,而无法在“### 今日任务”这个子标题下插入待办。
预期的效果
通过quickadd,将待办插入到“### 今日任务”这个子标题下方
已尝试的解决方案
更改quickadd设置中的选项
我想要在日记中的“###今日任务”后通过quickadd插件插入待办,但我上文有“### 今日任务总揽”及dataview代码块中引用的三级标题“### 今日任务”,通过修改quickadd插件中的选项,只能在“### 今日任务总揽”这个子标题下插入待办,而无法在“### 今日任务”这个子标题下插入待办。
通过quickadd,将待办插入到“### 今日任务”这个子标题下方
更改quickadd设置中的选项
原因是 QuickAdd 的这个 Insert after
关键词, 它是这么检测的:
Insert after
关键词去掉换行, 填补前后空白字符, 做成正则表达式Insert after
字串的行号, 见 ref所以根据这逻辑, 笔记中只要 “同一行文本的其中一部分, 能符合 Insert after
关键词”, 该行就被视为命中, 此后用户的数据就添加到这个 section
所以目前觉得, 最好就是绕开这麻烦就完了,
把真正感兴趣的 ### 今日任务
稍微改动一下文字, 别让 QuickAdd 提前找到有相同字样的行, 就行
如果确实不打算动笔记框架,
必须要在前面有 ### 今日任务xxx
的情况下, 仍然要匹配后面的准确 ### 今日任务
那需要改 .obsidian/plugins/quickadd/main.js
里的判断逻辑, 这脚本里应该有
// 在第42行左右
async insertAfterHandler(I){let l=await this.format(this.choice.insertAfter.after),b=new RegExp(`\\s*${U0(l.replace("\\n",""))}\\s*`),Z=GW(this.fileContent),
// 在 b=new RegExp 这一句里, 最后给加一个 $ 其余都不动
async insertAfterHandler(I){let l=await this.format(this.choice.insertAfter.after),b=new RegExp(`\\s*${U0(l.replace("\\n",""))}\\s*$`),Z=GW(this.fileContent),
解释:
b=new RegExp(`\\s*${U0(l.replace("\\n",""))}\\s*`)
// 对应源代码的 构造 targetRegex
const targetRegex = new RegExp(`\\s*${escapeRegExp(targetString.replace("\\n", ""))}\\s*`, );
// 随后 targetRegex 是这么用的
fileContentLines.findIndex((line) => targetRegex.test(line))
// 正则里加个 $ 表示这里要匹配行末,
b=new RegExp(`\\s*${U0(l.replace("\\n",""))}\\s*$`)
// 于是现在可以匹配到 ### 今日任务 但不能匹配 ### 今日任务总览
谢谢大佬!成了!