Czasami używam interaktywnych funkcji wewnątrz funkcji, którą piszę na własny użytek. Jeśli funkcja prosi o pewne informacje (np. „Plik wyjściowy: ~ /”), czy istnieje ogólny sposób dodawania tekstu do minibufora, a następnie naciśnij klawisz Enter, aby użytkownik nie musiał tego robić?
Jako przykład załóżmy, że chcę uruchomić org-latex-export-to-pdf
wewnątrz funkcji, ale nie chcę, aby użytkownik musiał określać nazwę pliku. Bieganie (org-latex-export-to-pdf)
przeniesie punkt do minibufora, ale umieszczenie czegoś (insert "filename.tex")
w następnym wierszu nie wydaje się działać.
interactive
klauzuli. Po wywołaniu z elisp, powinieneś być w stanie przekazać informacje jako argument funkcji. Oczywiście to ci nie pomoże, na wypadek gdyby funkcja, którą próbujesz wywołać, nie spełnia tego założenia.Odpowiedzi:
Ciekawy problem. Wygląda na to, że edytor działa za
post-command-hook
każdym razem, gdy wchodzi w nową pętlę poleceń, tjrecursive-edit
. Ale możemy zacząć odminibuffer-setup-hook
, który wykonuje funkcję po wejściu do minibufora. Chociaż pozwala to na wstawianie danych wejściowych, jest zbyt wcześnie, aby wyjść z minibufora, ponieważ catch nie został jeszcze skonfigurowany.Właśnie dlatego musimy zawinąć „argumenty” w naszą własną „pętlę poleceń”, która jest wykonywana za każdym razem, gdy wchodzimy do
recursive-edit
, w którym to momencie wyskakuje jeden argument i podnosi poziom o jeden poziom wyżejexit-minibuffer
.źródło
Napisałem makro dla tego o nazwie
with-simulated-input
, które można uzyskać tutaj . Umożliwia to wprowadzanie dowolnych danych wejściowych, a także wykonywanie dowolnych formularzy seplenienia w celu symulacji interakcji użytkownika.Na przykład:
zwróci
"hello world"
, z „hello” wstawionym przez pierwszy ciąg, „world” wstawiony za pomocą kodu lisp, a na końcu „RET”, aby zakończyć wprowadzanie.Jest dostarczany z zestawem testowym, na którym można znaleźć więcej przykładów użycia.
źródło
Wygląda na to, że użycie
run-with-timer
zinsert
spowoduje wykonanie pracy.Polecenie
insert
po umieszczeniu później pojawia się zbyt szybko. Próbuje wstawić ciąg, zanim będzie miejsce do wstawienia.źródło
org-export-output-file-name
podczas używania,org-latex-export-to-pdf
aby użytkownik nie był monitowany o nazwę pliku. Możesz postawić swoje wysiłki w pytaniu - np.run-with-timer
Itp. - jednak nie jest to dobre rozwiązanie (moim zdaniem). Lepszym rozwiązaniem jest prawidłowe przekazanie nazwy pliku programowo, tak aby minibufor nigdy się nie otwierał. Zalecam usunięcie tej odpowiedzi, aby uzyskać lepsze rozwiązanie przez osobę z większymelisp
doświadczeniem.org-latex-export-to-pdf
nie jest tym, co mnie interesuje. Jest to przykład, ponieważ wydawało się, że chciałem dodać go. Pytanie, które zadałem, było tym, o którym mówiłem: czy istnieje sposób, aby rzetelnie odpowiedzieć na pytanie minibufora za pomocą elisp. Indywidualne rozwiązanie nie jest tym, czego szukam. Z twojego komentarza mogę wywnioskować, że nie jest to zalecane.