当我删除了.emacs文件后,如何在Emacs中编写.emacs文件?

6

我打开了Emacs但不小心删除了它在启动时读取的.emacs文件。这代表了大约15年的调整。(我知道,我知道,备份。)

有没有办法让Emacs重新写出我已经删除的.emacs文件?

我通常不会在SO上问这种愚蠢的问题,但我知道我只剩下一天左右的时间来完成这个Emacs会话。


你在 .emacs 中打开了一个缓冲区吗? - ayckoster
呵呵,不,我不是那么无聊。 - SteveRawlinson
Zev的回答是你最好的选择,听起来你现在很无助。 - Trey Jackson
4
严肃点,Steve,收到后立即将其放入版本控制中,否则 (悲伤的表情) 就得从头开始重建。你可能可以用 customize 去抛出一些设置,并检查加载的库(这可能需要花费一些时间!)……只是一个想法。 - ocodo
我建议使用Dropbox或类似的工具来完成这个任务。 - justinhj
1
有趣的问题;令人沮丧的情况。15年没有备份?你是奇怪的人中的奇怪的人(即emacs用户)。 - harpo
4个回答

5
如果您启用了Emacs的备份功能,您应该在~/.emacs~中有上一个版本的.emacs文件的副本。如果是这样,只需将其重命名为".emacs",您就会得到除了最新更改之外的.emacs文件。即使您当前没有启用备份,您可能仍然可以在文件上最后一次备份中找到大量.emacs文件的内容。您还应该查看变量"backup-directory-alist"的值 - 它指定备份文件存储的位置(如果未使用默认位置,则为与修改文件相同的目录)。
否则,您的记忆力有多好... ;-)
编辑:如果您没有.emacs文件的备份,但已经使用该.emacs文件启动了运行的Emacs实例,那么您可以保存所有将在.emacs文件中定义的自定义设置。要做到这一点,可以执行以下操作:
(setq custom-file "/my/home/directory/.emacs-custom.el")
(custom-save-all)

那么,您可以创建一个新的.emacs文件,并添加以下行:
(setq custom-file "/my/home/directory/.emacs-custom.el")
(load custom-file)

这将至少恢复一些在您的 .emacs 文件中的自定义变量设置。


不幸的是,我从未在Emacs中编辑.emacs文件。但还是感谢你的尝试。 - SteveRawlinson
1
好的,我已经使用“custom-save-all”编辑了我的答案,提供另一个建议。 - zev
我用 vi 进行编辑。说真的,我不知道为什么。对于小的编辑,我总是打开 vi,而对于开发,我则使用 emacs。非常感谢你的回答。 - SteveRawlinson
谢谢你的建议。我现在正在将.emacs放入源代码控制中 :) - Akshat Jiwan Sharma

5

正如ayckoster所建议的那样,您可以尝试使用文件恢复或取证工具,例如The Sleuth Kit。 或者,这可能听起来很疯狂,如果您正在使用类Unix系统,则可以搜索原始磁盘设备(在我当前使用的Mac上,那将是/dev/rdisk1)。 说真的,有好几次我懒得使用完整的恢复工具,而是使用像sudo less -f /dev/rdisk1这样的东西,搜索我知道在文件中的字符串(global-set-key,任何人都行?),并成功恢复了文件的原始内容。


1
我接受了这个答案,因为它确实帮我找回了我的文件(通过在/dev/disk0中进行grep搜索)。非常感谢。 - SteveRawlinson
@ajk:对于“global-set-key”的答案加1,让我为我的.emacs感到开心,它确实充满了那样的东西;)但是话说回来,在几个用户帐户中,多台计算机中,Mercurial中,我的GMail帐户中,Dropbox中等等,我都有我的.emacs的副本。我的意思是,楼主从未备份过那个文件,这很不负责任。非常不负责任。 - SyntaxT3rr0r

1

Emacs会评估您的.emacs文件,然后关闭它。因此,基本上您无法找回您的.emacs文件。

解决方案可能是使用文件恢复应用程序。您的硬盘驱动器上有.emacs文件的几率非常高。

由于大多数这样的程序无法推断已删除文件的文件名或目录名,因此您必须知道您的.emacs文件的内容。

然后,您可以在某个文件夹中恢复所有当前已删除的文件,并递归搜索您的.emacs文件的内容。

这个过程可能需要很长时间。您必须决定是否值得这样做。


1

我不知道有什么方法可以让Emacs提供原始的.emacs文件,但是你肯定可以查询已加载的函数和变量符号,并获取它们的值。

这可能需要相当多的工作,但我认为理论上你应该能够以某种形式获得大部分数据,如果你成功地将其过滤到你知道是你自己的内容。

对于已评估的函数,(symbol-function 'SYMBOL)将返回所提供函数的(不易读的)定义。然后,您可以使用(fset 'SYMBOL VALUE),其中VALUE是对symbol-function调用的结果,来定义一个新的.emacs文件中的该函数。这将为您提供恢复定义的函数的方法。

你也可以看一下: 如何在emacs中打印所有已定义的变量?

这只是一个非常不完整的入门指南,但考虑到时间限制,我将其发布并标记为社区wiki,如果有人想继续开发它。

一个可靠地以可恢复方式转储应用程序状态的操作指南将是一个很好的开始,如果当前会话肯定要被终止(甚至如果不是,实际上也是如此,以防止崩溃或其他意外情况)。

您可以潜在地重新标记它,使用一些更通用的数据恢复类型标签,以扩大受众。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接