Esta página é melhor visualizada com o JavaScript habilitado

Emacs Do Zero #1: Configuração básica

 ·  ☕ 5 min. de leitura

Introdução

Por quê Emacs?

Como uma pessoa curiosa e com pouca capacidade de controlar impulsos, sempre
acabava pesquisando sobre uma coisa ou outra sobre produtividade, e qualquer um
que passe tempo o suficiente pesquisando sobre isto inevitavelmente se depara
com pessoas advogando o uso de (Neo)Vim e/ou Emacs.

Um dos pontos mais comuns dentre as discussões sobre o uso e migração entre
Emacs e (Neo)Vim, além de edição de texto, é Emacs Org Mode. Uma solução
completa para quase todas as suas necessidades produtivas, incluindo:
gerenciamento de notas, gerenciamento de tarefas, agenda, gerenciamento de
tempo e mais.

Eventualmente a curiosidade e baixo controle de impulsos tiraram vantagem de
mim e decidi experimentar Emacs e Org Mode por algum tempo.

O que é Emacs?

De maneira simples e redutiva Emacs é um editor de texto altamente modificável.
Mas, uma citação bem comum (repetida tantas vezes que o autor parece ter sido
esquecido) e satírica pode descrever melhor emacs: “Emacs é um ótimo sistema
operacional, faltando apenas um editor decente”. Este sentimento sobre o emacs
parece ser bem comum dado a popularidade de frameworks como Doom
Emacs
e Spacemacs que pré-configuram pacotes que emulam os atalhos
do vim no Emacs, afinal “o melhor editor não é o Emacs nem o Vim, é o Emacs
e o Vim.” (página inicial do Spacemacs)

Por quê do Zero?

Basicamente três razões:

  1. Frameworks adicionam uma camada de complexidade. Emacs é tão
    configurável que utilizar algum framework ou bootstrap para agilizar a
    configuração inicial inevitavelmente me via gastando mais tempo tentando
    entender o framework utilizado do que Emacs em sí, e sempre acabava me
    perguntando se não seria mais fácil escrever uma configuração do zero.
  2. Responsividade. Periódicamente sentia o Emacs lento, e me perguntava se
    a lentidão era inerente ao programa ou se era causado por algumas das
    diversas configurações e pacotes adicionados pelo framework.
  3. Linguagem funcional. Emacs Lisp é um dialeto de Lisp (linguagem
    funcional) usado para implementar a maior parte das funcionalidades do Emacs
    e a principal forma de configurar e modificar o comportamento do progama.

Configuração inicial

Criar arquivo de configuração vazio

Crie um arquivo de configuração no caminho .config/emacs/init.el, para ter certeza que o emacs vai utilizar este arquivo, remova os seguintes diretórios .emacs/,.emacs.d/ (se estiverem presentes).

Remover poluição visual

Adicione o texto a seguir no arquivo de configuração

1
2
3
4
5
6
7
8
(setq inhibit-startup-message t) ; inibe a mensagem de inicialização

(scroll-bar-mode -1)        ; Desabilita a visibilidade da barra de rolagem
(tool-bar-mode -1)          ; Desabilita a barra de ferramentas
(tooltip-mode -1)           ; Desabilita tooltips
(set-fringe-mode 10)        ; Adiciona 10 pixels de margem para os quadros/janelas do emacs

(menu-bar-mode -1)            ; Desabilita a barra de menu

Gerenciamento de pacotes

Emacs tem algumas opções para gerenciamento de pacotes, mas nesta séries decidi utilizar o Elpaca, apenas por, teoricamente, ser mais rápido que as outras opções.

Para configurar elpaca adicione o texto abaixo no .config.emacs/init.el

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
(defvar elpaca-installer-version 0.11)
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
                              :ref nil :depth 1 :inherit ignore
                              :files (:defaults "elpaca-test.el" (:exclude "extensions"))
                              :build (:not elpaca--activate-package)))
(let* ((repo  (expand-file-name "elpaca/" elpaca-repos-directory))
       (build (expand-file-name "elpaca/" elpaca-builds-directory))
       (order (cdr elpaca-order))
       (default-directory repo))
  (add-to-list 'load-path (if (file-exists-p build) build repo))
  (unless (file-exists-p repo)
    (make-directory repo t)
    (when (<= emacs-major-version 28) (require 'subr-x))
    (condition-case-unless-debug err
        (if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
                  ((zerop (apply #'call-process `("git" nil ,buffer t "clone"
                                                  ,@(when-let* ((depth (plist-get order :depth)))
                                                      (list (format "--depth=%d" depth) "--no-single-branch"))
                                                  ,(plist-get order :repo) ,repo))))
                  ((zerop (call-process "git" nil buffer t "checkout"
                                        (or (plist-get order :ref) "--"))))
                  (emacs (concat invocation-directory invocation-name))
                  ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
                                        "--eval" "(byte-recompile-directory \".\" 0 'force)")))
                  ((require 'elpaca))
                  ((elpaca-generate-autoloads "elpaca" repo)))
            (progn (message "%s" (buffer-string)) (kill-buffer buffer))
          (error "%s" (with-current-buffer buffer (buffer-string))))
      ((error) (warn "%s" err) (delete-directory repo 'recursive))))
  (unless (require 'elpaca-autoloads nil t)
    (require 'elpaca)
    (elpaca-generate-autoloads "elpaca" repo)
    (let ((load-source-file-function nil)) (load "./elpaca-autoloads"))))
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca `(,@elpaca-order))

;; Install use-package support
(elpaca elpaca-use-package
  ;; Enable use-package :ensure support for Elpaca.
  (elpaca-use-package-mode))

E crie um arquivo no caminho .config/emacs/early-init.el

1
(setq package-enable-at-startup nil)

Configuração básica de usabilidade

Os atalhos padrão do Emacs são bem desconfortáveis de utilizar para mim, então vou instalar um pacote chamado evil-mode para emular atalhos e comportamentos do vim no emacs.

1
(use-package evil :ensure t :demand t :config (evil-mode))

Uma outra coisa básica para qualquer editor é capacidade de sugerir/autocompletar código, para isso vamos configurar o pacote ivy.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
(use-package ivy
  :diminish
  :bind (("C-s" . swiper)
         :map ivy-minibuffer-map
         ("TAB" . ivy-alt-done)	
         ("C-l" . ivy-alt-done)
         ("C-j" . ivy-next-line)
         ("C-k" . ivy-previous-line)
         :map ivy-switch-buffer-map
         ("C-k" . ivy-previous-line)
         ("C-l" . ivy-done)
         ("C-d" . ivy-switch-buffer-kill)
         :map ivy-reverse-i-search-map
         ("C-k" . ivy-previous-line)
         ("C-d" . ivy-reverse-i-search-kill))
  :config
  (ivy-mode 1))

E a última mudança básica será utilizar o pacote doom-modeline para melhorar as informações exibidas sobre o buffer atual.

1
2
3
4
(use-package doom-modeline
  :ensure t
  :init (doom-modeline-mode 1)
  :custom ((doom-modeline-height 15)))

Referencias

Compartilhar em

Daniel B. Sales
Escrito por
Daniel B. Sales