Eventos¶
Os plugins reagem à atividade do editor pelo IEventBus. Os eventos são structs
simples definidos em PluginEvents.h:
| Evento | Carga útil |
|---|---|
DocumentOpened |
DocumentId, std::filesystem::path |
DocumentAboutToClose |
DocumentId — o usuário está fechando o documento e o fechamento é certo; publicado logo antes de sua última visão desaparecer, enquanto ele ainda pode ser lido por inteiro. Não ao sair do programa. Só plugins nativos; veja abaixo |
DocumentClosed |
DocumentId |
DocumentSaved |
DocumentId |
DocumentPrinted |
DocumentId, pages — publicado depois de um trabalho de impressão chegar ao dispositivo (Arquivo ▸ Imprimir, ou Imprimir dentro da visualização); pages conta as páginas do documento impressas, menos do que o documento tem quando uma seleção ou intervalo de páginas foi escolhido. Uma caixa de diálogo cancelada não publica nada. Por enquanto, apenas plugins C++ |
DocumentAboutToSave |
DocumentId, path — síncrono, com o buffer ainda editável (aparar espaços em branco, acrescentar nova linha final); sem caixas de diálogo |
DocumentEncodingChanged |
DocumentId, DocumentEncoding — a codificação com que o host gravará o documento de volta mudou (arquivo recém-identificado, ou setDocumentEncoding chamado) |
DocumentLineEndingChanged |
DocumentId, LineEnding — o terminador de linha que o documento usa mudou (arquivo recém-lido ou recarregado, um end_of_line do .editorconfig aplicado ao salvar, ou setLineEnding chamado) |
DocumentModifiedChanged |
DocumentId, modified — o sinalizador de limpo/sujo mudou (não a cada tecla) |
TextChanged |
DocumentId, pos, addedBytes, removedBytes |
SelectionChanged |
DocumentId |
ActiveDocumentChanged |
DocumentId |
HostWindowShown |
(nenhuma) — uma vez por execução, depois que o primeiro quadro está na tela; agende aqui o trabalho lento de inicialização |
SettingsChanged |
scope — "" = de todo o editor, "plugins/<id>" = a página daquele plugin foi aplicada |
WorkspaceRootChanged |
root (vazio = pasta fechada) — publicado pelo plugin Espaço de trabalho |
WorkspaceFilesChanged |
files[] de {path, displayPath} — publicado pelo plugin Espaço de trabalho |
ThemeChanged |
variant ("light" / "dark" / "") |
AppAboutToQuit |
(nenhuma) |
CommandShortcutChanged |
commandId, sequence (a nova combinação portátil; "" = sem associação) |
MarginClicked |
DocumentId, line, margin (EditorMargin::Symbol), modifiers — um clique esquerdo na coluna de marcadores de um editor, a cada clique desse tipo; veja Marcas de linha |
Os plugins também podem publicar eventos (ctx.events().publish(e)) — é assim que
o plugin Espaço de trabalho transmite WorkspaceRootChanged /
WorkspaceFilesChanged para o Localizar em arquivos e a paleta de comandos
consumirem.
Um documento, um id¶
Um DocumentId nomeia um documento, não um painel. Dividir documento exibe
um arquivo em dois painéis, e os dois carregam o mesmo DocumentId, então:
DocumentOpenedé publicado uma vez por arquivo — dividir não publica nada;DocumentClosedé publicado apenas quando a última visualização do documento fecha, então fechar um painel nunca desmonta estado de que o outro ainda precisa;activeDocument()responde com aquele único id, seja qual for o painel na frente, eopenDocuments()lista o documento uma vez.
Deliberadamente não há evento por painel e nem forma de perguntar qual painel está ativo: painéis são assunto do host, e tudo o que um plugin pode observar — texto, cursor, seleção, codificação, fim de linha, estado de modificado — pertence ao documento, que os painéis compartilham.
DocumentAboutToClose¶
Publicado uma vez por documento, imediatamente antes de sua última visão
desaparecer, quando o fechamento é certo — qualquer pergunta sobre salvar foi
respondida e não cancelada. Dentro do manipulador o documento ainda está
inteiro: text(), filePath(), caret(), bookmarkedLines() e a
codificação respondem. Em seguida vem a desmontagem e depois
DocumentClosed. Toda forma de fechar uma aba o publica (Fechar, Fechar tudo,
Fechar os outros / Fechar os à direita, um clique do meio, Fechar a pasta, o
closeDocument() de um plugin), inclusive documentos sem título; fechar um
painel de um documento ainda exibido em outro não o publica.
Sair do programa não o publica. O aplicativo publica AppAboutToQuit uma
vez, enquanto todos os documentos ainda estão abertos, e nenhum evento de
fechamento por documento: um plugin que guarda estado por documento entre
sessões percorre openDocuments() no seu manipulador de AppAboutToQuit.
Portanto, DocumentAboutToClose sempre significa "este documento está sendo
fechado", nunca "o programa está terminando".
Os manipuladores rodam de forma síncrona, dentro do fechamento: seja rápido, não mostre caixas de diálogo e trate o conjunto de documentos como somente leitura — não abra, feche nem ative documentos, e não edite o texto do documento que está sendo fechado.
Ele é só nativo, por projeto: a entrega a plugins Python é assíncrona, então a promessa de "ainda pode ser lido" não poderia ser cumprida lá, e o evento não é oferecido a eles (veja Eventos em Python).
CommandShortcutChanged¶
CommandShortcutChanged dispara quando o atalho efetivo de um comando muda — um
remapeamento do usuário no Mapeamento de atalhos, uma importação/redefinição de
mapa de teclado, ou uma supressão por conflito entrando/saindo. Comandos ligados a
menus não precisam de nada (o host remapeia a ação deles); comandos registrados com
scope = command_scope::kPluginWindow assinam e reaplicam a sequência aos próprios
widgets (veja Comandos e menus).
Assinando¶
subscribe é um template que devolve uma Subscription (RAII). Mantenha a
assinatura viva como membro enquanto quiser que a retrochamada dispare; destruí-la
cancela a assinatura.
m_sub = ctx.events().subscribe<MTE::plugin::DocumentSaved>(
[this](const MTE::plugin::DocumentSaved& e) {
// react to e.id ...
});
class IEventBus {
public:
template <class Event>
Subscription subscribe(std::function<void(const Event&)> cb);
// Forwards to a type-erased subscribeRaw(std::type_index, ...) internally.
};
Tip
Guarde toda Subscription como membro do plugin, para que todas as
retrochamadas sejam desmontadas automaticamente no shutdown().