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
- Sublime Text API Reference
- How to Create a Sublime Text 2 Plugin
- Plugin Development Forum
- Sublime Text Unofficial Documentation