OSX下Emacs服务器的基本设置

kuz*_*roo 9 mac emacs macos

我最近买了十年来的第一台 Mac,正在配置它。我是 Emacs 用户,并确定我想要普通的 Emacs而不是 Aquamacs,这样我就可以使用其他操作系统的现有配置。我尝试遵循我在网上找到的许多操作方法(例如我下载 Emacs 的站点上的这个这个这个),并尝试以多种方式组合这些部分,但从未使事情进入一种状态,甚至接近我习惯/希望的状态:

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

我怎么能配置 Emacs 来表现得像这样?

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

谢谢!

A. @lawlist 询问,“即使存在现有框架,当您从终端打开新文件时,是否默认打开新框架?” 答案是,如果我按照此处所述在启动时启动服务器,打开一个框架,然后通过键入 打开一个文件/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>,我可以在现有框架中打开该文件。如果当前没有打开的框架,我必须使用“-nc”,或者当我尝试打开文件时什么也没有发生。

B. @lawlist 询问,“您希望守护进程在登录时运行,还是在登录后手动加载 Emacs 就足够了?” 手动运行就好了。

Lri*_*Lri 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可以。

确保您使用emacsclient包含在您使用的 Emacs 版本中的二进制文件,例如/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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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


归档时间:

查看次数:

4893 次

最近记录:

11 年,9 月 前