Transformando Emacs em um IDE Python - Parte 3 (final)

Nos artigos anteriores, aprendemos a instalar (parte 1) e configurar (parte 2) os pacotes necessários para tornar o Emacs um ambiente de desenvolvimento integrado para a linguagem de programação Python. Também aprendemos a realizar algumas customizações básicas e onde buscar referências. Nesse artigo, veremos o uso básico do que foi instalado, configurado e aprenderemos a usar seus principais recursos.

Usando Emacs como IDE Python.

Esse é um resumo dos procedimentos que serão realizados:
  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

Note que o resto do tutorial se encontra na parte 1 (link aqui) e parte 2 (link aqui). Também é importante estar ciente de que a customização do seu init file pode interferir nos procedimentos a seguir, se houver alteração de atalhos e/ou falta de pacotes.

Teste das Funcionalidades

Para testar essas funcionalidades, precisamos criar um programa em Python. Execute o comando C-x C-f <diretório-de-sua-preferência>/programa.py RET. Escreveremos um programa que armazena uma lista de números de 2 a 1.000 (intervalo inclusivo), para exibir apenas os que forem primos palíndromos.

Caso não se lembre o que é um número primo:

Primo: que só é divisível por si próprio e por 1. (Dicionário Priberam)

Então, por definição, um número primo é todo número que é apenas divisível por 1 e si mesmo, exceto o próprio 1 (que só possui um divisor). Ex.: 2, 3, 5, 7, 11, 13...

Palíndromo: diz-se de palavra, grupo de palavras ou verso em que o sentido é o mesmo, quer se leia da esquerda para a direita quer da direita para a esquerda. (Dicionário Priberam)

Portanto, são números palíndromos o 5, 11, 121, 123.454.321 etc. já que podem ser lidos conforme a definição apresentada pelo dicionário.

Escreva o seguinte trecho de código:
#!/usr/bin/env python3

def is_primo(n):
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

Quando for escrever o bloco for, aperte, em seguida, C-c k e veja o bloco de construção sendo autocompletado. Use TAB para prosseguir nas regiões editáveis (regiões verdes).

Exemplo de detecção de não conformidade com PEP8 e autocomplete.

Note que a checagem de não conformidade com o PEP8 acontecerá toda vez que salvar seu código e o mesmo contiver erros. Nesse caso, o erro acusado foi o E302, porque duas linhas em branco eram esperadas antes da definição dessa função.

Chame a função is_primo() e imprima o resultado passando alguns valores. Use a função C-= para fazer seleções e veja o resultado. Para executar esse código, basta executar o comando C-c C-c em qualquer linha que o mesmo será enviado ao interpretador Python e então exibido em um buffer a parte.

Exemplo de uso do expand-region.

Note, também, que os erros contidos no código sempre serão expostos pelo verificador instalado.

Agora, criaremos uma outra função para verificar se um número é palíndromo ou não. Uma forma fácil de fazer essa verificação na linguagem é converter o número em string e compará-lo com a string invertida, percorrendo-a de trás para a frente ([::-1]). Você pode usar o comando C-<enter> e ir à definição de uma função e se quiser refatorá-la, pode usar o comando C-c C-e, e então todas as ocorrência daquele objeto (dependendo do escopo) serão afetadas. Para retornar ao local onde C-<enter> foi chamado basta executar M-*.

Exemplo de refatoração e introspecção de código.

Como já temos nossas funções, resta adicionar docstrings tanto no módulo quanto nas próprias funções. O código ficará assim:
#!/usr/bin/env python3

"""
Módulo que contém funções matemáticas para determinar
se um número é palíndromo e/ou primo.
"""
def is_primo(n):
    """
    Função para determinar se um número é primo.
    :param: n valor inteiro
    """
    for i in range(2, n):
        if n % i == 0:
            return False
    return True
def is_palin(n):
    """
    Função para determinar se um número é palíndromo.
    :param: n valor inteiro
    """
    str_n = str(n); return True if str_n == str_n[::-1] else False

Caso seu código esteja exatamente dessa forma, alguns erros serão acusados porque não está de acordo com o PEP8. Para resolver esse problema é simples, execute o comando C-c C-r f e veja seu código ser formatado automaticamente de acordo com o guia de estilo e codificação supracitado.

Exemplo de autoformatação de código.

Para navegar entre os erros basta executar os comandos C-c C-n e C-c C-p. Para conferir se ainda há erros existentes em seu código você pode executar C-c C-v.

Agora, não queremos mais visualizar o conteúdo dessas funções, então iremos ocultá-las com o comando C-x C-/. E então, escreveremos um novo módulo que usará essas duas funções.

Você pode usar C-x C-5 para navegar pelo Neotree. O <enter> expande o diretório ou entra em um arquivo e o espaço também assume o mesmo comportamento. Para mudar a raiz use C-c C-c.

O novo módulo se chamará main.py. Caso queira atualizar a árvore basta teclar g.

Uso do Neotree para navegar entre a árvore de diretórios.

Por fim, basta importarmos o módulo programa e imprimirmos quais números primos são palíndromos de 2 a 1.000. Note que a descrição da função é exibida abaixo da powerline do Emacs quando estamos com o cursor sobre ela.

Demonstração final do uso do Emacs como IDE Python.

No fim, teremos uma sequência de números primos palíndromos de 2 a 1.000.

E essa foi uma pequena demonstração do que se pode fazer com esse poderoso e extensível editor. Outros pacotes podem ser adicionados a ele e suas características, funções e atalhos também podem ser customizados.

O que você aprendeu

Você aprendeu como:
  • Executar refatoração de código.
  • Realizar autoformatação.
  • Usar introspecção de código e muitos outros recursos do que foi instalado e configurado.

Na documentação de cada pacote há mais detalhes, funções e configurações que você pode realizar.

Esse artigo é uma continuação de Transformando Emacs em um IDE Python - Parte 2.

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