Paperless Forest

Obsidian QuickAdd - как запускать скрипты

#Obsidian #QuickAdd

Плагин для Обсидиана QuickAdd позволяет автоматически создавать заметки, но ещё его можно использовать в качестве запускалки скриптов.

Javascript #

  • Создать файл в формате js и сохранить его в любом месте хранилища.
  • В файле написать код:
module.exports =  async (params) => {
    
  /Мой код. В нём можно использовать API Обсидиана и самого плагина./

}
  • В настройках QuickAdd создать макрос и в настройках макроса выбрать созданный скрипт.
  • Не забыть отметить значок молнии рядом с названием макроса, чтобы активировалась команда. Потом эту команду можно подвязать на хоткей или добавить кнопочку с помощью плагина Commander.

Другие языки и прочие файлы #

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

  • Нужно добавить файл, который мы хотим запустить, в хранилище. Например, это может быть bash-файл, который коммитит и пушит заметки на гитхаб.
  • Создать js-скрипт и макрос по инструкции выше.
  • В js-файле написать код:
module.exports =  async (params) => {
  
  let scriptPath = "\\scripts\\myFile.sh" /Здесь вместо моего примера надо указать путь к файлу, который мы хотим запустить. Путь указывается относительно хранилища. Обязательно надо эскейпить обратные слэши/

  let cmd = this.app.vault.adapter.basePath + scriptPath
  const { promisify } = require('util'); 
  const exec = promisify(require('child_process').exec); 
  await exec(cmd);

}

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

Запрашивать подтверждение перед выполнением скрипта #

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

module.exports =  async (params) => {

  const { quickAddApi: { yesNoPrompt } } = params;
  const runScript = await yesNoPrompt("Выполнить скрипт?");

  if (runScript) {

    /Здесь пишем код, который будет выполняться при подтверждении/
  }
}

Вызывать системные команды Обсидиана изнутри скрипта #

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

module.exports =  async (params) => {

  /Какой-то код/
  
  await app.commands.executeCommandById(id) /где id  это id конкретной команды/
  
  /Какой-то код/

}

Чтобы узнать id команды, можно открыть консоль и написать код:

console.log(app.commands.commands)

Это выведет список всех доступных на данный момент команд, включая команды из установленных плагинов, где указаны их названия и id.

Пример — скрипты для обновления вкладок #

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

Скрипт, чтобы обновить текущую активную вкладку:

module.exports =  async (params) => {

   await app.workspace.activeLeaf.rebuildView()
}

Скрипт, чтобы обновить все открытые вкладки:

module.exports =  async (params) => {

  await app.workspace.rightSplit.children.forEach(pane => {

    pane.children[pane.currentTab].rebuildView()
  })

  await app.workspace.leftSplit.children.forEach(pane => {

    pane.children[pane.currentTab].rebuildView()
  })

  await app.workspace.rootSplit.children.forEach(pane => {

    pane.children[pane.currentTab].rebuildView()
  })
}

Обновление вкладок может быть полезно при использовании некоторых плагинов, например Dataview и Supercharged Links, потому что они не всегда обновляют вид в реальном времени.