Como faço para compilar tudo em bytes no meu diretório .emacs.d?

138

Decidi dar uma olhada no Emacs e gostei muito. Agora, estou usando o Emacs Starter Kit , que fornece melhores padrões e algumas personalizações legais para a instalação padrão do Emacs.

Eu o personalizei um pouco, adicionei algumas coisas, como yasnippet , temas de cores , ilimitadas e outras. Eu configurei um repositório do github onde mantenho todas as personalizações para poder acessá-las de vários locais ou caso algo dê errado e eu perco meu diretório .emacs.d.

Tudo isso é muito bom, mas há um problema: o Emacs leva cerca de 1-2 segundos para carregar. AFAIK Posso compilar arquivos .el individuais com Mx byte-compile-file para .elc e funciona. Mas existem muitos arquivos .el, e me pergunto se existe uma maneira de compilá-los todos com um simples comando ou algo assim, para acelerar o carregamento do Emacs. Meu Emacs nem sempre está aberto, e eu o abro e fecho com bastante frequência, especialmente depois de configurá-lo como um editor padrão para o comando de edição no Total Commander para me acostumar mais rapidamente (sim, o Windows XP aqui).

Minha versão do Emacs é 22.3. E sim, a instalação padrão do Emacs sem personalizações é acionada instantaneamente.

Não tenho certeza de qual versão é preferida ao carregar, o .el ou o .elc compilado, a propósito.

Portanto, existe um comando elisp ou uma opção de linha de comando do Emacs para fazer com que o Emacs compile tudo no diretório .emacs.d?

Mikka
fonte

Respostas:

208

C-u 0 M-x byte-recompile-directory

irá compilar todos os arquivos .el no diretório e em todos os subdiretórios abaixo.

A C-u 0parte é fazer com que não pergunte sobre todos os arquivos .el que não possuem uma contrapartida .elc.

Laurynas Biveinis
fonte
9
E depois (uma vez que cada um tenha sido compilado uma vez), basta usar o mesmo comando sem o C-u 0(aka C-0, BTW). Isso compilará em bytes apenas os arquivos de origem mais recentes que as versões compiladas em bytes.
Drew
1
Uma pequena nota: para mim, não funcionou até remover todos os arquivos «.elc». Apenas dizia algo como "Concluído, 0 arquivos compilados, arquivos α ignorados".
Hi-Angel
1
@ Oi-Angel, eu tenho o mesmo problema. Você encontrou alguma solução?
Zhanxw 28/08/2015
@zhanxw yep. Infelizmente, o comando compila apenas arquivos que foram alterados ou que não possuem contrapartida «.elc». Portanto, para recompilar tudo em um diretório, primeiro você deve excluir todos os arquivos «.elc».
Hi-Angel
2
Infelizmente, o comando interativo não o expõe, mas se você chamar a função diretamente, poderá usar o argumento opcional FORCEpara recompilar arquivos que já possuem um ".elc" associado, mesmo que não sejam mais antigos que o arquivo de origem:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm
44

Para byte compilar automaticamente tudo o que precisa de compilação de bytes cada vez que inicio o emacs, coloquei o seguinte após minhas alterações load-pathna parte superior do meu .emacsarquivo:

(byte-recompile-directory (expand-file-name "~/.emacs.d") 0)

Surpreendentemente, isso não adiciona muito ao meu tempo de inicialização (a menos que algo precise ser compilado).

Para acelerar meu emacs, identifiquei primeiro as partes lentas usando profile-dotemacs.el e as substituí por carregamentos automáticos .

Richard Hansen
fonte
a documentação de carregamento automático foi movida. Isso e a referência profile-dotemacs.el são exatamente o que eu precisava quando me deparei com esta página.
Digicrat 01/03
24

Você pode usar o --batchsinalizador para recompilar na linha de comando.

Para recompilar tudo, faça

emacs --batch --eval '(byte-recompile-directory "~/.emacs.d")'

ou recompilar um único arquivo a partir de um Makefile,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'
Mike Samuel
fonte
1
Você poderia como usá-lo?
Nacho4d 29/07
8
@ nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el- ele não é repetido como o byte-recompile-directory .
Brian Burns
3
Você provavelmente deseja adicionar um argumento para forçar a recompilação, por exemplo. emacs --batch --eval '(diretório de recompilação de bytes "~ / .emacs.d" 0)'
Ibrahim
17

Isso está influenciando um pouco a questão, mas para resolver o problema de carregamento lento, você pode usar o novo recurso daemon no Emacs 23.

"Se você possui muitos pacotes de suporte, a inicialização do emacs pode ser um pouco lenta. No entanto, o emacs 23 traz o emacs --daemon, que permite iniciar o emacs em segundo plano (por exemplo, quando você faz login). novas janelas (quadros) do emacs com o emacsclient. É claro que você já pode ter um 'servidor' do emacs em versões mais antigas, mas poder iniciá-lo em segundo plano torna a solução muito mais agradável "

From http://emacs-fu.blogspot.com/2009/07/emacs-23-is-very-near.html

mwilliams
fonte
Definitivamente vou dar uma olhada neste. Obrigado!
001 Mikka
2
Se você adicionar o alias emacs = 'emacsclient -nw -a "" -c' ao seu .bashrc (ou versão do seu shell), ele primeiro tentará se conectar a um daemon em execução, se houver, se não houver, iniciará um e se conectará vocês.
Frederick
2

Para o meu uso spacemacs, o comando é spacemacs/recompile-elpa. O comando byte-recompile-directorynão compila nenhum arquivo.

Yu Shen
fonte
2
Coisas diferentes. O material ELPA / MELPA definiu métodos de construção em sua própria hierarquia de arquivamento. O diretório byte-recompile-tenta compilar todos os arquivos .el em um diretório definido pelo usuário.
21719 RichieHH