专栏/我如何用obsidian进行个人习惯管理(工具推荐)

我如何用obsidian进行个人习惯管理(工具推荐)

2023年11月30日 11:51--浏览 · --点赞 · --评论
粉丝:207文章:10

如何戒掉坏习惯?最好的方式是培养新习惯去替代它或者去占有你的时间,你的时间自然而然就倾泻到了你投入的地方。


之前个人工作流里面也提到,人的时间和精力投入应当是为了生命轮服务,生命轮的组成由自我追求来确认,比如我的是健康、工作、爱、娱乐、学习。目前主要希望自己长期都能够坚持的是运动和读书,不让腐朽的肉体拖沓灵魂的脚后跟。


之前一直会用timetrack的软件来记录设定为成长值的时间,用过多款习惯追踪软件来记录,现在前者仍然在使用,后者的话没能坚持,今年调整了这个习惯记录,转化为用自己最常用的本地笔记本obsidian也同步来记录习惯。


大部分的笔记、日记、各种人生年月日计划、工作日志、资料汇集、读书记录等都使用的是obsidian本地笔记本,所以将习惯记录在内,也利于长期保存,时刻查看,而且也可以根据自己的需求来定制展现形式,我的多是参考他人已写完的datajs代码,自身会编程的话,那就可以更进一步个性化实现啦。


Part 1 结果展现

每个图表涉及日期的均可点击跳转对应日期的当天日记。

1. 某项习惯年情况展示: 关于某项习惯的年情况,根据颜色的深浅可以看到当日的投入时间,如图;点击对应的颜色块,可以直接到达对应日期的当日计划内容页,如【当日完成情况展示】,下面是今年我读书和运动的习惯汇总情况,总的来说,还是满意的啦,读书的习惯坚持了3年,运动是从去年9月开始,感受到身体的各项性能在提升,具体见【喝奶茶吃零食不吃减肥餐,如何瘦15斤,全是干货,可复用任何习惯养成】。希望在配置新的运行模式(比如增加xx习惯养成),也能使得整体运行效能上有所提升啦。

2. 每个月的情况展示 可以看到每个月的形成情况,点击对应的日期,也可以到达当日计划内容页

3. 当日完成情况展示

延展:计划及复盘一切的习惯养成最好都服务于自己长期的人生战略,最好可以进行阶段性的计划和复盘,详情下次展开讲。


Part 2 如何处理数据及汇总

一般来说我平时会用timetrack来记录一些时间,比如运动时间、读书这些,在obsidian里的记录也来源于此。将每天的对应时间记录到对应的日期里,在汇总页展示所有的追踪结果。

1. 涉及到的插件,可以提前安装

  • 日记(自带)

  • Dataview

  • Habit Calendar

  • Heatmap Calendar


2. 文本代码等

水平有限,直接复制代码大家看着用。请注意:以下代码不是原创,而是从各位大神那里借鉴来的,不记得来处了,抱歉没能贴地址,大家可以根据需求自行调整更改。

日记的设定

开启日记之后,点击日期可以新建当日的日记,可以自己设定一个日记的template,如下图填写,那么每次新建日记就会按照模板自动新建了当日的日记。

我的日历图,好看!

当天日记template的设定,可以放入以下内容,请注意几点格式:

  1. 需要有 - [ ] ,这个就是checklist,主要是因为后续的结果展示里有一个条件是完成后打勾

  2. 需要有#habit ,理由也和上面一样

  3. 习惯的设定用xxx(reading:: )

-  [ ] #habit 8:00前起床(wakey::)
-  [ ] #habit 读书(reading:: )h 📌30分钟
-  [ ] #habit 运动(exercise:: )h📌15分钟
-  [ ] #habit 英语(language:: )h 📌15分钟

Heatmap Calendar的设定

首先开启Dataview(打开设定如下)及Heatmap Calendar,可以展示全年的习惯完成情况

可以注意以下几个地方:

  1. 颜色可以调整

  2. 文件地址需要更改

  3. 颜色强度可以进行调整

```dataviewjs
// 这一大段是从Heatmap Calendar中复制下来的。
dv.span("** 📖 阅读 **") 
const calendarData = {
    year: 2023,  // (optional) defaults to current year
    colors: {    // (optional) defaults to green
        blue:        ["#8cb9ff", "#69a3ff", "#428bff", "#1872ff", "#0058e2"], // first entry is considered default if supplied
        green:       ["#c6e48b", "#7bc96f", "#49af5d", "#2e8840", "#196127"],
        red:         ["#ff9e82", "#ff7b55", "#ff4d1a", "#e73400", "#bd2a00"],
        orange:      ["#ffa244", "#fd7f00", "#dd6f00", "#bf6000", "#9b4e00"],
        pink:        ["#ff96cb", "#ff70b8", "#ff3a9d", "#ee0077", "#c30062"],
        orangeToRed: ["#ffdf04", "#ffbe04", "#ff9a03", "#ff6d02", "#ff2c01"]
    },
    showCurrentDayBorder: true, // (optional) defaults to true
    defaultEntryIntensity: 5,   // (optional) defaults to 4
    intensityScaleStart: 0.25,    // (optional) defaults to lowest value passed to entries.intensity
    intensityScaleEnd: 3,     // (optional) defaults to highest value passed to entries.intensity
    entries: [],                // (required) populated in the DataviewJS loop below
}

function getHabitInPage(page, habit) {
 for (let task of page.file.tasks) {
  if (task.tags.contains('#habit') && task.checked && task[habit]) {
   return task[habit]
  }
 }
 return undefined
}

//DataviewJS loop
for (let page of dv.pages('"晨间日记/DayPlan/2023"')) {
 const habitIntensity = getHabitInPage(page, 'reading')
 if (!habitIntensity) {
  continue
 }
    //dv.span("<br>" + page.file.name) // uncomment for troubleshooting
    calendarData.entries.push({
        date: page.file.name,     // (required) Format YYYY-MM-DD
        intensity: habitIntensity, // (required) the data you want to track, will map color intensities automatically
        content: await dv.span(`[](${page.file.name})`),
        color: "orange",          // (optional) Reference from *calendarData.colors*. If no color is supplied; colors[0] is used
    })
}

renderHeatmapCalendar(this.container, calendarData)

每月习惯汇总

代码如下,调整habit和年月即可

```dataviewjslet pages = dv.pages(`"晨间日记/DayPlan/2023"`)
const year = 2023
const month = 12
const date_pattern = 'YYYY-MM-DD'
const habit_tag = '#habit'
const habits = {
'reading': '📖阅读 x {habit} h',  // this habit will be displayed like '📖 x 30 min'
'language': '📚语言 x {habit} h',
'guitar': '🎸吉他x {habit} h',
'exercise': '🏸运动 x {habit} h',
'writing': '📜写作 x {habit} h',
'input': '⌨输入 x {habit} h',
'output': '🗃输出 x {habit} h',
'wakey': '🌞早起',

}

let data = {}
for (let page of pages) {
let date = page.file.name
data[date] = data[date] || ''
for (let task of page.file.tasks.filter(task => task.tags.contains(habit_tag) && task.checked)) {
for (let habit in habits) {
if (task[habit]) {
data[date] += habits[habit].replace('{habit}', task[habit]) + '\n'
}
}
}
}

let calendarData = []
for (let date in data) {
calendarData.push({date: date, content: data[date]})
}
renderHabitCalendar(this.container, dv, {year, month, data: calendarData, date_pattern})

GIF


投诉或建议