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é:
(commentaire région (point min) (point)) code> à la fin de votre extrait. Li>
- 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)))`
3 Réponses :
Changer votre extrait sur celui-ci fixe la dernière ligne. Notez qu'il existe une pause de ligne entre la licence ("... sont autorisées") et le code LISP EMACS intégré. P> 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 En conséquence, Donc, Un moyen de réparer cette situation est de ramener 5 espaces blancs après (nième 5 (décodage)) code> a été remplacé par
2011 code> lorsque le bloc suivant,
(Commentaire-Région .. .) code> est évalué. p>
Commentaire-région code> voit la deuxième ligne comme p>
région-région code> met suffisamment d'espaces blancs pour cette chaîne. Ensuite, le moteur de modèle transforme
$ {1: 2011} code> dans
2011 code>, et cette transformation raccourcit la chaîne de 5 caractères. Ceci explique l'apparence prématurée de
*) code> de 5 caractères dans la deuxième ligne. P>
Commentaire-Région < / code> est évalué --- quelque chose le long de la ligne de: p>
Merci pour la suggestion code> Point-at-eol CODE>, elle corrige complètement le problème de la dernière ligne. Excellente explication B>, 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 i> du champ $ 1 ailleurs dans le Modèle (où vous devriez Supprimer B> 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 code> fonctionne sur le texte que nous voyons. Cependant, il semble que le crochet fonctionne sur le texte sous-jacent (par exemple
$ {1: ...} code>). Au fait, si vous définissez le crochet dans
# expand-env code>, 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 »))))))))))))))))) code>
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)))}*)
C'est intelligent, mais malheureusement, comme expliqué dans La réponse de Seiji , le Le moteur de modèle remplacera les champs après i> l'exécution de blocs, ce qui signifie que l'espace blanche insérée par (make-string ...) code> est deux fois 5 caractères (pour < code> $ {1:} $ {1:} code>). (Merci pour la suggestion de crochet, mais j'ai déjà mentionné mes tentatives infructueuses dans la question initiale)
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