Ответ 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