Як я можу перезавантажити .emacs після зміни?


375

Як я можу змусити Emacs перезавантажити всі свої визначення, які я оновив, .emacsне перезавантажуючи Emacs?


18
Я знаю, що emacs часто вважають ОС, але ... s / reboot / restart /?
Вільям Перселл

6
Я не розробник, тому багато відповідей, які мають сенс негайно для розробників, для мене це не дуже значать
Yazz.com

4
@MJB мета переповнення стека - це сховище знань навіть для самих основних питань. Це питання ідеально відповідає цілі переповнення стека. Будь ласка , дивіться stackoverflow.com/faq
chollida

5
можливий дублікат stackoverflow.com/questions/2281593/…
Trey Jackson

10
Ха-ха, п’ять років потому запропонований "пошук Google в першу чергу" веде сюди! приємно
JimLohse

Відповіді:


350

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

Ви також можете просто перемістити крапку в кінці будь-якого сексопа і натиснути, C-xC-eщоб виконати саме цей секпс. Зазвичай не потрібно перезавантажувати весь файл, якщо ви просто змінюєте рядок чи два.


22
Майте на увазі, що це не завжди може робити саме те, що ви вважаєте, що це робить. Якщо у вас є змінні, вміст яких перекинуто (тобто встановлення булевого значення навпаки), поведінка не буде такою ж, як завантаження файлу.
холліда

4
Будь-які побічні ефекти взагалі можуть порушити бажану поведінку: завантаження файлів тощо
vemv

Коли я це роблю, я отримую повідомлення: load-with-code-convert: Значення символу як змінної недійсне: n
Кріс Марі

2
Замість того, щоб перемістити точку за a defunабо defvar, ви також можете залишити її всередині тіла декларації та ввести C-M-x. Дуже зручно.
Томас

151

Дуже дивно, що дуже зручно

M-x eval-buffer

тут не згадується.

Він негайно оцінює весь код у буфері, його найшвидший метод, якщо ваш .emacsidempotent.


3
Хто каже, що .emacsце (або має бути) безсильним?
Майк

@mike: не я. "Дано a, b є істинним", призначеним для мене, "якщо a, b є істинним", але я бачу, що ви маєте на увазі. Я змінююсь, якщо для більшої ясності.
Петро

7
@mike: Коли було б сенс .emacsне бути ідентичним?
Заз

Я вважав би це першою пропозицією.
Стрикер

1
Я б не сказав, що це гарний стиль, але це може статися. Наприклад, ви можете вирішити не переосмислювати функцію, якщо вона вже визначена (з першого запуску). Можливо, ви не побачите змін у його визначенні під час оцінки файлу init.
Kaligule

43

Зазвичай ви можете просто переоцінити змінений регіон. Позначте область ~ / .emacs, яку ви змінили, а потім використовуйте M-x eval-region RET. Це часто безпечніше, ніж повторна оцінка всього файлу, оскільки легко написати файл .emacs, який працює не дуже правильно після завантаження двічі.


2
Цікаво. Я не розглядав ідею файлу .emacs, який не був ідентичним. Щось слідкувати, як я починаю з ELisp
Ерік

2
Я б здогадувався, що рідко можна знайти файл .emacs, який є ідентичним , принаймні в сильному сенсі двох виконань, що призводить до точно такого ж стану, як одне виконання. Принаймні, звичайно додавати до різних списків, часто таким чином, щоб не придушити дублюючі записи, коли виконується вдруге.
Дейл Хагглунд

1
Ще одна думка: використовуючи запропонований вище підхід, можливо, стан emacs, який ви отримали, не те, що робить ваш .emacs. Тобто, оскільки ви не виконали весь файл .emacs з чистого аркуша, ви насправді не знаєте, що він робить те, що ви хочете.
Дейл Хагглунд

1
Незважаючи на те, чи не вдалося б писати .emacs безвідмовно? Глобальна держава скупий.
Ehtesh Choudhury

39

Якщо ваш файл .emacs відкритий у поточному активному буфері:

Mx eval-буфер

12
Тут слід пам’ятати одне, що це може не залишити вас у стані, ідентичному підходу до перезапуску. (Налагоджений приклад: якщо у вас .emacs вплинув "тумблер").
luapyad

28
M-x load-file
~/.emacs

1
Зробивши це, я дізнався, що в моїй установці Windows 7 папка .emacs.d знаходилась у папці% appdata% замість домашньої папки користувачів.
Bassdrop Cumberwubwubwub


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, коли змінюється лише один рядок у файлі init? Можливо, це просто ==
Роберт Хауфтон

12

Інші вже відповіли на ваше запитання, як сказано, але я вважаю, що зазвичай хочу виконати рядки, які я тільки що написав. для цього, CtrlAltxу lisp працює просто чудово.


3
Дивіться також eval-lastsexp, за адресоюC-x C-e
Дерек Слэджер

З C-M-xвами, вам не потрібно бути "в кінці лісу" - ви думаєте, C-x C-eможливо? Приємно в тому C-M-x, що ви можете викликати його навіть тоді, коли точка знаходиться в середині оголошення / функції змінної.
Томас

Я, мабуть, увійшов у звичку їхати до кінця лісу в той час, коли я використовував лише Cx Ce. Дякую за улов!
Бахбар

9

Я пропоную вам не робити цього спочатку. Натомість запускайте новий сеанс emacs і перевіряйте внесені вами зміни, щоб перевірити, чи працюють вони правильно. Причина зробити це таким чином - уникнути того, що ви не перебуваєте в стані, коли у вас є непрацездатний файл .emacs, який не може завантажуватися або не завантажується. Якщо ви виконаєте все своє редагування в початковому сеансі, а все тестування в новому сеансі, у вас завжди буде щось надійне, щоб прокоментувати код, який порушує вас.

Коли ви нарешті задоволені своїми змінами, тоді продовжуйте і використовуйте одну з інших відповідей для повторного завантаження. Мої особисті переваги - це evalлише розділ, який ви додали / змінили, і зробити це просто виділити область доданого / зміненого коду та виклику M-x eval-region. Це мінімізує оцінений код, мінімізуючи будь-які ненавмисні побічні ефекти, як вказує луапяд.


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

4

Зараз я перебуваю на Ubuntu 15.04; Мені подобається визначити ключ для цього.
[M-insert] перекладається на alt-insert на моїй клавіатурі.
Помістіть це у свій файл .emacs:

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

3

Визначте його у своєму файлі init та зателефонуйте Mx reload-user-init-file

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

2

Хоча це M-x eval-bufferбуде працювати, у вас можуть виникнути проблеми з перемикачами та іншими подібними речами. Кращим підходом може бути "маркування" або виділення того, що є новим у ваших .emacs (або навіть буфер подряпин, якщо ваш просто занепокоєний), а потім M-x eval-region. Сподіваюсь, це допомагає.


2

Ось швидкий і простий спосіб швидкої перевірки конфігурації. Ви також можете використовувати C-x C-eв кінці певного lisp для виконання певної функції окремо.

Cx Ce запускає команду eval-last-sexp (знайдена на глобальній карті), яка є інтерактивно складеною функцією Lisp.

Він пов'язаний з Cx Ce.

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

Оцініть сексоп перед точкою; значення друку в області відлуння. Інтерактивно, з аргументом префіксу, друкуйте вихід у поточний буфер.

Зазвичай ця функція скорочує довгий вихід відповідно до значень змінних 'eval-express-print-length' та 'eval-express-print-level'. Однак при аргументі префікса нуля такого відсікання немає. Такий аргумент префікса також призводить до друку цілих чисел у кількох додаткових форматах (восьмеричний, шістнадцятковий та символьний).

Якщо 'eval -pression-debug-on-error' не має нульових значень, що є типовим, ця команда організовує всі помилки для введення налагоджувача.


2

Окрім таких команд, як Mx eval-buffer або Mx load-file, ви можете перезапустити свіжий emacs з командного рядка:

emacs -q --load "init.el"

Приклад використання stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/


Питання задає питання, як це зробити без перезавантаження Emacs. Запуск нової копії, технічно відповідаючи на питання, схоже, не відповідає духу питання. 😄
чвар

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

Може врятувати кілька ключових ударів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.