Como recarregar o .emacs depois de alterá-lo?

375

Como faço para o Emacs recarregar todas as minhas definições atualizadas .emacssem reiniciar o Emacs?

Yazz.com
fonte
18
Eu sei que o emacs é frequentemente considerado um sistema operacional, mas ... s / reboot / restart /?
William Pursell
6
Eu não sou um desenvolvedor, portanto, um monte das respostas que fazem sentido imediatamente para os desenvolvedores não significa muito para mim
Yazz.com
4
@MJB, o objetivo do Stack Overflow é ser um repositório de conhecimento, mesmo para as perguntas mais básicas. Esta pergunta se encaixa perfeitamente com o objetivo do Stack Overflow. Veja stackoverflow.com/faq
chollida
5
possível duplicata de stackoverflow.com/questions/2281593/...
Trey Jackson
10
haha agora, cinco anos depois, a sugerida "pesquisa no Google primeiro" leva aqui! agradável
JimLohse

Respostas:

350

Você pode usar o comando load-file ( M-x load-filee pressione return duas vezes para aceitar o nome do arquivo padrão, que é o arquivo atual sendo editado).

Você também pode simplesmente mover o ponto para o final de qualquer sexp e pressionar C-xC-epara executar apenas esse sexp. Normalmente, não é necessário recarregar o arquivo inteiro se você estiver apenas alterando uma linha ou duas.

Bryan Oakley
fonte
22
Lembre-se de que isso nem sempre faz exatamente o que você pensa que faz. Se você tiver variáveis ​​cujo conteúdo está no flop (por exemplo, definindo um valor booleano como oposto), o comportamento não será o mesmo que carregar o arquivo.
Chollida
4
Quaisquer efeitos secundários em geral, são propensos a quebrar o comportamento desejado: o carregamento de arquivos, etc.
vemv
Quando faço isso, recebo a mensagem: load-with-code-conversion: o valor do símbolo como variável é nulo: n
Chris Marie
2
Em vez de mover o ponto para trás de um defunou defvar, você também pode deixá-lo dentro do corpo e do tipo da declaração C-M-x. Muito conveniente.
Thomas
151

Muito estranho que o muito conveniente

M-x eval-buffer

não é mencionado aqui.

Ele avalia imediatamente todo o código no buffer, é o método mais rápido, se você .emacsé idempotente.

Pedro
fonte
3
Quem disse que .emacsé (ou tem que ser) idempotente?
Mike
@ Mike: não eu. "Dado a, b é verdadeiro" significava para mim, "se a, b é verdadeiro", mas posso entender o que você quer dizer. Eu mudo dado a if para mais clareza.
Peter
7
Mike: Quando faria sentido .emacsnão ser idempotente?
Zaz
Eu teria pensado que essa fosse a primeira sugestão.
Stryker
11
Eu não diria que é um bom estilo, mas pode acontecer. Por exemplo, você pode optar por não redefinir uma função se ela já estiver definida (desde a primeira inicialização). Você pode não ver uma alteração em sua definição ao avaliar seu arquivo init.
Kaligule
43

Geralmente, você pode apenas reavaliar a região alterada. Marque a região ~ / .emacs que você alterou e use M-x eval-region RET. Isso geralmente é mais seguro do que reavaliar o arquivo inteiro, pois é fácil gravar um arquivo .emacs que não funciona exatamente após o carregamento duas vezes.

Dale Hagglund
fonte
2
Interessante. Eu não tinha considerado a idéia de um arquivo .emacs que não era idempotente. Algo que atente para que eu começar com elisp
Erik
2
Eu acho que é raro encontrar um arquivo .emacs que seja idempotente, pelo menos no sentido forte de duas execuções, resultando exatamente no mesmo estado de uma execução. No mínimo, é bastante comum anexar a várias listas, geralmente de maneiras que não suprimem entradas duplicadas quando executadas pela segunda vez.
Dale Hagglund
11
Outro pensamento: usando a abordagem sugerida acima, é possível que o estado do emacs que você tenha não seja o que o seu .emacs realmente faz. Ou seja, como você não executou o arquivo .emacs inteiro a partir de uma lista limpa, na verdade não sabe que ele faz o que deseja.
Dale Hagglund
11
Dito isto, não seria possível escrever .emacs de maneira idempotente? O estado global é nojento.
Ehtesh Choudhury
39

Se você tiver o seu arquivo .emacs aberto no buffer ativo no momento:

Mx eval-buffer
Dominic Rodger
fonte
12
Uma coisa a ter em mente aqui é que isso pode não deixá-lo em um estado idêntico a uma abordagem de reinicialização. (Exemplo artificial: se você teve um efeito de "alternância" no seu .emacs).
21410 luapyad
28
M-x load-file
~/.emacs
digitaldreamer
fonte
11
Ao fazer isso, aprendi que na minha instalação do Windows 7, a pasta .emacs.d estava localizada na pasta% appdata% em vez da pasta inicial dos usuários.
você precisa saber é o seguinte
14

O seguinte deve fazê-lo ...

M-x load-file
Ritmo
fonte
13

solução

M-: (load user-init-file)


notas

  • você digita no Eval:prompt (incluindo os parênteses)
  • user-init-fileé uma variável que mantém o ~/.emacsvalor (apontando para o caminho do arquivo de configuração) por padrão
  • (load)é uma versão mais curta, antiga e não interativa do (load-file); não é um comando emacs (a ser digitado M-x), mas uma mera função elisp

conclusão

M-: > M-x


fonte
é M-:> Ctrl Alt x? com base na sua lógica, imagino M-: <CMx quando apenas uma linha no arquivo init é alterada? Talvez seja apenas ==
Robert Houghton
12

Outros já responderam à sua pergunta como indicado, mas acho que geralmente quero executar as linhas que acabei de escrever. por isso, CtrlAltxno lisp funciona muito bem.

Bahbar
fonte
3
Veja também eval-lastsexp, emC-x C-e
Derek Slager 17/02/10
Com C-M-x, você não precisa estar "no final do jogo" - você está pensando C-x C-etalvez? O bom C-M-xé que você pode invocá-lo mesmo quando point estiver no meio de uma declaração de função / variável.
Thomas
Eu provavelmente adquiri o hábito de terminar o cisco na época em que usava apenas o Cx Ce. Obrigado pela captura!
Bahbar
9

Sugiro que você não faça isso, inicialmente. Em vez disso, inicie uma nova sessão do emacs e teste as alterações que você fez para ver se elas funcionam corretamente. O motivo para fazer isso dessa maneira é evitar deixá-lo em um estado em que você tem um arquivo .emacs inoperável, que falha ao carregar ou falha ao carregar de maneira limpa. Se você fizer toda a edição na sessão original e todos os testes em uma nova sessão, sempre terá algo confiável para comentar o código incorreto.

Quando finalmente estiver satisfeito com as alterações, vá em frente e use uma das outras respostas para recarregar. Minha preferência pessoal é evalapenas a seção que você adicionou / alterou e, para isso, basta destacar a região do código e da chamada adicionados / alterados M-x eval-region. Isso minimiza o código avaliado, minimizando efeitos colaterais não intencionais, como aponta luapyad.

Joe Casadonte
fonte
9

Atalho do teclado:

(defun reload-init-file ()
  (interactive)
  (load-file user-init-file))

(global-set-key (kbd "C-c C-l") 'reload-init-file)    ; Reload .emacs file
Matt Kneiser
fonte
brilhante! Isso é muito bom!
PinkCollins
7
C-x C-e ;; current line
M-x eval-region ;; region
M-x eval-buffer ;; whole buffer
M-x load-file ~/.emacs.d/init.el
WisdomFusion
fonte
4

Atualmente, estou no Ubuntu 15.04; Eu gosto de definir uma chave para isso.
[M-insert] se traduz em alt-insert no meu teclado.
Coloque isso no seu arquivo .emacs:

(global-set-key [M-insert] '(lambda() (interactive) (load-file "~/.emacs")))
AAAfarmclub
fonte
3

Defina-o no seu arquivo init e chame pelo Mx reload-user-init-file

(defun reload-user-init-file()
  (interactive)
  (load-file user-init-file))
jacekmigacz
fonte
2

Embora M-x eval-bufferfuncione, você pode ter problemas com alternâncias e outras coisas semelhantes. Uma abordagem melhor pode ser "marcar" ou destacar o que há de novo no seu .emacs (ou mesmo no buffer de arranhões, se você estiver apenas brincando) e depois M-x eval-region. Espero que isto ajude.

user1026139
fonte
2

Aqui está uma maneira rápida e fácil de testar rapidamente sua configuração. Você também pode usar C-x C-eno final do lisp específico para executar determinadas funções individualmente.

O Cx Ce executa o comando eval-last-sexp (encontrado no mapa global), que é uma função interativa do Lisp compilada.

É vinculado a Cx Ce.

(eval-last-sexp EVAL-ÚLTIMO-SEXP-ARG-INTERNO)

Avalie sexp antes do ponto; valor de impressão na área de eco. Interativamente, com o argumento prefix, imprima a saída no buffer atual.

Normalmente, essa função trunca a saída longa de acordo com o valor das variáveis ​​'eval-expression-print-length' e 'eval-expression-print-level'. Com um argumento de prefixo zero, no entanto, não existe esse truncamento. Esse argumento de prefixo também faz com que números inteiros sejam impressos em vários formatos adicionais (octal, hexadecimal e caractere).

Se 'eval-expression-debug-on-error' for nulo, que é o padrão, esse comando organizará todos os erros para inserir o depurador.

Lorem Ipsum Dolor
fonte
2

Além de comandos como Mx eval-buffer ou Mx load-file, você pode reiniciar um emacs novo na linha de comando:

emacs -q --load "init.el"

Exemplo de uso stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/

Picaud Vincent
fonte
A questão pergunta como fazer isso sem reiniciar o Emacs. O lançamento de uma nova cópia, embora tecnicamente responda à pergunta, não parece se encaixar no espírito da pergunta. 😄
chwarr
0

Você pode definir a ligação de teclas para emacs como este

;; reload emacs configuration
(defun reload-init-file ()
  (interactive)
  (load-file "~/.emacs"))

(global-set-key (kbd "C-c r") 'reload-init-file) 

Espero que isso ajude!

Vinh Trieu
fonte
-2

Se houver um shell aberto no Emacs, você também poderá:

. ~/.emacs

Pode salvar alguns pressionamentos de tecla.

benjaminz
fonte