Como todo Emacs'er saberá, atualmente estou sofrendo com minha extensa configuração de pontos-Emacs. Todos os meus pacotes estão dentro dos contêineres de use-package
, e eu compilei todos os meus .el
-files. Mesmo com isso, o Emacs inicia em 6,4 segundos e carrega o restante dos pacotes (cerca de 40) depois.
Eu estava pensando em outras maneiras de resolver o longo tempo de inicialização, então notei algo. O Emacs padrão (sem configuração do usuário) usa muitas .el
bibliotecas, incluídas em todos os Emacs. Eles estão localizados em \shares\emacs\version number\lisp\
.
Mesmo com muitos arquivos lisp, ele consegue começar em um segundo. Quando eu estava inspecionando os arquivos de muitos pacotes incluídos no Emacs padrão, não encontrei nada extraordinário que pudesse explicar por que o Emacs consegue iniciar dentro de um segundo. Alguém poderia me dizer como o Emacs gerencia isso, mesmo com milhares de .el
arquivos?
:defer t
em suasuse-package
declarações sempre que possível?C-h i g (elisp) Building Emacs
se você está interessado em aprender sobre isso.Respostas:
O Emacs "gerencia" isso não carregando na inicialização, impedindo o carregamento do aplicativo principal. Isso, por sua vez, é o efeito de retornar o controle do teclado ao usuário mais rapidamente.
Mas quando é carregado? No primeiro uso dessa função, modo ou recurso.
Não diminui a velocidade? Sim, no primeiro uso. Essa é a troca. Deseja diminuir a velocidade na inicialização do emacs ou no primeiro uso.
Isso é perceptível? O carregamento no momento da inicialização parece demorar mais, pois outras bibliotecas principais também são carregadas. Mas, no primeiro uso, parece mais rápido, pois apenas esse recurso de subconjunto é carregado.
Então, por que alguém pegaria carga na inicialização? Como alguns não se importam em esperar para carregar todas as bibliotecas usadas com freqüência na inicialização, uma vez carregadas, todas as operações são executadas rapidamente depois disso.
Como posso escolher? Como Drew e outros apontaram em suas respostas a essa pergunta, você pode usar o carregamento automático e truques semelhantes para controlar. Mas a consideração mais importante deve ser o seu padrão de uso. Se você usa o emacs como vi, constantemente abrindo e fechando, sim, o tempo de inicialização se torna dolorosamente óbvio. Por outro lado, se você usar o emacs em execução o tempo todo, o tempo de inicialização de 1 segundo ou 1 minuto não será tão perceptível ou importante o suficiente para se importar.
Observe que você pode usar o modo em lote ou o Zile para inicialização instantânea enquanto estiver testando, executando ou usando o emacs como vi.
Minha preferência é carregar na inicialização para que quaisquer erros sejam detectados antecipadamente. Prefiro não ter que lidar com nenhum erro de carga durante um dia de trabalho, quando tenho inúmeros buffers, modos e estados de compilação ativos, juntamente com vários locais remotos gerenciados pelo TRAMP. A depuração de erros de carregamento automático nessas condições não é muito agradável.
fonte
Muitas das bibliotecas incluídas não são carregadas quando você inicia.
Alguns comandos etc. são carregados automaticamente , o que significa que o Emacs os reconhece e sabe como carregá-los. Quando você tenta usar um comando que é carregado automaticamente, o Emacs carrega a biblioteca que o define, se ainda não tiver sido carregada.
Você pode criar seus próprios carregamentos automáticos, seja para seus próprios comandos ou em bibliotecas que você não escreveu. Consulte o manual Elisp, nó Autoload .
fonte
;;;###autoload
) imediatamente antes de uma definição de comando em sua biblioteca é uma maneira de fornecer uma definição de carregamento automático, garantindo que sua biblioteca seja carregada quando alguém o invocar.(autoload...)
diretamente no seu arquivo init para registrá-los.Além das outras respostas (que explicam como a maioria das bibliotecas é realmente carregada somente sob demanda), também há o problema do pré-carregamento de muitas bibliotecas elisp principais no
emacs
próprio executável, o que fornece uma ilusão de que ele carrega um muitas coisas incrivelmente rapidamente.Isso é conseguido executando uma versão chamada "bare" do Emacs (que é o que realmente foi compilado e que é totalmente funcional, mas contém apenas o interpretador elisp e outras funcionalidades principais escritas em C) e dizendo para carregar todas as bibliotecas elisp que devem ser pré-carregadas, antes de finalmente "despejar" o
emacs
binário real com as bibliotecas incorporadas.Este mecanismo é detalhado no manual elisp:
C-hig
(elisp) Building Emacs
RETSe você mesmo compilou o Emacs, poderá experimentar esse processo e até despejar versões alternativas do executável final, se desejar (geralmente não recomendado, mas o recurso existe).
O
temacs
binário compilado pode ser encontrado nosrc
diretório e você pode comparar a diferença nos horários de início executando cada versão da seguinte maneira:No meu sistema, o primeiro leva ~ 4 segundos (durante o qual 111 bibliotecas elisp são carregadas), enquanto o último leva ~ 0,02 segundos.
fonte