如何在Mac OS上启动 GUI版emacsclient

开始在Mac OS上学习emacs, 按照 Doom Emacs 上的安装方案, 安装了emacs-mac.

brew tap railwaycat/emacsmacport
brew install emacs-mac --with-modules
ln -s /usr/local/opt/emacs-mac/Emacs.app /Applications/Emacs.app

安装完之后, 能用Emacs.app打开 GUI based emacs, Mac OS 的 menu bar 显示正常, 使用鼠标的话, 能在 buffer 中改变光标的位置. 所以 GUI based emacs 使用正常.

在安装Doom之前, 我尝试使用原生的emacs daemon + emacsclient

emacs --daemon
emacsclient  -c  tmp

发现我用 emacsclient -c tmp 打开的 emacs 总是 text/terminal based, 不是 GUI based. 比如没有 Mac OS app 都应该有的 menu bar, 使用鼠标也不能在buffer 中改变光标的位置… 请问大家如何解决这个问题的?

1 个赞

先说下我的解决方案,不过已经不用emacs-mac了,也许现在有进步? 解决方案就是不使用emacs --daemon,而是用(server-start). 永远不关GUI frame,以及做一个启动速度飞快的配置。

然后历史:

这个emacs-mac问题,一直以来都没有什么好方法…关了GUI就是不能create GUI frame.

It’s a known issue that multi-tty not supported in mac port. As developers words

The developer has no idea how to detach Emacs as a GUI application from Window Server or Dock without separating a GUI process (not thread) from the main Emacs (Lisp evaluator) process.

前人有做过patch,但无意merge。

有一说一,我觉得 emacsclient 的性能比较差。emacs 29 + eglot

搜了下, eglot 不是 LSP 的代替品么? 跟 emacsclient 不是代替关系吧

@Nasy 多谢解答. 但是这样好劝退Mac用户.

刚刚误删了回帖

对的,eglot 是 emacs 29 之后就内置的 lsp 替代品。我的意思其实是我用 emacs 29, 启动 emacsclient, 在使用 eglot 的情况下,有时候能感到明显的卡顿,相较之下,不用 emacsclient 就感觉舒服很多了。如果你觉得卡顿也可以试试看会不会是 emacsclient 的问题。

好的, 多谢解释.

请教下大家,什么情况下用 emacsclient ?

为了让 emacs 窗口总是瞬间打开.

目前试验出来能用的方案是这样:

使用 Emacs.app 打开 GUI based Emacs, 然后 M-x, start server (从这里打开 daemon). 然后保持这个 GUI based Emacs 不关闭. 然后就用 emacsclient -c 就是打开 GUI based emacs 了.

缺点是挺不自然的: 得有个 GUI-based Emacs.app 再那里开着.

而且也还没搞懂如何从 Raycast/Alfread 里直接打开 emacsclient -c, 需要用 terminal…

1 个赞

谢谢

有没有,server- client 这个用法? 比如 在Docker中运行 Emacs deamon, 在host 中,多开 Emacs clientclient?

这个不知道. 可能不行.

不过你可以在任何 remote linux 机器 (应该包括 Docker 里) 上开 emacs --daemon, 然后在那个机器上跑 emacsclient -c xxx

这样的话,还是直接开,直接用。在相应的配置下,控制打开的时长在1秒内。感觉就好多了~ 避免长时间等待。

用Emacsclient可能还有个问题,配置更新,要不热加载,要不重启Emacs deamon 守护进程服务,这就复杂了 ~

不知道从 session/workspace 的管理方面会不会带来些方便?

刚刚配置了下Raycast, 可以不开显示地开terminal 来开启 emacsclient -c xxx 了. 用这个就行: Raycast Store: Shell

回头只需要配置好这个 mac-pseudo-daemon, 应该就可以比较完美地使用了: 随时瞬开 GUI-based emacsclient. 这个是在 @Nasy 给的issue里找的,非常感谢.

1 个赞

@EthanLin 还有, 使用 emacsclient 不只是为了一个 emacs 窗口打开得快. 按照我的理解和测试, 是可以任意多个emacs窗口都可以瞬开. 这样才有使用 IDE (JetBrains) 或者 VSCode 的体验.

1 个赞

我遇到类似问题,不过是在windows上,死活启动不了terminal下的frame,有没有大佬知道怎么解决呀? :joy: 我的问题在: windows下怎么用client启动一个terminal下的frame? - Emacs-general - Emacs China (emacs-china.org)

1 个赞

这个没有差别啊,emacsclient最终还是用的emacs

Windows下用emacsclientw

emacsclientw -a "" -n -c 

不行,它启动gui frame

早上Mac下试了,确实没区别。

正常运行Emac,再启动新的Frame,也是秒开。不知道这个emacsclient有什么特殊用途