Je me retrouve parfois à utiliser des fonctions interactives à l'intérieur d'une fonction que j'écris pour mon propre usage. Si une fonction demande des informations (par exemple, "Fichier de sortie: ~ /"), existe-t-il une manière générale et simple d'ajouter du texte au mini-tampon, puis d'appuyer sur Entrée pour que l'utilisateur n'ait pas à le faire?
Par exemple, supposons que je souhaite exécuter à l' org-latex-export-to-pdf
intérieur d'une fonction mais je ne veux pas que l'utilisateur doive spécifier un nom de fichier. Courir (org-latex-export-to-pdf)
déplacera le point vers le mini-tampon, mais mettre quelque chose comme (insert "filename.tex")
sur la ligne suivante ne semble pas fonctionner.
interactive
clause. Lorsqu'il est appelé depuis elisp, votre devrait pouvoir transmettre les informations en tant qu'argument de fonction. Bien sûr, cela ne vous aide pas, au cas où la fonction que vous essayez d'appeler ne suit pas cette conception.Réponses:
Problème intéressant. On dirait que l'éditeur s'exécute à
post-command-hook
chaque fois qu'il entre dans une nouvelle boucle de commande, c'est-à-dire arecursive-edit
. Mais nous pouvons commencer parminibuffer-setup-hook
, qui exécute une fonction après avoir entré le mini-tampon. Bien que cela permette l'insertion d'une entrée, il est trop tôt pour quitter le mini-tampon, car la capture n'a pas encore été configurée.C'est là que nous devons encapsuler les `` arguments '' dans notre propre `` boucle de commande '', qui est exécutée chaque fois que nous entrons dans a
recursive-edit
, auquel cas il affiche un argument et lève un niveau, viaexit-minibuffer
.la source
J'ai écrit une macro pour cela appelé
with-simulated-input
, que vous pouvez obtenir ici . Il vous permet de fournir des entrées arbitraires ainsi que d'exécuter des formulaires lisp arbitraires afin de simuler l'interaction de l'utilisateur.Par exemple:
retournerait
"hello world"
, avec le "bonjour" inséré par la première chaîne, le "monde" inséré via le code lisp, et enfin "RET" pour terminer l'entrée.Il est livré avec une suite de tests que vous pouvez consulter pour plus d'exemples d'utilisation.
la source
Il semble que l'utilisation de
run-with-timer
avecinsert
fera le travail.La commande,
insert
placée après, arrive trop rapidement. Il essaie d'insérer la chaîne avant qu'il n'y ait un endroit pour l'insérer.la source
org-export-output-file-name
lors de l'utilisationorg-latex-export-to-pdf
afin que l'utilisateur ne soit pas invité à entrer le nom de fichier. Vous pouvez mettre vos efforts dans la question - par exemple,run-with-timer
etc. - mais ce n'est pas une bonne solution (à mon avis). La meilleure solution consiste à transmettre correctement un nom de fichier par programmation afin que le mini-tampon ne s'ouvre jamais en premier lieu. Je recommanderais de supprimer cette réponse afin que vous obteniez une meilleure solution par quelqu'un ayant plus d'elisp
expérience.org-latex-export-to-pdf
n'est pas celle qui m'intéresse. C'est un exemple puisque vous sembliez déterminé à ce que j'en ajoute un. La question que j'ai posée est celle que je voulais dire: existe-t-il un moyen de répondre de manière fiable à une invite de mini-tampon via elisp. Une solution au cas par cas n'est pas du tout ce que je recherche. D'après votre commentaire, je peux déduire que ce n'est pas recommandé.