Transformando Emacs em um IDE Python - Parte 2

Na parte 1 do tutorial você aprendeu como instalar os pacotes necessários para a construção do IDE Python. Nesse artigo, você será introduzido a uma configuração básica que te ajudará no uso do IDE.

Configurando Emacs como Python IDE


Esse é um resumo dos procedimentos que serão realizados. Também é importante ressaltar que os dois primeiros tópicos já foram abordados no artigo anterior:
  1. Instalação dos pacotes Python
  2. Instalação dos pacotes do Emacs
  3. Configuração básica de preferências
  4. Configuração básica de atalhos
  5. Teste das funcionalidades

Configurando Preferências

É possível instalar uma gama enorme de pacotes e realizar diversas configurações nessa etapa. Como o foco é manter uma configuração básica (e, talvez, mínima), o artigo seguirá esse escopo restritivo mas você poderá pesquisar novas configurações.

Use esse trecho de código e cole em seu init.el:

;; ################# Preferences ######################
(tool-bar-mode -1)
(menu-bar-mode -1)
(toggle-scroll-bar -1)
(setq inhibit-startup-screen t)
(global-linum-mode t)
(setq column-number-mode t)
(setq-default tab-width 4)
(electric-pair-mode 1)
(put 'narrow-to-region 'disabled nil)
(show-paren-mode 1)
(require 'paren)
(set-face-background 'show-paren-match (face-background 'default))
(set-face-foreground 'show-paren-match "#68ACEE")
(set-face-attribute 'show-paren-match nil :weight 'extra-bold)

Para ficar claro o que foi feito:
  • tool-bar-mode: quando recebe o valor -1, ele oculta a barra de ferramentas.
  • menu-bar-mode: o mesmo comportamento que tool-bar, mas oculta a barra de menu.
  • toggle-scroll-bar: oculta a barra de rolagem.
  • inhibit-startup-screen: quando verdadeiro, oculta a tela de boas-vindas do Emacs.
  • global-linum-mode: exibe a numeração de linhas no canto esquerdo da tela.
  • column-number-mode: quando verdadeiro, exibe o número de colunas onde o cursor se posicionar.
  • tab-width: configura a tabulação para 4 espaços (recomendação PEP8).
  • electric-pair-mode: autocompleta símbolos como " ' “” ‘’ () {} [] «» ‹› 「」.
  • narrow-to-region: habilita editar um trecho de código separadamente do resto do conteúdo do arquivo.
  • show-paren-mode: destaca símbolos pares como () {} [] ...
  • show-paren-match: está sendo utilizado para definir a cor dos símbolos pares.

Para ver a documentação de uma função ou variável, execute C-h o RET sobre ela.
  • Para ver o índice de variáveis padrão do Emacs, clique aqui.
  • Para ver o índice de comandos padrão do Emacs, clique aqui.

Com o buffer do seu init.el aberto, execute eval-buffer RET. Note que as configurações foram aplicadas. Ou pode recarregar o arquivo a partir de qualquer buffer executando o comando load-file RET ~/.emacs.d/init.el RET.

Juntamente aos pacotes que foram instalados, algumas configurações podem ser feitas para o ambiente de desenvolvimento. Use esse código:

;; ################# Python Preferences ###############
(elpy-enable)
(yas-global-mode 1)
(setq highlight-indentation-blank-lines t)
(set-face-background 'highlight-indentation-face "#373A40")
(set-face-background 'highlight-indentation-current-column-face "#949da8")
(yafolding-mode 1)
(setq python-shell-interpreter "ipython"
      python-shell-interpreter-args "-i --simple-prompt")

Explicação do código acima:
  • elpy-enable: essa função ativa o Elpy, anteriormente instalado.
  • yas-global-mode: ativa o YASnippet para uso no Emacs.
  • highlight-indentation-blank-lines: quando verdadeiro, permite visualizar a indentação de blocos.
  • yafolding-mode: permite exibir ou ocultar um bloco de código.

O último comando configura o interpretador Python para o ipython, mas pode ser simplesmente "python" e o argumento "-i", caso opte por este.
  • Veja esse trecho da documentação do Elpy para mais informações.

Caso tenha instalado o pacote de temas e ícones, pode carregá-los também. Adicione esse trecho de código:
;; ################# Themes ###########################
(require 'doom-themes)
(load-theme 'doom-one t)

;; ################# Icons ############################
(require 'all-the-icons)


Configuração de Atalhos

A configuração de atalhos é importante para acessar facilmente alguns recursos dos pacotes que foram instalados. É importante, também, que essa configuração não entre em conflito com a de atalhos personalizados ou atalhos que são definidos como padrão.
  • Você pode ver a lista de atalhos padrões aqui.

Cole o seguinte código:
;; ################# Custom Shortcuts #################
(global-set-key (kbd "C-c k") 'yas-expand)
(global-set-key (kbd "C-<enter>") 'elpy-goto-definition)
(global-set-key (kbd "C-S-<enter>") 'elpy-goto-definition-other-window)
(global-set-key (kbd "C-=") 'er/expand-region)
(global-set-key (kbd "C-x C-/") 'yafolding-toggle-element)

Funções:
  • yas-expand: completa blocos de códigos.
  • elpy-goto-definition: permite inspecionar a definição de um objeto.
  • elpy-goto-definition-other-window: o mesmo que o de cima, mas em uma outra janela.
  • er/expand-region: permite expandir a seleção de uma região.
  • yafolding-toggle-element: permite ocultar ou exibir um bloco de código.

Se preferir, também pode definir uma configuração de atalhos para redimensionamento de janelas:

;; ################# Window Shortcuts #################
(global-set-key (kbd "S-C-<left>") 'shrink-window-horizontally)
(global-set-key (kbd "S-C-<right>") 'enlarge-window-horizontally)
(global-set-key (kbd "S-C-<up>") 'shrink-window)
(global-set-key (kbd "S-C-<down>") 'enlarge-window)

Opcionalmente, caso tenha instalado o Neotree, pode adicionar essas linhas de código:

;; ################# File Explorer Menu ##############
(require 'neotree) 
(global-set-key (kbd "C-x C-5") 'neotree-toggle)
(setq neo-theme (if (display-graphic-p) 'icons 'arrow))
(setq neo-window-fixed-size nil)

Lembrando que todos esses atalhos são customizáveis e ficam ao seu critério adaptá-los.

Essas foram as configurações básicas de atalho e preferências. Com acesso a documentação da descrição (também disponível para leitura pelo artigo), você pode criar sua própria configuração e instalar seus próprios pacotes assim como também customizar atalhos. Há mais de 4.000 pacotes para uso se somados Elpa e MELPA. Vale a pena pesquisar e ler também o init file de outros usuários do Emacs.

No final, seu init.el deve se parecer aproximadamente assim:

;; Autociência 2019 - Criando uma IDE Python
(package-initialize)

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))


;; ################# Themes ###########################
(require 'doom-themes)
(load-theme 'doom-one t)


;; ################# Icons ############################
(require 'all-the-icons)


;; ################# File Explorer Menu ##############
(require 'neotree) 
(global-set-key (kbd "C-x C-5") 'neotree-toggle)
(setq neo-theme (if (display-graphic-p) 'icons 'arrow))
(setq neo-window-fixed-size nil)


;; ################# Preferences ######################
(tool-bar-mode -1)
(menu-bar-mode -1)
(toggle-scroll-bar -1)
(setq inhibit-startup-screen t)
(global-linum-mode t)
(setq column-number-mode t)
(setq-default tab-width 4)
(electric-pair-mode 1)
(put 'narrow-to-region 'disabled nil)
(show-paren-mode 1)
(require 'paren)
(set-face-background 'show-paren-match (face-background 'default))
(set-face-foreground 'show-paren-match "#68ACEE")
(set-face-attribute 'show-paren-match nil :weight 'extra-bold)


;; ################# Python Preferences ###############
(elpy-enable)
(yas-global-mode 1)
(setq highlight-indentation-blank-lines t)
(set-face-background 'highlight-indentation-face "#373A40")
(set-face-background 'highlight-indentation-current-column-face "#949da8")
(yafolding-mode 1)
(setq python-shell-interpreter "ipython"
      python-shell-interpreter-args "-i --simple-prompt")


;; ################# Custom Shortcuts #################
(global-set-key (kbd "C-c k") 'yas-expand)
(global-set-key (kbd "C-<enter>") 'elpy-goto-definition)
(global-set-key (kbd "C-S-<enter>") 'elpy-goto-definition-other-window)
(global-set-key (kbd "C-=") 'er/expand-region)
(global-set-key (kbd "C-x C-/") 'yafolding-toggle-element)


;; ################# Window Shortcuts #################
(global-set-key (kbd "S-C-<left>") 'shrink-window-horizontally)
(global-set-key (kbd "S-C-<right>") 'enlarge-window-horizontally)
(global-set-key (kbd "S-C-<up>") 'shrink-window)
(global-set-key (kbd "S-C-<down>") 'enlarge-window)


(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(package-selected-packages
   (quote
    (yasnippet-classic-snippets yafolding neotree markdown-mode json-mode hydra flymd expand-region elpy doom-themes))))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 ) 

O que você aprendeu

Você pode configurar o seu editor GNU Emacs para edição de códigos em Python. Agora resta usá-lo e testá-lo. Você aprendeu, especificamente:
  • Realizar configurações padrões do Emacs.
  • Realizar a configuração de alguns pacotes instalados.
  • Configurar atalhos customizados.

Continuação de Transformando Emacs em um IDE Python parte 1.
Continua em Transformando Emacs em um IDE Python - Parte 3 (final).

Referências
EMACSWIKI: Novato no Emacs. Disponível em <https://www.emacswiki.org/emacs/NovatoNoEmacs>. Acesso em 15 jan. 2019.

GITHUB. All-the-icons. Disponível em <https://github.com/domtronn/all-the-icons.el>. Acesso em 15 jan. 2019.

GITHUB. Elpy. Disponível em <https://github.com/jorgenschaefer/elpy>. Acesso em 15 jan. 2019.

GITHUB. Emacs doom themes. Disponível em <https://github.com/hlissner/emacs-doom-themes>. Acesso em 15 jan. 2019.

GITHUB. Emacs jedi. Disponível em <https://github.com/tkf/emacs-jedi>. Acesso em 15 jan. 2019.

GITHUB. Emacs neotree. Disponível em <https://github.com/jaypei/emacs-neotree>. Acesso em 15 jan. 2019.

GITHUB. Expand region. Disponível em <https://github.com/magnars/expand-region.el>. Acesso em 15 jan. 2019.

GITHUB. Ropemacs. Disponível em <https://github.com/python-rope/ropemacs>. Acesso em 15 jan. 2019.

GITHUB. Yapf. Disponível em <https://github.com/google/yapf>. Acesso em 15 jan. 2019.
GNU. GNU Emacs. Disponível em <https://www.gnu.org/software/emacs/download.html>. Acesso em 15 jan. 2019.

GNU. EMACS: The Extensible, Customizable Display Editor. Disponível em <https://www.gnu.org/software/emacs/emacs-paper.html#SEC24>. Acesso em 15 jan. 2019.

GNU. My Lisp Experiences and the Development of GNU Emacs. Disponível em <https://www.gnu.org/gnu/rms-lisp.html>. Acesso em 15 jan. 2019.

PYPI. Autopep8. Disponível em <https://pypi.org/project/autopep8/>. Acesso em 15 jan. 2019.

PYPI. Flake8. Disponível em <https://pypi.org/project/flake8/>. Acesso em 15 jan. 2019.

PYPI. Mccabe. Disponível em <https://pypi.org/project/mccabe/>. Acesso em 15 jan. 2019.

PYPI. Pycodestyle. Disponível em <https://pypi.org/project/pycodestyle/>. Acesso em 15 jan. 2019.

PYPI. Pyflakes. Disponível em <https://pypi.org/project/pyflakes/>. Acesso em 15 jan. 2019.


Para citar esse artigo:

Comentários