Ich bin auf der Suche nach einer yasnippet Vorlage, die mir erlauben würde, einen Lizenz-Header zu einem Skript-Puffer in Emacs hinzuzufügen. Kinda wie this, aber ein bisschen verbessert:box-style Kommentare mit yasnippet
- Der Header pro-Benutzerdaten umfassen muss, wie das Datum Name und E-Mail des Urhebers, die mit embedded elisp expansion von yasnippet erhalten werden kann.
- Der Header muss mit einer Syntax kommentiert werden, die vom Programmiermodus abhängt, in dem sich die Datei gerade befindet. Es gibt bereits a gist of a snippet that does all that. Grundsätzlich wird am Ende des Snippets
(comment-region (point-min) (point))
eingebettet. - Jetzt, Ich möchte den Kommentar-Stil in eine Box ändern. Sehen Sie sich die emacs-Dokumentation für die Variable
comment-style
an, oder, wenn Sie sehen möchten, wie ein Boxstil-Kommentar aussieht, rufen Sie einfachM-x comment-box
für eine aktive Region auf: Er ruftcomment-region
mit den richtigen Optionen auf.
Ein erster Ansatz, das zu tun ist, um die Art zu installieren, indem das Ende des vorherigen Schnipsel Modifizieren:
(let ((comment-style 'box))
(comment-region (point-min) (point)))
Leider wird die Vertiefung geschraubt, und meine Box nicht rechteckig ist,. Wenn ich von Schnipsel starten:
Copyright (c) ${1:`(nth 5 (decode-time))`}
All rights reserved.
Redistribution and use in source and binary forms, with or
without modification, are permitted`
(let ((comment-style 'box))
(comment-region (point-min) (point)))`
Die Erweiterung dieses Snippet "bricht das Feld" (Ich bin das Debuggen dieses Schnipsel mit ocaml Kommentar Syntax, nicht, dass es sollte egal):
(**************************************************************)
(* Copyright (c) 2010 *)
(* All rights reserved. *)
(* *)
(* Redistribution and use in source and binary forms, with or *)
(* without modification, are permitted *)
(**************************************************************)
- Zuerst dachte ich, die zweite Zeile wurde auf der Grundlage der Größe der vor der Expansion eingebetteten Code eingerückt, aber in diesem Fall sollte es die endgültige
*)
dieser Zeile 25 Felder zu früh kommen, nicht 4. - Wenn es eingerückt basierend auf nein Text am Einbettungspunkt vorhanden ist, sollte das endgültige
*)
auch 4 Plätze ankommen spät, nicht zu bald. - Schließlich verstehe ich nicht, was los ist mit der letzten Zeile, in der keine eingebettete Code-Erweiterung ist: Normalerweise habe ich kein Problem, eine quadratische Kommentarfeld aus einem Absatz mit einer kurzen letzten Zeile (entweder mit
comment-box
oder der elisp Funktion in dem ersten Kommentar-Block dieser Frage.
ich habe versucht, der Kommentar nach Schnipsel Expansion passieren zu machen, jede Nebenwirkung zu vermeiden, indem sie yas/after-exit-snippet-hook
hinzufügen, ersetzen die letzte Funktion des obigen Schnipsel mit:
(add-hook 'yas/after-exit-snippet-hook
(let ((comment-style 'box))
(comment-region (point-min) (point))) nil t)
Aber das hat nicht geholfen. Selbst wenn es so wäre, würde es mich mit einem Expansionshaken verlassen, der die Snippets notieren würde, die ich in diesem Puffer verwenden möchte, etwas, das ich sicher nicht will.
sollte ich noch hinzufügen, dass ich durch das Hinzufügen
# expand-env: ((yas/indent-line 'fixed))
am Anfang meiner Schnipsel yas/indent-line
-fixed
zu setzen versucht, aber das hat nichts ändern. Irgendwelche Ideen, wie man eine rechteckige Box erhält?
Edit: Wir haben a very nice answer, along with a proposed fix, (! Dicken Lob & Dank, Seiji), aber eine Frage bleibt, wie es auf den Fall anzupassen, wo man möchte ein Feld wieder zu verwenden, sagen, wie die Wiederverwendung von $1
in :
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)))`
In diesem Fall kann die Template-Engine kopiert der (variable-length) Wert $1
für das Feld erhalten, nämlich 2011
, bis zur letzten Zeile, bei Vorlage Expansion (nach Einkerbung), was eine Kommentarzeile 2 Chara cters zu breit. Es wird schwer vorherzusagen, wenn man die Vorlage schreibt, dass man Zeichen an dieser Zeile entfernen sollte. Vielleicht Feldwiederverwendung und richtigen Einzug sind zu viel, um gleichzeitig zu fragen. Sieht jemand einen Weg, dies zu tun?
Danke für die "Point-at-Eol" Vorschlag, es vollständig behoben das Problem der letzte Linie. ** Tolle ** Erklärung, danke. Ihr Fix funktioniert, aber es ist schmerzhaft, auf viele Felder in einer Zeile zu verallgemeinern (wo Sie den Textbaustein für jede Vorlage manuell zählen müssen) und unmöglich auf eine * Wiederverwendung * des Feldes $ 1 an anderer Stelle in der Vorlage zu erweitern (wo Sie würden) müssen ** so viele Leerzeichen entfernen wie die Auswertung der erzeugten eingebetteten Lispes **. Ich warte eine Weile, und wenn niemand eine Lösung dafür findet, werde ich Ihre Antwort "akzeptieren". – huitseeker
Ich stimme zu, dass meine Lösung für die zweite Zeile suboptimal ist. Es wäre toll, wenn 'yas/after-exit-snipeet-hook' an dem Text arbeitet, den wir sehen. Es scheint jedoch, dass der Hook auf dem zugrunde liegenden Text (z.B. $ {1: ...} ') funktioniert. Übrigens, wenn Sie den Hook in '# expand-env' setzen, wirkt sich der Hook nur auf den Snippet und nicht auf andere Snippets aus --- indem Sie' # expand-env: ((yas/after-exit-snippet-hook (Liste (lassen ((Kommentar-Stil 'Box)) (Kommentar-Bereich (Punkt-min) (Punkt-Max) nil))))) ' –