Как я могу перезагрузить .emacs после его изменения?

375

Как я могу заставить Emacs перезагрузить все мои определения, которые я обновил, .emacsбез перезапуска Emacs?

Yazz.com
источник
18
Я знаю, что emacs часто считают ОС, но ... s / reboot / restart /?
Уильям Перселл
6
Я не разработчик, поэтому многие ответы, которые имеют смысл сразу для разработчиков, не так много значат для меня
Yazz.com
4
@MJB цель переполнения стека - быть хранилищем знаний даже для самых основных вопросов. Этот вопрос идеально подходит для переполнения стека. Пожалуйста, смотрите stackoverflow.com/faq
chollida
5
возможный дубликат stackoverflow.com/questions/2281593/…
Трей Джексон
10
ха-ха, спустя пять лет, предложенный "поиск Google сначала" приводит сюда! приятно
JimLohse

Ответы:

350

Вы можете использовать команду load-file ( M-x load-file, затем дважды нажать return, чтобы принять имя файла по умолчанию, которое является текущим редактируемым файлом).

Вы также можете просто переместить точку в конец любого sexp и нажать, C-xC-eчтобы выполнить только этот sexp. Обычно нет необходимости перезагружать весь файл, если вы просто меняете одну или две строки.

Брайан Оукли
источник
22
Имейте в виду, что это не всегда может делать именно то, что вы думаете. Если у вас есть переменные, содержимое которых перехвачено (т. Е. Устанавливается логическое значение противоположное), то поведение не будет таким же, как при загрузке файла.
Холлида
4
Любые побочные эффекты в целом могут нарушить желаемое поведение: загрузка файлов и т. Д.
vemv
Когда я делаю это, я получаю сообщение: load-with-code-преобразование: значение символа как переменная void: n
Крис Мари
2
Вместо перемещения точки за defunили defvarвы также можете оставить ее внутри тела и типа объявления C-M-x. Очень кстати.
Томас,
151

Очень странно что очень удобно

M-x eval-buffer

здесь не упоминается

Он сразу оценивает весь код в буфере, это самый быстрый метод, если ваш .emacsидемпотент.

Питер
источник
3
Кто сказал, что .emacsэто (или должно быть) идемпотент?
микрофон
@mike: не я. «Учитывая a, b верно», означало для меня «если a, b верно», но я понимаю, что вы имеете в виду. Я изменяю данные, если для большей ясности.
Питер
7
@mike: Когда имело бы смысл .emacsне быть идемпотентом?
Заз
Я бы подумал, что это будет первое предложение.
Страйкер
1
Я бы не сказал, что это хороший стиль, но это может случиться. Например, вы можете не переопределять функцию, если она уже определена (из первого запуска). Вы можете не увидеть изменения в его определении при оценке вашего файла инициализации.
Калигуле
43

Обычно вы можете просто переоценить измененный регион. Отметьте область ~ / .emacs, которую вы изменили, и затем используйте M-x eval-region RET. Это часто безопаснее, чем переоценка всего файла, поскольку легко написать файл .emacs, который не работает сразу после двойной загрузки.

Дейл Хагглунд
источник
2
Интересно. Я не рассматривал идею файла .emacs, который не был идемпотентным. Что-то, на что стоит обратить внимание, когда я начну с ELisp
Эрик
2
Я полагаю, что редко встречается файл .emacs, который является идемпотентом, по крайней мере, в строгом смысле двух выполнений, приводящих к точно такому же состоянию, что и одно выполнение. По крайней мере, достаточно часто добавлять в различные списки, часто таким образом, чтобы не подавлять повторяющиеся записи при повторном выполнении.
Дейл Хэгглунд
1
Еще одна мысль: используя подход, который я предлагаю выше, возможно, что состояние emacs, которое вы получили, не то, что фактически делает ваш .emacs. Т.е., поскольку вы не выполнили весь файл .emacs с чистого листа, вы на самом деле не знаете, что он делает то, что вам нужно.
Дейл Хэгглунд
1
При этом нельзя ли написать .emacs идемпотентным способом? Глобальное состояние неприглядное.
Эхтеш Чоудхури
39

Если у вас есть файл .emacs, открытый в текущем активном буфере:

Mx eval-buffer
Доминик Роджер
источник
12
Здесь следует помнить одну вещь: это может не привести вас в состояние, идентичное подходу перезапуска. (Придуманный пример: если у вас был эффект «переключения» в ваших .emacs).
Луапяд
28
M-x load-file
~/.emacs
digitaldreamer
источник
1
Делая это, я узнал, что в моей установке Windows 7 папка .emacs.d была расположена в папке% appdata% вместо домашней папки пользователей.
Bassdrop Cumberwubwubwub
14

Следующее должно сделать это ...

M-x load-file
аллюр
источник
13

решение

M-: (load user-init-file)


ноты

  • вы набираете его Eval:быстро (включая скобки)
  • user-init-fileпеременная, содержащая ~/.emacsзначение (указывающее на путь к файлу конфигурации) по умолчанию
  • (load)это более короткая, старая и неинтерактивная версия (load-file); это не команда emacs (для M-xввода), а простая функция elisp

вывод

M-: > M-x


источник
такое M-:> Ctrl Alt x? исходя из вашей логики я представляю M-: <CMx, когда изменяется только одна строка в файле инициализации? Может быть, это просто ==
Роберт Хоутон
12

Другие уже ответили на ваш вопрос, как указано, но я нахожу, что я обычно хочу выполнить строки, которые я только что написал. для этого CtrlAltxв lisp работает просто отлично.

Bahbar
источник
3
Смотрите также eval-lastsexp, вC-x C-e
Дерек Slager
С C-M-x, вам не нужно быть "в конце" - вы думаете о чем-то C-x C-e? Приятно то, C-M-xчто вы можете вызывать его, даже когда точка находится в середине объявления функции / переменной.
Томас
Я, вероятно, вошел в привычку ходить до конца lisp в то время, когда я использовал только Cx Ce. Спасибо за улов!
Bahbar
9

Я предлагаю, чтобы вы не делали этого изначально. Вместо этого, запустите новый сеанс emacs и проверьте все внесенные вами изменения, чтобы убедиться, что они работают правильно. Причина сделать это таким образом, чтобы не оставлять вас в состоянии, когда у вас есть неработоспособный файл .emacs, который не загружается или не загружается чисто. Если вы выполняете все свои редактирования в исходном сеансе и все тесты в новом сеансе, у вас всегда будет что-то надежное, чтобы закомментировать некорректный код.

Когда вы, наконец, довольны своими изменениями, продолжайте и используйте один из других ответов для повторной загрузки. Я лично предпочитаю evalтолько тот раздел, который вы добавили / изменили, и для этого просто выделите область добавленного / измененного кода и вызова M-x eval-region. Это минимизирует оцениваемый код, сводя к минимуму любые непреднамеренные побочные эффекты, как указывает luapyad.

Джо Касадонте
источник
9

Сочетание клавиш:

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

(global-set-key (kbd "C-c C-l") 'reload-init-file)    ; Reload .emacs file
Мэтт Кнайзер
источник
блестящий! Это очень хорошо!
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
источник
4

Я в настоящее время на Ubuntu 15.04; Мне нравится определять ключ для этого.
[M-insert] переводится как alt-insert на моей клавиатуре.
Поместите это в ваш файл .emacs:

(global-set-key [M-insert] '(lambda() (interactive) (load-file "~/.emacs")))
AAAfarmclub
источник
3

Определите его в вашем файле инициализации и вызовите через Mx reload-user-init-file

(defun reload-user-init-file()
  (interactive)
  (load-file user-init-file))
jacekmigacz
источник
2

Хотя M-x eval-bufferсработает, у вас могут возникнуть проблемы с переключателями и другими подобными вещами. Лучшим подходом может быть «пометить» или выделить что-то новое в вашем .emacs (или даже в чистом буфере, если вы просто возитесь), а затем M-x eval-region. Надеюсь это поможет.

user1026139
источник
2

Вот быстрый и простой способ быстро проверить вашу конфигурацию. Вы также можете использовать C-x C-eв конце определенного lisp, чтобы выполнить определенную функцию индивидуально.

Cx Ce запускает команду eval-last-sexp (находится в global-map), которая является интерактивной скомпилированной функцией Lisp.

Это связано с Cx Ce.

(eval-last-sexp EVAL-LAST-SEXP-ARG-INTERNAL)

Оцените sexp до точки; вывести значение в области эха. Интерактивно, с префиксным аргументом, выведите выходные данные в текущий буфер.

Обычно эта функция усекает длинный вывод в соответствии со значением переменных «eval-expression-print-length» и «eval-expression-print-level». Однако с нулевым аргументом префикса такого усечения нет. Такой префиксный аргумент также заставляет целые числа печататься в нескольких дополнительных форматах (восьмеричный, шестнадцатеричный и символьный).

Если 'eval-expression-debug-on-error' не равно nil, что является значением по умолчанию, эта команда организует все ошибки для входа в отладчик.

Лорем Ипсум Долор
источник
2

Помимо команд, таких как Mx eval-buffer или Mx load-file, вы можете перезапустить свежий emacs из командной строки:

emacs -q --load "init.el"

Пример использования stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/

Пикауд Винсент
источник
Вопрос в том, как это сделать без перезапуска Emacs. Запуск новой копии, хотя и технически отвечая на вопрос, похоже, не соответствует духу вопроса. Ch
чарр
0

Вы можете установить привязку ключей для Emacs, как это

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

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

Надеюсь, это поможет!

Винь Триу
источник
-2

Если вам случится открыть оболочку внутри Emacs, вы также можете сделать:

. ~/.emacs

Может сохранить несколько нажатий клавиш.

benjaminz
источник