Obsidian Bases.
npx -y skills add kepano/obsidian-skills --skill obsidian-bases --agent claude-codeСоздание и редактирование файлов Obsidian Bases (.base): представления, фильтры, формулы, сводки. Используйте при работе с .base файлами, создании табличных/карточных представлений заметок.
.base файл в хранилище с корректным YAMLfilters (по тегу, папке, свойству, дате)formulas (опционально)table, cards, list, map# Глобальные фильтры применяются ко ВСЕМ представлениям
filters:
and:
- 'status == "active"'
- not:
- 'file.hasTag("archived")'
# Формулы — вычисляемые свойства
formulas:
formula_name: 'expression'
# Отображаемые имена и настройки свойств
properties:
property_name:
displayName: "Отображаемое имя"
formula.formula_name:
displayName: "Имя формулы"
# Кастомные сводные формулы
summaries:
custom_summary_name: 'values.mean().round(3)'
# Одно или несколько представлений
views:
- type: table | cards | list | map
name: "Имя представления"
limit: 10
groupBy:
property: property_name
direction: ASC | DESC
filters:
and:
- 'status == "active"'
order:
- file.name
- property_name
- formula.formula_name
summaries:
property_name: Average
# Одиночный фильтр
filters: 'status == "done"'
# AND — все условия должны быть истинны
filters:
and:
- 'status == "done"'
- 'priority > 3'
# OR — любое условие может быть истинным
filters:
or:
- 'file.hasTag("book")'
- 'file.hasTag("article")'
# NOT — исключить совпадающие элементы
filters:
not:
- 'file.hasTag("archived")'
# Вложенные фильтры
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")
| Оператор | Описание |
|---|---|
== | равно |
!= | не равно |
>, <, >=, <= | сравнение |
&&, ||, ! | логические операторы |
Три типа свойств:
note.author или просто authorfile.name, file.mtime и др.formula.my_formula| Свойство | Тип | Описание |
|---|---|---|
file.name | String | Имя файла |
file.basename | String | Имя без расширения |
file.path | String | Полный путь |
file.folder | String | Путь к папке |
file.size | Number | Размер в байтах |
file.ctime | Date | Время создания |
file.mtime | Date | Время изменения |
file.tags | List | Все теги файла |
file.links | List | Внутренние ссылки |
file.backlinks | List | Ссылки на этот файл |
formulas:
# Простая арифметика
total: "price * quantity"
# Условная логика
status_icon: 'if(done, "✅", "⏳")'
# Форматирование строк
formatted_price: 'if(price, price.toFixed(2) + " руб.")'
# Форматирование дат
created: 'file.ctime.format("YYYY-MM-DD")'
# Дней с момента создания (.days для Duration)
days_old: '(now() - file.ctime).days'
# Дней до дедлайна
days_until_due: 'if(due_date, (date(due_date) - today()).days, "")'
| Функция | Описание |
|---|---|
date(string) | Парсит строку в дату |
now() | Текущие дата и время |
today() | Текущая дата (время 00:00:00) |
if(cond, true, false?) | Условное выражение |
duration(string) | Парсит строку длительности |
file(path) | Получить объект файла |
link(path, display?) | Создать ссылку |
Вычитание двух дат возвращает Duration, не число.
# ПРАВИЛЬНО — доступ к .days, затем числовые функции
"(date(due_date) - today()).days"
"(now() - file.ctime).days.round(0)"
# НЕПРАВИЛЬНО — Duration не поддерживает .round() напрямую
# "(now() - file.ctime).round(0)" ← ошибка
# Таблица
views:
- type: table
name: "Мои задачи"
order: [file.name, status, due_date]
summaries: {price: Sum}
# Карточки
views:
- type: cards
name: "Галерея"
order: [file.name, cover_image, description]
# Список
views:
- type: list
name: "Простой список"
order: [file.name, status]
![[MyBase.base]]
![[MyBase.base#Имя представления]]
'if(done, "Yes", "No")'"Имя представления"# НЕПРАВИЛЬНО — двоеточие в неквотированной строке
displayName: Status: Active
# ПРАВИЛЬНО
displayName: "Status: Active"
# НЕПРАВИЛЬНО — Duration не число
"(now() - file.ctime).round(0)"
# ПРАВИЛЬНО — сначала .days, потом round
"(now() - file.ctime).days.round(0)"
# НЕПРАВИЛЬНО — свойство может отсутствовать
"(date(due_date) - today()).days"
# ПРАВИЛЬНО — защита через if()
'if(due_date, (date(due_date) - today()).days, "")'
filters:
and:
- file.hasTag("task")
- 'file.ext == "md"'
formulas:
days_until_due: 'if(due, (date(due) - today()).days, "")'
is_overdue: 'if(due, date(due) < today() && status != "done", false)'
priority_label: 'if(priority == 1, "🔴 High", if(priority == 2, "🟡 Medium", "🟢 Low"))'
views:
- type: table
name: "Активные задачи"
filters:
and: ['status != "done"']
order: [file.name, status, formula.priority_label, due, formula.days_until_due]
groupBy: {property: status, direction: ASC}
filters:
or:
- file.hasTag("book")
- file.hasTag("article")
formulas:
reading_time: 'if(pages, (pages * 2).toString() + " min", "")'
status_icon: 'if(status == "reading", "📖", if(status == "done", "✅", "📚"))'
views:
- type: cards
name: "Библиотека"
order: [cover, file.name, author, formula.status_icon]