我现在的场景是:
时常要去看一下.h 文件
会较频繁的改.cpp 文件, 少数的场景要去修改.h 文件
偶尔不小心修改了.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)
我的问题是:
如何在 check-before-save 里面 stop save。 直接(revert-buffer) 是不是就可以了?
ask if save (yes/no), y save, n (revert-buffer) ==> 这段逻辑在lisp 中 一直不会,如果能有个例子更好了。
#'check-before-save 和 'check-before-save 的区别是什么?
hook 的工作机制是什么样的? 因为(save-buffer) 之前会去检查 (before-save-hook) 的内容, 但我了 源码,好像并没有…
我感觉其实可以换个思路解决这个问题……不在保存的时候处理,而在打开的时候就设置为只读模式。
因为反正你很少编辑.h
文件,那么在需要编辑的时候关闭只读模式即可,
2 个赞
cireu
2019 年1 月 30 日 04:08
3
(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, 原来函数如此简洁
cireu
2019 年2 月 12 日 13:07
8
我喜欢(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
么……
cireu
2019 年2 月 13 日 03:26
10
先苟且着用,用advice-add
显得比较优雅(误)
cireu
2019 年2 月 28 日 09:29
11
(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-letf
比letf
多了啥?
cireu
2019 年2 月 28 日 09:41
13
24以上letf
就是cl-letf
的别名
这个别名要requirecl
才有,cl-lib
没有这个别名
JJPandari:
可以解释一下照顾我等lisp苦手。
就是用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