正确处理失败的代码段完成情况

时间:2012-11-27 21:23:48

标签: emacs elisp yasnippet advising-functions defadvice

我使用TAB从yasnippet扩展片段,当它不扩展片段时,它通常会回退到缩进(默认命令绑定到TAB),这由yasnippets自定义变量yas-fallback-behavior引用。只能是call-other-commandreturn-nil

我想要的功能就是点击TAB:

  1. 尝试完成代码段,成功或无声地失败。
  2. 检查我们是否处于PHP模式,并调用php-complete-function, 成功,或无声地失败。
  3. 默认为当前的缩进命令 (indent-for-tab-command)。
  4. 它目前完美地执行1,然后是3。但是,我能够通过使用这段代码建议yas--fallback来使其成功:

    (defadvice yas--fallback (before try-php-expand (&optional arg from-trigger-key-p) activate)
      (when (string-equal mode-name "PHP")
        (php-complete-function)))
    

    唯一主要问题仍然是,当尝试使用TAB缩进内容时,php-complete-function无声地失败,而是使用消息阻止迷你缓冲区从它的多次检查PHP完成。

    在这种情况下,是否有一种方法可以禁止来自该函数的消息传递,而不进行所有相同的检查,它基本上重新编写了我的建议中的函数?或者,有没有更好的方法来使用yasnippet来开始我缺少的那个?

2 个答案:

答案 0 :(得分:0)

您可以通过将message-log-max设置为nil来启用任何表达式中的日志记录。

(defadvice yas--fallback (before try-php-expand (&optional arg from-trigger-key-p) activate)
  (when (string-equal mode-name "PHP")
    (let (message-log-max)
      (php-complete-function))))

答案 1 :(得分:0)

您可以尝试类似的(保证100%未经测试):

(defvar my-inhibit-messages nil)
(defadvice message (around my-inhibit activate)
  (unless my-inhibit-messages ad-do-it))

(defadvice php-complete-function (around my-silence-php-messages activate)
  (let ((my-inhibit-messages t))
    ad-do-it))