分享一个小技巧,利用 Kanban、Templates、dataview 协作,自动获取 Kanban 的笔记卡片的待办项

利用 Kanban、Templates、dataview 协作,自动获取 Kanban 的笔记卡片的待办项

是我捣鼓一两个小时捣鼓出来的!

完成后的大致效果

左下角那个四个复选框就是结果。


初衷

我希望用 kanban 插件来做 GTD,所以希望 Kanban 卡片可以显示对应笔记页面的待办项,作为 GTD 中的 next action

做法

三者结合,就能创建一个类似这样的 Kanban 专用的笔记模板:

---
actions: |
  ```dataviewjs
  let tasks=dv.page('{{title}}')
    .file.tasks.where(t => !t.completed);
  if(tasks.length) dv.taskList(tasks, false);
  else dv.el('b', 'no actions.');
  ```
---
# {{title}}

加点注释方便理解:

---
actions: | ← 这个竖线是YAML语法,用来添加跨行字符串并保留换行符。而 `actions` 对应 Kanban 的设置项。由你指定。
  ```dataviewjs
  // 下方这第一行代码用于读取指定页面里未完成的待办项。
  // 注意这里的 `'{{title}}'` 是给 Templates 插件用的,创建笔记时会被替换为你的笔记标题。
  // 这样的话 dataview 就能找到这篇笔记了。
  // 如果你担心文件重名,可以自行加上 `Note Folder` 的路径。
  // (比如你设置的`Note Folder`是`Kanban Tasks/Projects`,
  // 那就改写为 `let tasks=dv.page('Kanban Tasks/Projects/{{title}}')`,就像上方截图那样)
  let tasks=dv.page('{{title}}')
    .file.tasks.where(t => !t.completed); // 这里筛选出未完成的任务
  if(tasks.length) dv.taskList(tasks, false); // 这条语句判断有没有找到待办项,有就显示,
  else dv.el('b', 'no actions.'); // 没有就显示加粗的 `no actions.`
  ```
---
# {{title}}

然后把这个模板添加到Kanban中,设置好 Note Folder


并在 Kanban 设置的 Linked Page Metadata 中添加 actions,启用 Hide labelField contains markdown

这之后,点击卡片的 New Note from Card 创建的笔记就能自动展示待办项了。

原理

根据你的设置,Kanban 会自动读取每条笔记的 actions metadata 并显示出来,而 actions 中的内容是 dataview 语句,它自动执行时会显示对应笔记中的所有任务,这样就把任务都显示出来了。

缺点

  • 如果你改了笔记标题,那么要同步修改每条笔记中的 metadata actions 中的笔记标题,否则 Kanban 会报错。
  • 在 Kanban 中只能打勾和浏览,修改待办项的内容要进入笔记中。

Bonus

其实 Kanban 不只能识别 dataview,其他代码也能识别,比如 mermaid。不过这种图片如果太宽了,渲染会出问题导致显示不完整。

7 个赞

十分感谢分享用法。

在Kanban 设置中找不到 `Linked Page Metadata ?

有的,就在最下面,你找找。

非常实用啊!多谢楼主!

1 个赞

请问action: | 换行输入代码块,需要什么插件支持吗,我尝试无法成功呢。

不需要插件,这是YAML本身的语法。我猜你失败的原因是新行没有缩进。

找了个yaml校验器,最后发现缩进竟然是两个空格,长知识了。 :sweat_smile:

大佬请问我平时制作任务会用看板,每个小任务完成日期不同,我想把不同看板的完成日期显示在一张图上,方便知道自己哪天任务多,哪天任务少好安排其他任务,怎么应该怎么搞?

这个是统计功能,要用别的插件吧,不好意思我没尝试过

1 个赞

没事没事,谢谢(!!!'…'/!!!)

怎样实现 callout 功能呢?或者引用进去也可以的

不太明白你的意思?我感觉操作应该是类似的。
其实你直接写进kanban的输入框里也行

提示:
今天又试了一下,这个方法获得的dataview好像无法互动了,只能查看任务不能打勾
此外,Kanban已经支持 Inline dataviewjs 功能了,也就是说你可以直接在看板新任务输入框里写 `$= (我在 actions 中写的代码)`,虽然还是没法打勾

其实是想用 Kanban 对笔记中的 callout 做一个呈现

这个就要查dataview和OB的代码里有没有提供相关功能了

貌似是不支持的,callout 的标题行还可以支持,换行后就不会显示了

那你就得自己写代码获取笔记全文然后一行行分析是不是Callout的一部分,然后自己拼接字符串了,真想试只能这样做。其实也不好维护,还是想别的办法吧。其实我也不建议在Kanban里展示太复杂的内容,感觉这并不是Kanban的定位。

心血来潮去问了一下AI,把AI的输出改了改,给你写了段代码参考。但我仍然不推荐你这么做,太复杂了,而且每个笔记都有一份,将来想改还很麻烦,不好维护。(而且代码好像放进Kanban里会失效哈哈哈,只能当普通模板用)

const content = await dv.io.load(dv.current().file.path);
const lines = content.split('\n');
const callouts = [];
let currentCallout = null;

lines.forEach(line => {
	if (line.startsWith('> [!')) {
		if (currentCallout) {
			callouts.push(currentCallout);
		}
		const match = line.match(/^\> \[!([^\]]+)\]/);
		currentCallout = {
			type: match ? match[1] : 'unknown',
			content: [line]
		};
	} else if (currentCallout) {
		currentCallout.content.push(line);
	}
});

if (currentCallout) {
	callouts.push(currentCallout);
}

//const callout_str = callouts.reduce((para, callout) => para + '---\n' + callout.content.join('\n'), '');
//dv.paragraph(callout_str);

callouts.forEach(callout => {dv.paragraph(callout.content.join('\n'))});

好滴好滴 感谢 我试一下嘿嘿