【问题标题】:How to create a backup of .emacs every time Emacs starts每次 Emacs 启动时如何创建 .emacs 的备份
【发布时间】:2012-02-26 02:33:11
【问题描述】:

每次 Emacs 启动时备份我的 .emacs 文件的好方法是什么?我想保留多份副本,以便在需要恢复到以前的版本时使用。

我的第一个想法是从 .emacs 文件中发出一个 shell 命令:

cp ~/.emacs ~/Backups/.emacs-yyyymmdd:hhmmss

... 附加当前时间戳以获得唯一的文件名。但据我所知,您无法从 .emacs 文件发出 shell 命令。

我读过BackupEachSaveForceBackups。有没有人有这些经验?效果好吗?

编辑:
Event_jr 关于版本控制的回答是一个可能的解决方案。不过,我更喜欢使用 shell 命令,因为版本控制适用于所有文件,而且我不需要对每个文件进行多次备份。

我查看了“版本控制”变量。在 Emacs 手册中是 described

Emacs 还可以制作带编号的备份文件。带编号的备份文件名包含“.~”、> 号和原始文件名后的另一个“~”。因此,eval.c 的备份文件 >would 被称为 eval.c.~1~、eval.c.~2~ 等等,一直到 eval.c.~259~ > 等名称。

变量版本控制决定是制作单个备份文件还是多个>编号的备份文件。

所以,我将它添加到我的 .emacs 中:

; Version control and backups:
(setq version-control t)    

按广告宣传。

This section 告诉如何控制每个文件的备份。我没有探索过。

【问题讨论】:

  • 您可能需要考虑将 .eamcs 置于版本控制之下。很多人都这样做。
  • "版本控制适用于所有文件" 版本控制不适用于所有文件,仅适用于您明确置于版本控制之下的文件。版本控制软件会简单地忽略那些不受其控制的文件。
  • 显然“版本控制”和名为“版本控制”的变量之间存在差异。如果设置了版本控制变量,则任何更改的文件都将获得编号备份。
  • 所以你的意思是变量,但它也不一定适用于所有文件。您可以将其设置为缓冲区局部变量,仅用于您要为其保留多个备份的文件。

标签: version-control emacs backup configuration-files


【解决方案1】:

您真正应该问的问题是,我如何永远不会丢失我在 Emacs 中编辑的任何文件的修订版,包括 ~/.emacs

答案是versioned backups。控制此功能的变量称为 version-control,这有点令人困惑,因为它完全与备份相关,而不是 VCS。

这也是 Emacs 的一个特性;无需安装其他软件包。我所做的几乎所有工作都在 VCS 中,但我仍然发现让我的工作的所有修订都易于访问非常有用。存储这么便宜,为什么不呢?

编辑:描述备份每个文件的save-buffer 方面。

您应该阅读 save-buffer 的文档 (C-h k C-x C-s) 以了解其中的细微差别,但基本上通过 C-u C-u 将强制它在每次节省。我实际上将它重新映射到我自己的函数

(defun le::save-buffer-force-backup (arg)
  "save buffer, always with a 2 \\[universal-argument]'s

see `save-buffer'

With ARG, don't force backup.
"
  (interactive "P")
  (if (consp arg)
      (save-buffer)
    (save-buffer 16)))
(global-set-key [remap save-buffer] 'le::save-buffer-force-backup)

【讨论】:

    【解决方案2】:

    据我所知,您无法从 .emacs 文件发出 shell 命令。

    当然可以:

    (shell-command "cp ~/.emacs ~/.emacs-`date +%Y%m%d:%H%M`")
    

    【讨论】:

      【解决方案3】:

      更好的解决方案是使用像git 这样的版本控制系统。如果你创建一个~/.emacs.d 目录并将你的 elisp 文件放在那里会更容易:

      mkdir ~/.emacs.d
      mv .emacs ~/.emacs.d/init.el
      git init
      git add init.el
      git commit -m 'initial checkin'
      

      现在每次修改 init.el 文件时,都可以使用以下命令保存更改:

      git commit -a -m 'descriptive commit message here'
      

      然后您可以向after-save-hook 添加一个函数,例如这个要点to automatically add, commit, and push when files change。推送后,您将拥有一个本地副本和一个远程副本(例如在 github 上)。

      Emacs 还通过一个名为 magit 的包与 git 集成。

      如果您现在花时间学习如何使用DVCS (Distributed Version Control System),从长远来看,您将获得丰厚的回报,您会发现 magit 使使用git 变得非常方便。

      【讨论】:

      • 嗯。我看到了优点,但是当我在如此小的规模上运作时,听起来麻烦多于它的价值。
      • 一开始似乎总是这样......在您意识到之前,您会惊讶于您的规模增长速度有多快。您现在花在小范围学习这些工具的时间将在以后必须处理更大的项目时获得巨大的回报。即使在小范围内,您也会体会到它的帮助。我为我开始的每个新项目输入git init。如果你使用magit,那么剩下的工作就很简单了。
      • 赞成,因为我同意,但是 git(我也使用它)根本不是最用户友好的 VCS。它非常强大和灵活,但总的来说,我会有点谨慎地将新手指向 VCS 的方向。 (Magit 非常好并且有很大帮助,但它并没有涵盖所有情况)。一定要尝试 git out(使用 Magit),看看你是否喜欢它,但也要注意还有更简单的替代方案。
      • @phils 我当然同意 git 令人困惑......即使你不是 VCS 的新手,但是 github 在某种程度上减轻了这种痛苦,部分原因是它的优秀文档可以帮助人们学习git,但主要是因为它有一个出色的 Web 界面,可以击败竞争对手(launchpad、code.google.com 和 (yuk) sourceforge 相比之下缺乏)。但是,如果您纯粹在命令行上进行比较,那么 bazaar 和 mercurial 肯定是更容易的 DVCS 系统。
      【解决方案4】:

      您将备份属性设置为配置;你可以参考here

      【讨论】:

        猜你喜欢
        • 2011-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多