Emacs yasnippet的动力学键

Emacs yasnippet的动力学键,emacs,yasnippet,Emacs,Yasnippet,我目前正在学习定义yasnippets,但似乎有一个用例我不知道如何使用。 例如,假设我想定义一个ruby代码段,将键“def”扩展为标准函数定义。这很容易做到,但是假设我想让生成函数的参数数量取决于键,比如如果我展开键'def>n',我想要一个具有n个参数的函数定义。我将如何做到这一点 编辑 基本上,我想制作具有HTML插件Emmet所具有行为的动态代码段。 正如下面使用Emmet的abbrev'p*3>div*2'如何创建3对p标记,每个标记中有两个div对,我希望能够 “def*3>2”生

我目前正在学习定义yasnippets,但似乎有一个用例我不知道如何使用。 例如,假设我想定义一个ruby代码段,将键“def”扩展为标准函数定义。这很容易做到,但是假设我想让生成函数的参数数量取决于键,比如如果我展开键'def>n',我想要一个具有n个参数的函数定义。我将如何做到这一点

编辑

基本上,我想制作具有HTML插件Emmet所具有行为的动态代码段。 正如下面使用Emmet的abbrev'p*3>div*2'如何创建3对p标记,每个标记中有两个div对,我希望能够
“def*3>2”生成3个函数定义,每个函数定义有2个参数。这只是一个示例,但基本上我需要量词和嵌套属性。

为了帮助您,我为您编写了一个代码片段,它实现了html的功能 你刚才说的是什么。您应该能够将其编辑为 改变它,让它做你想要的,但不会太多 如果所有的工作都是为你做的,那会很有趣;)

我做的第一件事是定义从

"p*3>div*2"

我觉得这个片段应该是:

${1:$$(when yas-moving-away-p (crushlist (split-string yas-text ">")))}
但由于某种原因,这对我来说不起作用(如果你发现了,请让我知道!)

如果您对如何实现实际代码片段有任何疑问,
请给我留言,我会尽力提供帮助。

为了帮助澄清这一点,我在这个代码段示例中使用的关键点是什么?我假设它不仅仅是“p*3>div*2”。是的,所以我做它的方式是你会放一些钥匙,任何钥匙。然后你把它展开。键入p*3>div*2,然后点击tab
(defun crushlist (my-list)
  (if my-list
      (let* ((elem (car my-list))
             (char (first (split-string elem "*")))
             (num (string-to-int(second (split-string elem "*")))))
        (apply 'concat
               (cl-loop for i from 1 to num
                        collect (concat "<" char ">
" (crushlist (cdr my-list)) "</" char ">
"))))
    ""))
${1:$$(when yas-moving-away-p (move-beginning-of-line nil) (kill-line) (insert (crushlist (split-string yas-text ">"))))}
${1:$$(when yas-moving-away-p (crushlist (split-string yas-text ">")))}