这可以视为以下事项的后续行动: 如何从 emacs 保存 shell 历史记录并在终端中使用它?
我尝试使用 .emacs 文件中的以下内容强制 bash 退出,但不起作用,即使我在单词“exit”后嵌入了 ^M 字符。这能起作用吗?
(defun bye ()
"Leaving emacs now"
(interactive)
(shell)
(goto-char (point-max))
(insert-string "exit"))
(add-hook 'kill-emacs-hook 'bye)
答案1
您所做的事情不起作用的部分原因是因为它(shell)
实际上启动了一个新的劣质 shell,而该 shell 可能是也可能不是 的目标(insert-string)
;无论如何,它最多能完成的事情就是退出劣质 shell。Emacs 维基对这个问题有一个未解答的问题,这在任何问题上都是相对罕见的;介于此,以及非批处理模式的 Emacs 对以任何方式与其父进程通信表现出的普遍不感兴趣,我倾向于怀疑你所尝试的事情是否可行。
但这并不意味着你不能得到想要的结果——毕竟,你不需要让 Emacs 与其父进程进行通信;如果你代替使用 Emacs 监控您的 shell 进程,那么您使用的任何终端都会在 Emacs 退出时同时退出,就像任何终端附加到其 pty 的进程完成时一样。
方法将根据您所用的 shell 而有所不同,但在 Bash、zsh 以及可能的 tcsh 中(假设仍有人在使用它),您只需要在 Emacs 调用前面加上exec
-- 如果您通常说emacs -nw
,那么请改说exec emacs -nw
,&c。
这假设您直接从 shell 调用 Emacs,这似乎是可能的。如果您使用(例如)shell 脚本来调用 Emacs,这将不起作用,因为exec
将替换执行脚本的 shell 进程,而不是绑定到您的 pty 的进程;在这种情况下,只需使用exec
shell 脚本,您仍然应该得到您想要的结果,除非您的脚本做了一些非常奇怪的事情,在这种情况下您应该更新您的问题以包含它,并且有人可能会找出可行的方法。