OSX下Emacs服务器的基本设置


9

我最近在十年内购买了我的第一台Mac,并且正在配置它。我是一名Emacs用户并确定我只需要常规的Emacs而不是Aquamacs,以便我可以使用其他操作系统的现有配置。我已经尝试过跟踪我在网上找到的很多方法(比如这个这个我从网站上下载Emacs的那个),并尝试过各种各样的方式组合,但从来没有让事情进入一个甚至接近我习惯/希望的状态:

  1. Emacs守护程序在启动时在我需要时立即开始运行; 要不是很好。任何新的Emacs帧都由同一台服务器支持。
  2. 当我从Finder打开文本文件时,文件将在Emacs中打开,如果可能,在现有的图形框架中打开。
  3. 如果我运行Emacs.app,系统将重用在后台运行的emacs守护程序,而不是启动新实例并在其上打开新窗口。(帽子小费
  4. 当我从一个终端运行Emacs时终端开始了它的业务,而没有等我完成Emacs(除非我使用'-nw')
  5. 在上述操作过程中,AFAIK在任何时候都不应该处于一种状态(“服务器编辑模式?”),它等待我输入C-x #,尽管我对这个没有深入的了解。
  6. (我认为这是奖励)我可以通过某种方式从终端调用Emacs,以便Emacs尽可能重用现有的帧。

我怎样才能将Emacs配置为这样?

我特别感到困惑的是让Finder以我想要的方式在Emacs中打开东西(#2),因为我发现的指南通常会创建一些别名,Applescripts,bash脚本等等,我不确定我想告诉Finder用来打开文本文件。

谢谢!

A. @lawlist问:“即使存在现有帧,当您从终端打开新文件时,默认情况下是否打开了新帧?” 答案是,如果我在启动时启动服务器的描述在这里,打开一个框架,然后通过键入打开一个文件/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>,我可以得到该文件在现有的框架中打开。如果当前没有框架打开,我必须使用“-nc”或当我尝试打开文件时没有任何反应。

B. @lawlist问:“你想让守护进程在登录时运行,还是在登录后手动加载Emacs就足够了?” 手动运行会很好。


你可以给它们编号,1,2,3,4,5,6,也许还有7和8.此外,即使有一个现有的框架,当你从终端打开一个新文件时默认打开一个新框架?我知道一些答案,但不是全部 - 所以问题的数字会有所帮助。您希望守护进程在登录时运行,还是在登录后手动加载Emacs就足够了?
法律列表

@Lauri Ranta有一个很好的答案。 M-x server-start将手动启动服务器,以便emacsclient与之通信。我已经放入(server-start)我的init.el文件而不是在登录时使用守护进程 - 但是,许多人更喜欢守护进程登录选项。当然,该.emacs文件将是一个合适的地方(server-start)
法律清单

关于从Finder打开文件,我假设你远远超出了需要这样的东西的阶段: dummies.com/how-to/content/ ... 所以,假设这是不合适的,那么你可能会去没关系ns-find-file- 当文件与Emacs.app关联时自动激活。上面链接中的拦截文件功能也会修改ns-find-file您感兴趣的内容。当然,你需要构建Emacs --with-ns
法律清单

Answers:


10

要使Emacs.app在现有框架而不是新框架中打开文件,请添加(setq ns-pop-up-frames nil)到配置文件中~/.emacs

您可以使用open -a emacs file或从终端打开文件emacsclient -n file。如果Emacs.app没有打开但有一个Emacs --daemon进程,由于某种原因emacsclient -n file不起作用,但emacsclient -nc file确实如此。

确保使用您使用的emacsclientEmacs版本中包含的二进制文件/Applications/Emacs.app/Contents/MacOS/bin/emacsclient,或者/usr/local/bin/emacsclient如果您使用Homebrew安装Emacs。

要在登录时启动Emacs服务器,例如将此plist保存为~/Library/LaunchAgents/my.emacsdaemon.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.emacsdaemon</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
    <string>--daemon</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/> <!-- run the program again if it terminates -->
</dict>
</plist>

下次登录时会自动加载plist,但您可以通过运行立即加载它launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist

编辑:我仍然不知道为什么人们将文件类型与AppleScript应用程序相关联,而不仅仅是Emacs.app。kuzzooroo的答案中的脚本也可以写成shell脚本:

macos=/Applications/Emacs.app/Contents/MacOS
if pgrep -qf 'Emacs.*--daemon'; then
  [[ $($macos/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))') = t ]] && args=-nc || args=-n
else
  $macos/Emacs --daemon
  args=-nc
fi
$macos/bin/emacsclient $args "$@"
open -a /Applications/Emacs.app

您可以使用Platypus将脚本另存为应用程序:

我刚开始使用Emacs,但我有一个完全不同的设置。我制作了自己的Emacs应用程序,复制了iTerm.app,更改了Info.plist中的CFBundleIdentifier,以便应用程序使用不同的首选项文件,并将默认命令设置为/usr/local/bin/emacs。我已经加入(server-start)~/.emacs我在登录时打开自定义Emacs的应用程序。我使用Platypus创建了一个运行的应用程序,emacsclient -n "$@";open -b my.emacs并将其作为文本文件的默认应用程序。


2

Lauri的解决方案与评论中的建议相结合,主要解决了我的问题。我粘贴了一些Applescript,我从网上找到的东西拼凑而成。该脚本有助于消除一些剩余的皱纹,例如,如果没有当前的Emacs帧,它的行为会好一点。

编辑:脚本的目的是与Finder中的.txt文件相关联。

-- http://superuser.com/questions/457484/how-to-open-emacs-from-macs-finder
-- https://gist.github.com/ambethia/304964#comment-799519
on run {input}
    set filepath to quoted form of POSIX path of input
    tell application "Terminal"
        try
            -- we look for <= 2 because Emacs --daemon seems to always have an entry in visibile-frame-list even if there isn't
            set frameVisible to do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))'"
            if frameVisible is "t" then
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n " & filepath
            else
                -- there is a not a visible frame, launch one
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n " & filepath
            end if
        on error
            -- daemon is not running, start the daemon and open a frame     
            do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
            do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n"
        end try
    end tell

    -- bring the visible frame to the front
    tell application "Emacs" to activate

    return input
end run
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.