7
votes

Commentaires de style boîte avec Yasnippet

Je cherche à écrire un yasnippet modèle qui me permettrait d'ajouter une en-tête de licence à un tampon de script dans Emacs. Un peu comme cette , mais un peu amélioré:

  1. L'en-tête doit inclure des données par l'utilisateur, comme le nom de la date et électronique du titulaire du droit d'auteur, qui peut être obtenu avec extension elisp embarqué de yasnippet. li>
  2. Les besoins d'en-tête à commenta avec une syntaxe en fonction du mode de programmation, le fichier est en cours. Il y a déjà un point essentiel d'un extrait qui fait tout ce qui . Fondamentalement, cela revient à intégrer (commentaire région (point min) (point)) code> à la fin de votre extrait. Li>
  3. Maintenant, Je veux changer le commentaire de style à une boîte strong>. Voir la emacs documentation du commentaire de style code> variable ou, si vous voulez voir ce qu'est un look de commentaire boîte de style comme, appelez commentaire boîte Mx code> sur un actif région. Il appelle commentaire région code> avec les bonnes options li> Ol>

    Une première approche de le faire est de configurer le style en modifiant la fin de l'extrait précédent à: p>

    Copyright (c) ${1:`(nth 5 (decode-time))`}
    All rights reserved.
    
    Redistribution and use in $1, in source and binary forms
    `(let ((comment-style 'box))
            (comment-region (point-min) (point-at-eol 0)))`
    


0 commentaires

3 Réponses :


5
votes

Changer votre extrait sur celui-ci fixe la dernière ligne. XXX

Notez qu'il existe une pause de ligne entre la licence ("... sont autorisées") et le code LISP EMACS intégré.

Quant à la deuxième ligne, je vais d'abord expliquer pourquoi cela se produit, puis proposer une solution (laid). Lorsque votre extrait est inséré dans un fichier, des blocs intégrés de LISP sont évalués séquentiellement depuis le début du tampon jusqu'à la fin. Ce que cela signifie dans votre snippet est que (nième 5 (décodage)) a été remplacé par 2011 lorsque le bloc suivant, (Commentaire-Région .. .) est évalué.

En conséquence, Commentaire-région voit la deuxième ligne comme xxx

Donc, région-région met suffisamment d'espaces blancs pour cette chaîne. Ensuite, le moteur de modèle transforme $ {1: 2011} dans 2011 , et cette transformation raccourcit la chaîne de 5 caractères. Ceci explique l'apparence prématurée de *) de 5 caractères dans la deuxième ligne.

Un moyen de réparer cette situation est de ramener 5 espaces blancs après Commentaire-Région < / code> est évalué --- quelque chose le long de la ligne de: xxx


2 commentaires

Merci pour la suggestion Point-at-eol , elle corrige complètement le problème de la dernière ligne. Excellente explication , merci. Votre solution fonctionne, mais il est douloureux de généraliser à de nombreux champs sur une ligne (où vous devez compter manuellement la chaudière pour chaque modèle) et impossible d'étendre à une réutiliser du champ $ 1 ailleurs dans le Modèle (où vous devriez Supprimer autant d'espaces blancheurs que l'évaluation du LISP intégré créé). J'attendrai un peu de temps et si personne ne propose une solution pour cela, je vais "accepter" votre réponse.


Je conviens que ma solution pour la deuxième ligne est sous-optimale. Ce serait génial si yas / après-sortie-snipet-crochet fonctionne sur le texte que nous voyons. Cependant, il semble que le crochet fonctionne sur le texte sous-jacent (par exemple $ {1: ...} ). Au fait, si vous définissez le crochet dans # expand-env , le crochet n'affecte que le snippet et non d'autres extraits --- en ajoutant # exp: ((YAS / après -exit-snippet-crochet (liste (Let ((((((Style de commentaire »)))))))))))))))))



1
votes

Cela peut vous être utile à vous:

(* Copyright (c) ${1:2011}${1:$(make-string (- 72 (string-width text)) ?\ )} *)
(* ${2}${2:$(make-string (- 72 (string-width text)))}*)


1 commentaires

C'est intelligent, mais malheureusement, comme expliqué dans La réponse de Seiji , le Le moteur de modèle remplacera les champs après l'exécution de blocs, ce qui signifie que l'espace blanche insérée par (make-string ...) est deux fois 5 caractères (pour < code> $ {1:} $ {1:} ). (Merci pour la suggestion de crochet, mais j'ai déjà mentionné mes tentatives infructueuses dans la question initiale)



0
votes

Ceci a fonctionné pour moi:

# -*- mode: snippet -*-
# name: box comment block
# key: bbox
# expand-env: ((yas-after-exit-snippet-hook (lambda () (if (buffer-substring yas-snippet-beg yas-snippet-end) (comment-box yas-snippet-beg yas-snippet-end 1)))))
# --
Copyright (c) ${1:`(nth 5 (decode-time))`}
All rights reserved.

Redistribution and use in source and binary forms, with or
without modification, are permitted
$0


0 commentaires