如何在保存文件之前让Emacs查询用户(如果用户回答否,则中止)?

如何在保存文件之前让Emacs查询用户(如果用户回答否,则中止)?,emacs,elisp,save,savefiledialog,Emacs,Elisp,Save,Savefiledialog,我想添加一个额外的提示,询问用户是否确定要保存该文件,但仅限于某些“受保护”目录中的文件。假设我有一个函数file-needs-protection-p,它接受一个文件名并返回t,如果在保存该文件之前应该查询用户。当用户试图保存此类文件时,如何让Emacs询问类似“此文件受保护。是否确实要修改它?”,然后如果用户回答否,则让Emacs中止保存 希望在某个地方有一个特殊的钩子,我可以添加一个使用yes-or-no-p的函数,如果函数返回false,Emacs将中止保存?如果您已经有file-nee

我想添加一个额外的提示,询问用户是否确定要保存该文件,但仅限于某些“受保护”目录中的文件。假设我有一个函数
file-needs-protection-p
,它接受一个文件名并返回t,如果在保存该文件之前应该查询用户。当用户试图保存此类文件时,如何让Emacs询问类似
“此文件受保护。是否确实要修改它?”
,然后如果用户回答否,则让Emacs中止保存


希望在某个地方有一个特殊的钩子,我可以添加一个使用
yes-or-no-p
的函数,如果函数返回false,Emacs将中止保存?

如果您已经有
file-needs-protection-p
,我想剩下的事情很简单:

(defun save-buffer-check 
  "If the current buffer is a protected file, query the user before saving."
  (if (file-needs-protection-p (buffer-file-name))
      (if (y-or-n-p 
           "This file is protected. Are you sure you want to modify it?")
          (save-buffer))
    (save-buffer)))

将其重新绑定到
C-x C-s
,看看它是否满足您的需要。我认为您不需要任何特殊的钩子或建议,只需要一个函数,在调用
save buffer
之前插入对谓词的调用,或者只返回而不做任何操作。

未测试,但我认为您应该能够在save hook之前使用
来执行测试并询问您的问题,如果他们回答“否”,只需提出一个错误:

(错误“用户中止保存”)

我对它进行了测试,效果很好。我不知道你可以使用钩子中的错误来破解相关函数,非常简洁。我想这是一个很好的解决方案。不过,我希望有一种不那么直截了当的方法。对于个人使用,这可能很好,但我正在考虑在Emacs包中这样做(以保护用户不修改应该自动管理的文件),因此我不能真正要求用户重新绑定这些基本的键绑定。钩子是一种更干净的方法,所以将绑定放在mode键映射中,然后它只应用于使用mode的缓冲区。或者在调用检查之前,使用phils的答案并添加逻辑来检查当前主模式。我想你可以从一个或两个答案中得到你想要的。