Ambiente de Desenvolvimento para Common Lisp: Emacs + SBCL + CMUCL + Quicklisp + utilitários. Parte III: Configuração do Emacs

Ao instalar o Emacs conforme o indicado na Parte II desta série, você está agora com algo semelhante ao da figura a seguir:

Precisamos agora configurar o Emacs com as opções necessárias para que ele se torne um ambiente de desenvolvimento Common Lisp (além de algumas outras configurações úteis). Nas próximas seções entenderemos quais os arquivos e diretórios de configuração são necessários, e faremos a configuração passo a passo.

1. Entendendo os arquivos de configuração do Emacs

A configuração do Emacs é feita através do arquivo .emacs, que fica em seu diretório HOME (~/.emcas) e do diretório .emacs.d, também em seu diretório HOME (~/.emacs.d).

Como terminamos a instalação, ainda não temos o arquivo .emcas, mas o diretório .emcas.d já foi criado pela primeira inicialização do Emacs:

O .emacs é o arquivo de conterá as configurações básicas essenciais, e apontará para outros arquivos dentro do diretório .emacs.d com configurações adicionais (é nesse diretório que packages adicionais serão instalados e que outros arquivos de configurações serão criados).

Eu detalharei a configuração que eu gosto de utilizar, que pode ser utilizada como base para a sua própria configuração.

OBSERVAÇÃO: não sou especialista no Emacs e as configurações aqui demonstradas podem não ser as mais otimizadas e melhores possíveis, mas são extremamente funcionais e resolvem todos os meus problemas. Algumas são obrigatórias para o ambiente de desenvolvimento Common Lisp e outras são opcionais: eu indicarei claramente as configurações obrigatórias e as opcionais.

2. Repositório para packages do Emacs

[ESTA CONFIGURAÇÃO É OBRIGATÓRIA]

A primeira configuração que faremos é indicar ao Emacs um repositório de packages e bibliotecas de terceiros que estão prontamente disponíveis para instalação. Eu utilizo o MELPA (Milkypostman’s Emacs Lisp Package Archive):

Site do MELPA: https://melpa.org/

Utilize um editor de texto de sua preferência, crie o arquivo ~/.emacs e coloque o seguinte conteúdo:

;;----------------------------------------------------------;;
;; Inicializa packages e diretórios
;;----------------------------------------------------------;;
 
;; Configura diretório para packages e configurações adicionais:
(setq load-path (append (list "~/.emacs.d/config") load-path))

;; Configura repositórios MELPA e outros:
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)

;; Inicializa packages:
(package-initialize)

Nesse momento seu arquivo terá o seguinte:

As linhas iniciadas por ;; são comentários. A linha 6 indica que os arquivos de configurações adicionais que criaremos futuramente serão armazenados no diretório ~/.emacs.d/config; As linhas 9 e 10 configuram o Emacs para utilizar o MELPA; e a linha 13 inicializa os packages do Emacs.

Precisamos criar o diretório que indicamos acima (linha 6). Para isso use os comandos a seguir em um terminal:

cd ~/.emacs.d

mkdir config

Nesse momento o Emacs está configurado para acessar, buscar e instalar packages do MELP. Para maiores informações, consulte a documentação disponível. O próximo passo é instalar os packages necessários!

3. Instalação de packages necessários (e alguns outros úteis)

[ESTA CONFIGURAÇÃO É OBRIGATÓRIA]

Inicie o Emacs instalado. Precisamos indicar ao Emacs que busque a lista de pacotes atuais do MELPA e, para isso, utilizamos o comando M-x package-refresh-contents (“M-x” significa pressionar a tecla Meta, mantê-la pressionada, pressionar a tecla x e depois soltar as duas; a tecla Meta geralmente é a Alt). Ao pressionar M-x você poderá digitar package-refresh-contents na “barra” de comandos do Emacs:

Digite “Enter” e aguarde alguns momentos: o Emacs fará o download da lista de pacotes atual do MELPA (para o subdiretório ~/.emacs.d/elpa) e, ao terminar, exibirá uma mensagem dizendo que a atualização da lista de pacotes foi concluída:

Agora vamos instalar os packages necessários. Podemos utilizar uma interface gráfica de gerenciamento de pacotes, disponibilizada pelo próprio Emacs, ou podemos instalar através de comandos M-x.

Para acessar a interface gráfica de gerenciamento de pacotes, digite M-x package-list-packages e tecle “Enter”:

Você verá a lista disponível de pacotes:

Para instalar basta procurar o pacote na listagem, por exemplo, o pacote dash:

Note que existem 2 opções para o pacote dash: uma opção fornecida pelo projeto GNU e outra opção fornecida pelo MELPA. Minha preferência é instalar os pacotes fornecidos pelo MELPA, a não ser que ocorra alguma incompatibilidade entre diferentes pacotes (o Emacs irá lhe alertar se esse for o caso). Para instalar o pacote basta clicar no nome do pacote: uma janela se abrirá e você poderá clicar na opção de instalar (botão “Install”):

Ao clicar em “Install” o Emacs solicitará a confirmação de que o pacote deve ser instalado. Clique em sim:

Após alguns instantes o Emacs informará que o dash está instalado (juntamente com algumas outras informações úteis e uma opção para apagar o pacote):

Para instalar o resto dos pacotes, repita esse processo e instale o seguinte (se for instalar um por um, siga a ordem indicada abaixo):

  • dash
  • dash-functional
  • s
  • ag
  • all-the-icons
  • async
  • company
  • pos-tip
  • company-quickhelp
  • f
  • shrink-path
  • doom-modeline
  • doom-themes
  • elisp-refs
  • expand-region
  • transient
  • with-editor
  • git-commit
  • helpful
  • loop
  • macrostep
  • magit
  • memoize
  • multiple-cursors
  • neotree
  • paredit
  • slime
  • slime-company
  • smex
  • sublime-themes
  • yasnippet
  • yasnippet-snippets
  • ess
  • org

Observação: o gerenciador de pacotes do Emacs permite que você marque vários pacotes para instalação (utilize o comando C-s para procurar, e marque com a tecla i) e, depois, faça a instalação de todos ao mesmo tempo (com a tecla x). Se quiser aprender como fazer isso, consulte a documentação disponível.

Alguns dos pacotes listados acima são obrigatórios para o ambiente de desenvolvimento Common Lisp, outros são opcionais e uns poucos não são diretamente relacionados ao nosso objetivo (por exemplo, o ess , o org, e o yasnippet). Como eu utilizao esses outros pacotes e os considero úteis, recomendo a instalação.

Ao terminar a instalação o Emacs fará uma alteração no arquivo ~/.emacs e incluirá as seguintes linhas ao final do arquivo:

As configurações acima são gerenciadas pelo próprio Emacs, não faça nenhuma alteração nessas linhas. Elas indicam quais pacotes instalados estão disponíveis para uso. Essa é a confirmação de que os pacotes foram instalados corretamente.

4. Configuração da aparência/layout do Emacs

[ESTA CONFIGURAÇÃO É OPCIONAL]

Eu gosto de ajustar algumas coisas na aparência do Emacs e incluir algumas funções úteis, por exemplo, colocar o Emacs em modo fullscreen ou configurar atalhos de teclado para aumentar ou diminuir a fonte de exibição. Você não é obrigado a fazer nenhuma das configurações desta seção, mas acredito que serão úteis no futuro.

Para organizar as configurações vamos mantê-las em arquivos diferentes.

4.1. Configuração da aparência geral

Em primeiro lugar, crie o arquivo aparencia.el dentro do diretório ~/.emacs.d/config, e digite o seguinte conteúdo (ou faça o download do arquivo pronto):

Conteúdo do arquivo ~/.emacs.d/config/aparencia.el

As linhas 6, 9, 12 e 15 estão comentadas mas você pode ativá-las, se desejar. A linha 6 é a mais inocente de todas, apenas suprime a mensagem de startup do Emacs.

A linha 9 oculta a barra de botões, a linha 12 oculta a barra de rolagem lateral e a linha 15 oculta a barra de menu. Essas opções são úteis quando você já é um usuário mais avançado do Emacs e utiliza tudo por atalhos de teclado: nessa situação você quer o máximo de tela disponível para o código, e botões e menus são apenas uma distração. Se você ativar essas linhas, a interface do Emacs será a seguinte:

Maximização da área de código (botões, menu e rolagem lateral ocultos)

Se você é iniciante, mantenha essas linhas comentadas para até que se sinta confortável em utilizar o Emacs. Você pode experimentar essas opções dinamicamente através dos comandos:

  • M-x tool-bar-mode
  • M-x scroll-bar-mode
  • M-x menu-bar-mode

A linha 18 ativa a numeração das linhas de código, e a linha 21 maximiza o Emacs após sua inicialização. Essas opções são úteis e podem ficar descomentadas.

4.2. Configuração do tamanho da fonte

Você conhece os atalhos do Mozilla Firefox para aumentar (Ctrl-=), diminuir (Ctrl--) ou retornar o tamanho da fonte de exibição na tela para o padrão (Ctrl-0)? Bem, é possível configurar atalhos para isso no Emacs! Crie o arquivo firefox_font_size.el dentro do diretório ~/.emacs.d/config, e digite o seguinte conteúdo (ou faça o download do arquivo pronto):

Conteúdo do arquivo ~/.emacs.d/config/firefox_font_size.el

Não vou explicar todas as linhas desse arquivo, apenas as mais importantes:

  • A linha 7 configura o tamanho padrão (190) para a fonte de exibição. Você pode experimentar outros valores até encontrar um tamanho confortável;
  • A linha 20 e a linha 21 configuram os “saltos” de acréscimo ou diminuição no tamanho da fonte. Aqui os saltos estão configurados de 5 em 5, mas você pode aumentar esse valor se quiser;
  • A linha 31 configura o atalho para aumentar o tamanho da fonte: C-+. Isso significa segurar a tecla Ctrl e digitar a tecla + (também pode ser necessário manter pressionada a tecla Shift para o acesso ao +);
  • A linha 32 configura o atalho para diminuir o tamanho da fonte: C--. Isso significa segurar a tecla Ctrl e digitar a tecla – (aqui não é necessário a tecla Shift); e
  • A linha 33 configura o atalho para retorar o tamanho da fonte ao tamanho padrão configurado na linha 7: C-=. Isso significa segurar a tecla Ctrl e digitar a tecla = (também não é necessário o Shift).

4.3. Configuração de fullscreen

Esta é outra configuração inspirada no Firefox: o uso da tecla F11 para entrar e sair do modo de tela cheia (fullscreen). Para reproduzir essa funcionalidade, crie o arquivo firefox_fullscreen.el dentro do diretório ~/.emacs.d/config, e digite o seguinte conteúdo (ou faça o download do arquivo pronto):

Conteúdo do arquivo ~/.emacs.d/config/firefox_font_size.el

A linha 16 configura o atalho para ligar/desligar o modo fullscreen, associando-o à tecla F11. A linha 19, comentada, faz com que o Emacs já se inicie no modo fullscreen (deixe essa opção comentada por enquanto… quando tiver mais experiência com o Emacs, pode habilitar por padrão).

4.4. Ativando as configurações

Até o momento nós apenas colocamos os 3 arquivos de configurações no diretório ~/.emacs.d/config, mas não informamos ao Emacs para ler e ativar esses arquivos durante a inicialização. Para isso vamos fazer o seguinte acréscimo ao arquivo ~/.emacs (antes das configurações automáticas que o Emacs incluiu ao final do arquivo):

Carregando as configurações de aparência na inicialização do Emacs (parte do arquivo ~/.emacs)

As linhas 21, 24 e 27 fazem com que o Emacs, durante a inicialização, leia e ative as configurações definidas nos arquivos indicados.

5. Configuração para edição de texto

[ESTA CONFIGURAÇÃO É OPCIONAL]

Eu gosto de alterar um pouco as configurações padronizadas do Emacs em relação à edição de texto, e também utilizo com freqüência alguns templates que crio através do Yasnippet.

5.1. Edição de texto

Aqui estão três configurações que eu utilizo muito: fazer os parênteses correspondentes piscarem (para ajudar no balanceamento de parênteses), realçar código além da coluna 80 e, em arquivos TXT, quebrar automaticamente a linha na coluna 80.

Crie o arquivo edicao_texto.el dentro do diretório ~/.emacs.d/config, e digite o seguinte conteúdo (ou faça o download do arquivo pronto):

Conteúdo do arquivo ~/.emacs.d/config/edicao_texto.el

As linhas 6-8 carregam o arquivo flash-paren.el, que é um conjunto de configurações para fazer o Emacs balancear parênteses mimetizando o comportamento do antigo Zmacs. Faça o download do arquivo “flash-paren.el” e salve no diretório ~/.emacs.d/config. Eu utilizo o flash-paren pois é bem simples e atende minhas necessidades. Se você não quiser utilizá-lo, consulte a documentação do Emacs para saber como configurar outras formas de balancear parênteses (o próprio Emacs tem funcionalidades built-in para isso).

As linhas 11-15 configuram o Emacs para realçar linhas digitadas cujo conteúdo ultrapassou a coluna 80. Você pode alterar esse limite na linha 12. Note que essa configuração está ativa para no modo de programação (linha 14) e também no modo texto (linha 15).

As linhas 18-19 configuram o Emcas para quebrar automaticamente a linha na coluna 80, em arquivos em modo texto (TXT).

5.2. Templates com o Yasnippet

O Yasnippet é um sistema de templates para o Emacs que nos permite digitar alguma abreviatura pré-configurada e expandi-la automaticamente para código completo. Eu utilizo muito o Yasnippet e tenho vários templates que criei ao longo do tempo. Você encontra vários templates disponíveis na internet, e um repositório bem conhecido de templates é o https://github.com/AndreaCrotti/yasnippet-snippets.

Para configurar o Yasnippt crie o arquivo templates.el dentro do diretório ~/.emacs.d/config, e digite o seguinte conteúdo (ou faça o download do arquivo pronto):

As linhas 5-9 habilitam o Yasnippet no Emacs. Os templates devem ficar, por padrão, organizados em subdiretórios específicos dentro do diretório ~/.emacs/snippets. Consulte a documentação do Yasnippet para saber como utilizá-lo. Um exemplo de diretórios de templates é o seguinte:

Árvore de templates do Yasnippet

Na imagem acima estão exibidos 16 templates para 5 modos de programação do Emacs: C, LaTeX, Lisp, SQL e TXT. Cada template tem um cabeçalho que cria uma key única para o template (a abreviatura a ser utilizada dentro do Emacs), e o conteúdo que substituirá a abreviatura, por exemplo: no modo LaTeX eu criei o template “2col”, com o seguinte conteúdo:

Template de 2 colunas para o LaTeX

Isso significa que quando eu estiver escrevendo um documento LaTeX e escrever “2col” e teclar em TAB, o texto abaixo das hashtags será inserida. O Yasnippet é muito útil, consulte a documentação!

5.3. Ativando as configurações

Agora que os arquivos de configurações estão criados precisamos instruir o Emacs para ler esses arquivos e ativar as configurações durante a inicialização. Para isso acrescente ao arquivo ~/.emacs o seguinte (antes das configurações automáticas que o Emacs incluiu ao final do arquivo):

Carregando as configurações de edição de texto e templates (parte do arquivo ~/.emacs)

6. Configuração para impressão em PDF (salvar em PDF)

Seria muito bom que o Emacs tivesse a capacidade de salvar qualquer arquivo em PDF, não é mesmo? Bem, é possível fazer isso! Utilizando o utilitário “ps2pdf14” do Linux, podemos converter os arquivos que estão sendo editados no Emacs em versões em PDF.

Para verificar se o ps2pdf14 está instalado em seu sistema, digite ps2pdf14 e tecle Enter. Você deve ver algo como o seguinte:

Se você receber uma mensagem de comando não econtrado, precisará instalar o Ghostscript em seu Linux, por exemplo: em distribuições baseadas na Debian faça:

sudo apt install ghostscript

Depois de instalar o Ghostscript em seu Linux (e de verificar a disponibilidade do ps2pdf14), crie o arquivo imprimir_pdf.el dentro do diretório ~/.emacs.d/config, e digite o seguinte conteúdo (ou faça o download do arquivo pronto):

Configurações para salvar um arquivo em PDF

Nas linhas 6-19 definimos uma função chamada de print-to-pdf() que se encarregará de salvar o arquivo que estamos editando em PDF, através do utilitário ps2pdf14. A linha 21 cria o atalho de teclado “C-c p” para salvar o arquivo em PDF, ou seja: clique e segure a tecla Ctrl e, enquanto está segurando a Ctrl, clique na tecla c; depois solte as duas teclas e clique na tecla p. Nesse momento o Emacs salvará uma versão em PDF de seu arquivo.

A única coisa que falta agora é dizer ao Emacs para ler e ativar essas funções durante a inicialização. Abra novamente o arquivo ~/.emacs e acrescente o seguinte (antes das configurações automáticas que o Emacs incluiu ao final do arquivo):

Carregando as configurações de impressão em PDF (parte do arquivo ~/.emacs)

7. Finalizando as configurações

Estamos com todas as configurações do Emacs praticamente terminadas (exceto as configurações que fazem as integrações do Emacs com as implementações Lisp, que serão vistas em outros artigos desta série).

Alguns útlimos retoques que gosto de fazer é alterar o padrão de exibição das datas, transformar TABs em espaços, ativar a numeração de linhas, ajustar o tamanho das fontes em arquivos impressos e em PDF, habilitar um tema de cores para o Emacs (eu gosto de temas claros), incluir a númeração de páginas nos arquivos PDF e outras. Tudo isso pode ser feito via interface gráfica do Emacs com o comando M-x customize-browse, que abre a interface de configuração das ZILHÕES de opções do Emacs:

Interface de configuração das opções do Emacs

Como são poucas as opções que eu gosto de modificar, eu prefiro editar diretamente o arquivo ~/.emacs e incluir essas configurações na parte gerenciada automaticamente pelo Emacs (as linhas finais do arquivo)… é mais rápido editar manualmente do que tentar lembrar onde as opções de configuração estão na interface gráfica.

Faça a edição, COM MUITO CUIDADO, das linhas finais do arquivo ~/.emacs para o seguinte:

Ajustes finais do arquivo ~/.emacs

Na figura acima, os retângulos vermelhos indicam as configurações que eu acrescentei. ATENÇÃO: note que nas linhas 70 e 76 o último parênteses está fora do retângulo vermelho: isso indica que são os parênteres que já tinham sido colocados lá pelo Emacs: mantenha-os!

Se você segui à risca todas as configurações indicadas aqui, e instalou o Emacs conforme a Parte II desta série, terá exatamente o mesmo ambiente que o meu. Nesse caso você pode fazer o download do arquivo .emacs prontinho, com todas as configurações que mostrei aqui.

O resultado final, até o momento é o seguinte:

Emacs configurado!

No próximo artigo aprenderemos a instalar uma implementação Lisp (e depois aprenderemos a integrar o Emacs com o Lisp). Não perca!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *