我想在emacs-lisp中插入一个特定的yasnippet作为函数的一部分。有没有办法做到这一点?
唯一似乎相关的命令是yas/insert-snippet
,但它只是打开一个包含所有选项的弹出窗口,并且文档没有说明通过指定代码段名称来绕过弹出窗口。
答案 0 :(得分:5)
yas/insert-snippet
确实只是yas/expand-snippet
的一个薄包装,用于交互式使用。然而,内部结构......很有趣。从源代码来看,当我想在elisp模式中扩展“defun”片段时,以下内容对我有用:
(yas/expand-snippet
(yas/template-content (cdar (mapcan #'(lambda (table)
(yas/fetch table "defun"))
(yas/get-snippet-tables)))))
答案 1 :(得分:3)
作为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")
答案 2 :(得分:1)
我刚刚进入yasnippet,我想在为某些模式打开新文件时自动插入我的一个片段。这导致我到这里,但我已经产生了一个稍微不同的解决方案。提供另一种选择:(" new-shell"是我提供新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发生巨大变化,我的解决方案就不容易破解。