Criando plugins para Sublime Text

Criando plugins para Sublime Text

Conheci o Sublime Text há pouco mais de um ano, por indicação do pessoal da comunidade Python Brasil. Desde então, tenho usado este editor de texto como alternativa às IDEs pesadas, caras e com muitos recursos que acabam subutilizados.

Logo nos primeiros minutos de uso, os novos usuários podem notar que o Sublime Text se destaca por sua interface limpa e rápida. O editor dispõe de um interessante mini-mapa que permite visualizar o código “do alto”, facilitando a localização. Também é possível editar texto lado a lado em múltiplos painéis (mão na roda para escrever HTML e CSS, por exemplo). Os recursos de seleção e edição de textos são intuitivos e proporcionam alto ganho de agilidade. Experimente a busca e seleção de múltiplos trechos para entender do que estou falando.

Mesmo com todos estes recursos, onde o Sublime Text realmente brilha é na capacidade de estender suas funcionalidades por meio de plugins personalizados, de forma que os usuários possam incrementar o editor com novos recursos de acordo com suas necessidades. Os plugins são escritos em Python e existe todo um ecossistema de publicação e gerenciamento de pacotes de plugins.

Por que você deveria aprender a escrever plugins para o Sublime Text?

Uma vez convencido de que o Sublime Text é o editor certo para você, o próximo passo é saber como tirar dele o máximo de funcionalidade. Andrew Hunt e David Thomas, no seu clássico livro The Pragmatic Programmer, defendem que um programador deve usar um único editor para todas as suas tarefas e usá-lo bem. Além disso, um bom editor deve possuir três características fundamentais: ser configurável, ser extensível e ser programável. Sendo assim, é importante desenvolver a capacidade de prover o editor com os recursos que você precisará para que seu projeto ganhe em produtividade, evitando inconsistências e duplicação de esforços.

Por onde começar?

Após baixar e instalar o Sublime Text no seu sistema operacional (existem versões para Linux, Mac e Windows),  vamos escrever um plugin simples para inserir a data e hora atuais no final do texto.

Selecione o item de menu Tools > New plugin… O seguinte trecho de código será criado automaticamente numa nova aba do editor:

import sublime, sublime_plugin
class ExampleCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.insert(edit, 0, "Hello, World!")

O que este código Python faz é inserir a frase “Hello, World!” no início do texto. Para testá-lo, salve o arquivo  com o nome example.py na pasta Packages/User (crie caso não exista), que fica dentro do diretório de instalação do Sublime Text. Em seguida, abra uma nova aba vazia, digite um trecho de texto qualquer e depois abra o console do Sublime Text (View > Show console). No console, digite:

view.run_command('example')

Se tudo ocorrer como esperado, deve surgir a frase “Hello, World!” no editor, logo no início do texto.

Agora vamos fazer algumas pequenas modificações no código para que o plugin faça o que nós queremos. Para obter a data e hora atuais, precisaremos de recursos do módulo datetime do Python. Então, acrescentamos no início do nosso código a linha:

import datetime

Depois, substituímos a string “Hello, World!” no corpo do método run() pelo código que nos retorna a string formatada correspondente a data e hora atuais. A última linha fica assim:

self.view.insert(edit, 0, datetime.datetime.now().strftime('%d/%m/%y, %H:%M'))

Por fim, queremos que a data e hora sejam inseridas no final do texto e não no início. Para isso precisamos modificar o valor do segundo parâmetro passado para o método insert, que indica a posição em que a string deve ser inserida. Atualmente o valor é 0 (zero), que indica a primeira posição da tela.

Para informar o valor da última posição, devemos passar o tamanho do texto já existente. Esse valor é obtido chamando o método size() do objeto view. Dessa forma, a última linha passa a ser:

self.view.insert(edit, self.view.size(), datetime.datetime.now().strftime('%d/%m/%y, %H:%M'))

Execute o comando novamente através do console e a string com a data e hora deve aparecer ao final do texto. Está pronto o código do nosso primeiro plugin para Sublime Text.

Atribuindo uma tecla de atalho

Agora vamos associar uma combinação de teclas de atalho para executar o novo comando disponibilizado pelo plugin que acabamos de escrever. No Sublime Text, as combinações de teclas de atalho são configuradas em arquivos JSON. As combinações de teclas são específicas para cada sistema operacional, o que nos obriga a criar três novos arquivos se quisermos que nosso plugin funcione em qualquer plataforma: Default (Windows).sublime-keymap, Default (Linux).sublime-keymap e Default (OSX).sublime-keymap. Para fazer com que a data e hora sejam inseridas com a combinação de teclas Shift+Alt+D, o conteúdo de cada um dos arquivos deve ser:

[
	{
		"keys": ["shift+alt+d"], "command": "example"
	}
]

Os arquivos devem ser salvos na mesma pasta em que está localizado o example.py. Desse modo, ao pressionar a combinação de teclas que atribuímos, a data e hora atuais serão inseridas no final do texto que estivermos editando.

Exemplo de Código

Para fins de estudo, escrevi um pequeno plugin que serve para inserir docstrings em funções/métodos de um programa Python. O plugin AddPythonDocstrings é do tipo TextCommand e serve como exemplo de uso de algumas funções comuns na localização e manipulação de trechos do texto.

Esta foi uma rápida amostra das possibilidades dos plugins para Sublime Text. Para mais detalhes sobre como desenvolver plugins mais complexos, bem como para uma melhor compreensão da API de plugins, recomendo estudar a documentação indicada nas referências abaixo.

Referências

  1. Sublime Text API Reference
  2. How to Create a Sublime Text 2 Plugin
  3. Plugin Development Forum
  4. Sublime Text Unofficial Documentation
Anúncios

10 ideias sobre “Criando plugins para Sublime Text

  1. Helal Ferrari Cabral

    Achei por acaso teu post cara, vou utilizar seu exemplo para testar caso em goste vou definitivamente migrar para o sublime.

    Uma pergunta tu conhece um pacote do sublime que faz oq o eclipse e o netbeans faz:
    – Quando tu passa cima de uma chamada de metodo ou extensao de uma class usando control e clicando com mouse esquerdo a IDE te leva para onde foi criado aquela classe ou metodo.

    Eu não sei o nome tecnico para esse tipo de job mas é um recurso muito bom que acaba te economizando varios clicks e até um search.

    Se tu souber agradeço se compartilhar! abs e sucesso.

    Resposta
  2. Erick Mendonça

    Muito bacana o post! Tenho usado timidamente o Sublime Text e fiquei maravilhado com essa funcionalidade aparentemente simples de ver o código “por cima”, em uma miniatura. Facilita imensamente o desenvolvimento de trechos maiores de código!

    Resposta
  3. Ricardo Leal

    Rodrigo, aqui é Ricardo Leal!
    Ótimo post sobre o Sublime Text!
    Não consegui acesso à versão nova do Byte of Phyton, teve algum problema?

    Resposta
    1. Rodrigo Amaral Autor do post

      Mestre Ricardo! Parece que site do autor do livro está com problemas mesmo. Se o problema persistir por mais tempo, tentarei entrar em contato com ele. Abraço!

      Resposta
  4. Pingback: Plugins do Sublime Text para desenvolvimento WordPress | Rodrigo Amaral

  5. Pingback: Guia para os atalhos de teclado do Sublime Text | Rodrigo Amaral

  6. Pingback: Resumo do 1º Encontro de Usuários Python de Sergipe | Rodrigo Amaral

  7. prgmtinspire

    Não achei, talvez até tenha algum artigo sobre, mas gostaria de desenvolver uma definição nova de sintaxe para o sublime para programar para Ti-Nspire – Calculadora da Texas instruments, a melhor! Caso nao tenha vc poderia fazer um artigo desses… vai me ajudar e quem sabe a outros que estejam com dificuldades em encontrar doc’s em pt-BR. Vlw!

    Resposta
  8. Yure Mark

    Olá, sabe qual o plugin que faz com que eu link um caminho de uma arquivo ou função. Tipo o Ctrl + Click no Aptana

    Resposta

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s