【发布时间】:2010-06-19 14:44:23
【问题描述】:
当我遇到一些非常奇怪的行为时,我正试图回答 another SO question。这是我的小测试用例:
(make-variable-buffer-local
(defvar my-override-mode-on-save nil
"Can be set to automatically ignore read-only mode of a file when saving."))
(defadvice file-writable-p (around my-overide-file-writeable-p act)
"override file-writable-p if `my-override-mode-on-save' is set."
(or
my-override-mode-on-save
ad-do-it))
(defun my-override-toggle-read-only ()
"Toggle buffer's read-only status, keeping `my-override-mode-on-save' in sync."
(interactive)
(setq my-override-mode-on-save (not my-override-mode-on-save))
(toggle-read-only))
(defun tester-fn ()
(interactive)
(let ((xxx (file-writable-p "/tmp/foofoo"))
(yyy (file-writable-p "/tmp/fooxxfoo")))
(message (concat "XXX: " (if xxx "yes" "no") " - YYY: " (if yyy "yes" "no")))))
地点:
-
/tmp/foofoo是一个只读文件,我访问过并在其中运行my-override-toggle-read-only。 -
/tmp/fooxxfoo不存在。 -
/tmp可由我登录的用户写入。
如果我在将my-override-mode-on-save 设置为t 的缓冲区中运行tester-fn,则会得到意想不到的结果:XXX: no - YYY: no。如果我在其他缓冲区(例如 scratch)中运行 tester-fn,我会在小缓冲区中得到预期的响应:XXX: no - YYY: yes。通过调试器跟踪建议表明它正在做我认为它应该做的事情,执行我期望它执行的部分,跳过我期望它执行的部分,返回我期望它的值。但是,通过调试器跟踪 tester-fn 会显示返回的值非常不同(nil & t 如果变量评估为 nil,nil & nil 如果变量评估为非 nil)。 nil & nil 的回报真的让我觉得很奇怪。
我不知道这里发生了什么。有人知道为什么我没有得到预期的结果吗?
【问题讨论】:
标签: emacs elisp advising-functions defadvice