F: Wie kann ich yasnippeteine Textzeichenfolge innerhalb des Elisp-Codes korrekt erweitern (Snippet-Felder erkennen)?
Ein sehr einfaches Snippet ist nur eine Zeichenfolge, in der sich einige Steuerzeichen vermischen. Wir können auch Elisp-Formulare verwenden, um umfangreichere Snippets zu erstellen, aber mir ist nicht klar, wie ich sie angemessen erweitern kann.
Hier ist ein einfaches Beispiel, das das Problem erfasst. Ich erstelle ein org-modeSnippet, um ein Link-Skelett einzufügen, das aussieht [[source][description]]. Das folgende einfache Snippet erzeugt das gewünschte Verhalten von "Start im Quellfeld, Ende im Beschreibungsfeld":
[[$1][$0]]
Wir können Elisp-Code in Snippets (in `s eingeschlossen) mischen. Ich hätte gedacht, dass das Folgende genau das gleiche Verhalten wie die einfachere Version erzeugen würde, da das ifeinfach [[$1][$0]]als String ausgewertet wird :
`(if t "[[$1][$0]]")`
Dies ist jedoch nicht der Fall. Stattdessen verhält es sich so, als wären die Felder $0und $1keine Felder, beendet das Snippet und platziert einen Punkt nach dem Finale ]. Also: Wie erhält man das gewünschte Verhalten, wenn ein elisp-Formular zu einer Textzeichenfolge mit yasnippetin diese Zeichenfolge eingebetteten Feldern ausgewertet wird ?
BEARBEITEN: Wie gewünscht, hier ist der spezielle Anwendungsfall, der die Frage inspiriert hat. Wenn die X-Zwischenablage einen URL-Link enthält, möchte ich, dass das Quellfeld im Organisationslink ([[ Quelle ] [Beschreibung]] ausgefüllt und im Zielfeld belassen wird. Es verwendet eine Hilfsfunktion ( dan-xclipboard-link-p), die die URL zurückgibt, falls vorhanden, oder sonst nil. Es scheint mir, dass ich in der Lage sein sollte, so etwas zu tun:
`(let ((link (dan-xclipboard-link-p)))
(if link
(concat "[[" link "][$0]]")
"[[$1][$0]]"))`
Tatsächlich funktionierte mit einer früheren Version von yasnippet eine Version dieses Codes so, wie ich es beabsichtigt hatte.
EDIT 2: Interessanterweise funktioniert dieses Snippet, wenn sich ein Link in der X-Zwischenablage befindet, schlägt jedoch fehl, wenn dies nicht der Fall ist (dh es wird nicht $1als Feld erkannt :
[[`(or (dan-xclipboard-link-p) "$1")`][$0]]
yas-insert-snippetdas hier zutrifft. Auf jeden Fall kommt jetzt ein tatsächlicher Anwendungsfall (der früher funktioniert hat) in Frage.
(if t (yas-insert-snippet))? Können Sie eine realistischere Bedingung angeben, damit wir den tatsächlichen Anwendungsfall verstehen können? Dies könnte ein XY-Problem mit eleganteren Lösungen sein.