代码之家  ›  专栏  ›  技术社区  ›  Joe Casadonte

如何在Emacs中建议原语

  •  4
  • Joe Casadonte  · 技术社区  · 14 年前

    我想回答 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 如果变量的计算结果为零, 和; 如果变量的计算结果为非零)。这个 和; 我觉得回归真的很奇怪。

    我不知道这里发生了什么。有人知道我为什么没有得到我期望的结果吗?

    1 回复  |  直到 10 年前
        1
  •  4
  •   tripleee    10 年前

    你的代码看起来不错,除了丢失的那把钥匙。您需要适当地设置返回值:

    (defadvice file-writable-p (around my-overide-file-writeable-p act)
      "override file-writable-p if `my-override-mode-on-save' is set."
      (setq ad-return-value
            (or
             my-override-mode-on-save
             ad-do-it)))
    

    这记录在 advice manual .