如何在emacs启动时打开多个shell buffer并分别命名

如题,我尝试写了一段代码

(shell)
(rename-buffer "name1")
(shell)
(rename-buffer "name2")
(shell)
(rename-buffer "name3")

然而当我用eval-buffer运行这段代码的时候,程序停在第4行,并且返回

Buffer name ‘name1’ is in use

有没有懂elisp的给解释一下怎么解决?

你的代码假设 shell 会把生成的 Buffer 设置成 Current Buffer,这个假设虽然很「重」(想象用户通过某种方式令 shell 在后台开启,而不需要显示它),但默认是对的,用 M-x eval-region 能正确执行,但是 M-x eval-buffer 会出现你提到的问题,可能是 eval-buffer 的 Bug,下面是一个重现的代码,eval-buffer 会执行第一段代码两次:

;; 第一段
(pop-to-buffer (get-buffer-create "*foo*"))
(message "==> hello")
(rename-buffer "111")

;; 第二段
(pop-to-buffer (get-buffer-create "*foo*"))
(message "==> world")
(rename-buffer "222")

更简单而靠谱的办法利用 shell 的参数 BUFFER 或者返回值。

2 个赞

嗯,用参数会比较简单,谢谢你。