Gelegentlich verwende ich interaktive Funktionen innerhalb einer Funktion, die ich für meinen eigenen Gebrauch schreibe. Wenn eine Funktion nach Informationen fragt (z. B. "Ausgabedatei: ~ /"), gibt es eine allgemeine Möglichkeit, dem Minibuffer Text hinzuzufügen und dann die Eingabetaste zu drücken, damit der Benutzer dies nicht tun muss?
Angenommen, ich möchte org-latex-export-to-pdf
innerhalb einer Funktion ausgeführt werden, möchte aber nicht, dass der Benutzer einen Dateinamen angeben muss. Beim Laufen (org-latex-export-to-pdf)
wird der Punkt in den Minibuffer verschoben, aber das Setzen (insert "filename.tex")
in die nächste Zeile scheint nicht zu funktionieren.
interactive
Klausel nach solchen Informationen fragen. Wenn Sie von elisp aufgerufen werden, sollten Sie in der Lage sein, die Informationen als Funktionsargument zu übergeben. Dies hilft Ihnen natürlich nicht weiter, falls die Funktion, die Sie aufrufen möchten, diesem Entwurf nicht folgt.Antworten:
Interessantes Problem. Es sieht so aus, als würde der Editor
post-command-hook
jedes Mal ausgeführt, wenn er in eine neue Befehlsschleife eintritt, dh arecursive-edit
. Aber wir können damit beginnenminibuffer-setup-hook
, dass eine Funktion nach Eingabe des Minibuffers ausgeführt wird. Dies ermöglicht zwar das Einfügen von Eingaben, es ist jedoch zu früh, um den Minibuffer zu verlassen, da der Fang noch nicht eingerichtet wurde.Dort müssen wir die 'Argumente' in unsere eigene 'Befehlsschleife' einbinden, die jedes Mal ausgeführt wird, wenn wir eine eingeben
recursive-edit
. An diesem Punkt wird ein Argument eingeblendet und eine Ebene nach oben über geworfenexit-minibuffer
.quelle
Ich habe dafür ein Makro geschrieben
with-simulated-input
, das Sie hier bekommen können . Sie können beliebige Eingaben vornehmen und beliebige Lisp-Formulare ausführen, um die Benutzerinteraktion zu simulieren.Beispielsweise:
würde zurückkehren
"hello world"
, wobei das "Hallo" durch die erste Zeichenfolge eingefügt wird, die "Welt" über den Lisp-Code eingefügt wird und schließlich "RET", um die Eingabe zu beenden.Es wird mit einer Testsuite geliefert, in der Sie weitere Anwendungsbeispiele finden.
quelle
Es scheint, dass die Verwendung
run-with-timer
mitinsert
den Job erledigt.Der Befehl,
insert
der danach platziert wird, wird zu schnell angezeigt. Es wird versucht, die Zeichenfolge einzufügen, bevor ein Platz zum Einfügen vorhanden ist.quelle
org-export-output-file-name
,org-latex-export-to-pdf
damit der Benutzer nicht zur Eingabe des Dateinamens aufgefordert wird. Sie können Ihre Bemühungen in die Frage stellen - z. B.run-with-timer
usw. - es ist jedoch keine gute Lösung (meiner Meinung nach). Die bessere Lösung besteht darin, einen Dateinamen programmgesteuert ordnungsgemäß zu übergeben, damit der Minibuffer überhaupt nicht geöffnet wird. Ich würde empfehlen, diese Antwort zu löschen, damit Sie von jemandem mit mehrelisp
Erfahrung eine bessere Lösung erhalten .org-latex-export-to-pdf
interessiert mich nicht. Es ist ein Beispiel, da Sie anscheinend darauf bedacht waren, dass ich einen hinzufüge. Die Frage, die ich gestellt habe, ist die, die ich gemeint habe: Gibt es eine Möglichkeit, eine Minibuffer-Eingabeaufforderung durch elisp zuverlässig zu beantworten? Eine Lösung von Fall zu Fall ist nicht das, wonach ich suche. Aus Ihrem Kommentar kann ich schließen, dass es nicht empfohlen wird.