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.
Æ!!
ResponderExcluirVá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
O mksession não guarda TUDO, ele divide essa tarefa com o viminfo. O mksession e viminfo dariam um livro, não um post ;)
ResponderExcluirMas como diria um professor meu preguiçoso:
- Fica de lição de casa.
:help viminfo