Запустить интерактивную команду оболочки как буфер emacs

Запустить интерактивную команду оболочки как буфер emacs

Я хотел бы запустить команду оболочки, которая задает несколько интерактивных вопросов перед продолжением работы, из 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> & disownand/or xterm -e <your-program-which-queries-the-end-users> & disown. Но это зависит от того, как вы хотите запустить программу, как синхронный или асинхронный процесс; я имею в виду, хотите ли вы заблокировать запуск программы, пока конечный пользователь отвечает на вопрос(ы) или нет?

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

Связанный контент