- Add or update Yaml properties and Dataview fields easily
- Ignore properties to hide them from the menu
- Auto Properties that have customizable, pre-defined values selectable through a suggester
- Multi-Value Mode that allows you to detect and vectorize/create arrays from your values
- Progress Properties that automatically update properties/fields
- Works with total task, completed task, and incomplete task counts. Mark a task as completed (from anywhere), and the file will be updated with the new count.
- Transform properties between YAML and Dataview
- Delete properties easily
- Auto update properties in files linked to from Kanban boards on lane change
- Edit metadata through a filemenu
- Edit last value in tags - works with Obsidian Tracker, too.
- API to use in other plugins and Templater templates.
This plugin is in the community plugin browser in Obsidian. Search for MetaEdit and you can install it from there.
- Go to Releases and download the ZIP file from the latest release.
- This ZIP file should be extracted in your Obsidian plugins folder. If you don't know where that is, you can go to
Community Plugins
inside Obsidian. There is a folder icon on the right ofInstalled Plugins
. Click that and it opens your plugins folder. - Extract the contents of the ZIP file there.
- Now you should have a folder in plugins called 'metaedit' containing a
main.js
file,manifest.json
file, and astyles.css
file.
LQtNcywPB3.mp4
omBaAmeyJQ.mp4
You can access the API by using app.plugins.plugins["metaedit"].api
.
I recommend destructuring the API, like so:
const {autoprop} = this.app.plugins.plugins["metaedit"].api;
Takes a string containing a property name. Looks for the property in user settings and will open a suggester with possible values for that property.
Returns the selected value. If no value was selected, or if the property was not found in settings, it returns null
.
This is an asynchronous function, so you should await
it.
Updates a property with the given name to the given value in the given file.
If the file is a string, it should be the file path. Otherwise, a TFile
is fine.
This is an asynchronous function, so you should await
it.
Gets the value of the given property in the given file.
If the file is a string, it should be the file path. Otherwise, a TFile
is fine.
This is an asynchronous function, so you should await
it.
New Task template (requires Templater)
<%*
const {autoprop} = this.app.plugins.plugins["metaedit"].api;
_%>
#tasks
Complete:: 0
Project::
Status:: <% await autoprop("Status") %>
Priority:: <% await autoprop("Priority") %>
Due Date::
Complete:: 0
Energy::
Estimated Time::
Total:: 1
Complete:: 0
Incomplete:: 1
---
- [ ] <% tp.file.cursor() %>
Requires Dataview and Buttons.
```dataviewjs
const {update} = this.app.plugins.plugins["metaedit"].api
const {createButton} = app.plugins.plugins["buttons"]
dv.table(["Name", "Status", "Project", "Due Date", ""], dv.pages("#tasks")
.sort(t => t["due-date"], 'desc')
.where(t => t.status != "Completed")
.map(t => [t.file.link, t.status, t.project, t["due-date"],
createButton({app, el: this.container, args: {name: "Done!"}, clickOverride: {click: update, params: ['Status', 'Completed', t.file.path]}})])
)
```
Requires Dataview.
```dataviewjs
const {update} = this.app.plugins.plugins["metaedit"].api;
const buttonMaker = (pn, pv, fpath) => {
const btn = this.container.createEl('button', {"text": "Done!"});
const file = this.app.vault.getAbstractFileByPath(fpath)
btn.addEventListener('click', async (evt) => {
evt.preventDefault();
await update(pn, pv, file);
});
return btn;
}
dv.table(["Name", "Status", "Project", "Due Date", ""], dv.pages("#tasks")
.sort(t => t["due-date"], 'desc')
.where(t => t.status != "Completed")
.map(t => [t.file.link, t.status, t.project, t["due-date"],
buttonMaker('Status', 'Completed', t.file.path)])
)
```
Made by Christian B. B. Houmann Discord: Chhrriissyy#6548 Twitter: https://twitter.com/chrisbbh Feel free to @ me if you have any questions.
Also from dev: NoteTweet: Post tweets directly from Obsidian.