Иногда я использую интерактивные функции внутри функции, которую я пишу для собственного использования. Если функция запрашивает некоторую информацию (например, «Выходной файл: ~ /»), существует ли общий способ добавления текста в минибуфер, а затем нажмите клавишу ВВОД, чтобы пользователю не нужно было это делать?
В качестве примера предположим, что я хочу запустить org-latex-export-to-pdf
внутри функции, но не хочу, чтобы пользователь указывал имя файла. Запуск (org-latex-export-to-pdf)
переместит точку в минибуфер, но, похоже, что-то вроде (insert "filename.tex")
следующей строки не работает.
interactive
предложении. При вызове из elisp вы должны быть в состоянии передать информацию в качестве аргумента функции. Конечно, это не поможет вам, если функция, которую вы пытаетесь вызвать, не соответствует этой схеме.Ответы:
Интересная проблема. Похоже , редактор запускается
post-command-hook
каждый раз , когда он вводит новую команду петлю, т.е.recursive-edit
. Но мы можем начать с тогоminibuffer-setup-hook
, что выполняет функцию после входа в минибуфер. Хотя это позволяет вставлять ввод, слишком рано выходить из минибуфера, потому что перехват еще не настроен.Вот где нам нужно обернуть «аргументы» в нашем собственном «командном цикле», который выполняется каждый раз, когда мы вводим a
recursive-edit
, и в этот момент он получает один аргумент и выбрасывает на один уровень вверх черезexit-minibuffer
.источник
Я написал для этого макрос
with-simulated-input
, который вы можете получить здесь . Это позволяет вам предоставлять произвольный ввод, а также выполнять произвольные формы lisp для имитации взаимодействия с пользователем.Например:
возвратил бы
"hello world"
, с "hello", вставленным первой строкой, "world", вставленным через код lisp, и, наконец, "RET", чтобы завершить ввод.Он поставляется с набором тестов, который вы можете посмотреть для большего количества примеров использования.
источник
Похоже, что использование
run-with-timer
сinsert
сделает работу.Команда,
insert
помещенная впоследствии, появляется слишком быстро. Он пытается вставить строку, прежде чем найдется место для ее вставки.источник
org-export-output-file-name
при использовании,org-latex-export-to-pdf
чтобы у пользователя не запрашивалось имя файла. Вы можете приложить свои усилия в вопросе - например,run-with-timer
и т. Д. - однако, это не очень хорошее решение (на мой взгляд). Лучшее решение - правильно передать имя файла программно, чтобы минибуфер никогда не открывался. Я бы порекомендовал удалить этот ответ, чтобы кто-то с большимelisp
опытом получил лучшее решение .org-latex-export-to-pdf
, не тот, который меня интересует. Это пример, поскольку вы, похоже, намеревались добавить его. Я задал вопрос, который я имел в виду: есть ли способ надежно ответить на запрос минибуфера через elisp. Индивидуальное решение очень не то, что я ищу. Из вашего комментария могу сделать вывод, что это не рекомендуется.