"Hoje Eu Aprendi" - A Lista

Table of Contents

1 INTRO

Resolvi fazer este post para acumular pequenas peças de conhecimento que descubro por aí.

2 Mantendo várias configurações do Emacs

A motivação é simples (ou quase). Existem por aí pela internet muitos repositórios contendo configurações para o Emacs. Pois bem, será que é possível manter várias dessas configurações em paralelo, podendo assim escolher qual delas iniciar e com isso poder compará-las?

A resposta é positiva. Aqui está o meu passo-a-passo:

  1. Criar um diretório que conterá todas essas configurações. No meu caso, é o ~/eprofiles.
  2. Baixar o chemacs via git:

    $> git clone https://github.com/plexus/chemacs.git
    $> cd chemacs && ./install.sh
    OK      Creating symlink ~/.emacs -> /home/blob/eprofiles/chemacs/.emacs
    

    Com isto, você terá um link simbólico.

  3. Configurar o arquivo ~/.emacs-profiles.el

    Este é um arquivo contendo uma lista Elisp, a qual descreve a configuração. Eis um exemplo:

    (("amacs" . ((user-emacs-directory . "~/eprofiles/amacs")
                 (custom-file          . "~/eprofiles/amacs/custom.el")
                 (server-name          . "amacs")
                 (env                  . (("EMACS_PROFILE" . "amacs")))))
     ("prelude" . ((user-emacs-directory . "~/eprofiles/prelude")
                   (custom-file          . "~/eprofiles/prelude/custom.el")
                   (server-name          . "prelude")
                   (env                  . (("EMACS_PROFILE" . "prelude"))))))
    

    Aqui, a lista contém diversos pares cons. O primeiro elemento do par é o nome do perfil, e o segundo elemento é uma lista de variáveis de configuração:

    • user-emacs-directory aponta para o diretório daquela configuração - mais precisamente, este diretório terá que conter um arquivo init.el.
    • custom-file é o arquivo de customização via Custom. Explicando rapidamente: normalmente o Emacs salva algumas configurações no próprio arquivo init.el. Por vezes isso não é nada desejável - por exemplo, se você gosta de manter seus arquivos em serviços de versão (Mercurial, Git &c.), é bastante chato ficar salvando um monte de linhas que não foram produzidas por você. Assim, ao estabelecer um valor à variável custom-file, o Emacs passa a salvar suas configurações neste arquivo, despoluindo o init.el.
    • server-name é o nome pelo qual o servidor Emacs será reconhecido.
    • env é uma lista de variáveis de ambiente (aquelas como o PATH, TERMINFO_DIRS e por aí vai). Eu costumo usar para certas customizações extras.
  4. (opcional) Definir um default no arquivo ~/.emacs-profile

    Basta escrever o nome de um perfil predileto, digamos amacs.

  5. Invocar o Emacs!

    Agora, você pode invocar o Emacs da seguinte forma:

    $> emacs --with-profile amacs
    

    Desta forma, o Emacs passa a reconhecer a opção --with-profile, a qual seleciona um perfil como o descrito anteriormente.

    Acaso você tenha editado e escolhido um perfil default no passo opcional anterior, este perfil será carregado acaso o Emacs seja invocado sem o argumento --with-profile.

    Enfim, é isso!

3 REPL para Emacs Lisp

Sim, mesmo usando Emacs há décadas, eu nunca me atentei para a necessidade de um REPL (um read-eval-print-loop - um interpretador interativo, para os leigos :-]). Sim, existe um interpretador de comandos Elisp dentro do Emacs (por que alguém ficaria surpreso com isso?).

A forma mais direta é simplesmente invocar o IELM (Inferior Emacs Lisp Mode):

M-x ielm
*** Welcome to IELM ***  Type (describe-mode) for help.
ELISP> (+ 2 3 4)
10

A outra, um pouco mais impressionante, é usar a Elisp shell. Ela interpreta tanto comandos para a shell quanto comandos Elisp.

~/snippets $ (+ 2 4)
6

FONTES:

http://emacs-fu.blogspot.com.br/2011/03/ielm-repl-for-emacs.html

4 Caracteres esquisitos

Por vezes, aparecem alguns caracteres estranhos. Isto costuma ser problema de codificação de caracteres. Este rápido comando tem-me sido bem útil:

M-x revert-buffer-with-coding-system <RET> utf-8-unix

5 Usar o Emacs em modo root

Se, por algum motivo, for necessário editar um arquivo de sistema ao qual somente o usuário root tem acesso, a solução mais à mão seria abrir uma nova shell e invocar o comando sudo:

$> sudo emacs /etc/fstab

Mas, e se eu já estiver com uma sessão do Emacs já aberta como usuário comum? Eis que entra em cena o TRAMP!

C-x C-f /sudo::/etc/fstab

6 Nome do arquivo completo na barra de título

(setq frame-title-format
      '(buffer-file-name
        "%b - %f" ; File buffer
        (dired-directory
         dired-directory ; Dired buffer
         (revert-buffer-function
          "%b" ; Buffer Menu
          ("%b - Dir: " default-directory))))) ; Plain buffer

7 Contadores em Macros

Uma coisa que faço muito é comando repetitivo. Por vezes, preciso fazer algo rápido e descartável - por exemplo, um script que renomeia uma lista de arquivos sequencialmente.

Os comandos para criar macros de teclado são kmacro-start-macro (normalmente associado a C-x ( ou F3) para iniciar a sequência e kmacro-end-macro (normalmente, C-x ) ou F4) para encerrar. Para repetir a última macro, basta usar kamcro-end-and-call-macro (normalmente, C-x e ou F4).

Agora, se precisar usar um contador, o comando é kmacro-insert-counter (C-x C-k C-i). Normalmente ele incrementa 1 ao contador logo após imprimi-lo.

É isso!

8 For loop na Eshell

O Emacs tem uma shell de interação muito interessante. Ela é parecida, mas não é uma Unix shell, e nem pretende ser. Em razão disso, certas construções não funcionam nela.

A que eu vou falar aqui é o comando for. Ele é usado quando queremos realizar uma sequência de operações em uma lista.

Por exemplo, se eu quiser converter todos os arquivos JPG de um diretório em arquivos PNG, este seria o código em Bash:

for f in *.jpg; do
    convert $f `basename $f .jpg`.png;
done

A utilidade convert é parte da suite Imagemagick/GraphicsMagick, e basicamente transforma imagens em imagens. Já basename é outra utilidade que, ao ler um nome de arquivo, elimina a extensão do mesmo.

EM Eshell isso fica assim:

for file in *.jpg {convert $file ${file-name-sans-extension $file}.png}

Author: Tradutor Bastardo

Created: 2020-04-04 sáb 03:16

Validate