Skip to content

Latest commit

 

History

History
345 lines (267 loc) · 33.7 KB

File metadata and controls

345 lines (267 loc) · 33.7 KB

Changelog

Unreleased

Features

  • vulpea#251 Automatically detect when global tag inheritance settings (org-use-tag-inheritance, org-tags-exclude-from-inheritance) change between sessions and trigger a forced re-index. A fingerprint of these settings is stored in the database; on startup, if the fingerprint differs, the file change cache is cleared so all files are re-extracted with the new settings. Per-buffer overrides (e.g. via .dir-locals.el) are not tracked — use vulpea-db-sync-update-directory with a force argument after changing those.

Fixes

  • vulpea#267 Fix Wrong type argument: hash-table-p error during async sync. When org-id-update-id-locations is running, org-id-locations is temporarily an alist. If a vulpea timer fires in that window, org-id-add-location fails. Now org-id-locations is defensively converted to a hash table before registering IDs.
  • Fix org-element parser errors ("Invalid search bound", wrong-type-argument integer-or-marker-p) when building the database from scratch. The reusable parse buffer replaces its contents with inhibit-modification-hooks set, leaving the org-element cache stale from the previous file. Now org-element-cache-reset is called after each buffer replacement.

v2.2.0

Features

  • vulpea#243 Automatic database rebuild on schema version change. When vulpea-db-version changes, the database file is deleted and recreated from scratch on next access. When vulpea-db-autosync-mode is active, a forced re-index of all files is triggered automatically.
  • vulpea-journal#3 Add vulpea-db-extra-extensions for tracking non-.org files (e.g., .org.age, .org.gpg). Files with extra extensions are always parsed via find-file to support decryption hooks. Default is nil (opt-in only).
  • Store link descriptions in the database. Links now include a :description field extracted during parsing, eliminating the need for file I/O when querying link descriptions. The vulpea-db-query-links-* functions now return plists with :source, :dest, :type, :pos, and :description keys. Database schema version bumped to 3 (existing databases will rebuild automatically).
  • vulpea#212 Add title propagation system for renaming notes:
    • vulpea-propagate-title-change - interactive command to rename a note’s title and update incoming link descriptions. Supports dry-run with C-u prefix, categorizes links into exact matches (auto-update) and partial matches (manual review), and optionally renames the file.
    • vulpea-rename-file - function to rename a note’s file based on a new title slug and update the database.
    • vulpea-title-change-detection-mode - minor mode that detects title changes on save and notifies the user to run vulpea-propagate-title-change.
  • vulpea#211 Add per-note tag operations in new vulpea-tags.el module: vulpea-tags (get), vulpea-tags-add, vulpea-tags-remove, vulpea-tags-set. These work with both file-level notes (filetags) and heading-level notes (org heading tags).
  • vulpea#211 Add batch tag operations: vulpea-tags-batch-add, vulpea-tags-batch-remove, and vulpea-tags-batch-rename. The rename function implements vulpea#120, allowing global tag renaming across all notes. vulpea-tags-batch-rename is interactive with completion for existing tags.
  • vulpea#211 Add batch metadata operations: vulpea-meta-batch-set and vulpea-meta-batch-remove for efficiently setting or removing metadata properties across multiple notes. Both use vulpea-utils-process-notes for optimized batch processing.
  • vulpea-journal#2 Extend vulpea-create with :parent and :after parameters for creating heading-level notes under existing notes. When :parent is a vulpea-note, a heading is inserted in the parent’s file at parent-level + 1. :after controls insertion order: 'last (default, append as last child), nil (insert as first child), or a note ID string (insert after that sibling).

Fixes

  • vulpea#248 Heading-level notes now inherit tags from their file’s #+filetags and from parent headings, matching standard org-mode tag inheritance behavior. Inheritance respects org-use-tag-inheritance and org-tags-exclude-from-inheritance. vulpea-buffer-tags-get now accepts an optional LOCAL argument to return only the heading’s own tags without inheritance.
  • vulpea#227 Enable alias expansion by default in vulpea-find and vulpea-insert. Previously, notes could only be found by their primary title even though the :expand-aliases feature existed in vulpea-select-from. Now both functions pass :expand-aliases t by default, so notes with aliases appear multiple times in the completion list — once for the original title and once for each alias.
  • vulpea#232 Support aliases on heading-level notes. Previously, aliases were only extracted for file-level notes. Now heading-level notes with :ALIASES: (or :ROAM_ALIASES: etc.) properties are extracted and appear in vulpea-find via alias expansion.
  • vulpea#221 Fix links in note titles not being persisted to the normalized links table. Previously, vulpea-db--extract-links-from-string set :pos to nil, which violated the NOT NULL constraint on the links table, causing silent insertion failure. Title links were stored in the notes JSON column but not in the links table, so vulpea-find-backlink could not find notes linked via their titles. Now buffer positions are computed correctly for title links. Additionally, links in non-note heading titles (headings without :ID:) are now extracted and attributed to the nearest ancestor note.
  • vulpea#221 Strip Org emphasis markers from titles, aliases, and outline paths during extraction. Previously, notes with Org emphasis markup (e.g. ==code==, ~verbatim~, *bold*, /italic/, _underline_, +strikethrough+) in their titles appeared with raw markers in vulpea-find completion. Now emphasis markers are removed at extraction time, consistent with how org link markup is already stripped.
  • vulpea#238 Fix sync failure with packages that add read-only text properties (e.g. org-transclusion). When org-mode hooks marked regions as read-only in the shared parse buffer, erase-buffer would fail on the next file, causing all subsequent files to fail with “Text is read-only”.
  • vulpea-journal#5 Fix ~ paths in database causing query mismatches. vulpea-db-sync--list-org-files now expands directory paths before calling directory-files-recursively, consistent with vulpea-db-sync--scan-files-async. Previously, when vulpea-db-sync-directories contained ~/notes, the database stored paths with ~ unexpanded, causing exact-match lookups to fail.
  • vulpea#252 Fix vulpea-find-backlink failing when cursor is inside a heading without its own ID. The function now inherits the ID from the nearest ancestor (parent heading or file-level note). Additionally, the resolved ID is validated against the database — if it does not correspond to a known note, a clear error is shown.
  • vulpea-journal#5 Change vulpea-default-notes-directory default from (car vulpea-db-sync-directories) to nil. The old default was evaluated once at load time, before use-package :custom could take effect, causing stale values. When nil, it dynamically resolves via vulpea--default-directory.
  • vulpea#255 Fix fswatch sync ignoring file changes when vulpea-db-sync-directories contains relative paths (e.g. ~/notes). The fswatch path validator now expands directory paths before comparison, consistent with all other sync functions.
  • vulpea#257 Extract #+CATEGORY keyword at file level as a property. Previously only :CATEGORY: in the :PROPERTIES: drawer was captured.
  • vulpea-journal#9 Fix vulpea-note-properties returning symbol keys after database round-trip. json-parse-string with :object-type 'alist produces symbol keys, but the rest of the API uses string keys consistently. Property keys are now converted back to strings in vulpea-db--row-to-note.
  • vulpea#260 Fix first heading with :ID: not being indexed when the file has no file-level ID. The file-level property extraction was searching the entire AST for a property drawer, accidentally finding the first heading’s drawer and stealing its ID for a bogus file-level note.
  • vulpea#250 Fix vulpea-buffer-tags-get only reading the first #+filetags line. When a file has multiple #+filetags lines, all lines are now collected and merged. vulpea-buffer-tags-set also consolidates multiple lines into a single #+filetags line.
  • vulpea#262 Fix org-attach error during parsing when org-latex-preview-mode is active and org-attach-id-dir is relative. The shared parse buffer now sets buffer-file-name before loading file contents and inhibits modification hooks during buffer population.
  • vulpea#263 Add :noquery t to the fswatch process so Emacs does not prompt about it when exiting.

v2.1.0

Features

  • vulpea#206 Add vulpea-db-query-dead-links for finding broken ID links that point to non-existent notes. Returns a list of cons cells (SOURCE-NOTE . BROKEN-TARGET-ID). Only checks links of type “id”; other link types are ignored.
  • vulpea#207 Add vulpea-db-query-orphan-notes for finding notes with no incoming ID links, and vulpea-db-query-isolated-notes for finding notes with no incoming or outgoing ID links.
  • vulpea#208 Add vulpea-db-query-title-collisions for finding notes that share the same title. Returns list of (TITLE . NOTES) groups.
  • vulpea#209 Add link querying API: vulpea-db-query-links (all links), vulpea-db-query-links-by-type (filter by type), vulpea-db-query-links-from (outgoing links from a note), vulpea-db-query-links-to (incoming links to a note). All return plists with :source, :dest, :type, and :pos keys.

Fixes

  • vulpea#221 Strip org link markup from note titles during extraction. Previously, titles containing org links (e.g. The Memory Illusion [[id:...][book]]) were stored verbatim with raw link syntax. Now org-link-display-format is applied at extraction time so titles, file-titles, and outline paths are stored as clean display text. Links from titles are still extracted and persisted in the links table.
  • vulpea#222 Normalize property keys to uppercase during extraction. Previously, files with lowercase property names (e.g. :id: instead of :ID:) were silently skipped because assoc lookups are case-sensitive. Now property keys are upcased at the extraction boundary, matching org-mode’s case-insensitive treatment of properties.

Performance

  • Make polling-based external change detection non-blocking. Previously, vulpea-db-sync--check-external-changes used synchronous directory-files-recursively every poll interval (~1s blocking per cycle with 13k files). Now uses async fd (or find) subprocess for file listing, reducing blocking time from ~1000ms to <1ms per poll cycle. The file-attributes comparison (~170ms) runs in the subprocess callback without freezing Emacs.

v2.0.1

Features

  • Add vulpea-db-query-attachments-by-path for efficiently querying all attachment link destinations for notes at a given file path. Returns a list of cons cells (DEST . ATTACH-DIR) where DEST is the attachment file name and ATTACH-DIR is the attachment directory of the note containing the link. Uses a single SQL query with JOIN, avoiding N+1 queries when processing multiple notes in a file.

Performance

  • Async autosync startup is now non-blocking. When vulpea-db-sync-scan-on-enable is 'async, the startup function returns in ~8ms instead of ~1400ms (measured with 13,800 files in GUI Emacs). File listing uses an fd (or find) subprocess instead of synchronous directory-files-recursively, and cleanup of deleted files uses set comparison against the subprocess output instead of per-file file-exists-p calls. When fswatch is active, filenotify watchers are skipped entirely as they are redundant. Added vulpea-db-sync-debug variable for timing instrumentation.

Fixes

  • vulpea#200 Fix heading-level metadata not being persisted to the database. Previously, vulpea-db-query-by-meta-key and vulpea-db-query-by-meta returned no results for heading-level metadata because org-element-map with NO-RECURSION 'headline wouldn’t descend into the headline element itself during extraction.
  • Fix headline link extraction including links from child headlines. Previously, when extracting links for a heading-level note, all links from nested child headlines were also included. This caused issues with attachment resolution in tools like publicatorg, where attachments would be incorrectly resolved using parent heading’s attachment directory instead of the actual heading containing the link.
  • vulpea#202 Fix link extraction to include links from non-note subtrees. Previously, links inside headings without an ID were not attributed to any note. Now links in non-note subtrees are collected as part of the nearest ancestor note, while still respecting note boundaries (headings with IDs).

v2.0.0

Fixes

  • vulpea-create now refuses to overwrite existing files. Previously, if a file existed at the target path but was not in the vulpea database, vulpea-create would silently overwrite it. Now it signals an error, preventing accidental data loss.

v2.0.0-rc.2

Breaking changes

  • vulpea#128 vulpea-insert now uses keyword arguments instead of positional optional arguments. Change (vulpea-insert filter-fn create-fn) to (vulpea-insert :filter-fn filter-fn :create-fn create-fn).

Features

  • vulpea#178 Add file-title slot to vulpea-note that stores the title of the file containing the note. For file-level notes, this equals the note’s title. For heading-level notes, this is the parent file’s title. Useful for displaying context without additional queries.
  • vulpea#178 Add vulpea-select-describe-outline and vulpea-select-describe-outline-full functions for displaying notes with their parent hierarchy in selection interfaces. Set vulpea-select-describe-fn to use them.
  • vulpea#128 Add :candidates-fn argument to vulpea-insert, aligning with vulpea-find. Allows customizing the source of candidates for note selection during insert.
  • vulpea#75 Add heading-level metadata support to vulpea-meta-* and vulpea-buffer-meta-* functions. Metadata operations now scope to the correct level based on the note: file-level notes access metadata before any headings, while heading-level notes access metadata within their subtree. This ensures consistent behavior between database extraction (which already supported heading-level meta) and the API.

Performance

  • vulpea#129 Optimize vulpea-db-query-by-tags-every, vulpea-db-query-by-tags-none, and vulpea-db-query-by-links-every to use single SQL queries with subqueries instead of two separate queries. Provides ~1.3-1.4x speedup for large result sets.
  • vulpea#66 Add vulpea-meta-set-batch and vulpea-buffer-meta-set-batch for setting multiple metadata properties efficiently. Parses the buffer only once instead of N times, providing significant speedup (2-10x depending on property count).

Fixes

  • Interactive meta commands (vulpea-meta-add, vulpea-meta-add-list, vulpea-meta-remove, vulpea-meta-clean) now correctly operate on the note at point, including heading-level notes.

v2.0.0-rc.1

This is a complete rewrite of Vulpea that removes the dependency on org-roam. Vulpea now manages its own database and provides all functionality independently.

Breaking changes

  • org-roam is no longer required. Vulpea manages its own SQLite database.
  • Database location changed from org-roam’s db to vulpea-db-file (default: vulpea.db in vulpea-directory).
  • vulpea-db-update renamed to vulpea-db-update-file.

New Sync System

Vulpea now has its own file synchronization system (vulpea-db-sync.el):

  • Multiple backends: filenotify (default), fswatch (for large directories), polling (fallback).
  • Async batched updates to avoid blocking Emacs.
  • Configurable via vulpea-db-sync-backend, vulpea-db-sync-directories.
  • Start with vulpea-db-sync-start, stop with vulpea-db-sync-stop.

vulpea-note changes

  • Links now include :pos (buffer position) in addition to :source and :dest.
  • All link types are captured: id, https, file, attachment, etc.
  • New slot :attach-dir for attachment directory path.

New Query Functions

  • vulpea-db-query-by-directory - query notes by directory path.
  • vulpea-db-query-by-file-path - query notes by exact file path.
  • vulpea-db-search-by-title - search notes by title substring.
  • vulpea-db-query-by-created-date - query notes by creation date (from CREATED property).
  • vulpea-db-query-by-property - query notes by property key and value.
  • vulpea-db-query-by-property-key - query notes that have a specific property.

Fixes

  • Fix inconsistency where directory scans (vulpea-db-sync-update-directory, vulpea-db-sync-full-scan, initial scan, and polling) would index files in hidden directories (paths containing /.*), while file watchers excluded them. Now all sync methods consistently exclude hidden directories.
  • Fix fswatch filter incorrectly processing partial paths when output is split across buffer boundaries, which could cause scanning of directories outside the watched paths.

Features

  • Exclude archived entries from the database by default. Controlled by vulpea-db-exclude-archived (default t). Entries are considered archived if they have the org-archive-tag (directly or inherited) or the ARCHIVE_TIME property.
  • Populate created-at column from CREATED property during extraction. Enables efficient querying of notes by creation date via vulpea-db-query-by-created-date.
  • Add normalized properties table for efficient property-based queries. Properties are now stored both in the JSON blob (for full note retrieval) and in a normalized table (for indexed queries via vulpea-db-query-by-property and vulpea-db-query-by-property-key).
  • Add vulpea-note-expand-aliases utility function that expands a note into multiple notes based on aliases. Returns a list where the first element has the original title and subsequent elements have each alias as title with primary-title set to the original. Useful for selection interfaces.
  • Add :expand-aliases parameter to vulpea-select, vulpea-select-from, and vulpea-select-multiple-from. When non-nil, notes with aliases appear multiple times in completion - once for the original title and once for each alias. Selected alias notes have the alias as title and original as primary-title.

v0.4.0

Last release based on org-roam. Future versions (v2) will be independent of org-roam.

Features

  • Include attachment directory in vulpea-note and notes table.
  • vulpea#130 Introduce mechanism to automatically rebuild database when needed. This happens either on the first usage of Vulpea or when vulpea-db-version increases.
  • vulpea#158 Introduce mechanism to define more tables in Org Roam database (see vulpea-db-define-table). And provide a hook to fill defined tables with data (see vulpea-db-insert-note-functions).
  • Handle forced database sync. Whenever it happens, make sure that all the extra tables are initialized and versions are set accordingly.
  • Respect aliases used in the meta blocks when extracting value as a note.
  • Introduce vulpea-insert-default-candidates-source.
  • Introduce vulpea-db-query-by-tags-none.
  • Include outline-path in vulpea-note and bump notes table version (i.e. a full rebuild is required).
  • Introduce vulpea-db-query-by-level, which returns all notes of a given LEVEL.
  • Improve performance of vulpea-meta-get-list and vulpea-note-meta-get-list for notes by using single call to db.
  • Allow to pass meta when creating a new note.
  • Allow to control how new note is created when a non-existent one is picked in the insert flow.
  • Allow to pass Org capture properties when creating a new note.
  • Introduce shortcuts for checking of a note links to all/any of the given links.
  • Allow to override description in vulpea-utils-link-make-string.
  • Function to sort metadata in a buffer.
  • vulpea-select-multiple-from function.

v0.3.0

This release’s main feature is a dedicated view table to boost the performance of query operations. In addition, it provides some specialized queries for situations when the set of notes can be narrowed down by tags or links.

In addition, vulpea-note now has properties, meta and links as part of its structure.

Features

  • vulpea#97 Expose properties in vulpea-note.
  • vulpea#100 Persist note meta in org-roam-db.
  • vulpea#100 Provide an API to access/extract data from vulpea-note-meta:
    • vulpea-note-meta-get-list - to get all values of given PROP and TYPE.
    • vulpea-note-meta-get - to get the first value of given PROP and TYPE.
  • New function to remove buffer properties - vulpea-buffer-prop-remove.
  • Improve filetags handling:
    • Property format them with : as separator;
    • Remove property when setting them to empty list instead of leaving empty property.
  • New function to select on arbitrary list of notes as opposed to relying on filter - vulpea-select-from.
  • vulpea#106 Include links in vulpea-note.
  • vulpea#106 Provide more functions to query notes in efficient manner:
    • vulpea-db-query-by-tags-some - return all notes tagged with one of the provided TAGS;
    • vulpea-db-query-by-tags-every - return all notes tagged by every tag from the list of provided TAGS;
    • vulpea-db-query-by-links-some - return all notes linking at least one of the provided DESTINATIONS;
    • vulpea-db-query-by-links-every - return all notes linking each and every provided DESTINATIONS;
  • vulpea#116 improve query performance by building and maintaining a separate view table.
  • vulpea#121 allow to configure candidates source for vulpea-find function via vulpea-find-default-candidates-source variable.
  • Add shortcuts for checking tags on the note:
    • vulpea-note-tagged-all-p - return non-nil if a NOTE is tagged by all of the TAGS.
    • vulpea-note-tagged-any-p - return non-nil if a NOTE is tagged by any of the TAGS.

v0.2.0

Primarily migration to org-roam v2 that has many improvements and breaking changes.

Features

  • Allow to provide extra properties in vulpea-create.
  • New function to manipulate #+title: vulpea-buffer-title-set and vulpea-buffer-title-get.
  • New functions to manipulate #+filetags:
    • vulpea-buffer-tags-get - function to get list of tags.
    • vulpea-buffer-tags-set - function to set/replace the value of #+filetags.
    • vulpea-buffer-tags-add - function to add a tag to #+filetags.
    • vulpea-buffer-tags-remove - function to remove a tag from #+filetags.
  • New functions to manipulate buffer-wide properties in the buffer header using #+NAME: value format:
    • vulpea-buffer-prop-set - function to set a VALUE of property with NAME in the current buffer.
    • vulpea-buffer-prop-set-list - function to set a value of property with NAME to the list of VALUES in the current buffer.
    • vulpea-buffer-prop-get - function to get a value of property with NAME from the current buffer.
    • vulpea-buffer-prop-get-list - function to get a value of property with NAME as a list separated by some SEPARATORS.
  • Extract buffer related functions (prop and meta related) to separate module. Basically, this means that now it’s possible to manipulate meta lists that are located in any org file, not necessarily part of vulpea.
  • Add aliases and primary-title slots to vulpea-note.
  • Use custom completion in vulpea-select instead of one provided by org-roam. See documentation for more information.
  • New functionality to select and find a note:
    • vulpea-find - just a wrapper around vulpea-select to provide a consistent experience; selection can be narrowed down by vulpea-find-default-filter or by passing explicit filter.
    • vulpea-find-backlink - select and find a backlink to current note.
  • New functionality to insert a link to the note via vulpea-insert, which accepts global and local filter (just like vulpea-find) and allows to hook into finalisation (e.g. call your custom handler after the link was inserted regardless involvement of capture process). See documentation for more information.
  • New utilities to repeat functions:
    • vulpea-utils-collect-while;
    • vulpea-utils-repeat-while.
  • vulpea#98 Make it possible to use vulpea-meta-remove interactively.
  • vulpea#98 Make it possible to use vulpea-meta-clean interactively.
  • vulpea#98 Provide interactive variant of vulpea-meta-set: vulpea-meta-add and vulpea-meta-add-list.
  • All features of org-roam apply to vulpea.

Breaking changes

  • Flatten template in vulpea-create, meaning that instead of passing a template in format (:body :file-name :head :unnarrowed :immediate-finish), all values should be passed as arguments to vulpea-create. Also, there is no need to provide #+title: ${title} in :head anymore. See vulpea-create documentation for more information.
    ;; instead of
    (vulpea-create title
                   (list :file-name file-name
                         :head "#+title: ${title}\n#+url: ${url}\n#+filetags: tag1 tag2\n"
                         :unnarrowed t
                         :immediate-finish t)
                   (list (cons url "https://example.org")
                         (cons id "xyz")))
    
    ;; you should
    (vulpea-create title
                   file-name
                   :id xyz
                   :tags '("tag1" "tag2")
                   :head "#+url: ${url}"
                   :unnarrowed t
                   :immediate-finish t
                   :context
                   (list :url "https://example.org"))
        
  • Remove vulpea-setup because org-roam v2 already provides all information to get resulting file of capture process.
  • Remove vulpea-note-meta. It was only used for vulpea-select, but now it is not needed anymore.
  • All breaking changes of org-roam apply to vulpea.

v0.1.1

Primarily a stabilization and bug-fix release.

Features

  • vulpea#84 Support passing extra context for templates to vulpea-create. This is a breaking change, now instead of passing id argument, you should pass (list (cons 'id id)). While being more verbose it gives much more power.
  • vulpea#85 Support require match in vulpea-select. This is a breaking change, as arguments to vulpea-select are passed as keys. In my experience, most of the times first two arguments are nil and they are rarely needed. In this way, API of this function is cleaner and opens a way to add new functionality there.
  • vulpea#86 New function vulpea-db-query to query notes with generic predicate.
  • vulpea#86 Add metadata to vulpea-note consisting of access time and modification time.
  • vulpea#86 Use vulpea-db-query in vulpea-select instead of heavy org-roam-db-query.
  • vulpea#89 vulpea-utils-note-hash function to calculate sha1 of a given NOTE.
  • vulpea#90 vulpea-create automatically adds a property block with id into created file (formatted according to org-property-format). This also breaks API, see breaking changes section for more information.

Fixes

  • vulpea#80 Fix how org-roam-capture--new-file is called from advice.

Breaking changes

  • vulpea#82 Remove all autoloads.
  • vulpea#86 vulpea-select does not allow to pass completions anymore.
  • vulpea#87 org-roam-capture--new-file is not being adviced by default anymore. Instead you should call vulpea-setup.
  • vulpea#90 vulpea-create does not accept org-roam-template (whatever that means), instead it accepts a structured property list (:file-name :head :unnarrowed :immediate-finish) which is converted into something supported by org-roam. Migration is simple - just remove irrelevant parts.

v0.1

Features

  • vulpea module - one stop module, importing all others.
    • vulpea-select - function to completing-read a note with optional filter.
    • vulpea-create - function to create a new note file with given TITLE and TEMPLATE.
  • vulpea-db module - for querying notes data base.
    • vulpea-db-get-id-by-file - function to get ID of a note represented by FILE.
    • vulpea-db-get-by-id - function to get note represented by ID. Supports headings of the note.
    • vulpea-db-get-file-by-id - function to get FILE of a note represented by ID. Supports headings of the note.
    • vulpea-db-search-by-title - function to query notes with TITLE.
    • vulpea-db-update - function to update db with NOTE-OR-ID.
  • vulpea-meta module - for manipulating note metadata represented by description list:
    • vulpea-meta - function to get metadata from NOTE-OR-ID. In most cases you should not use this function unless performance is important. In this case, take a look at bang functions, e.g. vulpea-meta-get!.
    • vulpea-meta-get - function to get a value of PROP for note with ID. Value is parsed based on the passed TYPE or as a string if omitted.
    • vulpea-meta-get! - function to get a value of PROP from META (result of vulpea-meta). Value is parsed based on the passed TYPE or as a string if omitted. Use it performing multiple read operations in a row.
    • vulpea-meta-get-list - function to get all values of PROP for note with ID. Values are parsed based on the passed TYPE or as a string if omitted.
    • vulpea-meta-get-list! - function to get all values of PROP from META (result of vulpea-meta). Values are parsed based on the passed TYPE or as a string if omitted. Use it performing multiple read operations in a row.
    • vulpea-meta-set - function to set VALUE of PROP for NOTE-OR-ID. Supports multi-value properties.
    • vulpea-meta-remove - function to remove a PROP for NOTE-OR-ID.
    • vulpea-meta-remove - function to remove all meta for NOTE-OR-ID.
    • vulpea-meta-format - function to format a VALUE.
  • vulpea-utils module.
    • vulpea-note type definition.
    • vulpea-utils-with-note - function to execute BODY with point at NOTE. Supports file-level notes as well as heading notes.
    • vulpea-utils-link-make-string - make a bracket link to NOTE.