1

Я хотел бы запустить команду оболочки, которая задает несколько интерактивных вопросов, прежде чем продолжить, из Emacs. Функциональность, которую я ищу, похожа на xterm -e <command> , только с открывающимся окном Emacs. Для этого не потребуется слишком много возможностей эмуляции терминала (в основном это несколько раз "y"), но все равно требуется ввод с клавиатуры. Можно ли как-то это сделать?

Я уже пробовал использовать term и ansi-term ; когда дана команда, отличная от /bin /bash, обе сразу закрываются, не оставляя времени, чтобы прочитать, в чем проблема.

2 ответа2

1

Короткий ответ:

M-x terminal-emulator

звучит точно так, как вы просите.

То, что вам нужно, может отличаться - если вам действительно нужно дать программе серию из y строк в stdin, подумайте yes | program Если программа действительно хочет, чтобы ее стандартный вывод был tty, подумайте об использовании expect .

0

Вы можете создать макрос редактирования emacs ("макросы редактирования" - это то, из чего происходит название "emacs"), и в макрос клавиатуры поместить команды, которые запускают скрипты Gnu Bash или другие программы оболочки, и создавать скрипты, которые запрашивают у пользователя Y или N ответы.

Итак, чтобы создать макрос, вы должны сделать что-то вроде этого:

Cx (
Mx new-frame return
Mx shell return (or just Mx eshell return--to use the emacs built-in shell)
bash <bash-program-that-queries-end-user-for-Y-or-N-answers> &
Mx delete-frame
Cx )

Сохраните макрос и поместите его в программу emacs lisp, которую вы загружаете для повторного использования.

Макрос, конечно, будет использоваться с тех пор в emacs, и / или вы можете запустить все это как командный файл из командной строки, как любая другая программа.

Другие инструменты и предложения: Изучите рекурсивное редактирование emacs (которое останавливает и перезапускает макросы и дает конечному пользователю время для ответа на вопросы или даже редактирует вещи) и встроенную функцию emacs «сообщение или ящик» или просто сообщение функция. Вы можете использовать tkquery (простую в настройке программу Tcl/Tk, которая запрашивает у пользователей входные данные) и / или использовать zenity для создания простых графических диалоговых окон, которые легко программировать и которыми могут пользоваться конечные пользователи.

Вы можете создать подпрограмму для вопросов и ответов в Gnu Make и запустить ее в Gnu Emacs. Чтобы сделать это и взаимодействовать с запущенным сеансом Make, вы могли бы использовать process-send-string, например, из одного из моих make-файлов:

echo "(process-send-string \"*compilation*\" \" \\n \") "

Я имею в виду, что вы можете использовать функцию emacs process-send-string, чтобы общаться и отвечать на вопросы Y-or-N с помощью работающей программы Gnu Make, которая работает внутри буфера Gnu Emacs.

И наконец, возвращаясь к вашему вопросу и удивляясь, почему xterm -e <your-program> быстро завершается: вы можете просто сделать что-то вроде emacs -l <emacs-lisp-file-with-question-and-answer-macro-in-it> & disown и / или xterm -e <your-program-which-queries-the-end-users> & disown . Но это зависит от того, как вы хотите запустить программу, как синхронный или асинхронный процесс; Я имею в виду, вы хотите заблокировать запуск программы, пока конечный пользователь отвечает на вопрос (ы) или нет?

С этими инструментами я думаю, вы можете получить то, что вы хотите с Gnu Emacs; и, поскольку Gnu Emacs является расширяемым, вы, безусловно, можете заставить его делать то, что вы хотите каким-то образом - если вы расширяете его, программируя его самостоятельно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .