2

Это можно считать продолжением:Как сохранить историю оболочки из emacs и использовать ее в терминале?

Я пытаюсь заставить bash завершить работу с помощью следующего в моем файле .emacs, но это не работает, даже если я добавляю символ ^ M после слова "выход". Можно ли заставить это работать?

(defun bye ()
  "Leaving emacs now"
  (interactive)
  (shell)
  (goto-char (point-max))
  (insert-string "exit"))
(add-hook 'kill-emacs-hook 'bye)

1 ответ1

0

Частично причина того, что вы не работаете, заключается в том, что (shell) фактически запускает новую подчиненную оболочку, которая может или не может быть целью для (insert-string) ; в любом случае, самое большее, что он мог бы сделать, - это выйти из нижней оболочки. В вики Emacs есть оставшийся без ответа вопрос по этому вопросу, который относительно редко встречается там по любому вопросу; между этим и общей незаинтересованностью Emacs не в пакетном режиме при общении с его родительским процессом любыми средствами, я склонен сомневаться в том, что вы пытаетесь это сделать возможным.

Это, однако, не означает, что вы не можете получить желаемый результат - в конце концов, вам не нужно, чтобы Emacs связывался с его родительским процессом; если вы замените свой процесс оболочки на Emacs, то любой терминал, который вы используете, выйдет в то же время, что и Emacs, точно так же, как любой терминал, когда процесс, присоединенный к его pty, завершится.

Метод будет различаться в зависимости от вашей оболочки, но в Bash, zsh и, возможно, также в tcsh (при условии, что кто-то все еще использует его), вам нужно просто предварять вызов Emacs с помощью exec - если вы обычно говорите emacs -nw , вместо этого говорите exec emacs -nw , & c.

Это предполагает, что вы вызываете Emacs непосредственно из оболочки, что кажется вероятным. Если вы используете (например) сценарий оболочки для вызова Emacs, это не сработает, потому что exec заменит процесс оболочки, выполняющий сценарий, а не связанный с вашим pty; в этом случае просто exec вместо этого сценарий оболочки, и вы все равно получите желаемый результат, если только ваш сценарий не делает что-то действительно странное, в этом случае вы должны обновить свой вопрос, чтобы включить его, и кто-то, вероятно, сможет что-то придумать это сработает.

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