如何戒掉坏习惯?最好的方式是培养新习惯去替代它或者去占有你的时间,你的时间自然而然就倾泻到了你投入的地方。
之前个人工作流里面也提到,人的时间和精力投入应当是为了生命轮服务,生命轮的组成由自我追求来确认,比如我的是健康、工作、爱、娱乐、学习。目前主要希望自己长期都能够坚持的是运动和读书,不让腐朽的肉体拖沓灵魂的脚后跟。
之前一直会用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的设定,可以放入以下内容,请注意几点格式:
需要有
- [ ]
,这个就是checklist,主要是因为后续的结果展示里有一个条件是完成后打勾需要有
#habit
,理由也和上面一样习惯的设定用
xxx(reading:: )
- [ ] #habit 8:00前起床(wakey::)
- [ ] #habit 读书(reading:: )h 📌30分钟
- [ ] #habit 运动(exercise:: )h📌15分钟
- [ ] #habit 英语(language:: )h 📌15分钟
Heatmap Calendar的设定
首先开启Dataview(打开设定如下)及Heatmap Calendar,可以展示全年的习惯完成情况

可以注意以下几个地方:
颜色可以调整
文件地址需要更改
颜色强度可以进行调整
```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和年月即可
```dataviewjs
let 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})
