segunda-feira, 3 de agosto de 2009

Shell no VIm com agilidade

Muitas vezes você está editando no VIm e precisa executar algo no shell, pegar algum output ou simplesmente ir embora para casa. Hoje vamos ver algumas soluções que o VIm nos oferece para essas situações, mostrando porque ele é O editor.

Suspendendo o VIm

Para mim essa é a solução mais elegante que existe, porém ela é baseado no uso do Bash como shell e para mim a beleza consiste nessa junção Bash + VIm. Não sei como funciona e se funciona em outros shells.

Quando o Bash está com o Job Control ligado, ao inicializarmos um processo, ele ‘herda’ do Bash o tratamento de alguns sinais, um deles é o SIGTSTP. O tratamento do SIGTSTP suspende o processo, retornando o controle do terminal ao Bash. A maioria dos terminais mapeia o SIGTSTP para as teclas Ctrl-Z, mas isso é uma configuração do terminal, não do Bash. Você pode verificar a configuração do seu terminal utilizando:

$ stty -a

A beleza disto, é que o VIm não sobrescreve o tratamento do SIGTSTP herdado do Bash, portanto, você podê suspender o seu VIm! Com isso, você retornará o controle do terminal ao processo Bash pai do VIm. Você pode executar quantos comandos forem necessários e depois retornar o controle do terminal ao VIm utilizando o fg.

$ vim foo

Edição, edição, edição
Voltando para o Bash
Ctrl-Z

Tarefas que queremos executar no Bash...
$ rake db:migrate

Voltando para o VIm
$ fg
De volta ao VIm

Outro modo de obter um shell é através do comando :sh ou :shell.

:sh

Para retornar ao shell, Ctrl-D (EOF) ou exit.

O shell criado depende do valor da variável ‘shell’ do VIm.

:set shell

Executando dentro do VIm

Para executar um comando simples, como remover um arquivo, obter uma listagem de diretório, executar uma migration, basta utilizar :!.

:!ls

Você pode especificar um ponto para o qual deseja enviar a saída do comando.

:.!ls
:0!ls
:$!ls

Um atalho para :.! é !!.

Nota: !! é diferente de :!!, o segundo re-executa no shell o último comando executado anteriormente.

Criando uma sessão

Você está no meio de um trabalho pesado: 4 arquivos em edição, outros 10 na buffer list, um monte de marcadores, alguns lugares na stack.

Porém chegou a hora do seu merecido descanso, mas não quer perder o ambiente da edição. Deixar o computador ligado é uma solução, mas a energia pode acabar, sem contar o desperdício.

O segredo é salvar uma sessão do VIm e carrega-la posteriormente. Pode parecer complicado, mas é extremamente simples: :mks ou :mksession, você pode passar como argumento o nome da sessão, do contrário, o arquivo padrão é Session.vim.

:mks

O arquivo gerado nada mais é quem um aglomerado de opções e comandos do VIm. Portanto, para carregar de volta uma sessão, basta ‘executar’ o script com o comando :source ou :so.

:so Session.vim

O mais provável é que você vá carregar uma sessão a partir do terminal.

$ vim -S Session.vim

Por padrão, a opção -S carrega o arquivo Session.vim, portanto o comando abaixo tem o mesmo efeito.

$ vim -S

Conclusão

Parece que perdemos um pouco da cultura de ferramentas especializadas do UNIX. Hoje é normal quererem fazer tudo no seu editor preferido, na sua linguagem preferida etc. Eu acho isso uma bobagem que, em minha opinião, é fomentada por grandes empresas que espalham a todos que sua solução é completa: o desenvolvedor que sabe XYZ não precisa saber mais nada.

A relação disto com as dicas é indireta mas muito importante.

Perdemos um tempo considerável para achar uma solução pura no VIm, Ruby, o que for, mesmo existindo ferramentas UNIX próprias para a função. Hoje aprendemos como trocar agilmente do shell para o VIm e vice-versa, mostrando que faz parte do VIm colaborar com essas outras ferramentas.

2 comentários:

  1. Æ!!

    Várias dicas legais cara!
    Muitas delas eu já conhecia e foi bom lembrar, e outras eu nunca tinha usado, como é o caso do !!. :)

    Uma coisa que eu conheço e deveria usar é o :mks, mas infelizmente ele não faz uma das coisas que eu queria, que é guardas as macros que eu estou usando naquela seção.

    Valeu pelas dicas cara! Preciso começar a postar sobre o Vim tambem, e acho que isso não vai demorar muito! Esse seu post me animou mais ainda. ;)

    Há braços

    ResponderExcluir
  2. O mksession não guarda TUDO, ele divide essa tarefa com o viminfo. O mksession e viminfo dariam um livro, não um post ;)
    Mas como diria um professor meu preguiçoso:
    - Fica de lição de casa.

    :help viminfo

    ResponderExcluir

Comenta ae, amiguinho!