vlambda博客
学习文章列表

在MacOS上自动运行Emacs服务器

随着我攒的Emacs配置越来越多,Emacs在我的Mac笔记本上启动也越来越慢了。我希望Emacs能像nano那样,在我需要查看或编辑文件的时候瞬间启动,但又不想失去攒了很久的配置和主题,怎么办呢?


有一个办法是将Emacs启动成服务器模式,在需要编辑器的时候只需要启动一个Emacs客户端即可。这个办法既能达到快速启动编辑器的目的,又能提供一个带全部配置和主题的Emacs。在Linux上这是个常见的用法,但在Mac笔记本上如何实现?


创建plist文件

首先在LaunchAgents目录下给Emacs服务器创建一个plist文件:

~/Library/LaunchAgents/emacs.daemon.plist


假设Emacs二进制文件在/Applications/Emacs.app/Contents/MacOS/Emacs,内容示例如下:

<?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>emacs.daemon</string> <key>ProgramArguments</key> <array> <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string> <string>--daemon</string> </array> <key>RunAtLoad</key> <true/> <key>ServiceDescription</key> <string>Emacs Daemon</string> </dict></plist>


加入自动启动

将创建好的plist文件加载到自动启动:

launchctl load -w ~/Library/LaunchAgents/emacs.daemon.plist

手动启动或停止Emacs服务器:

launchctl start emacs.daemonlaunchctl stop emacs.daemon

如果需要将plist从自动启动中移除:

launchctl unload ~/Library/LaunchAgents/emacs.daemon.plist

如果Emacs服务器启动成功,用ps命令应该能找到相应的进程:

ps aux|grep "[Ee]macs"


Emacs客户端

有了Emacs服务器,接下来就可以随时调用Emacs客户端了:

emacsclient ~/.bash_profile


要注意的坑

如果系统里有多个Emacs版本(例如MacOS可能会自带一个旧版本的Emacs,而你又安装了新版的Emacs),这时候就必须保证你使用的Emacs客户端和服务器版本一致。

例如,假设Emacs服务器是在这里:

/Applications/Emacs.app/Contents/MacOS/Emacs

那么Emacs客户端程序也需要是同一个版本:

/Applications/Emacs.app/Contents/MacOS/bin/emacsclient

如果和服务器版本不一致,Emacs客户端就不能正常启动。


另外一个要注意的是图形界面:Emacs客户端默认情况下是启动成终端模式(文本模式),如果需要图形界面,要加上"--c"参数:

emacsclient --c