I know we have daily and Zettelkasten prefixer settings, but I’d really like to make a plugin that’ll let you define a function that specifies the name of new note. I have a personal date-encoding that can’t be directly implemented with Moment formatting.
Is this even something we can hook into? I’ve had a skim of other plugins and most seem to be checking for Moment formatting, or none at all. I also read through the API, but I didn’t spot any events that looked likely to hook into.
Oh, just to say, I’m very comfortable with Typescript.
Looks like I was a little pre-emptive. The event fires after creation, and on load (where it’s adding all the items to the vault I presume). Updating the payload will actually affect the UI representation of the files, not how the file was saved (which seems to come earlier in the process).
I was able to use Templater to make some custom logic to always add a zettel-id to the beginning of the filename (so this works even if I don’t use the zettel plugin), but also strip out the ID for the first header inside the file. Maybe this could be useful for you?
This template will work from creating a new note via keyboard shortcut, creating a new note via built-in zettel plugin, or from creating a link [[some link]] in a file and clicking on it.
async function zettler (tp) {
let title = tp.file.title
const zidRegex = /^\d{8,}\s?/
console.log("title is", title);
const matches = title.match(zidRegex);
if (Array.isArray(matches) && matches.length > 0) {
console.log('title has zid');
// We need to set the note header as the stripped title
title = title.replace(zidRegex, '');
console.log('title without zid is', title);
if (title.startsWith("Untitled") || title === '') {
title = await tp.system.prompt("Title");
}
console.log('renaming file to ', title);
await tp.file.rename(`${matches[0]} ${title}`);
} else {
console.log('prepending zid');
// we need to prepend a zid to the file name on disk
let filename = await tp.date.now("YYYYMMDDHHmm") + ' ' + title
console.log('renaming to ', filename);
await tp.file.rename(`${filename}`);
}
console.log('title is now', title);
return title;
}
module.exports = zettler;
The important part is when I call await tp.file.rename() with the new name. This will update the link from the previous file to include the new zettel id.