2016-04-22 3 views
1

J'apprends actuellement à définir yasnippets mais il semble y avoir un cas d'utilisation que je n'arrive pas à comprendre. Par exemple, disons que je veux définir un fragment Ruby qui étend la clé 'def' dans une définition de fonction standard. C'est très facile à faire mais supposons que je veux faire le nombre de paramètres de la fonction générée dépend de la clé, comme si je développais la touche 'def>n', je veux une définition de fonction avec n nombre de paramètres. Comment pourrais-je accomplir cela?Touches de dynamique pour yasnippet

modifier

Fondamentalement, je veux faire des extraits dynamiques qui ont un comportement que le plugin HTML Emmet possède. Tout comme dans l'abbrev 'p * 3> div * 2' qui suit avec Emmet crée 3 paires de p étiquettes avec deux paires div dans chacun, je voudrais qu'il soit possible de faire 'def * 3> 2' générer 3 définitions de fonctions avec 2 arguments chacune. C'est juste un exemple mais fondamentalement je veux des propriétés de quantification et d'imbrication.

Répondre

1

Pour essayer de vous aider j'ai écrit l'extrait pour vous qui fait ce que le html fait que vous parliez. Vous devriez pouvoir l'éditer à changez-le pour qu'il fasse ce que vous voulez mais ce ne serait pas beaucoup amusement si tout le travail a été fait pour vous;).

La première chose que je faisais était de définir la fonction qui fait la transformation de

"p*3>div*2" 

à

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

Cette fonction est:

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

L'extrait est alors:

${1:$$(when yas-moving-away-p (move-beginning-of-line nil) (kill-line) (insert (crushlist (split-string yas-text ">"))))} 

Je me sens comme l'extrait de code doit être:

${1:$$(when yas-moving-away-p (crushlist (split-string yas-text ">")))} 

mais cela ne fonctionne pas pour moi pour une raison quelconque

Si vous avez des questions (si vous trouvez s'il vous plaît laissez-moi savoir!) sur la façon de mettre en œuvre votre extrait réel, laissez-moi un commentaire et je vais essayer de vous aider.

+0

Pour clarifier cela, quelle serait la clé que j'utiliserais pour cet exemple d'extrait? Je suppose que ce n'est pas seulement "p * 3> div * 2". –

+0

Ouais donc la façon dont je l'ai fait était que vous mettriez une clé, une clé. Ensuite, vous l'agrandissez. Tapez p * 3> div * 2, puis appuyez sur l'onglet – Jules

+0

@ Y.Khurshid cela a-t-il fonctionné pour vous? – Jules