Як отримати те саме середовище Emacs на іншому комп'ютері?


16

Я початківець в Emacs (використовую його вже близько 2 тижнів і люблю це). Коли я оновлюю і розширюю свій ~/.emacs.d/init.elфайл, те, що я там записую M-x package-install, залежить від певних пакунків, які я встановив із MELPA, використовуючи .elфайли, які я сам написав тощо.

Моє запитання: чи варто в майбутньому перемикати комп’ютери, наприклад, який найкращий спосіб безперешкодно отримати те саме середовище Emacs на новому комп’ютері, як у мене зараз?


3
Поки ви можете рухатись init.elнавколо (наприклад, використовуючи git), такий підхід також працює (на основі use-package): lunaryorn.com/posts/…
VanLaser

Один із підходів полягає в тому, щоб помістити свою .emacs.d каталог в Dropbox. Я використовував його лише на комп’ютерах з тією ж ОС. Різні смаки * nix повинні бути в порядку, але у вас можуть виникнути проблеми, якщо ви спробуєте поділитися на машинах із надто різними ОС.
Кудит

Це питання дуже близьке до emacs.stackexchange.com/q/408/2710 . Чи можете ви виділити відмінності?
Ендрю Сванн

Для непрограміста, такого як я, синхронізація конфігурації та пакунків emacs на трьох машинах (два вікна, одне OSX) за допомогою Google Drive була ефективною та надійною. Це працює тому, що emacs та більшість його пакетів значною мірою є платформою агностиком. Для відтворення кросплатформенного ідентичного досвіду emacs потрібно лише кілька рядків у файлі init.el для вирішення конкретних шляхів ОС до синхронізованого каталогу пакетів emacs.
Snelephant

Ваш конфігурація - весь ваш ~/.emacs.dкаталог, тому використовуйте будь-який метод, який ви віддаєте перевагу для синхронізації цього між машинами. (наприклад, сховище Github або папка Dropbox, або все, що найкраще підходить для вас).
філ

Відповіді:


9

Правильне рішення полягає у використанні straight.elменеджера пакунків, який я написав для вирішення цієї проблеми. Ви можете дізнатися більше про це в іншій відповіді на це питання .

Ця відповідь, написана місяцями до того, як я розпочав роботу straight.el, раніше описував суворо неповноцінний спосіб досягнення часткового рішення. Цей підхід коротко описаний нижче; Я більше не рекомендую його.

Навіть якщо ви не хочете користуватися straight.el, вам слід принаймні прийняти use-package. (Не те, що обидві є взаємовиключними - я вважаю, що найчистіша установка походить від використання обох.)


Почніть з визначення списку пакунків у своєму init-файлі:

(defvar my-packages
        '(
          aggressive-indent
          avy
           .
           .
           .
          projectile
          undo-tree
          )
  "List of packages to be installed at Emacs startup.")

Потім встановіть їх автоматично:

(require 'cl-lib)
(package-initialize)
(unless (cl-every #'package-installed-p my-packages)
  (dolist (package my-packages)
    (unless (package-installed-p package)
      (package-install package))))

Якщо ви тримаєте init.elфайл під контролем версій, то синхронізація його з іншою машиною призведе до того, що ваші пакети будуть встановлені автоматично. Звичайно, встановлені версії будуть зовсім іншими, і не можна очікувати, що ваша конфігурація вийде з коробки в результаті. Це є основним недоліком package.elі є однією з причин, чому такий підхід поганий. Побачимо ще раз straight.el. Зауважте також, що наведений вище код відокремлює ваш список пакунків від вашої конфігурації для цих пакетів, що ускладнює відстеження речей у вашому init-файлі. Це ще один головний недолік. Побачимо ще раз use-package.


Дякую за написання! Якщо я вирішую розмістити все на Github, включаючи пакунки, завантажені з MELPA, чи збереже це можливість MELPA автоматичного оновлення пакетів на новому комп’ютері?
space_voyager

1
@space_voyager Так, все одно відбуватиметься так само. Однак: (1) коли ви клонуєтеся до нового комп'ютера, Emacs не потребуватиме завантаження пакетів з MELPA, оскільки вони вже є у сховищі, яке ви тільки що клонували; та (2) щоразу, коли ви використовуєте package.elдля оновлення пакетів, у вашому сховищі відбудуться незмінені зміни, і вам доведеться взяти на себе зобов’язання включити оновлення пакета.
Радон Росборо

Щиро дякую. І ще одне: я подумав, що MELPA оновлює пакет автоматично. Це не так?
space_voyager

1
@space_voyager: Ну, звичайно, віддалене сховище пакетів буде оновлено, але оновлені версії пакетів не завантажуються та не встановлюються на локальну машину автоматично. Для цього вам потрібно M-x list-packages RET U.
Радон Росборо

1
@Lassi Коротка відповідь: використовуйте все, що ви хочете встановити Emacs; використовувати straight.elлише для встановлення пакетів Emacs. Nix - відмінна ідея, але, наскільки я знаю, вона недостатньо оптимізована для розробки пакунків Emacs (будь ласка, виправте мене, якщо я помиляюся) . Якщо ви використовуєте менеджер системних пакетів для установки пакетів Emacs, ви не зможете просто відредагувати їх вихідний код, а потім здійснити та здійснити зміни вгору за потоком. Востаннє, коли я розглядав конфігурацію Nix для пакетів Emacs, вона здавалася надмірно складною і взагалі поступалася straight.elдосвіду розробки. Але, що б не плавав твій човен.
Радон Росборо

11

Якщо ви використовуєте use-package , ви можете переміщувати цей файл з комп'ютера на комп'ютер, і коли Emacs запускається, доки у вас є доступ до Інтернету, він забиратиме пакунки та налаштовує їх.

Спочатку встановіть бібліотеку пакетів:

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

А потім завантажувальна програма use-package:

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(eval-when-compile (require 'use-package))

Тепер, замість того, щоб налаштувати Emacs та припустити, що встановлені пакети, використовуйте use-packageїх як для встановлення, так і для налаштування. Наприклад, для деяких моїх налаштувань керма:

(use-package helm
  :ensure t
  :bind (("M-x" . helm-M-x)
         ("M-y" . helm-show-kill-ring)
         ("C-x C-f" . helm-find-files)
         ("M-s o" . helm-occur))

  :config
  (helm-mode 1)
  (setq helm-echo-input-in-header-line t))

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

Так. Якщо у вас є інші файли, які є частиною вашої конфігурації, вам також доведеться перемістити їх поруч із файлом init.
zck

в цей момент він знову стає грою, "який файл насправді є частиною моєї конфігурації і як я можу його синхронізувати на своїх машинах" :(
Omair Majid

слід додати :ensure tдо use-packageдекларації або встановити use-package-always-ensureзначення t. В іншому випадку він не буде автоматично встановлюватися в іншу систему при копіюванні конфігурації.
Чакраварті Рагунандан

6

Управління пакетами наступного покоління за допомогою straight.el

Після тривалої і розчарувальної боротьби використовувати package.el+ Quelpa для управління своїми пакунками, я кусав кулю і написав власного менеджера пакунків . Він призначений повністю замінити package.el, забезпечивши досвід управління пакетом, який перевершує майже будь-який спосіб.

Ви можете прочитати дуже обширну документацію, щоб дізнатися про всі її особливості, але найбільш релевантним у цьому питанні є те, що straight.elзосереджено на ідеальній відтворюваності . Це означає, що не має значення, чи нормально ви запускаєте Emacs, чи запускаєте його на новій машині, а також те, що будь-які локальні зміни контролюються версією та можуть бути повернені до канонічного стану. Практично кажучи, це досягається (1) клонування пакетів як сховищ Git та надання автоматизованих інструментів для управління їх станом; (2) використання init-файлу як єдиного джерела істини для стану управління пакетами, без змінних даних, що зберігаються в іншому місці; та (3) використання додаткових файлів блокування версій для встановлення точних змін Git кожного пакету, а також будь-яких сховищ рецептів таstraight.el себе.

Для початку вставте фрагмент завантажувальної програми , який буде встановлено та активовано straight.el. Потім, щоб переконатися, що пакет встановлений, просто надішліть виклик straight-use-packageу свій init-файл:

(straight-use-package 'projectile)

Так, це так просто. Ніякого поводження зі package-refresh-contentsсміттям чи будь-яким із цього сміття. Якщо ви видалите цю форму зі свого init-файла та перезапустите Emacs, Projectile більше не завантажуватиметься (на відміну від package.el). Це означає, що вам не доведеться турбуватися про те, що ваша конфігурація якось не працює на новій машині, оскільки ви випадково залежали від незадекларованих пакетів.

Ви можете встановлювати пакети куди завгодно та коли завгодно, у всьому своєму init-файлі (не потрібно оголошувати їх перелік в одній точці). Звичайно, ви також можете просто зробити

(dolist (package '(ace-jump-mode ... zzz-to-char)) (straight-use-package package))

якщо ви віддаєте перевагу списку. Однак я рекомендую використовувати use-packageдля керування конфігурацією пакета. Спочатку потрібно встановити його:

(straight-use-package 'use-package)

Потім, оскільки straight.elмає вбудовану інтеграцію з use-package, наступне "просто працює":

(use-package projectile
  :straight t
  :init (projectile-mode 1))

Після того, як ви написали свій init-файл, щоб встановити необхідні йому пакунки, запустіть, M-x straight-freeze-versionsщоб зберегти файл блокування версій ~/.emacs.d/straight/versions/default.el. Ви повинні тримати цей файл під контролем версій, оскільки він дозволить straight.elперевірити правильні версії всіх ваших пакетів під час першого запуску Emacs на новій машині. (Ви можете вручну повернутися до версій, визначених у файлі блокування, використовуючи M-x straight-thaw-versions.)

Для підтримки ідеї локальних машинних точкових файлів, про яку я згадував у своїй іншій відповіді , straight.elпропонується профільна система . Я все-таки рекомендую використовувати символьні посилання для ваших точкових init.elфайлів (у цьому випадку ваш локальний init-файл, якщо це можливо, і файл блокування версії, якщо ви хочете використовувати його).

Якщо вам цікаво, як straight.elпорівнювати його з іншими менеджерами пакунків, ознайомтесь із розділом широкого порівняння . Але є ще багато документації на все інше .


4

Ви можете використовувати cask для управління вашими пакунками. Використовуйте git / github для контролю джерела та синхронізації точок файлів emacs.

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