"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:
- Criar um diretório que conterá todas essas configurações. No meu caso, é o
~/eprofiles. Baixar o
chemacsvia git:$> git clone https://github.com/plexus/chemacs.git$> cd chemacs && ./install.shOK Creating symlink ~/.emacs -> /home/blob/eprofiles/chemacs/.emacsCom isto, você terá um link simbólico.
Configurar o arquivo
~/.emacs-profiles.elEste é 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-directoryaponta para o diretório daquela configuração - mais precisamente, este diretório terá que conter um arquivoinit.el.custom-fileé o arquivo de customização via Custom. Explicando rapidamente: normalmente o Emacs salva algumas configurações no próprio arquivoinit.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ávelcustom-file, o Emacs passa a salvar suas configurações neste arquivo, despoluindo oinit.el.server-nameé o nome pelo qual o servidor Emacs será reconhecido.envé uma lista de variáveis de ambiente (aquelas como oPATH,TERMINFO_DIRSe por aí vai). Eu costumo usar para certas customizações extras.
(opcional) Definir um default no arquivo
~/.emacs-profileBasta escrever o nome de um perfil predileto, digamos
amacs.Invocar o Emacs!
Agora, você pode invocar o Emacs da seguinte forma:
$> emacs --with-profile amacsDesta 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-directorydired-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; doconvert $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}