Как получить ту же среду Emacs на другом компьютере?

16

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

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

space_voyager
источник
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))
zck
источник
Имейте в виду, что конфигурация (in init.el) проходит, но есть еще много чего. Например, это не будет портировать dabbrev-файлы, или ваши пользовательские фрагменты, или что-то другое.
Омаир Маджид
Да. Если у вас есть другие файлы, которые являются частью вашей конфигурации, вам также придется их переместить вместе с файлом инициализации.
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или что-нибудь из этого мусора. Если вы удалите эту форму из вашего файла инициализации и перезапустите 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ваш локальный файл инициализации, если это применимо, и файл блокировки версии, если вы хотите использовать один).

Если вам интересно, как straight.elсравниваются другие менеджеры пакетов, ознакомьтесь с обширным разделом сравнений . Но есть еще много документации по всем остальным тоже.

Радон Росборо
источник
4

Вы можете использовать бочку для управления своими пакетами. Используйте git / github для управления исходным кодом и синхронизации ваших файлов emacs.

goromlagche
источник