非常に奇妙な行動に出くわしたとき、私は別のSOの質問に答えようとしていました。ここに私の小さなテストケースがあります:
(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
ているバッファで実行すると、予期しない結果が得られます: . 他のバッファー (例: scratch ) で実行すると、期待される応答がミニバッファーで得られます。デバッガーを介してアドバイスを追跡すると、デバッガーが本来あるべきだと思うことを正確に実行し、期待する部分を実行し、期待する部分をスキップし、期待する値を返していることがわかります。ただし、デバッガーをトレースすると、非常に異なる値が返されることが示されます (変数が nil として評価される場合は& 、変数が非 nil として評価される場合は &) 。&リターンは、私が奇妙だと思うものです。my-override-mode-on-save
t
XXX: no - YYY: no
tester-fn
XXX: no - YYY: yes
tester-fn
nil
t
nil
nil
nil
nil
ここで何が起こっているのかわかりません。期待した結果が得られない理由を知っている人はいますか?