避免不小心编辑了.h 文件

我现在的场景是:

  1. 时常要去看一下.h 文件
  2. 会较频繁的改.cpp 文件, 少数的场景要去修改.h 文件
  3. 偶尔不小心修改了.h 文件, 然后有时需要很长的时间去编译

所以我打算在save 特定的 .h 之前 做一些特殊的处理, 比如

(defun check-before-save()
   " 1. if the buffer is changed but the content is same as disk.  stop revert the buffer and stop save.
   " 2. if the buffer is different from the content in disk,  ask if save (yes/no), y save,  n.  revert the buffer. and not save 
)
(add-hook 'before-save-hook #'check-before-save)

我的问题是:

  1. 如何在 check-before-save 里面 stop save。 直接(revert-buffer) 是不是就可以了?
  2. ask if save (yes/no), y save, n (revert-buffer) ==> 这段逻辑在lisp 中 一直不会,如果能有个例子更好了。
  3. #'check-before-save 和 'check-before-save 的区别是什么?
  4. hook 的工作机制是什么样的? 因为(save-buffer) 之前会去检查 (before-save-hook) 的内容, 但我了 源码,好像并没有…

我感觉其实可以换个思路解决这个问题……不在保存的时候处理,而在打开的时候就设置为只读模式。

因为反正你很少编辑.h文件,那么在需要编辑的时候关闭只读模式即可,

2 个赞
(if (yes-or-no-p "Are you ready?")
    (message "Let's Rock'in roll!")
  (message "..."))
(if (yes-or-no-p "dO yOu KnOw BoOgIe WoOgIe?")
    (message "Let me show you!")
  (message "..."))

2 个赞

赞,这个想法我试试。

多谢 emcas_ran & cireu, 原来函数如此简洁

  1. 还有y-or-n-p。purcell是(fset 'yes-or-no-p 'y-or-n-p)的,这样不用再敲yes,永远只要按y。可以按个人口味酌量添加。

我喜欢(advice-add #'yes-or-no-p :override #'y-or-n-p)

直接覆盖yes-or-no-p的话感觉还是不太好。有时候放magit在后台运行。运行完成的时候magit会强制你进入minibuffer回答一些提问。假如你正好在打字。而且正好打到y上,而你想选的是no,那就悲剧了。

用advice不也一样是永远用y-or-n-p么……

先苟且着用,用advice-add显得比较优雅(误)

(advice-add #'yes-or-no-p :override #'y-or-n-p)

(defun cm/with-true-yes-or-no-p (fun &rest args)
  (require 'advice)
  (cl-letf (((symbol-function #'yes-or-no-p)
             (ad-get-orig-definition #'yes-or-no-p)))
    (apply fun args)))

(advice-add #'magit-y-or-n-p :override #'cm/with-true-yes-or-no-p)
2 个赞

看了好久终于明白了……可以解释一下照顾我等lisp苦手。另外cl-letfletf多了啥?

24以上letf就是cl-letf的别名

这个别名要requirecl才有,cl-lib没有这个别名

就是用advice.el提供的ad-get-orig-definition获取还没被advice的函数定义。然后放在letf块里遮盖住被adviced的定义。

其实笨一点的方法,用

(unwind-protect
    (progn
      (advice-remove #'yes-or-no-p #'y-or-n-p)
      ;; ...do something
      )
  (advice-add #'yes-or-no-p :override #'y-or-n-p))

也行


用错advice了,应该用around才对

还要你的magit-slow-confirm为t