12

yasnippetが大好きですが、覚えるのに時間がかかります。私がやりたいのは、マクロを展開できるポイントに来たときにカーソルの色を変更することです(マクロがない場合は再び元に戻します)。ただし、yasnippetがどのように機能するかについて私が覚えていることから、それは正確にはパフォーマンスが高くない可能性があります。

友人が私がここで欲しいのはyasnippet-can-fire-pであると提案しましたが、これを行うための最善の方法についてはまだわかりません。私のシステムをひどく停止させない、これを実装するための最もクリーンな方法は何ですか?

4

1 に答える 1

14

拡張できるかどうかをチェックする関数を見つけるのに少し時間がかかりましたが、最終的にはそれを見つけるのに十分「幸運」でした。

重要なのは、この関数が通常は拡張されるか、そうでなければフォールバック動作を実行することです。この関数のクローンを作成し、代わりにそれらの場所にカーソルの色を設定しました。

そして、驚くべきことに、それは実際にはまったく減速しません。

;; 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問題

于 2013-01-10T18:56:17.630 に答える