В прошлой статье Obsidian + Dataview: Таблицы я рассказал про установку плагина Dataview, формирование таблиц с его помощью и разобрал 4 кейса его использования.

Dataview - это очень мощный и функциональный плагин, с помощью которого кроме таблиц можно так же формировать списки, календари и задачи.

Сегодня хотелось бы остановиться на задачах, тем более что Dataview позволяет сделать из Обсидиана task/todo-менеджер с календарём и возможностью ставить себе задачи на определённые даты, а затем просматривать выполненные\невыполненные задачи за конкретные дни.

Про исходники

По вопросам из прошлой статьи я понял, что неплохо было бы сразу давать исходники того хранилища по которому написана статья. Чтобы читатели сразу открывали исходник и шли по нему не перепечатывая то, что я уже напечатал. Плюс я думаю, что найдутся такие читатели, которым с исходниками и статья не нужна будет.

Вот сразу ссылка на архив, чтобы можно было скачать, распаковать и открыть обсидианом как хранилище.

Про ошибку Error Fatal

(Скорее всего в углу всплывёт ошибка "Error fatal. not a git repositiry", ткните по ней и работайте дальше, я не смог победить её. Она вылезает из-за того, что я выгружаю всё из тестового хранилища в свой гитхаб, чтобы вы могли быстро скачать, а сам плагин Obsidian-git в только что скачанном хранилище не настроен, пощупать сами исходники эта ошибка не мешает. Если она разражает, то удалите в скачаной базе плагин Obsidian-git).

Как работают задачи в двух словах

  1. В данной статье я не рассказываю как установить плагин Dataview, т.к. уже рассказывал об этом в первой статье.

  2. Задачи так же как и таблицы работают на встроенном языке запросов.

  3. Чтобы отобрать все задачи со всего своего хранилища достаточно в любую заметку вставить следующий код (Если в вашем хранилище Обсидиан много задач, то в код лучше добавить что-то ограничивающее выдачу, например FROM #задачи1 , иначе Обсидиан может долго долго формировать в списке все 100500 задач, которые у вас есть):

```dataview
TASK
FROM #задачи1
```
  1. Т.е. должно получиться что-то подобное:

Добавляем параметр к задачам

  1. Предположим мы хотим ввести градацию сложности в каджой задаче.

  2. Для этого в каждую заметку можно дописать соответствующий параметр [сложность:: 1].

  1. Теперь мы можем по этому параметру: группировать, сортировать и отбирать задачи.

  2. Для этого добавляем:

    1. "GROUP BY сложность" - для группировки;

    2. "SORT сложность ASC" - для сортировки (ASC - по возрастанию, DESC - по убыванию);

    3. "WHERE сложность = 1" - для отбора.

  1. Чтобы отобрать только выполненные задачи пишем "WHERE completed":

  1. Чтобы отобрать только невыполненные задачи пишем "WHERE !completed":

  1. Таким образом можно добавить сразу несколько параметров к одной задаче, этими параметрами могут быть:

    • Контекст - как по GTD (Телефон, Компьютер). И в дальнейшем сделать по заметке на каждый контекст и когда телефонное настроение открывать заметку "Телефон" и перед нами будут все задачи, где от нас требуется сделать звонок, при этом сами задачи могут быть расположены в соответствующих проектах.

    • Место (Дом, Офис, Торговый центр, Клиент) - и в дальнейшем всё так же как по контексту - можно добавлять к каждой задаче параметр места.

    • Сложность или трудозатраты - т.е. какая это задача, пятиминутная или часовая?

Добавляем дату к задачам и отбираем задачи на сегодня

  1. Предположим нам надо задавать дату каждой задачи.

  2. Назовём этот параметр [Дата:: 2023-01-23]

  3. Но каждый раз печатать эти 19 символов для каждой задачи - это очень сложно и долго, давайте автоматизируем это.

Ставим плагин QuickAdd, включаем его и идём прописывать хоткеи:

  1. В первом поле пишем название нашего хоткея, например "Сегодня", т.е. этот хоткей будет проставлять сегодняшнюю дату.

  2. Во втором выпадающем списке выбираем "Capture".

  3. Потом жмякаем на кнопку "Add Choice".

  4. Затем ткнём на молнию => это добавит данный хоткей в возможность назначения комбинации клавиш в обсидиане.

  5. Затем настраиваем созданный хоткей => жмём на шестерёнку.

  1. В открывшимся окне ставим две галки "Capture to active file" и "Capture format".

  2. Затем в поле "Capture format" пишем следующий текст: ",[Дата:: {{DATE}}]," [[2023-01-23 - Obsidian - Tragic Panda.png]].

  1. Так же можно добавить сразу подобные хоткеи на любые даты и вообще текст, который вам нужен:

    1. ",[Дата:: {{DATE:yyyy-MM-DD+1}}]," - данная сточка проставит завтрашнюю дату;

    2. ",[Дата:: {{DATE:yyyy-MM-DD-1}}]," - эта вчерашнюю дату;

    3. ",[Дата:: {{DATE:yyyy-MM-DD+7}}]," - а эта "через неделю";

    4. Можно добавить все три сложности, что мы раньше создали, для этого в Caprute format пишем ",[сложность:: 1],".

  2. Далее нам надо непосредственно прописать сочетания клавиш нашим хоткеям.

  3. Идём в настройки => Сочетания клавиш => Пишем в поле QuickAdd.

  4. Там видим все наши созданные хоткеи и назначаем им сочетания клавиш.

  5. У меня хоткеи такие: ALT+S - сегодня; ALT+D - завтра; ALT+F - через неделю; ALT+1/2/3 - сложность1/2/3.

  • Теперь присваиваем всем задачам в проекте даты:

  • Затем пишем вот такой код (Мы отбираем все задачи с нужным нам тегом, с непустой датой, а так же с датой сегодня и ранее, все незавершённые задачи, группируем их по дате)

```dataview
TASK
FROM #задачи3
WHERE Дата != empty
WHERE Дата <= date(today)
WHERE !completed
GROUP BY Дата
```
  • Должно получиться так (эта заметка - динамичная, т.е. каждый новый день сюда будут добавляться задачи с соответствующими датами, по сути это заметка "СЕГОДНЯ" в todo-листах.

  • Ну и на конец можно отобрать предстоящих задачи, невыполненные, сгруппированные сразу и по сложности и по дате (внутри скобок list() можно менять местами параметры или добавлять еще), с ограничением выдачи = 3 (За ограничение отвечает строчка LIMIT 3 и в зависимости от её положения в коде при сложных запросах будут разные результаты), т.е. три ближайших задачи, вот он код:

```dataview
TASK
FROM #задачи3
WHERE Дата > date(today)
WHERE !completed
GROUP BY list(сложность, Дата) as abs
SORT abs asc
LIMIT 3
```
  • Вот таким должен быть результат (Я не нашёл способа не дублировать каждую родительскую группировку и выглядит это не очень красиво, но это работает, а это главное)

Добавляем календарь и отбираем задачи на любой день

  • После того как мы получили возможность отобразить все сегодняшние и предстоящие задачи хотелось бы еще отобразить задачи на конкретный день.

  • Захотели что-то сделать в обсидиане? Что надо сделать в первую очередь? Правильно - поставить плагин, потом настроить, а потом еще поставить один плагин.

  • Ставим плагин Calendar, в настройках плагина можно сразу снять галку "Confirm before crating new note".

  • Затем ставим плагин Templater.

  • Далее нам надо создать: папку для ежедневных заметок (Daily Notes), папку для шаблонов (Template) и в ней первую заметку-шаблон (Daily Note).

  • Настраиваем встроенный плагин "Ежедневные заметки", указываем файл шаблона ежедневной заметки (Daily Note), указываем папку, куда будут складываться ежедневные заметки (Daily Notes), настраиваем представление даты: YYYY-MM-DD:

  • Настраиваем Dataview: Отключаем предупреждение о пустом результате, устанавливаем интервал обновления Dataview (т.е. выполнили задачу на заметке Dataview, через сколько времени представление обновиться и она оттуда пропадёт, значение в милисекундах), указываем формат даты yyyy-MM-dd, ставим галку "Автоматически проставлять параметр [completion:: 2023-01-23]".

  • Затем идём в файл-шаблон ежедневной заметки (Daily Note) и там пишем заголовок "# Запланированное на сегодня:", а под ним вот такой код (в строчке WHERE отбираются задачи по дате, а дата берётся из названия файла, а файл ежедневной заметки у нас будет называться как раз YYYY-MM-DD):

```dataview
TASK
FROM #задачи4
WHERE Дата = date({{Title}})
WHERE !completed
```
  • В этом же файле пишем заголовок "# Выполненные за сегодня:", а под ним вот такой код:

```dataview
TASK
FROM #задачи4
WHERE completion = date({{Title}})
WHERE completed
```
  • Теперь берём проект, в котором у нас перечислены задачи с параметром "Дата"

  • Если мы всё сделали верно или взяли мои исходники, то у нас должно получиться что-то подобное. И в какую дату бы мы не ткнули - у нас создаётся заметка на день, в которой уже есть код Dataview, который отбирает все запланированные и выполненные задачи за этот день.

Заключение

Надеюсь этот гайд поможет вам взглянуть на Обсидиан под другим углом.

Далее в планах раскрыть тему периодических задач через плагины Advanced URI или Tasks.

Не стесняйтесь задавать вопросы, если что-то не получается или не понятно.

Если нашли опечатку в тексте, то выделяйте её и жмите CTRL + Enter и тогда мне в личку прилетит репорт об опечатке.

Комментарии (13)


  1. Aquahawk
    23.01.2023 15:41

    Интересно что zettelkasten то подход описанный здесь требуют аккуратности и системного оформления заметок. Я свой дзен в obsidian познал когда отказался от системности.


    1. CyberMock Автор
      24.01.2023 04:39

      Да у меня не совсем zettelkasten или я бы даже сказал совсем не он. Просто есть заметки проекты, в которых записываются задачи по проектам, а в отдельных заметках они собираются по датам и контекстам. А zettelkasten там про атомарность и прочие сложнопонимаемые штуки.

      Тем то и хорош обсидиан, что он каждому позволяет познать свой дзен по-своему.


  1. flowing_abyss
    23.01.2023 15:43

    Предельный огонь. Думаю, что сила такой реализации в следующих вещах:

    • мы мыслим свои задачи через проекты

      • т.е. мы можем, например, работать в контексте какого-то проекта (в рамках множества заметок), писать много какого-то текста, пилить иллюстрации, схемы и прочее и тут же в этих же заметках по ходу дела писать задачи

        • причём задачи с конкретными параметрами (в данном случае, это сложность и дата)

    • мы извлекаем задачи из проекта исключительно в рамках dataview

      • т.е. мы не плодим лишних плагинов и лишних логик на их основе

      • иначе говоря, это работает, если мы хорошо понимаем как извлекаются данные и по каким признакам мы их хотим группировать

    Теперь из небольших корректировок. Я не проверял сработает ли это, но возможно будет лучше, если даты будут прописываться сразу как заметки (типа такого Дата:: [[2023-12-01]]). Причём их стоит сразу создавать (самому или как-то автоматически). Это всё нужно для того, чтобы на календаре эти заметки сразу показывались. Ибо dataview дает линейное отображение, а мне, например, хотелось бы ещё визуально мочь оценивать расстояния между задачами на календаре.

    В остальном же крутая идея и реализация.


    1. CyberMock Автор
      24.01.2023 04:44

      Если я правильно вас понял, то вы хотите каждую задачу отображать в разной заметке? Я не много не могу понять сценарий? Как это вы предлагаете использовать?
      Если вы в любом проекте напишите задачу с параметром дата, то ткнув на нужный день она там уже будет отображаться. Или вы хотите чтобы заметка с этим днём сразу создавалась?


      1. flowing_abyss
        24.01.2023 09:58

        Давайте я в виде вопроса лучше попробую. У вас есть шаблон, который в периодической заметке выводит список запланированных задач. Чтобы с помощью этого шаблона увидеть какие задачи запланированы в конкретный день, мы создаем периодическую заметку на этот конкретный день – тыкаем на календарь. На календаре под числом есть точка, которая является индикатором того, что по этой дате у вас есть периодическая заметка. Теперь вопрос. Как сделать, чтобы в календаре появились везде точки, где у меня есть запланированные задачи из проектов?


        1. CyberMock Автор
          24.01.2023 11:05

          Там немного другая логика работы, точка ставится от кол-ва символов на заметке за этот день и в настройках плагина Calendar вы можете задать какому количеству слов будет соответствовать одна точка.

          Скрин для понимания

          А

          А для того, чтобы Обсидиан сам создавал заметку наверное подойдёт плагин obsidian-note-autocreation, но я им сам не пользовался. Мне пока такой не нужен. Мой сценарий использования обсидиана не требует чтобы по всем датам, по которым есть запланированные задачи были проставлены точки.

          Мой сценарий такой:

          • Поступает вводная "Давай встретимся тогда-то"

          • Я тыкаю в календарь в эту дату

          • Открывается заметка с запланированными задачами

          • Если я вижу, что время для встречи есть, то я соглашаюсь на встречу

          • Копирую себе в заметку INBOX текст от этого человека, если мы с ним переписывались,

          • если устно общались, то сам записываю дату и с кем встреча

          • А затем на ближайшем разборе инбокса превращаю эту строчку в задачу и отправляю в соответствующий проект с проставленными параметрами

          Даже если бы количество точек соответствовало количеству задач - при моём сценарии это была бы бессмысленная инфа, потому что задачи могут варьироваться от "проверить штрафы на машину" до "уделить 2 часа написанию статьи на хабр". Пока не увижу что конкретно за задачи - не будет понимания занят у меня день или нет и можно ли эти задачи подвинуть или нет.


          1. flowing_abyss
            24.01.2023 11:32

            Да, в календаре можно настроить зависимость количества точек от количества слов. Но первая точка появится, если просто существует заметка.

            Если отталкиваться от вашего сценария, то я спрашиваю про то как организовать такую логику:

            • Поступает вводная "Давай встретимся тогда-то"

            • Я смотрю на календарь и ищу эту дату

              • если этот день пустой (т.е. нет вообще точек), то я сразу заношу задачу в свою систему

              • если этот день непустой (т.е. есть точки под ним), то я его открываю и анализирую какие задачи уже стоят на этот день

                • если нет места, то передоговариваюсь

                • или как-то втискиваю в рамках системы

            • ...


            1. CyberMock Автор
              24.01.2023 11:48

              Ну по тому же GTD все вводные если это не 2-5 минутные дела должны проходить через инбокс. Собственно так я предлагаю делать.В инбоксе я и задаю дату новой задачи и распределяю её в соответствующий проект. После распределения она отображается соответствующей заметке на соответствующий день.

              Так то можно задачу помещать в заметку определённого дня, но для этого надо немного подшаманить с шаблоном Daily Note. В таком случае задача будет отсутствовать в соотвествующем проекте, что для меня не подходит.


              1. flowing_abyss
                24.01.2023 12:44

                Скрин

                Надеюсь, что так станет понятнее...

                Возможно у вас есть какое-то более изящное решение как такую логику автоматизировать.


                1. CyberMock Автор
                  25.01.2023 11:40

                  Что-то сложно, не понимаю, извините.


                1. CyberMock Автор
                  25.01.2023 13:27

                  Возможно вам как-то поможет плагин Tasks + Tasks-Calendar

                  Первый - мощный инструмент для задач.

                  Второй - выводит все эти задачи в календарный вид.


  1. TilloTill
    25.01.2023 10:50

    Спасибо за отличную статью, прояснили много непонятных моментов.

    Разрешите уточнить, почему Вы используете срок задачи в виде параметра "Дата::"? Можно ли применяя Ваш подход, использовать due date из плагина Tasks? Объясню, почему это кажется удобнее - у этого плагина есть своя форма по добавлению новых задач, например, с телефона пользоваться ей проще.


    1. CyberMock Автор
      25.01.2023 11:36
      +1

      Данный код будет работать.

      WHERE due = date(2023-01-26)

      В документации Dataview есть раздел посвящённый этому.

      В целом связка Dataview + Tasks - достаточна удобна, но к сожалению повторяющиеся задачи не создаются из представления Dataview, надо проваливаться в замтеку и там её откликивать.

      Вообще про Dataview + Tasks я планирую следующую статью как раз написать, где-то к середине февраля.