
Я хотел бы запустить команду оболочки, которая задает несколько интерактивных вопросов перед продолжением работы, из Emacs. Функциональность, которую я ищу, похожа на xterm -e <command>
, только вместо этого открывается окно Emacs. Для этого не потребуется слишком много возможностей эмуляции терминала (это в основном нажатие "y" несколько раз), но все равно потребуется ввод с клавиатуры. Возможно ли это как-то сделать?
Я уже пробовал использовать term
и ansi-term
; при вводе команды, отличной от /bin/bash, обе немедленно закрываются, не оставляя времени разобраться, в чем проблема.
решение1
Короткий ответ:
M-x terminal-emulator
звучит именно так, как вы просите.
Что тынуждатьсяможет отличаться - если вам действительно нужно просто передать программе ряд y
строк на stdin, рассмотрите yes | program
. Если программа действительно хочет, чтобы ее stdin был tty, рассмотрите использование expect
.
решение2
Вы можете создать макрос редактирования 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 message-or-box или просто функцию message. Вы можете использовать tkquery (легкую в настройке программу Tcl/Tk, которая запрашивает у пользователей входные данные) и/или использовать zenity для создания простых графических интерактивных окон, которые легко программировать и использовать конечным пользователям.
Вы можете создать процедуру вопросов и ответов в Gnu Make и запустить ее в Gnu Emacs. Чтобы сделать это и взаимодействовать с запущенным сеансом Make, вы можете использовать process-send-string, как в этом отрывке из одного из моих makefiles:
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
and/or xterm -e <your-program-which-queries-the-end-users> & disown
. Но это зависит от того, как вы хотите запустить программу, как синхронный или асинхронный процесс; я имею в виду, хотите ли вы заблокировать запуск программы, пока конечный пользователь отвечает на вопрос(ы) или нет?
Я думаю, что, имея эти инструменты под рукой, вы сможете добиться от Gnu Emacs всего, чего захотите; а поскольку Gnu Emacs расширяем, вы, безусловно, сможете заставить его делать то, что вам нужно, если расширите его, запрограммировав самостоятельно.