如何在另一台计算机上获得相同的Emacs环境?


16

我是Emacs的初学者(已经使用了大约2周并喜欢它)。当我更新和扩大我的~/.emacs.d/init.el文件,这个事情,我写在那里靠,我用从MELPA安装某些包M-x package-install,在.el文件我写我自己,等等。

我的问题是,例如,将来我应该更换计算机时,什么是在新计算机上无缝地获得相同的确切Emacs环境的最佳方法是什么?


3
只要您可以四处移动init.el(例如,使用git),此方法也将有效(基于use-package):lunaryorn.com/posts/…–
VanLaser

一种方法是将.emacs.d目录放入Dropbox。我只在具有相同操作系统的计算机上使用过它。* nix的不同风格应该可以,但如果尝试在运行操作系统差异太大的计算机之间共享,则可能会遇到问题。
Qudit

这个问题与emacs.stackexchange.com/q/408/2710非常接近。您能否强调差异?
Andrew Swann

对于像我这样的非程序员,使用Google云端硬盘在三台机器(两个窗口,一个OSX)上同步emacs配置和程序包是有效且可靠的。之所以可行,是因为emacs及其大多数软件包在很大程度上与平台无关。跨平台复制具有相同的emacs体验,只需init.el文件中的几行即可将操作系统特定的路径解析为同步的emacs软件包目录。
Snelephant

您的配置是整个~/.emacs.d目录,因此请使用您喜欢的任何方法在计算机之间进行同步。(例如Github存储库,Dropbox文件夹或最适合您的文件)。
菲尔斯

Answers:


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 16-10-17

1
@space_voyager是的,一切仍然会以相同的方式发生。但是:(1)当您克隆到新计算机时,Emacs 不需要从MELPA下载软件包,因为它们已经在您刚刚克隆的存储库中;(2)每当您用于package.el更新软件包时,您的存储库中都会进行未分段的更改,并且您将必须提交以包括软件包更新。
Radon Rosborough

太谢谢了。还有一件事:我认为MELPA会自动打包更新。不是这样吗?
space_voyager 16-10-17

1
@space_voyager:当然,远程软件包存储库将被更新,但是软件包的更新版本不会自动下载并安装在本地计算机上。为此,您需要M-x list-packages RET U
Radon Rosborough

1
@Lassi简短答案:使用任何您想安装的Emacs;使用straight.el仅安装Emacs的包。据我所知,Nix是一个好主意,但对于Emacs软件包开发而言,它并不是很好的优化工具(如果我错了,请纠正我)。如果使用系统软件包管理器来安装Emacs软件包,则将无法仅编辑其源代码,然后提交并向上游推送更改。上一次我查看Emacs软件包的Nix配置时,它似乎过于复杂,通常不如straight.el开发经验。但是,无论您的船浮在水上。
Radon Rosborough

11

如果使用use-package,则可以在计算机之间移动该文件,当Emacs启动时,只要您可以访问Internet,它就会拉入软件包并对其进行配置。

首先,设置包库:

(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文件,您的自定义代码段或其他任何内容。
Omair Majid

是。如果配置中包含其他文件,则还必须将其与init文件一起移动。
zck

到那时,它又变成了一个游戏,“哪个文件实际上是我的配置的一部分,以及如何使它在我的计算机上保持同步” :(
Omair Majid

您应该添加:ensure tuse-package声明中或设置use-package-always-ensuret。否则,复制配置后,它不会自动安装在另一个系统上。
Chakravarthy Raghunandan '16

6

下一代包装管理 straight.el

在使用package.el+ Quelpa进行长期艰苦的奋斗之后,我忍无可忍,写了我自己的包裹管理器。它旨在package.el通过提供几乎在所有方面都出色的软件包管理体验来完全替代。

您可以阅读非常详尽的文档以了解其所有功能,但是与此问题最相关的一个是straight.el着眼于完美的可重复性。这意味着您是正常启动Emacs还是在新机器上启动Emacs都无关紧要,并且任何本地更改都是受版本控制的,并且可以恢复为规范状态。实际上,这是通过(1)克隆作为Git存储库的软件包,并提供用于管理其状态的自动化工具来实现的;(2)使用init文件作为包管理状态的唯一事实来源,而在其他地方没有存储任何可变数据;(3)使用可选的版本锁定文件来指定每个软件包以及任何配方存储库的确切Git版本。straight.el 本身。

首先,插入bootstrap片段,它将安装并激活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))

编写完初始化文件以安装所需的软件包后,请运行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点文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.