gnu 屏幕中 emacs 中 shell 缓冲区中的命令

command in shell buffer in emacs in gnu screen

问题 How do I define an Emacs List function to spawn a shell buffer with a particular command executed in the shell 的出色答案奇怪地在 Gnu "screen" 会话中不起作用。在屏幕命令的上下文中,而不是我告诉它执行的命令,

echo 'test1'\n

,Emacs被递归调用了!可能的 shell 缓冲区包含熟悉的 "emacs: Terminal type "dumb" is not powerful enough to 运行 Emacs" 消息。

我怎样才能完成这项工作?这是我所做的:

在命令行上:

~  srn@basil{1}% screen -s run-emacs2

这是 shell 脚本 运行-emacs2:

#!/bin/bash
EMACS=/usr/bin/emacs23-x
export NO_AT_BRIDGE=1  ## suppress annoying gtk>2 warning
exec "$EMACS" -nw --load init.el.test -f spawn-shell

注意:如果在命令行上我说:

~  srn@basil{1}% run-emacs2

...一切正常。问题似乎是与 Gnu 屏幕的一些交互。

这里是 init.el.test(几乎是从上面链接的答案中逐字记录的):

(defun spawn-shell ()
  "Invoke shell test"
  (pop-to-buffer (get-buffer-create (generate-new-buffer-name "gzo")))
  (shell (current-buffer))
  (process-send-string nil "echo 'test1'\n"))

这是预期的行为。根据 screen 手册,-s 选项在哪里看:

-s program

Set the default shell to be program. By default, screen uses the value of the environment variable $SHELL, or /bin/sh if it is not defined. This option is equivalent to the shell command (see Shell).

screen程序将$SHELL变量设置为程序(作为打开新的window的一部分),它是继承的在子进程中,它依次运行 $SHELL 恰好是什么。由于您不希望这样,解决方法是将 emacs 脚本修改为 reset $SHELL 回到 /bin/sh before 运行一个“shell”。