Configurando o Sublime Text 2
Leia em 8 minutos
Depois de quase 6 anos usando o Textmate, chegou a hora de trocar de editor de textos. Embora o Textmate 2 esteja evoluindo aos poucos, eu achei a nova interface horrenda, deixando de lado toda a simplicidade da primeira versão.
Talvez por isso eu tenha ficado no TM1, mesmo com todos os seus problemas, dentre eles vários snippets que simplesmente não funcionavam com o Ruby 1.9, mesmo eu tendo atualizado tudo para as últimas versões, erros de encoding e outros bugs bizarros.
Estes problemas começaram a me atrapalhar ao ponto de querer um novo editor. A alternativa mais óbvia era o Sublime Text 2, que eu já tinha testado, mas que tinha algumas coisas que me irritavam (sidebar na esquerda, bug com quotes e layout de teclado US International,…). Há alguns dias dei mais uma chance e finalmente me decidi por trocar de editor.
Neste artigo você verá como configurei o Sublime Text 2, com alguns plugins e dicas.
Command Palette
O Sublime Text 2 possui o Command Palette, que permite alternar entre sintaxes, executar comandos e snippets, dentre outras tarefas. Ele é o seu melhor amigo, e seu atalho, ⌘+⇧+P, deve estar na ponta dos dedos.
Instalando plugins
O Sublime Text 2 precisa de alguns plugins que considero essenciais. Primeiro, instale o Package Control, um gerenciador de plugins com suporte ao Github e Bitbucket, além de canais personalizados de instalação.
Depois que você fizer a instalação, pode instalar alguns plugins. Execute a Command Palette e digite “install” para abrir o Package Control. Veja a lista dos plugins que instalei:
- Alignment: permite alinhar variáveis, hashes, etc.
- BufferScroll: se lembra da posição do scroll e cursor, code foldings, bookmarks, dentre outros.
- ChangeQuotes: permite alternar entre aspas e apóstrofos.
- ColorPick: abre panel de cores do Mac OS X. Ótima companhia para CSS.
- DetectSyntax: detecta a sintaxe de arquivos como Gemfile, Capfile, etc. Também detecta arquivos do RSpec.
- ERB Insert and Toggle Commands: adiciona snippets para tags do ERB.
- Expand Selection to Quotes: permite selecionar o conteúdo de strings com um atalho de teclado.
- IndentGuides: exibe uma linha vertical ligando o início e fim de um bloco de indentação.
- Sass: suporte ao Sass.
- SidebarEnhancements: adiciona várias opções a sidebar, como criação de arquivos e diretórios, dentre muitas outras opções. Essencial.
- Toggle Symbol to String: permite alternar entre símbolo e aspas. Eu tive que modificar o plugin para usar aspas em vez de apóstrofos.
Definindo o $PATH
Como uso instalações personalizadas de Node.js e Ruby em caminhos nem sempre definidos pelas extensões, tive que criar um arquivo que fizesse essa definição por mim.
Basta criar um arquivo no diretório $HOME/Library/Application Support/Sublime Text 2/Packages
com o conteúdo de sua variável $PATH
, como no exemplo abaixo:
import os
os.environ["PATH"] = "./bin:/Users/fnando/local/bin:/Users/fnando/local/node/current/bin/:/Users/fnando/local/ruby/gems/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
print "PATH=" + os.environ["PATH"]
Esse arquivo é carregado pelo Sublime Text 2, que sobrescreve a definição padrão.
Tema
Faz algum tempo que venho usando um tema claro. Tirando o bla-bla-bla de todo mundo que diz que tema claro fere os olhos (meh), tenho gostado bastante.
No Textmate eu usava o tema Espresso tutti colori, que também está disponível no Sublime Text 2. Você precisará do tema Soda e de uma configuração para definir o esquema de cores.
Primeiro, faça o clone do repositório.
cd ~/Library/Application\ Support/Sublime\ Text\ 2/Packages
git clone https://github.com/buymeasoda/soda-theme.git "Theme - Soda"
Na configurações do usuário (cmd+,), basta adicionar a configuração abaixo:
{
"theme": "Soda Light.sublime-theme",
"color_scheme": "Packages/Color Scheme - User/Espresso Soda.tmTheme"
}
Se tudo deu certo, você terá um editor como este:
Configurações do editor
O Sublime Text 2 é um editor que permite configurar quase tudo. Você pode explorar as opções padrão usadas pelo editor acessando o menu “Sublime Text 2 > Preferences > Settings - Default”. Todas estas opções podem ser personalizadas através do menu “Settings - User”. Veja as opções que decidi usar:
{"auto_complete_commit_on_tab": true}
: altera a tecla que faz o autocomplete para tab.{"ensure_newline_at_eof_on_save": true}
: adiciona linha em branco ao final do arquivo.{"font_face": "Menlo"}
: usa a fonte Menlo.{"font_size": 20.0}
: tamanho de fonte 20, para uma leitura extremamente confortável.{"highlight_line": true}
: faz o highlighting da linha com o cursor.{"highlight_modified_tabs": true}
: marca as abas modificadas de modo diferente.{"new_window_settings":{"show_minimap": false}}
: esconde o mapa do arquivo.{"rulers": [80]}
: exibe uma guia na coluna 80.{"save_on_focus_lost": false}
: desabilita salvar quando o editor perde o foco. É o padrão, mas deixei aqui para servir de documentação.{"show_full_path": true}
: exibe o caminho completo do arquivo que está sendo editado.{"translate_tabs_to_spaces": true}
: converte tab em espaços.{"trim_trailing_white_space_on_save": true}
: remove whitespaces quando o arquivo é salvo.{"tab_size": 2}
: define a indentação com tamanho 2.{"bold_folder_labels": true}
: deixa diretórios com bold na sidebar.{"drag_text"}
: desabilita o drag ‘n’ drop de seleções de texto.{"draw_white_space": "all"}
: exibe caracteres em branco.
Configuração de atalhos
Uma das grandes vantagens do Sublime Text 2 em relação ao Textmate é a facilidade de se configurar atalhos de teclado. As definições originais podem ser vistas no menu “Sublime Text 2 > Preferences > Key Bindings - Default”. Veja quais são as configurações que estou usando:
{"keys": ["super+alt+]"], "command": "alignment"}
: define o atalho de alinhamento de variáveis e afins para o mesmo do Textmate.{"keys": ["ctrl+super+r"], "command": "reveal_in_side_bar"}
: atribui um atalho para exibir o arquivo atual na sidebar.{"keys": ["super+shift+r"], "command": "side_bar_rename"}
: atribui um atalho para renomear o arquivo selecionado na sidebar.{"keys": ["super+k", "super+t"], "command": "title_case"}
: atribui um atalho para converter o texto em Title case.{"keys": ["super+k", "super+s"], "command": "swap_case"}
: atribui um atalho para alternar o case do texto.{"keys": ["super+v"], "command": "paste_and_indent"}
: altera o atalho padrão de colar para fazer a indentação automaticamente.{"keys": ["super+shift+v"], "command": "paste"}
: muda o atalho de colar sem indentação.
Lembra daquele bug que eu tinha falado sobre aspas e o layout de teclado US International? Uma maneira que consegui resolver este problema foi definindo um atalho de teclado, ⌃+', que pega o texto selecionado e coloca entre aspas. Este atalho já existia, mas definia apóstrofos. Como prefiro aspas, redefini como no exemplo abaixo:
{"keys": ["'"], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context":
[
{"key": "setting.auto_match_enabled", "operator": "equal", "operand": true},
{"key": "selection_empty", "operator": "equal", "operand": false, "match_all": true}
]
}
Outro atalho que defini foi para inserir tags ERB como no Textmate:
{"keys": ["ctrl+shift+."], "command": "erb", "context":
[
{"key": "selector", "operator": "equal", "operand": "text.html.ruby, source.yaml, source.css, source.scss, source.js"}
]
}
Aprendendo atalhos de teclado
Uma das vantagens de se usar um editor como o Sublime Text 2 é você pode fazer muita coisa à partir de atalhos de teclado e snippets. Mas se você não aprender estes atalhos e snippets, perderá grande parte da brincadeira e, acredite, deixará de ser produtivo. Quem me conhece sabe que gosto de aprender o editor de cabo a rabo (e é por isso que não fico pulando de um editor para outro toda hora).
Enquanto decidia se ia usar ou não o Sublime Text 2, fiz uma lista de atalhos que achei interessante. No fim das contas, criei um cheatsheet que contém todos os atalhos que você deve saber de cabeça. Aprenda-os! Você não irá se arrepender.
Faça o download do cheatsheet agora!
Abaixo você pode ver os atalhos interessantes que você deve conhecer.
Exibir/executar completions
Completion é uma das coisas que você não liga muito, mas quando começa a usar, ajuda um pouco. Para exibir uma lista das completions disponíveis, pressione ⌃+space.
Para completar palavras presentes no arquivo, você pode simplesmente pressionar ⇥.
Exibir/esconder sidebar
Alguns comandos do Sublime Text 2 precisam de um combo de teclas. É o caso da sidebar. Para alternar entre exibir/esconder a sidebar, pressione as teclas ⌘+K e logo depois ⌘+B.
Normalmente escondo a sidebar quando estou no modo split.
Goto line
Para ir para uma linha específica, basta pressionar ⌃+G.
Goto symbol
Para ir para a definição de um método, classe, ou módulo (na verdade, a definição de definição varia dependendo do tipo de arquivo que você está editando), use o atalho ⌘+R.
Goto anything
Para navegar rapidamente entre os arquivos do seu projeto, utilize o atalho ⌘+P. Mas diferente do Textmate, no Sublime Text 2 a busca é feita muito rapidamente, além de o arquivo selecionado ser exibido.
Split
Uma das funcionalidades do Sublime Text 2 que não existia no Textmate é o split. Você pode criar seus próprios layouts ou usar uma extensão chamada SplitScreen, que permite definir proporções. Se você não quer tanta flexibilidade, pode usar os layouts que já vem por padrão.
Para fazer o split em duas colunas, use o atalho ⌘+⌥+2. Então, para mover arquivos entre os dois panels, utilize os atalhos ⌃+⇧+1 ou ⌃+⇧+2.
Para fazer o split em duas linhas, use o atalho ⌘+⌥+⇧+2.
Para voltar ao layout original, use o atalho ⌘+⌥+1.
Commandline
Se você você usava o Textmate, deve estar se perguntando se existe um substituto para o comando mate
. Sim, existe! Mas você precisará criar o link simbólico manualmente.
Abra o terminal e digite o comando abaixo:
ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /Users/fnando/local/bin/
Lembre-se de alterar o diretório de destino. Para saber quais diretórios são procurados, execute echo $PATH
. Escolha um desses diretórios como destino.
Configurando o Alfred
Eu uso o Alfred para tudo, inclusive abrir diretórios direto no Sublime Text 2. Para facilitar esta tarefa, nós iremos criar um script que permite abrir o projeto sem ter que ir até a opção “Open with…”.
Na aba “Extensions”, crie o script abaixo:
Agora, basta iniciar o Alfred, encontrar o diretório que você quer abrir e digitar subl
.
Executando testes no Vagrant
Uma das coisas que sempre me perguntam sobre usar o Vagrant como ambiente de desenvolvimento é como rodar testes direto de seu editor nesta máquina virtual. A resposta simples é que você não consegue.
A resposta mais complicada é que dá para criar builders personalizados que irão executar comandos diretamente na máquina virtual.
Minha primeira tentativa foi conectar com SSH e executar o comando lá. Infelizmente, esta abordagem adiciona 5 segundos no tempo total de execução. A outra maneira foi executar comandos diretamente na máquina virtual usando a command-line do VirtualBox, sem ter nenhuma penalização com a do SSH.
Note que as instruções à seguir se aplicam a uma configuração como a minha, que tem as seguintes características:
- O mapeamento do diretório compartilhado do Vagrant reflete a minha máquina no box do Vagrant.
- Todos os projetos compartilham um único box do Vagrant.
Para configurar o Vagrant, você pode fazer algo como o snippet abaixo:
Vagrant::Config.run do |config|
config.vm.box = "hellobits"
config.vm.network :hostonly, "192.168.33.2"
config.vm.share_folder "v-root", "/Users/fnando/Projects", ".", :nfs => true
end
Depois, você precisará criar um arquivo chamado vagrant-run
. Este arquivo deve estar em seu $PATH
e ser executável.
#!/usr/bin/env ruby
require "json"
VAGRANTFILE = File.expand_path("~/Projects/.vagrant")
USE_BUNDLER = false
def find_working_dir(file)
working_dir = File.dirname(file)
while true
exists = ["spec", "test", "lib", "Gemfile", "node_modules"].find do |dir|
File.exist?("#{working_dir}/#{dir}") && working_dir !~ %r[/(spec|test)/]
end
return working_dir if exists
return if working_dir == "/"
working_dir = File.dirname(working_dir)
end
end
if ARGV.size == 2
command, file = *ARGV
else
fail "Invalid builder parameters"
end
working_dir = find_working_dir(file)
if USE_BUNDLER && working_dir && File.exist?("#{working_dir}/Gemfile")
bundle_exec = "bundle exec"
end
full_command = ""
full_command << "cd '#{working_dir}' && " if working_dir
full_command << "#{bundle_exec} #{command} '#{file}'"
vm_id = JSON.load(File.read(VAGRANTFILE))["active"]["default"]
system <<-SH
VBoxManage guestcontrol #{vm_id} \
execute --image /bin/sh \
--username vagrant --password 'vagrant' \
--environment 'HOME=/home/vagrant PATH=./bin:/home/vagrant/local/bin:/home/vagrant/local/ruby/gems/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin GEM_PATH=/home/vagrant/local/ruby/gems GEM_HOME=/home/vagrant/local/ruby/gems' \
--wait-stdout --wait-stderr --wait-exit \
-- -c "#{full_command}"
SH
Finalmente, você precisará criar os builders personalizados. Isso pode ser feito através do menu “Tools > Build System > New Build System”. Eu criei três builders para executar testes do RSpec, arquivos Ruby em geral e scripts JavaScript com Node.js, mas você pode criar quantos builders quiser. Basta usar uma configuração como esta:
{
"cmd": ["vagrant-run", "rspec", "$file"],
"selector": "source.ruby.rspec"
}
Mude o comando para o que você quiser. Se você não quiser sobrescrever os builders originais, pode criar builders apenas para o projeto. Para saber mais como fazer isso, veja a documentação do Sublime Text 2.
Finalizando
No geral, estou bastante contente com o Sublime Text 2. Às vezes me pego executando atalhos do Textmate que, claro, nem sempre funcionam, mas não vai demorar muito até eu me acostumar com os novos atalhos.
Eu comprei a licença do Sublime Text 2, que custa 59USD. Embora você possa usar sem ter que pagar, faça a sua parte e compre uma licença. É uma maneira de mostrar ao desenvolvedor que você aprecia o seu trabalho.
Se você quiser ver minhas configurações, subi meu diretório de configurações no Github: https://github.com/fnando/sublime-text-2.
Updates:
- Adicionei informações sobre como integrar o Sublime Text 2 com o Vagrant.