yasnippet的动态关键字

时间:2016-04-22 14:57:35

标签: emacs yasnippet

我目前正在学习定义yasnippets,但似乎有一个用例,我无法弄清楚如何使用。 例如,让我们说我想要定义一个ruby代码片段来扩展键“def'进入标准函数定义。这很容易做到,但是假设我想让生成的函数的参数数量取决于键,就像我展开键> def> n ',我想要一个带有 n 参数数量的函数定义。我该如何做到这一点?

修改

基本上我想制作具有HTML插件Emmet所拥有的行为的动态片段。 正如以下缩写' p * 3> div * 2'与Emmet一起创建3对p标签,每个标签内有两个div对,我希望它可以制作 ' DEF * 3→2'生成3个函数定义,每个函数有2个参数。这只是一个例子,但基本上我想要量词和嵌套属性。

1 个答案:

答案 0 :(得分:1)

为了帮助我,我为你编写了代码片段 那是你在说什么你应该能够编辑它 改变它,使它做你想要的,但它不会太多 如果所有工作都为你完成,那就很有趣;)。

我做的第一件事是定义从

转换的函数
"p*3>div*2"

<p>
<div>
</div>
<div>
</div>
</p>
<p>
<div>
</div>
<div>
</div>
</p>
<p>
<div>
</div>
<div>
</div>
</p>

该功能是:

(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 ">")))}

但由于某些原因这对我不起作用(如果你发现请告诉我!)

如果您对如何实施实际代码段有任何疑问, 给我留言,我会尽力帮忙。