1

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

编辑

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

4

1 回答 1

1

为了帮助您,我为您编写了代码片段,该代码片段完成了您所说的 html 的作用。您应该能够对其进行编辑以更改它,以便它执行您想要的操作,但如果所有工作都为您完成,那将不会很有趣;)。

我做的第一件事是定义从

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

但这对我不起作用(如果你发现了,请告诉我!)

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

于 2016-04-22T20:07:35.733 回答