我想回答
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
可由登录为的用户写入。
如果我跑
tester-fn
在一个缓冲区里
my-override-mode-on-save
设置为
t
然后我得到了一个意想不到的结果:
XXX: no - YYY: no
. 如果我跑
测试器
在其他缓冲区(例如
划痕
)我在minibuffer中得到了预期的响应:
XXX: no - YYY: yes
. 通过调试器跟踪建议表明它正在做我认为它应该做的事情,执行我期望它做的部分,跳过我期望它做的部分,返回我期望它做的值。但是,跟踪
测试器
通过调试器显示返回的值非常不同(
nil
和;
T
如果变量的计算结果为零,
零
和;
零
如果变量的计算结果为非零)。这个
零
和;
零
我觉得回归真的很奇怪。
我不知道这里发生了什么。有人知道我为什么没有得到我期望的结果吗?