23 January 2009

Emacs

Já faz um tempo que eu estou ciente da guerra sagrada dos editores de texto. Como o primeiro deles que eu vi sendo usado foi o vi (trocadilho não intencional) foi ele o primeiro a ganhar minha atenção também. No entanto nunca me motivei o suficiente para me adaptar à interface. Como minha história de programador foi marcada por editores bem normais (para os padrões de hoje) eu acabava sempre caindo para uma alternativa simples e confortável quando eu realmente tinha que fazer algo sério, ou então para um ambiente especializado caso precisasse trabalhar com uma linguagem específica.

No entanto, eu sempre me senti atraído pelas lendas de poder infinito prometido àqueles que dominam um desses editores lendários. Um pouco frustrado pela falta de flexibilidade da minha opção atual, resolvi voltar a investir no aprendizado de uma dessas ferramentas. Baixei e instalei os dois, mas apesar da minha maior simpatia com o Vim, resolvi que deveria experimentar o GNU Emacs dessa vez.

Bom, os comentários sarcásticos sobre o Emacs dizendo que ele é “um grande sistema operacional, faltando apenas um editor decente” estão perto de ser verdade: o Emacs é um sistema bem complexo. Ele vem com diversos modos de edição diferente que são divididos em dois tipos: major-modes e minor-modes. Os major-modes governam o comportamento geral do editor para um determinado buffer (o que você chamaria de "arquivo" em um editor comum, mas que não necessariamente está associado a um arquivo no disco), enquanto os minor-modes adicionam comandos e comportamentos que podem complementar um major-mode. Para um determinado buffer apenas um major-mode pode estar ativo, mas minor-modes podem ser vários. Um exemplo: o major-mode Text serve para editar arquivos de texto normais e o minor-mode Autofill pode ser usado para que as linhas sejam quebradas automaticamente para formar parágrafos uniformes. Existem também major-modes para linguagens de programação e marcação como o c-mode, o python-mode e o html-mode. Além de comandos adicionais, aparecem menus para executar alguns dos comandos mais comuns.

Bom, até agora parece que tudo isso é só uma nomenclatura rebuscada pra coisas comuns que todos os editores tem, mas a diferença é o grau de customização que é possível no emacs. Cada um desses modos são implementados como programas em um dialeto específico de Lisp chamado Emacs Lisp ou ELisp. O que acontece é que cada tecla (ou combinação de teclas) pressionada pode estar associada com uma função ELisp, inclusive as teclas alfanuméricas, o que quer dizer que quando você digita a letra A no seu teclado, existe uma função Lisp que insere o caractere A na posição atual do cursor. Porém, não precisa ser assim! Nada impede você de associar qualquer tecla ou combinação com qualquer outro comando fazendo seu próprio programa Lisp. E é graças a essa flexibilidade que o Emacs vem com uma míriade de modos que não tem nada a ver com editar texto, por exemplo, um psicoterapeuta virtual, um jogo de tetris, um navegador de arquivos, leitor de notícias online e MUITOS outros, tanto já incluídos no GNU Emacs como disponíveis na internet. Fora minor-modes adicionais que acrescentam ferramentas muito legais como essa aqui:



Vale também mencionar que um dos major-modes chamado org-mode tem uma palestra de mais de 40 minutos do Google Tech Talks para explicar o seu funcionamento.

Apesar de todas essas maravilhas, existem razões pelas quais é difícil começar a usar o Emacs.
  • A pletora de funcionalidade pode ser um tanto desgastante. São tantos comandos e opções que é enlouquecedor no início.
  • Os atalhos de teclado costumam envolver malabarismos não tão comuns em outros editores. Existem atalhos como Ctrl+x, b significando que você precisa primeiro apertar Ctrl+x e depois apertar b, até porque Ctrl+x, Ctrl+b é outro atalho que ativa outro comando.
  • O programa foi criado bem antes de algumas convenções que muitos de nós estamos acostumados (Ctrl+C, Ctrl+V, Ctrl+Z, alguém?). Para se ter uma idéia, o comando padrão de desfazer é Ctrl+_ e como o caractere é um underscore, isso significa que você precisa apertar Shift junto em um teclado QWERTY convencional. Felizmente isso tem uma solução simples: existe o modo CUA que é fácil de ativar e que faz com que muitas coisas passem a funcionar do jeito que é convencional nos editores atuais.
  • O programa é um tanto feio para padrões estéticos atuais e tem cara de antigo.
  • Customizar o comportamento do programa significa editar um arquivo Lisp ou usar uma interface um tanto poluída chamada Custom (que, adivinhem, é implementada em Lisp dentro do próprio Emacs)
Apesar dessas desvantagens eu estou gostando de aprender a usá-lo. Já fiz minhas primeiras funções em Lisp para adicionar uns comandos que eu sentia falta de outros editores e foi bem fácil. A impressão que eu tenho é que é um tipo de ferramenta que tem uma interface nem um pouco convencional, mas que compensa aprender. É mais ou menos a impressão que eu tenho do Blender também.

Meu principal objetivo é usá-lo como a IDE perfeita para Python e ele tem umas features bastante impressionantes para isso:



O Rope é usado para uma parte da funcionalidade mostrada nesse vídeo. É uma biblioteca com recursos de refatoração e funções de introspecção úteis para IDE's. No Emacs ele é usado através do Ropemacs.

Uma dica para quem estiver iniciando: aprenda os comandos por nome. Todo comando tem um nome que está relacionado com a função que ele desempenha. Aperte Esc e depois x (ou segure a tecla Meta - Alt normalmente - e pressione x) que você irá para o minibuffer e poderá executar um comando digitando seu nome. Além disso, você não precisa saber todo o nome do comando, basta apertar tab para mostrar uma lista de opções de autocompletar. Se o comando que você executar tiver um atalho de teclado, uma mensagem aparecerá no minibuffer dizendo qual é o atalho, logo após a execução. Assim você pode ir memorizando os atalhos dos comandos que você usa com mais frequência, enquanto os comandos novos que você aprender dá pra memorizar pelo nome que é muito mais fácil.