当Yasnippet宏可以触发时,如何触发事件?

时间:2013-01-10 17:56:20

标签: emacs elisp yasnippet

我喜欢yasnippet,但需要时间记忆。我想做的是当我处于可以扩展宏的点时(当没有宏时再次返回),更改光标颜色。但是,从我记忆中yasnippet的工作方式来看,这可能并不完全符合要求。

一位朋友建议我在这里想要的是一个yasnippet-can-fire-p,但我仍然不确定这样做的最佳方式。实现这一目标最干净的道路是什么,不会让我的生命停止?

1 个答案:

答案 0 :(得分:12)

花了一些时间来找到检查它是否可以扩展的功能,但最终能够“幸运”找到它。

关键是此功能通常会扩展或以其他方式执行回退行为。我克隆了这个函数,并在那些地方设置光标颜色。

而且,令人惊讶的是,它实际上并没有减速。

;; It will test whether it can expand, if yes, cursor color -> green.
(defun yasnippet-can-fire-p (&optional field)
  (interactive)
  (setq yas--condition-cache-timestamp (current-time))
  (let (templates-and-pos)
    (unless (and yas-expand-only-for-last-commands
                 (not (member last-command yas-expand-only-for-last-commands)))
      (setq templates-and-pos (if field
                                  (save-restriction
                                    (narrow-to-region (yas--field-start field)
                                                      (yas--field-end field))
                                    (yas--current-key))
                                (yas--current-key))))

  (set-cursor-color (if (and templates-and-pos (first templates-and-pos)) 
                        "green" "red"))))

; As pointed out by Dmitri, this will make sure it will update color when needed.
(add-hook 'post-command-hook 'yasnippet-can-fire-p)

将此添加到我的lisp集合中(我实际上认为这也很有用)。


更新:在yasnippet的最新版本[从2014年8月起,从0.8.1开始],yas--current-key功能已重命名为yas--templates-for-key-at-point。 cf Issue