Hoje Vim de Rails. ;-)
Publicado em Developer
Hoje finalmente sobrou um tempo para testar e escrever sobre o plugin Rails.vim (eita trocadilho infame no título!), feito pelo Tim Pope, que tem mais alguns plugins para o Vim também de sua autoria (inclusive eu fiz um post sobre um deles aqui).
Instalação
Para instalar o plugin podemos pegar o pacote no site do Vim ou se preferirem pegar a cópia mais recente através do Subversion:
svn co http://svn.tpope.net/rails/vim/railsvim
Nos dois casos para a instalação é só copiar os arquivos rails.vim para ~/.vim/plugin e rails.txt para ~/.vim/doc.
Criando o projeto
Logo após instalado, podemos ir para o diretório de nossa preferência, abrir o Vim e criar nosso projeto no Rails utilizando
:Rails projeto
Isso vai criar um diretório chamado projeto logo abaixo do diretório corrente com toda a estrutura necessária pelo Rails. Na verdade ele chama o comando rails com o nome do diretório que informamos, do mesmo modo que fazemos pelo console. Logo após criado o diretório ele abre o arquivo README do Rails para que possamos dar uma olhada ou solenemente ignorá-lo após estar careca de tanto ver o dito cujo. ;-)
Criando o modelo
Como primeiro passo vamos criar um modelo de uma tabela chamada, digamos, registros para o projeto. Podemos digitar no Vim:
:Rgenerate model Registro
O plugin vai criar o modelo do mesmo modo que fazemos na linha de comando, e vai abrir o primeiro arquivo gerado, nesse caso, registro.rb.
Migrations
Nosso modelo está criado, precisamos criar a tabela no banco de dados correspondente a ele, para isso vamos usar uma migration que já foi criada quando criamos o modelo. Digitamos
:Rmigration
A migration criada anteriormente foi aberta automaticamente. Nesse ponto podemos configurar e salvar essa migration com um lance MUITO interessante: se digitarmos :Rinvert na migration, o plugin vai "inverter" o conteúdo do método self.up no self.down, ou seja, se temos um create_table o plugin vai criar um drop_table (se self.up estiver vazio o processo é revertido). Porém antes de executar a migration vamos configurar nosso arquivo database.yml, que podemos editar usando
:Redit config/database.yml
O :Redit edita um arquivo levando em conta o diretório raiz da aplicação atual. Em muitos casos o :e do Vim faz a mesma coisa escrevendo-se menos. Depois de configurado o arquivo, vamos rodar nossa migration. Podemos utilizar o Rake da seguinte forma:
:Rake
Temos que especificar a target do Rake, mas o plugin é bem esperto para saber que se estamos em uma migration e rodar a target db:migrate. Bem esperto esse carinha. :-)
Falando em esperteza, o plugin do Rails tem integração com outro plugin chamado dbext
que, se estiver instalado, vai automaticamente carregar as configurações do database.yml. Isso permite que utilizemos quaisquer recursos
do dbext sem nos preocuparmos em o configurar (detalhe: carrega automaticamente menos em ambientes Windows). Se por exemplo, quisermos
ver como ficou o resultado da nossa migration no banco de dados, podemos posicionar o cursor em cima do símbolo :registros e digitar
Connection: T(MYSQL) H(localhost) D(projeto_development) U(taq) Field Type Null Key Default Extra id int(11) NO PRI NULL auto_increment descricao varchar(255) YES NULL
Controlador
Ok, já temos o modelo, vamos criar um controlador:
:Rgenerate controller Registros
Servidor
Vamos testar se o controller foi criado corretamente? Podemos iniciar o servidor web por aqui mesmo:
:Rserver
Dando uma olhada nos processos para ver se o servidor web foi corretamente iniciado:
20112 ? S 0:00 ruby -C /home/taq/temp/projeto script/server -d
Olhem o processo dele ali. Se quisermos "matar" esse e iniciar outro, é só utilizar :Rserver! (notaram o ! "destrutivo" no nome do método? ;-)
Preview
Podemos abrir o browser no controlador que estamos e dar uma olhadinha nele. Antes de mais nada temos que configurar o browser que vamos utilizar no plugin. Para isso temos que definir um comando chamado OpenURL dessa maneira (troquem o caminho para a localização do seu browser preferido):
:command -bar -nargs=1 OpenURL :!/home/taq/firefox/firefox
Agora que o browser está configurado corretamente, como estamos no controlador dos registros o plugin vai ser esperto o bastante para saber que queremos abrir a URL http://localhost:3000/registros quando digitarmos
:Rpreview
E olha que coisa mais linda mais cheia de graça! O browser foi aberto com a URL do controlador que estamos.
Console
Para abrir o console:
:Rconsole
O único porém é que enquanto não fechar o console, a janela de edição não se ativa.
Extração de parciais
Essa é uma boa. Vamos supor que temos o seguinte código em uma view chamada show para o nosso controlador registros:
<h1>Registro</h1> <div> <h2><%= @registro.descricao %></h2> <p>Esse é um registro.</p> </div>
E por alguma carga d'água queremos renderizar a DIV em uma parcial. Podemos selecionar as linhas que queremos com SHIFT+V (nesse caso onde começa e termina a DIV) e digitamos:
:Rextract registro
O arquivo corrente se transforma em:
<h1>Registro</h1> <%= render :partial => 'registro' %>
E é criada uma parcial chamada registro (que foi o nome que informamos ali em cima) em app/view/registros/_registro.rhtml com o seguinte conteúdo:
<div> <h2><%= registro.descricao %></h2> <p>Esse é um registro.</p> </div>
UIA! :-)
Navegando nos arquivos
No Vim o comando gf é utilizado para abrir o arquivo no qual o cursor se encontra sobre o caminho. Por exemplo, se eu colocar o cursor em cima de alguma parte do texto onde está escrito /home/taq/.vimrc e apertar gf, o meu .vimrc vai ser aberto (se quisermos abrir o arquivo em uma nova janela, temos que apertar CTRL+W CTRL+F ao invés do gf).
O plugin remapeou o gf. Vamos supor que estamos no código do controlador:
def show @registro = Registro.find(:first) end
E posicionamos o cursor bem em cima de Registro e apertamos gf. Uau! Vamos para o modelo! Se na nossa view tivermos um código assim:
<%= link_to 'Home', :controller=>'registros' %>
E posicionarmos o cursor em 'registros' e digitarmos gf, vamos parar no controlador! Alguns outros exemplos da documentação do plugin:
Pos*t.find(:first) app/models/post.rb has_many :c*omments app/models/comment.rb ~ link_to "Home", :controller => :bl*og app/controllers/blog_controller.rb <%= render :partial => 'sh*ared/sidebar' %> app/views/shared/_sidebar.rhtml ~ <%= stylesheet_link_tag :scaf*fold %> public/stylesheets/scaffold.css class BlogController < Applica*tionController app/controllers/application.rb class ApplicationController < ActionCont*roller::Base .../action_controller/base.rb fixtures :pos*ts test/fixtures/posts.yml layout :pri*nt app/views/layouts/print.rhtml (In the Blog controller) def li*st app/views/blog/list.rhtml
Também podemos trabalhar com conceitos de arquivos alternativos e relacionado, que são estabelecidos como:
Arquivo corrente | Arquivo alternativo | Arquivo relacionado |
---|---|---|
Modelo | Teste unitário | Migração relacionada |
Controlador (no método) | Teste funcional | Template (view) |
Template (view) | Helper | Controlador (posiciona no método) |
Migration | Migration anterior | Próxima migration |
config/routes.rb | config/database.yml | config/environment.rb |
Para acionar o arquivo alternativo, digitamos :A (ou :AS para dividir a janela horizontalmente, :AV para dividir verticalmente e :AT para abrir em uma nova aba). Para abrir o arquivo relacionado, digitamos :R (ou :RS, :RV e :RT do mesmo modo que com :A).
Javascript
Para acessar os arquivos .js podemos utilizar o comando :Rjavascript <nome>, onde nome é o nome opcional de um arquivo, se não for passado assume application.js.
CSS
Para acessar os arquivos .css podemos utilizar o comando :Rstylesheet <nome>, onde nome é o nome opcional de um arquivo, se não for passado assume o nome do controlador corrente.
Tags
Para gerar tags com nossas classes e métodos, podemos utilizar (atenção: precisamos do ctags instalado)
:Rtags
Isso vai gerar um arquivo tags na raiz do nosso projeto. Se quisermos dar uma olhada por exemplo em onde que está a definição de ApplicationController, posicionamos o cursor em cima dessa palavra no controlador e apertamos CTRL+], onde vamos ser direcionados diretamente para o arquivo application.rb. Uma dica rápida: para voltarmos para onde estávamos anteriormente utilizamos CTRL+T, mais documentação sobre o Vim e tags pode ser encontrada aqui.
Conclusões
O plugin oferece mais opções das que estão descritas aqui, vale a pena uma conferida. Não é uma IDE visualmente falando, mas se você está usando o Vim não está se preocupando com isso, está? ;-) Eu com esse plugin e o VTreeExplorer estou bem sossegado.
Comentários
Comentários fechados.
Artigos anteriores
- Pull requests em modo raiz - sex, 22 de dezembro de 2023, 09:57:09 -0300
- Qual a idade do seu repositório? - ter, 27 de dezembro de 2022, 12:50:35 -0300
- Utilizando ctags em projetos Rails mais recentes - qui, 24 de junho de 2021, 08:23:43 -0300
- Fazendo o seu projeto brotar - seg, 15 de julho de 2019, 08:57:05 -0300
- Learn Functional Programming with Elixir - sex, 02 de março de 2018, 18:47:13 -0300
- Ambiente mínimo - Driver Driven Development - qua, 23 de agosto de 2017, 15:15:03 -0300
- Ambiente mínimo - repositórios de código - dom, 16 de abril de 2017, 13:02:14 -0300
- Ambiente mínimo - terminal e navegador - dom, 02 de abril de 2017, 21:43:29 -0300
- Utilizando muitas gems no seu projeto? - sáb, 29 de outubro de 2016, 11:57:55 -0200
- Desenvolvedores e inteligência artificial - seg, 11 de julho de 2016, 09:09:38 -0300
Sérgio, obrigado pela contribuição!
O RFind foi implementado ano passado, quase dois anos depois que eu escrevi esse artigo, que errrrr ... precisa de um post novo em breve com algumas atualizações. :-)
Eustáquio,
É interessante falar também o Rfind. Onde v. fez
:Redit config/database.yml
V. pode fazer
:Rfind data
Que ele busca o database.yml.
[]s
Cara, parabéns pelo post!
Usava o Netbeans para projetos Rails, mas o fato de ser obeso (e em java, rs) era bem desistimulante.. Agora no Mac tento usar o TextMate como todos recomendam, mas ainda não me dou muito bem..
Vou seguir o conselho de um amigo (e esse post como referência), e dar uma chance para VIM.. ;)
Abraços
TAQ q q vc usa para fazer tags?
e tem algum plugin de autocomplete para rails no vim?
Urubatan,
Eu já conhecia o Project (falando nisso, eu tenho que arrumar as URLs agora que me livrei dos spammers chatos ehehe), mas eu sou muito tosco ainda para ter tudo tão facilitado desse jeito ehehe. :-)
Me chame de masoquista, mas eu ainda gosto de ir no prompt e criar o projeto "na unha" e ver as letrinhas pipocando. Gosto é gosto né! :-D
Dá uma fuçada aqui no blog, procura "vim" no campo de busca ali em cima que tem coisa pra xuxu!
[]'s!
Taq, show de bola este post, faz pouco tempo que leio o teu blog, não tinha visto ele ainda :D
uma dica rápida (se é que eu tenho alguma coisa de VIM pra poder passar :D )
Como eu mencionei neste post http://www.urubatan.com.br/2007/08/09/putz-o-vim-e-uma-ide-tambem/ o plugin do rails para o VIM tem integração com o plugin de projetos, e eu achei que ficou bem melhor do que com o VTreeExplorer ...
:Rproject cria um projeto apenas com os arquivos do projeto rails (atualizado automagicamente) .
Da uma testada uma hora destas e me diz o que tu achou :D