当使用“ open -a”打开时,Emacs在新框架中打开文件


20

我希望能够从命令行调用Emacs,并在图形Emacs未运行时启动它,或者访问已经运行的Emacs中的文件。我尝试执行此操作emacsclient,我知道这是“正确”的方法,但是在OS X上我遇到了很多问题,它会随机崩溃,或者emacs --daemon在关闭或重新启动计算机的过程中挂起,和一般的脆弱感 尽管我想让它正常工作,但目前open -a实际上效果要好得多,除了这个问题,我将在下面进行描述:

open -a像这样使用:

$ open -a Emacs file.txt

如果Emacs不在运行,它将启动Emacs并访问该文件。但是如果我不在当前缓冲区时执行此*scratch*操作,则会在新框架(即新系统窗口)中打开文件。

这是一个示例会话:

$ open -a Emacs file.txt

这将启动Emacs并打开file.txt,因此其中有一个带有此缓冲区的框架。如果我切换到*scratch*缓冲区,并执行以下操作:

$ open -a Emacs file1.txt

它将在同一框架中打开此文件。现在有一个打开此文件的框架,如果我这样做:

$ open -a Emacs file2.txt 

它将打开一个新框架,从而导致同时打开两个框架。

我尝试使用--args切换到open,将命令行参数修改为Emacs ,但是对于随后的调用似乎不起作用,例如:

$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'

这只会在消息缓冲区中打印“ foo”……第二次将Emacs带到前台,但没有消息被打印。

我不确定如何open与已经在运行的应用程序进行通信,有人知道我能找到什么吗?还是有某种方法可以获取比Messages缓冲区更详细的运行日志?在上面的会话中,没有什么有趣的内容打印到该缓冲区,所以我不知道我该如何破解一些Emacs Lisp来做我想做的事情...

谢谢!


我对OSX一无所知,所以我无法提供任何具体信息。但是,如果我要调试它,我会向其中抛出一些语法错误find-file,然后将其设置debug-on-error为t,并检查堆栈跟踪以了解有关如何调用Emacs的一些线索。添加错误find-file可能就像将函数定义复制到lisp暂存缓冲区并error在其中添加调用一样简单(例如(error "cause stack trace"),永远不要更改源文件find-file-始终在暂存缓冲区中执行此操作!
Joe Casadonte

@乔谢谢!这是一个很好的主意,我会在未来牢记这一点。其实,我结束了试图用emacsclient一遍,用它开始(server-start)在我init.el看来是工作不比emacs --daemon在启动时,这是我一直在努力,我第一次尝试emacsclient
michiakig 2011年

Answers:


26

答案在这里: emacs变量在原始框架中“以...打开”

这是对较新版本的emacs中默认设置的更改。加:

(setq ns-pop-up-frames nil)

到.emacs文件。

很高兴找到这个。


这非常有帮助!加上别名,open -a /Applications/Emacs.app $1似乎一切正常!请注意,我是在init中启动服务器的,以使emacs可用于git。
Dror
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.