sexta-feira, 28 de agosto de 2009

Desfazendo no VIm

O que fazemos quando erramos, desfazemos o erro. Para isso serve a ferramenta undo, tão popular nos mais diversos tipos de editores. Hoje veremos o que o Vim nos oferece para desfazer e refazer a edições.

Desfazendo e refazendo

Desfazer uma ação é extremamente simples, mas pode haver algumas particularidades.

O comando u desfaz a última edição, enquanto o comando CTRL-R refaz a última edição desfeita.

    iFoo
    iBar
    iFooBar
    u            <- Desfazendo iFooBar
    CTRL-R       <- Refazendo iFooBar

Os comandos u e CTRL-R aceitam um count como argumento, portanto, podemos fazer 2u ou 4CTRL-R para desfazer 2 edições ou refazer a últimas 4 edições desfeitas.

Nota: CTRL-R difere de . pois o primeiro refaz a última edição desfeita, enquanto o segundo reexecuta o último comando de edição.

Listas

Listas são estruturas recorrentes em programação. Uma lista é um conjunto de elementos dispostos em um seqüência, aonde um elemento tem um elemento anterior e posterior associado a ele, exceto o primeiro elemento, que não possui o anterior e o último elemento, que não possui um posterior.

Um apontador nada mais faz do que apontar para um determinado elemento de uma lista.

Lista de edição

Uma lista de edição, é uma estrutura que contém as edições realizadas em ordem seqüencial. Os comandos u e CTRL-R simplesmente manipulam está lista para desfazer ou refazer as edições.

     Conteúdo -  Lista de edição
     |        - Alteração feita: iFoo
     Foo
     |        - Alteração feita: iBar
     Foo
     Bar
     |        - Alteração feita: iFooBar <-- Apontador
     Foo
     Bar
     FooBar

Utilizando o comando u:

     Vazio
     |      Alteração feita: iFoo
     Foo
     |      Alteração feita: iBar        <-- Apontador
     Foo
     Bar
            Alteração desfeita: iFooBar

Utilizando o comando u novamente:

     Vazio
     |      Alteração feita: iFoo        <-- Apontador
     Foo
            Alteração feita: iBar
            Alteração desfeita: iFooBar

Utilizando o comando CTRL-R:

     Vazio
     |      Alteração feita: iFoo
     Foo
     |      Alteração feita: iBar        <-- Apontador
     Foo
     Bar
            Alteração desfeita: iFooBar

Quero mais!

Depois que você pega o jeito, editar no VIm é uma delícia. Desfazer uma ação é extremamente freqüente e a tecla u em teclados QWERTY é facilmente acessada.

Undo é um assunto extenso dentro do VIm pois ele envolve a função básica de editação. Outros tópicos interessantes são: bloco de edição, arvore de edição e timeline de edição. Estes dois últimos serão abordados futuramente, pois são de ampla utilidade.

Para os mais impacientes ou curiosos, vocês podem obter TUDO sobre undo no help, pesquisando sobre undo ou no capítulo 32.

  :help undo
  :help 32

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.