Мои запросы Tasks и шаблоны Templater для задач в Obsidian
Всем привет, меня зовут Влад. Сегодня я хочу рассказать как и с помощью чего, я веду свои задачи в Obisiadn.
Как я докатился до жизни такой…
C таск трекерами у меня долгая история: я много сидел на Todoist, потом перешел на TickTick. Не знаю на сколько это было связанно с сами таск трекерами или уже с моими личными проблемами -, но по итогу они мне мало помогали закрывать задачи, что личные, так и по работе. Потом у меня появился iPad и годовая подписка на Microsoft Office. Так я и перешел на OneNote.
Примерно в тоже время после тренинга по эмоциональному интеллекту было принято решение делить задачи на сферы жизни: Быт, Работа, Яркость жизни, Хобби и тд, — чтобы можно было заметить перекос в ту или иную сторону. Текстовый редактор, как по мне, в отличие от приложений, дает больше свободы в структурировании и нахождении своего способа организации дел. Если не знаешь как тебе удобно (а ты не знаешь, если только начинаешь вести задачи), то приложения будут структурировать хаос, а не наводить порядок.
Подписка закончилась, продлевать было лень и не очень то и хотелось за один OneNote платить. Так я и перешел на Obsidian, который и по сей день является моим основным приложением для всего.
Переход к автоматизации
По началу я разделял задачи руками, сферы жизни — заголовки, месяц — отдельный файл. Но спустя некоторое время, как бы обойтись без французкого… мне надоело это делать руками, Я ЖЕ ПРОГРАММИСТ подумал я и начала автоматизировать свою работу.
Начал я с плагина Tasks, который позволяет писать кастомные запросы на задачи со всего хранилища. И это был ад.
Сама возможность использовать мой любимый Javascript в запросах не может не вызывать уважения к плагину, но то как это пишется… примерно так
filter by function \
const SPRINT_P = 'SPRINT';\
\
const SPRINT_START_DATE = '2025-03-17';\
const SPRINT_END_DATE = '2025-03-30';\
\
const hasSprintTag = () => {\
const sprintTagBegin = '#Спринт25';\
const currentSprint = '03С2';\
const sprintTag = sprintTagBegin+currentSprint;\
return task.tags.includes(sprintTag);\
};\
\
...
Про дебагинг я вообще молчу, один раз я искал пробел после слеша целый час, может быть если я изначально знал, что искать, то нашел бы быстрее, в том же Templater с этим проблем нет, я конечно не пробовал Dataview, но может быть там все хорошо.
Сейчас мой запрос работает на свойствах файла и тегах задач.
Структура самого шаблона:
Инбокс — задачи, которые появились в текущем спринте
Задачи — блок с запросом Tasks
Сам результат запроса выглядит так:

Символом параграфа отмечаются категории в тегах, двойными — родительские задачи (так удобнее понимать к чему относиться задача). В «Не сгруппировалось» попадают задачи без категории
Описание свойств, которое используются в запросе:
Свойство | Описание | Значения |
---|---|---|
HAS_TASK | Чтобы задачи попали в запрос у Файла должно быть это свойство | Не имеет значения |
SPINT | свойство отвечающее за то, зависят ли задачи от тега со спринтом | DONE — попадает в запрос, если дата завершения попадает в период спринта TAG — задачи попадают в тот спринт, который указан в теге задачи |
GROUPING | отвечает за группировку | HEADING — группировка по заголовкам (нужна для списков, где есть несколько категорий) CUSTOM — группировка по свойствам файла |
GROUP_NAME | Название группы | Строка |
SUBGROUP_NAME | Название субгруппы | Строка или |
На сегодня я использую только два набора свойств для списков:
Свойство | Значения | |
---|---|---|
Описание | Списки с несколькими категориями, например, беклог на год или на квартал | Список под конкретную категорию Пример: Похудение, Петпроект %NAME%, и тд |
SPINT | TAG | DONE |
GROUPING | HEADING | CUSTOM |
GROUP_NAME | - | {{Название категории}} |
SUBGROUP_NAME | - | $FILENAME |
Шаблон с запросом Tasks: https://github.com/imabramon/my-templates
Работа с тегами
После агрегирования главной проблемой стала работа с тегами, так как вся группировка основана них. По началу я еще не уставал вручную писать, но, например, когда начинается спринт, пишешь очень много задач, многие их которых относятся к разным категориям, то это надоедает. Так я написал первые версии шаблоны на JS. В целом ничего сложного, бьешь tp.selection на строки и добавляешь в конец теги из промта.
Но планы были грандиозные (да и сейчас остались), вот например есть такой список:
- [ ] task
- [ ] sub parent
- [x] sub 1
- [ ] sub 2
- [x] sub 3
Хотелось бы шаблон который сможет превратить его в
- [ ] task
- [ ] sub parent
- [ ] sub 2
- [x] task
- [x] sub parent
- [x] sub 1
- [x] sub 3
Т.е. разделить на завершенную часть и незавершенную. Например у меня есть большая задача в инбоксе, и я не хочу переносить всю ее в беклог или следующий спринт. Так или иначе были идеи шаблонов, для которых нужна была абстракция, чтобы можно было удобнее работать, да и перспектива писать код в обсидиане меня не впечатляла. Так я перешел в привычный vs code.
К сожалению не так часто удавалось или даже хотелось писать из-за личных загонов. Но по спустя временя, понял что это было интересно, как говорил Жан Пьер Польнореф. Потихоньку писал парсер, фиксил баги, писал тесты, фиксил баги, думал какие шаблоны сделать еще и фиксил баги. Не хватает пару обычных для коллекций функций по типу map, reduce и тд, но то что уже есть сейчас хватит, чтобы покрыть большое количество запросов (в первую очередь моих).
По итогу сейчас есть следующие шаблоны:
добавление и удаление тегов — тут понятно
разделение по завершенности — пример выше
счетчик — создает однотипные задачи вида
- [ ] N
, удобно использовать для трекеров привычек
Так же есть 2 шаблон использующие понятие категории (сферы жизни):
разделить по категории — удобно сортировать инбокс
теги как у родителя — так же удобно работать с инбоксом, так как обычно у меня нет пересечений по категориям
Более подробно про сами шаблоны с примерами и JS API, которое есть на данным момент есть, можно найти на гитхабе: https://github.com/imabramon/templater_tasks_processor
Заключение
Пациент в глубокой коме…
Пока все это делал, довольно много устал от этого проекта. Вот в начале каждого пета есть некий тильт, так как еще не очень шаришь, мало что есть и много что надо сделать, в середине самый пик приятных эмоций — уже много что есть, начал уже жестко шарить за область проекта, но вот в конце, когда надо полишить — самый тягостный период разработки, как по мне. Понимаешь, что так оставлять нельзя, но и доделывать очень тяжело (возможно у меня SVG).
Надеюсь получилось не слишком душно и кому-нибудь это поможет для работы в obsidian.
Habrahabr.ru прочитано 6572 раза