Scripting em Groovy
Automatizar o Freeplane com scripts: API de nós e mapas, execução, permissões e scripts guardados no menu.
O que você vai aprender
- Executar um script no Freeplane e ver o resultado
- Conhecer a API de nós, mapas e interface
- Guardar scripts para aparecerem no menu, com atalho
- Configurar permissões com segurança
Antes de começar
- Fórmulas
- Alguma familiaridade com programação; Groovy é próximo de Java e de Python em legibilidade
Scripting em Groovy🔗
Fórmulas calculam o conteúdo de um nó. Scripts fazem qualquer coisa: criar nós, reorganizar ramos, ler arquivos, gerar relatórios, falar com uma API.
O Freeplane roda em Java e embute o Groovy, uma linguagem que compila para a JVM e tem sintaxe leve. Você não precisa saber Java — só entender que o código tem acesso à mesma estrutura que a interface manipula.
Habilitando🔗
Ferramentas → Preferências → Scripts. Há um conjunto de permissões separadas:
| Permissão | Concede |
|---|---|
| Executar scripts sem assinatura | Rodar scripts que você mesmo escreveu |
| Ler arquivos | Abrir arquivos do disco |
| Escrever arquivos | Gravar no disco |
| Executar outros aplicativos | Chamar programas do sistema |
| Acesso à rede | Fazer requisições HTTP |
Conceda o mínimo de que precisa. Um script pode fazer tudo o que você pode fazer no computador, e mapas circulam.
Um .mm pode conter fórmulas e scripts que rodam ao abrir. Trate mapas de origem desconhecida com o mesmo cuidado que trataria uma planilha com macros.
Executando um script🔗
O caminho rápido é o console de scripts: Ferramentas → Scripts → Editor de scripts (ou o console interativo, conforme a versão). Escreva, execute, veja a saída.
Um primeiro script:
def total = node.map.root.branch.size()
c.statusInfo = "O mapa tem ${total} nós"
c é o objeto de controlador — ele fala com a interface. node é o nó selecionado. node.map é o mapa.
Os três objetos de entrada🔗
| Objeto | É |
|---|---|
node | O nó selecionado (ou aquele em que a fórmula está) |
c | O controlador: seleção, mensagens, diálogos, zoom |
config | Preferências e propriedades do Freeplane |
Com c você chega a:
c.selecteds // lista dos nós selecionados
c.selected // o nó atual
c.select(algumNo) // muda a seleção
c.statusInfo = "..." // mensagem na barra de status
c.find { ... } // busca no mapaManipulando nós🔗
Criar, mover, editar:
def novo = node.createChild('Nova tarefa')
novo['responsável'] = 'Ana'
novo['prazo'] = '2026-09-15'
novo.icons.add('button_cancel')
novo.note = 'Criado por script'
novo.style.name = 'Bloqueado'
Percorrer:
node.branch.each { n ->
if (n.text.startsWith('TODO')) {
n.icons.add('help')
}
}
Apagar:
node.children.findAll { it.text.isEmpty() }*.delete()Scripts úteis de verdade🔗
Marcar como concluído tudo que está selecionado:
c.selecteds.each {
it.icons.add('button_ok')
it.style.name = 'Concluído'
}
Numerar os filhos de um nó:
node.children.eachWithIndex { n, i ->
n.text = "${i + 1}. ${n.text.replaceFirst(/^\d+\.\s*/, '')}"
}
Ordenar filhos alfabeticamente:
def ordenados = node.children.sort { it.text }
ordenados.each { it.moveTo(node, ordenados.indexOf(it)) }
Exportar o ramo para CSV:
def linhas = ['texto;responsável;prazo;custo']
node.branch.each { n ->
linhas << "${n.text};${n['responsável']};${n['prazo']};${n['custo']}"
}
new File('/tmp/relatorio.csv').text = linhas.join('\n')
c.statusInfo = "${linhas.size() - 1} linhas gravadas"
Esse último exige a permissão de escrita em arquivos.
Criar nós a partir de um texto colado:
def texto = java.awt.Toolkit.defaultToolkit.systemClipboard
.getData(java.awt.datatransfer.DataFlavor.stringFlavor)
texto.split('\n').findAll { it.trim() }.each {
node.createChild(it.trim())
}Guardando scripts no menu🔗
Scripts avulsos no console são bons para experimentar. Para uso repetido, grave-os como arquivos .groovy em:
~/.config/freeplane/1.11.x/scripts/ # Linux
%APPDATA%\Freeplane\1.11.x\scripts\ # Windows
Reinicie o Freeplane e eles aparecem em Ferramentas → Scripts. O nome do arquivo vira o nome do item de menu, com convenções:
MeuScript.groovy→ item “Meu Script”- Um sufixo de modo (
_on_single_node,_on_selected_nodes) controla quando o script fica disponível.
Atalhos de teclado podem ser atribuídos em Preferências → Atalhos, na seção de scripts.
Depurando🔗
c.statusInfo = "..."para mensagens rápidas na barra de status.printlnescreve na saída do console de scripts.- Exceções aparecem num diálogo com a pilha completa.
- Rode em um mapa de teste antes de soltar num mapa de verdade. Scripts não têm desfazer confiável em todas as operações —
Ctrl+Zfunciona para muitas, mas não conte com isso.
Onde aprender mais🔗
- A API do Freeplane está documentada em Ferramentas → Scripts → Ajuda da API de scripts, que abre um mapa navegável com todas as classes e métodos.
- O wiki oficial mantém uma coleção de scripts prontos.
- Add-ons são, em boa medida, scripts empacotados — ler o código de um add-on é uma boa forma de aprender.
Erros comuns
- Conceder todas as permissões e depois abrir mapas de origem desconhecida
- Rodar um script destrutivo no mapa real sem ter testado numa cópia
- Contar com
Ctrl+Zpara desfazer o que um script fez em massa - Escrever fórmulas gigantes nos nós em vez de scripts guardados e reutilizáveis
Na prática🔗
- Habilite scripts sem assinatura, e só isso.
- No console, rode o script que conta os nós do mapa.
- Escreva um script que marque com ícone todo nó cujo texto comece com
TODO. - Salve-o como
MarcarTodos.groovyno diretório de scripts. - Reinicie e confirme que ele aparece no menu.
- Atribua um atalho de teclado.
Você aprendeu
node,ceconfigsão os pontos de entrada da API- Permissões são separadas; conceda o mínimo necessário
- Scripts em
~/.config/freeplane/<versão>/scripts/viram itens de menu com atalho - Teste em cópia: o desfazer de operações em massa não é confiável
Perguntas para reflexão
- Quais são os três pontos de entrada da API, e o que cada um dá acesso?
- Por que as permissões são separadas, e qual é a política recomendada?
- Onde ficam os scripts que viram itens de menu?
- Por que testar em cópia é regra ao operar em massa?