Vai al contenuto principale
TaskForge 3.0: l'IA legge le tue attività.

Convertire le attività Obsidian tra formati

Obsidian Tasks non ha un comando che riscriva un vault da un formato a un altro. Lo dice la sua stessa documentazione. Le conversioni qui sotto sono script e ricette che fanno il lavoro, ciascuno testato sulle righe di esempio della documentazione del plugin, più l’unica conversione per cui esiste uno strumento: da una riga di attività a un file di attività e viceversa.

Scritto per Obsidian Tasks 8.6, Task Genius 9.13 e TaskNotes 4.14, ottobre 2026. Nomi dei campi e simboli sono elencati nella guida rapida.

Prima di cambiare qualsiasi cosa

  1. Fai un backup del vault. Copia la cartella o fai il commit in git. Uno script che riscrive 4.000 righe deve essere facile da annullare.
  2. Lavora prima su una copia. Esegui la conversione su una copia del vault, aprila in Obsidian ed esegui una delle tue solite query sulle attività. Confronta i conteggi con l’originale.
  3. Converti, poi cambia il plugin. Obsidian Tasks legge un formato alla volta. Converti prima le righe, poi cambia il formato delle attività nelle sue impostazioni, così il plugin non vede mai un vault convertito a metà.
  4. Controlla cosa resta. Cerca nel vault i vecchi simboli (📅, ⏳, ⏫ per le emoji; due::, repeat:: per Dataview) per trovare le righe saltate dalla ricetta.

Quale conversione ti serve

Da A Come
Righe con emoji Campi Dataview Lo script o la ricetta trova e sostituisci qui sotto.
Campi Dataview Righe con emoji Lo script o la ricetta inversa qui sotto.
Uno qualsiasi Task Genius Niente da riscrivere. Task Genius legge entrambi nella stessa riga. Scegli nelle sue impostazioni quale scrive.
Righe di attività File di attività TaskNotes converte una riga alla volta. La riga di comando di TaskForge ne converte molte insieme.
File di attività Righe di attività La riga di comando di TaskForge, con un’anteprima di tutto ciò che andrebbe perso.

Da emoji a campi Dataview

Ogni emoji con il suo valore diventa un campo tra parentesi. Le emoji di priorità diventano un campo priority con una parola, e il testo della ricorrenza passa dentro le sue parentesi. Esegui le sostituzioni in quest’ordine: prima date e priorità, ricorrenza per ultima, così il testo della ricorrenza finisce dove inizia la parentesi successiva.

Prima e dopo

Prima
- [ ] Send invoice to Acme ⏫ 🔁 every month ➕ 2026-10-01 ⏳ 2026-11-01 📅 2026-11-03 #finance
- [x] Book flights 📅 2026-10-25 ✅ 2026-10-20
- [ ] Order parts 🆔 parts1
- [ ] Assemble 🛫 2026-11-10 ⛔ parts1 📅 2026-11-15
Dopo
- [ ] Send invoice to Acme  [priority:: high]  [repeat:: every month]  [created:: 2026-10-01]  [scheduled:: 2026-11-01]  [due:: 2026-11-03] #finance
- [x] Book flights  [due:: 2026-10-25]  [completion:: 2026-10-20]
- [ ] Order parts  [id:: parts1]
- [ ] Assemble  [start:: 2026-11-10]  [dependsOn:: parts1]  [due:: 2026-11-15]

Trova e sostituisci, un campo alla volta

Questi pattern funzionano in qualsiasi editor con ricerca regex su più file, come VS Code, che scrive il testo catturato come $1. Attiva la modalità regex e la distinzione tra maiuscole e minuscole. A differenza dello script, agiscono su ogni riga, non solo sulle checkbox.

Campo Trova Sostituisci con
📅 (?:📅|📆|🗓️?)\s*(\d{4}-\d{2}-\d{2}) [due:: $1]
⏳ (?:⏳|⌛)\s*(\d{4}-\d{2}-\d{2}) [scheduled:: $1]
🛫 🛫\s*(\d{4}-\d{2}-\d{2}) [start:: $1]
➕ ➕\s*(\d{4}-\d{2}-\d{2}) [created:: $1]
✅ ✅\s*(\d{4}-\d{2}-\d{2}) [completion:: $1]
❌ ❌\s*(\d{4}-\d{2}-\d{2}) [cancelled:: $1]
🔺 🔺️? [priority:: highest]
⏫ ⏫️? [priority:: high]
🔼 🔼️? [priority:: medium]
🔽 🔽️? [priority:: low]
⏬ ⏬️? [priority:: lowest]
🏁 🏁\s*(keep|delete) [onCompletion:: $1]
🆔 🆔\s*([A-Za-z0-9_-]+) [id:: $1]
⛔ ⛔\s*([A-Za-z0-9_-]+(?:\s*,\s*[A-Za-z0-9_-]+)*) [dependsOn:: $1]
🔁 🔁\s*([A-Za-z0-9, !]*[A-Za-z0-9])(?=\s*(?:\[|\^|$)) [repeat:: $1]

La stessa cosa come script

Salvalo come emoji_to_dataview.py ed esegui python3 emoji_to_dataview.py Inbox.md Projects/*.md. Tocca solo le righe con checkbox, scrive due spazi prima di ogni campo come fa Obsidian Tasks, e converte anche i simboli alternativi di scadenza e data programmata: 📆, 🗓 e ⌛.

#!/usr/bin/env python3
"""Rewrite Obsidian Tasks emoji fields to Dataview [key:: value] fields.

Usage: emoji_to_dataview.py NOTE.md [NOTE.md ...]   (rewrites in place; back up first)
Only checkbox lines are touched. Run it on a copy of your vault first.
"""
import os
import re
import sys

DATE = r"(\d{4}-\d{2}-\d{2})"
ID = r"[A-Za-z0-9_-]+"
RULES = [
    (rf"(?:📅|📆|🗓️?)\s*{DATE}", r"[due:: \1]"),
    (rf"(?:⏳|⌛)\s*{DATE}", r"[scheduled:: \1]"),
    (rf"🛫\s*{DATE}", r"[start:: \1]"),
    (rf"➕\s*{DATE}", r"[created:: \1]"),
    (rf"✅\s*{DATE}", r"[completion:: \1]"),
    (rf"❌\s*{DATE}", r"[cancelled:: \1]"),
    (r"🔺️?", "[priority:: highest]"),
    (r"⏫️?", "[priority:: high]"),
    (r"🔼️?", "[priority:: medium]"),
    (r"🔽️?", "[priority:: low]"),
    (r"⏬️?", "[priority:: lowest]"),
    (r"🏁\s*(keep|delete)", r"[onCompletion:: \1]"),
    (rf"🆔\s*({ID})", r"[id:: \1]"),
    (rf"⛔\s*({ID}(?:\s*,\s*{ID})*)", r"[dependsOn:: \1]"),
    # Last, so the rule text ends at the next bracket or the end of the line.
    (r"🔁\s*([A-Za-z0-9, !]*[A-Za-z0-9])(?=\s*(?:\[|\^|$))", r"[repeat:: \1]"),
]
TASK = re.compile(r"^(\s*(?:[-*+]|\d+\.)\s+\[.\]\s)(.*)$")

for path in sys.argv[1:]:
    out = []
    for raw in open(path, encoding="utf-8", newline="").read().split("\n"):
        cr = "\r" if raw.endswith("\r") else ""
        line = raw[: len(raw) - len(cr)]
        m = TASK.match(line)
        if m:
            head, body = m.groups()
            for pattern, repl in RULES:
                body = re.sub(pattern, repl, body)
            body = re.sub(r"\s*(\[(?:due|scheduled|start|created|completion|cancelled|priority|onCompletion|id|dependsOn|repeat):: )", r"  \1", body)
            line = head + body
        out.append(line + cr)
    tmp = path + ".tmp"
    with open(tmp, "w", encoding="utf-8", newline="") as fh:
        fh.write("\n".join(out))
    os.replace(tmp, path)

Da campi Dataview a emoji

Il percorso inverso legge sia [key:: value] sia (key:: value) e scrive le emoji standard. I campi che non conosce, come [project:: Website], restano sulla riga intatti, e una priorità scritta come numero viene lasciata stare perché i plugin non concordano sul significato dei numeri.

Prima
- [ ] Send invoice to Acme  [priority:: high]  [repeat:: every month]  [created:: 2026-10-01]  [scheduled:: 2026-11-01]  [due:: 2026-11-03] #finance
- [x] Book flights  [due:: 2026-10-25]  [completion:: 2026-10-20]
- [ ] Order parts  [id:: parts1]
- [ ] Assemble  [start:: 2026-11-10]  [dependsOn:: parts1]  [due:: 2026-11-15]
Dopo
- [ ] Send invoice to Acme ⏫ 🔁 every month ➕ 2026-10-01 ⏳ 2026-11-01 📅 2026-11-03 #finance
- [x] Book flights 📅 2026-10-25 ✅ 2026-10-20
- [ ] Order parts 🆔 parts1
- [ ] Assemble 🛫 2026-11-10 ⛔ parts1 📅 2026-11-15

Applicato all’output dello script precedente, restituisce esattamente le righe di esempio qui sopra. I vault reali sono meno ordinati: le righe che usavano 📆, 🗓 o ⌛ tornano come 📅 o ⏳, e una riga con descrizione vuota guadagna uno spazio.

Salvalo come dataview_to_emoji.py ed eseguilo allo stesso modo.

#!/usr/bin/env python3
"""Rewrite Dataview [key:: value] task fields to Obsidian Tasks emoji fields.

Usage: dataview_to_emoji.py NOTE.md [NOTE.md ...]   (rewrites in place; back up first)
Reads [key:: v] and (key:: v). Only checkbox lines are touched.
"""
import os
import re
import sys

DATE = r"(\d{4}-\d{2}-\d{2})"
ID = r"[A-Za-z0-9_-]+"


def field(key, value):
    return rf"[\[(]\s*{key}::\s*{value}\s*[\])]"


RULES = [
    (field("due", DATE), r"📅 \1"),
    (field("scheduled", DATE), r"⏳ \1"),
    (field("start", DATE), r"🛫 \1"),
    (field("created", DATE), r"➕ \1"),
    (field("completion", DATE), r"✅ \1"),
    (field("cancelled", DATE), r"❌ \1"),
    (field("priority", "highest"), "🔺"),
    (field("priority", "high"), "⏫"),
    (field("priority", "medium"), "🔼"),
    (field("priority", "low"), "🔽"),
    (field("priority", "lowest"), "⏬"),
    (field("onCompletion", "(keep|delete)"), r"🏁 \1"),
    (field("id", f"({ID})"), r"🆔 \1"),
    (field("dependsOn", rf"({ID}(?:\s*,\s*{ID})*)"), r"⛔ \1"),
    (field("repeat", r"([A-Za-z0-9, !]*[A-Za-z0-9])"), r"🔁 \1"),
]
TASK = re.compile(r"^(\s*(?:[-*+]|\d+\.)\s+\[.\]\s)(.*)$")

for path in sys.argv[1:]:
    out = []
    for raw in open(path, encoding="utf-8", newline="").read().split("\n"):
        cr = "\r" if raw.endswith("\r") else ""
        line = raw[: len(raw) - len(cr)]
        m = TASK.match(line)
        if m:
            head, body = m.groups()
            for pattern, repl in RULES:
                body = re.sub(pattern, repl, body, flags=re.I if "priority" in pattern else 0)
            line = head + re.sub(r"[ \t]{2,}", " ", body).rstrip()
        out.append(line + cr)
    tmp = path + ".tmp"
    with open(tmp, "w", encoding="utf-8", newline="") as fh:
        fh.write("\n".join(out))
    os.replace(tmp, path)

Cosa la conversione non gestisce

  • Una riga con testo tra due campi. Obsidian Tasks legge dalla fine della riga, quindi quei campi non li aveva letti nemmeno prima.
  • Un link a blocco come ^abc123 alla fine della riga. Gli script lo lasciano dov’è, cioè dove Obsidian se lo aspetta.
  • La sintassi solo di Task Genius: ore dopo le date, priorità [#A], campi progetto e contesto, regole di ricorrenza iCalendar. Lascia stare quelle righe o convertile a mano.
  • Le regole di ricorrenza che un formato scrive in modo diverso. Controlla alcune attività ricorrenti dopo il passaggio, soprattutto quelle con when done.
  • Le attività ricorrenti che hanno già copie completate nel file. Le copie sono normali attività completate e si convertono come qualsiasi altra riga.
  • Le righe dentro blocchi di codice. Gli script lavorano riga per riga e non conoscono le recinzioni, quindi converti a mano le note che citano esempi.
  • Un campo non riconosciuto lasciato in fondo alla riga, come [custom:: x]. Obsidian Tasks legge dalla fine, quindi si ferma lì e ignora i campi convertiti prima.
  • Una regola 🔁 seguita da un #tag. La ricorrenza resta non convertita: sposta il tag prima di essa o converti quella riga a mano.
  • Attività dentro citazioni o callout (righe che iniziano con > - [ ]). Gli script le saltano.
  • Un’ora dopo una data, come 14:30. Resta fuori dal campo convertito. Obsidian Tasks non ha un campo orario, quindi solo Task Genius la legge.

Da righe di attività a file di attività

Un file di attività è una nota con i campi dell’attività nel frontmatter YAML, il formato che usa TaskNotes. Non ogni campo di una riga vi trova posto. Ecco come i campi corrispondono alle proprietà di TaskNotes.

Dove va ogni campo

In una riga di attività In un file di attività Nota
📅 2026-11-03
due: 2026-11-03
Stesso nome.
⏳ 2026-11-01
scheduled: 2026-11-01
Stesso nome.
🛫 2026-11-10
start: 2026-11-10
TaskNotes non ha una data di inizio. Tienila come proprietà personalizzata se ti serve.
➕ 2026-10-01
dateCreated: 2026-10-01T08:00:00Z
Scritta come timestamp ISO.
✅ 2026-10-20
completedDate: 2026-10-20
Lo stato diventa un valore di completato, e la data va in completedDate.
⏫
priority: high
Usa i valori della tua lista di priorità di TaskNotes. La lista predefinita ha tre livelli, non cinque, quindi decidi come si corrispondono i cinque.
🔁 every month
recurrence: "DTSTART:20261103;FREQ=MONTHLY"
Diventa una regola iCalendar. every month con una scadenza del 2026-11-03 diventa DTSTART:20261103;FREQ=MONTHLY.
#finance
tags:
  - finance
Diventano una lista YAML, senza cancelletto.
🏁 delete
onCompletion: delete
Nessuna proprietà TaskNotes. Conservato come semplice chiave di frontmatter che TaskNotes ignora.
🆔 parts1
id: parts1
Nessuna proprietà TaskNotes. Le dipendenze in TaskNotes puntano a percorsi di file, non a ID.
⛔ parts1
blockedBy:
  - uid: "Tasks/Order parts.md"
    reltype: FINISHTOSTART
Diventa una voce blockedBy che nomina il file dell’altra attività.

Una riga alla volta con TaskNotes

TaskNotes ha un comando Convert to TaskNote e un pulsante di conversione accanto alle checkbox che puoi attivare nelle impostazioni delle funzioni. Entrambi creano un nuovo file di attività dalla riga e sostituiscono la riga con un link al file. Va bene per poche attività, è lento per un vault.

Molte insieme con la riga di comando di TaskForge

TaskForge è un’app separata, e il suo strumento da riga di comando (anche il motore del suo server MCP) converte le attività tra riga e file, in entrambe le direzioni, singolarmente o in blocco. Richiede un vault configurato per i file di attività, perché deve sapere come riconoscerli. Guarda prima l’anteprima. Un commit in blocco deve ripetere il numero di attività trovate dall’anteprima, così una query troppo ampia non può convertirne più del previsto.

Anteprima, poi conversione, di ogni attività con il tag #home
taskforge convert --query 'tag:home' --to tasknotes --folder Tasks --dry-run
taskforge convert --query 'tag:home' --to tasknotes --folder Tasks --acknowledge-count 2

Un’esecuzione reale

In Inbox.md
- [ ] Send invoice to Acme ⏫ 🔁 every month 📅 2026-11-03 #finance
Tasks/Send invoice to Acme.md
---
title: Send invoice to Acme
status: open
priority: high
tags:
  - finance
  - task
recurrence: "DTSTART:20261103;FREQ=MONTHLY"
due: 2026-11-03
---

La priorità ⏫ è diventata high e every month è diventato una regola iCalendar ancorata alla scadenza. In una seconda esecuzione, una data di inizio, un’azione al completamento e un ID di attività sono stati conservati come semplici chiavi di frontmatter (start, onCompletion, id) invece di essere scartati. Il comando rifiuta qualsiasi attività che non riesce a convertire per intero. Riconvertire un file in una riga aggiunge alla riga il tag identificativo del file, task.

Per andare nella direzione opposta, indica una nota di destinazione e guarda prima l’anteprima:

taskforge convert --query 'tag:home' --to inline --folder Inbox.md --dry-run

Domande frequenti

Come converto le emoji di Obsidian Tasks nel formato Dataview?

Obsidian Tasks non ha un comando di conversione. Cambia il formato delle attività nelle sue impostazioni solo dopo aver riscritto le righe, con un trova e sostituisci regex o con uno script come quello di questa pagina. Fai prima un backup e prova su una copia.

Cambiare il formato delle attività in Obsidian Tasks converte le mie attività esistenti?

No. L’impostazione cambia il modo in cui il plugin legge e scrive da quel momento. Le righe nel vecchio formato non vengono più lette come campi finché non le riscrivi.

Come trasformo molte attività con checkbox in file TaskNotes?

TaskNotes converte una riga alla volta. Per un blocco, la riga di comando di TaskForge converte ogni attività che corrisponde a una query, con una prova a vuoto prima. In ogni caso, controlla che i campi senza una proprietà TaskNotes, come le date di inizio, siano finiti dove vuoi.

Devo convertire se uso Task Genius?

Di solito no. Task Genius legge campi in emoji e tra parentesi nella stessa riga, quindi i vault misti funzionano così come sono. Convertire serve solo se usi anche Obsidian Tasks o Dataview, che leggono uno stile ciascuno.

Gli script possono danneggiare le mie note?

Modificano solo le righe con checkbox e solo i campi che riconoscono, ma riscrivono i file sul posto. Fai prima un backup, eseguili su una copia e confronta prima di affidare loro il vault vero.