Plugins

De todos os recursos de extensibilidade do Sublime Text, a sua API [1] de desenvolvimento de plugins é, de longe, o mais poderoso deles. São os plugins que fornecem boa parte das funcionalidades do Sublime Text, tanto na sua instalação original, quanto por meio de pacotes de terceiros.

Neste capítulo vamos mostrar uma rápida visão geral de como se pode criar este tipo de extensão de funcionalidade de forma relativamente simples. No entanto, trata-se de assunto um tanto extenso, que certamente mereceria um livro à parte. Portanto, não iremos nos aprofundar em detalhes aqui [2].

Nosso primeiro plugin

Os plugins do Sublime Text são codificados na linguagem de programação Python, conhecida por ser poderosa, intuitiva e fácil de aprender [2]. Com apenas alguns cliques é possível criar e colocar um clássico plugin Hello World para rodar:

  1. Selecione o item de menu Tools | New Plugin…

  2. Surgirá uma nova aba contendo o código-fonte do plugin de exemplo. Salve o arquivo (Ctrl+S) com o nome de example.py

  3. Abra uma nova aba de edição (Ctrl+N)

  4. Selecione o item de menu View | Show console

  5. No campo de entrada de texto que aparecerá na parte inferior da janela, digite view.run_command('example') e aperte Enter

  6. Pronto! A frase Hello, World! foi inserida no início do texto pelo plugin que acabamos de criar.

Explicando o que acabamos de fazer (figura 38):

Estrutura básica de um plugin do |ST|

Fig. 38 Estrutura básica de um plugin do Sublime Text

  1. Na primeira linha do código-fonte do plugin é realizada a importação dos módulos da Sublime API, que contém todas as funcionalidades que precisamos para manipular o Sublime Text.

  2. Na segunda linha declaramos a classe Python que implementa nosso plugin (ExampleCommand). Ela é filha da classe TextCommand, que conheceremos em breve.

  3. Na terceira linha implementamos o método run(). Este método é chamado toda vez que o comando é executado.

  4. Na quarta linha temos o corpo do método. Neste caso, estamos dizendo ao plugin que insira, no buffer de texto ativo (edit), o texto Hello, World! na posição 0 (primeira coluna da primeira linha).

Uma visão geral da Sublime API

Em resumo, a Sublime API é uma coleção de comandos e eventos que atuam sobre os componentes do editor.

As classes que representam os componentes estão definidas no módulo sublime, enquanto que as classes responsáveis pela implementação de comandos e eventos estão no módulo sublime_plugin.

Módulo sublime

Agrupa as representações dos componentes do Sublime Text, que são elementos das classes a seguir:

View

Representa uma view (aba) do Sublime Text, a qual contém um buffer de texto [3].

Region

Representa uma área do buffer de texto.

Selection

Armazena um conjunto contendo uma ou mais Regions.

Edit

Componente especial que serve para agrupar modificações realizadas em um buffer.

Window

Representa uma janela do Sublime Text.

Settings

Manipula arquivos de configuração.

Cada uma das classes citadas acima possui um conjunto de métodos que atuam sobre seu respectivo componente, a exemplo do método insert() que vimos antes.

Módulo sublime_plugin

Na seção anterior, por exemplo, vimos que nosso plugin usa uma classe base chamada TextCommand. Como podemos deduzir pelo nome, este tipo de classe serve para implementar comandos que manipulam o texto que está em uma view.

As classes base contidas no módulo sublime_plugin representam os diferentes tipos de comandos que atuam sobre os comoponentes definidos no módulo sublime. São elas:

TextCommand

Usamos TextCommands quando precisamos criar comandos que são instanciados uma vez para cada view e possuem uma referência para o objeto do tipo View correspondente. Normalmente os comandos desse tipo são utilizados para realizar manipulações e transformações no texto que está sendo editado.

WindowCommand

Os comandos desse tipo são utilizados quando precisamos manipular janelas. São instanciados para cada janela e possuem uma referência para o objeto Window correspondente.

ApplicationCommand

Não possui referência para nenhum view, buffer ou janela. Por isso, comandos desse tipo são menos utilizados que os comandos implementados pelas classes anteriores.

EventListener

As implementações de EventListener ficam “escutando” a view ativa para saber quando ocorrem eventos nela (ex.: ativação, fechamento, modificação etc.)

É fácil perceber que, misturando e combinando os comandos, event listeners e componentes que formam a API, é possível criar plugins que tornam o Sublime Text capaz de fazer praticamente qualquer coisa.