如何强制Emacs保存,即使它认为(无需保存更改)

如何强制Emacs保存,即使它认为(无需保存更改),emacs,save,Emacs,Save,这种情况一直发生在我身上: 我在emacs中打开了一个文件 我保存它('save-buffer) 磁盘上的文件更改(或get的删除、移动等) 但是我想要它回来,所以我尝试在emacs中再次保存('save-buffer'),而不是保存它,而是说“(不需要保存任何更改)”并且什么也不做 是否有其他功能或设置可用于强制emacs保存?您可以使用C-x C-w另存为。这应该是无条件的节约。您也可以只键入一个空格,然后在其上退格。Emacs足够聪明地意识到,如果您撤销了迄今为止所做的所有工作,则缓冲

这种情况一直发生在我身上:

  • 我在emacs中打开了一个文件
  • 我保存它('save-buffer)
  • 磁盘上的文件更改(或get的删除、移动等)
  • 但是我想要它回来,所以我尝试在emacs中再次保存('save-buffer'),而不是保存它,而是说“(不需要保存任何更改)”并且什么也不做

是否有其他功能或设置可用于强制emacs保存?

您可以使用C-x C-w另存为。这应该是无条件的节约。您也可以只键入一个空格,然后在其上退格。Emacs足够聪明地意识到,如果您撤销了迄今为止所做的所有工作,则缓冲区没有变化,但是如果您进行更改,然后手动对其进行更改,则会考虑缓冲区已被更改。

< P>可以使用Emacs LISP函数“强>未修改的< /强>标记前缀AG,将当前缓冲区标记为已修改,必须:

C-u M-~
如果不直接调用新函数,上面的答案将不起作用。 如果要无缝更改emacs的保存行为。最好的解决方案是创建一个建议:

(defadvice save-buffer (before save-buffer-always activate)
  "always save buffer"
  (set-buffer-modified-p t))

在“保存缓冲区”周围包装一个函数,该函数首先标记已修改的缓冲区:

(defun save-buffer-always ()
  "Save the buffer even if it is not modified."
  (interactive)
  (set-buffer-modified-p t)
  (save-buffer))

作为对scottfrazer回答的一个轻微替代:

(defun my-save-buffer-always-sometimes (prefix)
  "Save the buffer even if it is not modified."
  (interactive "P")
  (when prefix
    (set-buffer-modified-p t))
  (save-buffer))

这是因为,当您想要使用前缀(
C-u C-x C-s
)时,您可以强制执行此操作,但不必以其他方式不必要地更改文件。最后修改的时间戳非常有用(例如,源代码控制),任意更改它似乎是一种耻辱。当然是YMMV。

类似的问题让我上网寻找解决方案。然后我突然意识到,我所要做的就是键入一个空格(或任何字符)并删除它,这会将缓冲区标记为已更改。然后我可以像平常一样输入C-x C-s。也许不复杂或不先进,但它能工作。

是的,谢谢,我一直在用这些,但有点烦人。特别是对于C-xc-w,您需要重新键入文件名并按ENTER键。我很想找到一些可以设置为键绑定并单击保存的东西。@sligocki:我发现,如果您只需在文件名提示符下按,而不键入任何内容,Emacs就会重新使用现有的文件名。很好,谢谢!我认为这相当于下面的函数,所以我将使用这个函数(这样我就可以给它分配一个键)。啊,以前从未听说过建议,我假设这些是保存之前要运行的某种钩子?听起来不错,谢谢你指给我看。现在,我必须在重新映射键组合以运行scott的“始终保存缓冲区”或使用建议之间进行选择…:)正是:谢谢你的留言。然而,在我的例子中,如果我明确要求emacs保存,我希望它保存和更新时间戳,等等。事实上,时间戳假设首先似乎是问题所在,因为我使用的是git,git branch会在不更新时间戳的情况下更改目录中的文件,导致emacs认为它仍然是同一个旧文件:/Note对于
evil
的用户,您需要将其添加到配置中:
(evil declare abort repeat'save buffer always)
-否则,保存将破坏您的最后一个操作。见:`