在OS X上使用Emacs 23 - 使用多个实例还是emacsclient?

6
我想知道有没有人对在OS X上设置emacs 23有什么建议。我已经使用Linux / Windows一段时间了,在那里,我只需打开许多emacs实例并且它们是独立的 - 例如,我可以在不同的框架中拥有两个单独的文件,每个文件都有自己的R,Python和/或shell运行。我认为这是不被赞成的(?)-但它保持了每个脚本文件的工作目录分开,我很喜欢这一点。
我理解在我的.emacs文件中设置(server-start)并通过调用'emacsclient'而不是'Emacs'现在是首选的方式(?)。我找到了这个线程,它通过一个Applescript实现了这一点: Emacs 23, OS X, multi-tty and emacsclient 但我想知道除此之外是否还有其他方法 - 当我在OS X上打开两个emacs实例时,它会给我错误提示:
** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x3803, name = 'org.gnu.Emacs.ServiceProvider'

但是打开了一个新的框架,让我可以编辑文件。我知道在OS X上使用vim有一个叫做“mvim”的东西,允许启动多个vim实例,但是emacs有类似的东西吗?抱歉问题有点冗长 - 总之,我想请教您以下问题:

(1) 'emacsclient'是专家的方法吗? (2) 如果不是必须的,是否有办法在OS X上运行多个emacs 23实例(不仅仅是框架)?

谢谢!

6个回答

7
如果你想要多个emacs实例(而不是框架),请在终端提示符下使用以下命令:
/Applications/Emacs.app/Contents/MacOS/Emacs &

(Generic form for any app) /Path_To_Application.app/Contents/MacOS/Application &

这可能会让你遇到麻烦;如果多个实例互相覆盖了临时文件,我不会感到惊讶。在我的情况下,我有一些位于.emacs.d中的文件/目录,例如auto-save-listbackupsbookmarksido.lastplacesprojectile.cache - David J.
如果您想要使用不同的配置目录运行多个实例,请查看以下内容:如何使用自定义user-emacs-directory启动emacs(在相对较新的Emacs StackExchange上,值得一看)。 - David J.

7

让我间接回答你的问题。

正如你所知,emacsclient 提供了一项服务,允许用户在现有的 Emacs 中从外部打开文档。这是专家们的"方法"吗?这取决于专家。我是Emacs的重度用户,但从未使用过 emacsclient。为什么?因为我从一开始就从未离开过Emacs。我运行的所有shell都在Emacs中(使用自制的 screen 包),我在Emacs中阅读邮件等等。我从来没有理由在命令行中输入 emacsclient

你的使用模式似乎是喜欢同时运行多个Emacs,这样更容易跟踪哪些进程和文件一起使用。这很有道理。如果你愿意,你可以在一个Emacs中完成所有操作,但可能需要改变你的使用模式或进行一些自定义来管理多个解释器/ shell/其他内容以满足你的需要。
因此,如果你喜欢同时运行多个Emacs,请继续这样做。
关于第二个问题,看起来在你的.emacs文件中有(server-start)会导致问题-可能是因为两个Emacs尝试使用相同的端口而发生冲突。查看文档以启动服务器,并从你的.emacs文件中删除该行,改为使用--daemon命令行选项启动服务器一次即可。

然后,在命令行中,您可以选择是启动新的emacs(输入emacs)还是连接到您启动的服务器(输入emacsclient)。


感谢您的回复-当我得到bootstrap_register失败时,我没有(server-start),并且在服务器运行并启动另一个实例时仍会收到警告(无法连接到服务器)。 我认为这是OS X应用程序的问题:http://osdir.com/ml/emacs.macintosh.osx/2005-07/msg00036.html,并且Carbon Emacs页面预示着在打开多个实例时会出现警告。 从我所了解的情况来看,我的选择是(1)忽略警告并继续在第二/第三/ ...实例中工作,或者(2)变得更好地尝试管理多个工作目录。 - hatmatrix
感谢您的建议。您的建议确实有效,尽管会出现警告(而且我编辑的第一个文件与服务器实例相关联)。 - hatmatrix
我几天前需要运行emacsclient从家里访问我的工作会话,以便我可以检查在shell中运行的一些命令的输出。我还喜欢将其用作$ EDITOR,以便我可以拥有一个漂亮的环境来编辑crontabs等文件。 - Kirk Strauser
当我读到“我从不离开Emacs”时,我真的希望我也能在其中进行网页浏览。 - Bleeding Fingers

4
这是一个简单的shell脚本,将启动一个独立的Emacs实例,提升Emacs窗口并将其置于焦点位置:
#!/bin/bash

/Applications/Emacs.app/Contents/MacOS/Emacs \
    --eval '(select-frame-set-input-focus (nth 0 (frame-list)))' \
    "$@"

注意事项:

  • 这个脚本让emacs的行为像我习惯的Linux上的emacs。
  • 可能有比'(nth 0 (frame-list))'更好的方式来识别要激活的窗口,但是上面的脚本对我来说做到了正确的事情。
  • 我的.emacs文件中没有'(server-start)'。

1
我在我的.emacs中使用类似这样的代码,只有在服务器没有运行时才调用server-start函数:
(if (file-exists-p
 (concat (getenv "TMPDIR") "emacs"
         (number-to-string
          (user-real-uid)) "/server"))
nil (server-start))

然后我对我的.zshrc进行了一些更改,以便我可以毫不费力地从Shell中运行ec作为我的编辑器命令:

# I use the Emacs package from emacsformacosx.com
alias emacs='open -a emacs'
alias emacsclient='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'
alias ec='emacsclient -a /Applications/Emacs.app/Contents/MacOS/Emacs'
export EDITOR='ec'

太好了!我不知道第一个表达式——我认为检查服务器是否正在运行会更直接,但这似乎可以工作。 - hatmatrix
可能有更好的方法来判断服务器是否在运行,但这是我想到的第一个方法 :) - markhellewell
此处可使用server-process变量。如果您正在使用--daemon选项,则还需要检查(daemonp),并了解在处理完您的初始化文件和任何命令行参数之前,服务器不会启动。有关详细信息,请参阅(command-line)函数的末尾附近。 - phils

1

我创建了这个shell脚本,它可以让你同时打开多个emacs实例。

安装很简单,只需将emacs-ide脚本复制到/usr/local/bin/或任何在$PATH中的目录即可。

你可以使用多个文件或目录来运行多个Emacs实例,例如:

emacs-ide ~/Projects/project-1
emacs-ide ~/Projects/project-2

该脚本还会将窗口名称设置为与正在编辑的目录(项目)或文件相匹配。

0

使用

open -a -n /Applications/Emacs.app

在我的电脑上出现了一个弹窗"Emacs意外退出",导致我无法正常使用。(系统版本:OS X Yosemite 10.10.3,软件版本:Emacs 24.3.1 x86_64-apple-darwin)

为了解决这个问题,我安装了Aquamacs和Emacs,这样至少我可以同时运行两个编辑器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接