Как я могу вызвать событие, когда может запускаться макрос Yasnippet?

Мне нравится yasnippet, но для запоминания требуется время. То, что я хотел бы сделать, это изменить цвет курсора, когда я нахожусь в точке, которая может развернуть макрос (и обратно, когда макроса нет). Однако из того, что я помню о том, как работает yasnippet, это может быть не совсем исполнительным.

Друг предположил, что то, что я хочу здесь, это yasnippet-can-fire-p, но я все еще не уверен, как лучше всего это делать. Какой самый чистый путь к реализации этого, который не приведет мою систему к остановке?

Ответ 1

Пришло время найти функцию, которая проверила, может ли она расширяться, но "посчастливилось" найти ее в конце концов.

Ключ состоит в том, что эта функция обычно расширяется или, иначе, выполняет резервное поведение. Я клонировал эту функцию и вместо этого задавал цвета курсора в этих местах.

И, что удивительно, на самом деле это вообще не замедляется.

;; 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 года, от 0.8.1] функция yas--current-key была переименована в yas--templates-for-key-at-point. cf Issue