emacs-lispの関数の一部として特定のyasnippetを挿入したい。それを行う方法はありますか?
関連していると思われる唯一のコマンドはですyas/insert-snippet
が、すべてのオプションを含むポップアップを開くだけであり、ドキュメントには、スニペット名を指定してポップアップをバイパスすることについては何も記載されていません。
yas/insert-snippet
yas/expand-snippet
確かに、インタラクティブに使用するための単なる薄いラッパーです。しかし、内部構造は...興味深いものです。ソースコードから判断すると、elisp-modeで「defun」スニペットを展開したい場合は、次のように機能します。
(yas/expand-snippet
(yas/template-content (cdar (mapcan #'(lambda (table)
(yas/fetch table "defun"))
(yas/get-snippet-tables)))))
yasnippetの作成者として、将来変更される可能性のあるyasnippetの興味深いデータ構造の内部詳細に依存したくないと思います。私はとのドキュメントに基づいてこれを行いyas/insert-snippet
ますyas/prompt-functions
:
(defun yas/insert-by-name (name)
(flet ((dummy-prompt
(prompt choices &optional display-fn)
(declare (ignore prompt))
(or (find name choices :key display-fn :test #'string=)
(throw 'notfound nil))))
(let ((yas/prompt-functions '(dummy-prompt)))
(catch 'notfound
(yas/insert-snippet t)))))
(yas/insert-by-name "defun")
yasnippetを使い始めたばかりで、特定のモードで新しいファイルを開いたときに、スニペットの1つを自動的に挿入したいと思いました。それが私をここに導きましたが、私は少し異なる解決策を生み出しました。さらに別の選択肢を提供する:( 「new-shell」は、新しいシェルスクリプトテンプレートを提供するための私の個人的なスニペットの名前です)
(defun jsm/new-file-snippet (key)
"Call particular yasnippet template for newly created
files. Use by adding a lambda function to the particular mode
hook passing the correct yasnippet key"
(interactive)
(if (= (buffer-size) 0)
(progn
(insert key)
(call-interactively 'yas-expand))))
(add-hook 'sh-mode-hook '(lambda () (jsm/new-file-snippet "new-shell")))
IMO、私のソリューションは、yasnippetが劇的に変化した場合でも、壊れにくいです。