Saya kadang-kadang menemukan diri saya menggunakan fungsi interaktif di dalam fungsi yang saya tulis untuk saya gunakan sendiri. Jika suatu fungsi meminta beberapa informasi (mis. "File output: ~ /") apakah ada cara umum untuk menambahkan teks ke minibuffer dan kemudian tekan enter sehingga pengguna tidak harus melakukannya?
Sebagai contoh, misalkan saya ingin menjalankan org-latex-export-to-pdf
fungsi tetapi saya tidak ingin pengguna harus menentukan nama file. Berlari (org-latex-export-to-pdf)
akan memindahkan poin ke minibuffer, tetapi menempatkan sesuatu seperti (insert "filename.tex")
pada baris berikutnya tampaknya tidak berfungsi.
interactive
klausulnya. Ketika dipanggil dari elisp, Anda harus dapat meneruskan informasi sebagai argumen fungsi. Tentu saja, ini tidak membantu Anda, jika fungsi yang Anda coba panggil tidak mengikuti desain ini.Jawaban:
Masalah menarik. Sepertinya editor menjalankan
post-command-hook
setiap kali memasuki loop-perintah baru, yaitu arecursive-edit
. Tapi kita bisa mulai denganminibuffer-setup-hook
, yang menjalankan fungsi setelah memasuki minibuffer. Meskipun ini memungkinkan memasukkan input, masih terlalu cepat untuk keluar dari minibuffer, karena tangkapan belum diatur.Itu adalah bahwa kita perlu untuk membungkus 'argumen' di dalam 'loop perintah' kita sendiri, yang dijalankan setiap kali kita memasukkan a
recursive-edit
, di mana saat itu muncul satu argumen dan melemparkan satu tingkat ke atas, melaluiexit-minibuffer
.sumber
Saya menulis makro untuk ini disebut
with-simulated-input
, yang bisa Anda dapatkan di sini . Ini memungkinkan Anda untuk memberikan input sewenang-wenang serta mengeksekusi bentuk-bentuk cadel sewenang-wenang untuk mensimulasikan interaksi pengguna.Sebagai contoh:
akan kembali
"hello world"
, dengan "halo" dimasukkan oleh string pertama, "dunia" dimasukkan melalui kode lisp, dan akhirnya "RET" untuk menyelesaikan input.Muncul dengan test suite yang dapat Anda lihat untuk contoh penggunaan lebih lanjut.
sumber
Tampaknya menggunakan
run-with-timer
denganinsert
akan menyelesaikan pekerjaan.Perintah
insert
ketika ditempatkan setelah itu muncul terlalu cepat. Mencoba memasukkan string sebelum ada tempat untuk memasukkannya.sumber
org-export-output-file-name
ketika menggunakanorg-latex-export-to-pdf
sehingga pengguna tidak diminta untuk nama file. Anda dapat menempatkan usaha Anda dalam pertanyaan - misalnyarun-with-timer
,, dll - namun, itu bukan solusi yang baik (menurut saya). Solusi yang lebih baik adalah dengan meneruskan nama file secara terprogram sehingga minibuffer tidak pernah terbuka. Saya akan merekomendasikan menghapus jawaban ini sehingga Anda mendapatkan solusi yang lebih baik oleh seseorang yang lebihelisp
berpengalaman.org-latex-export-to-pdf
bukan yang saya minati. Ini adalah contoh karena Anda sepertinya berniat untuk menambahkan saya. Pertanyaan yang saya ajukan adalah pertanyaan yang saya maksudkan: apakah ada cara untuk secara andal menjawab prompt minibuffer melalui elisp. Solusi kasus demi kasus sangat tidak sesuai dengan yang saya cari. Dari komentar Anda, saya dapat menyimpulkan bahwa itu tidak dianjurkan.