dcdr
2023 年9 月 24 日 23:16
1
开始在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 个赞
Nasy
2023 年9 月 25 日 00:56
2
先说下我的解决方案,不过已经不用emacs-mac了,也许现在有进步?
解决方案就是不使用emacs --daemon
,而是用(server-start)
. 永远不关GUI frame,以及做一个启动速度飞快的配置。
然后历史:
这个emacs-mac问题,一直以来都没有什么好方法…关了GUI就是不能create GUI frame.
已打开 09:24PM - 19 Jan 16 UTC
I have linked:
```
/usr/local/bin/emacsclient -> /Applications/Emacs.app/Conte… nts/MacOS/bin/emacsclient
```
The command:
```
% emacsclient -t
```
(or --tty or -nw) should open a frame in the current tty. Instead, if `Emacs.app` is open and the server is running, it opens a new frame in the GUI, whether or not -t is passed. If, on the other hand, `emacsclient` is invoked first (running emacs in `--daemon` mode), as:
```
% emacsclient -a ""
```
(which in the background launches
`/Applications/Emacs.app/Contents/MacOS/Emacs --daemon=^J5,6^J`) further calls to `emacsclient` to open a GUI frame do not function:
```
% emacsclient -c foo
```
(opens a tty frame)
```
% emacsclient foo
Waiting for Emacs...
```
(hangs, no window opens)
It also seems to be impossible to have `emacsclient` open `Emacs.app` if the latter is not already running. I have had this setup (using `emacsclient` to go back and forth between GUI and TTY frames) working with vanilla Carbon `Emacs.app` (but it's been some time).
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
dcdr
2023 年9 月 25 日 04:48
5
Zarkli:
eglot
搜了下, eglot 不是 LSP 的代替品么? 跟 emacsclient 不是代替关系吧
dcdr
2023 年9 月 25 日 04:50
6
@Nasy 多谢解答. 但是这样好劝退Mac用户.
刚刚误删了回帖
对的,eglot 是 emacs 29 之后就内置的 lsp 替代品。我的意思其实是我用 emacs 29, 启动 emacsclient, 在使用 eglot 的情况下,有时候能感到明显的卡顿,相较之下,不用 emacsclient 就感觉舒服很多了。如果你觉得卡顿也可以试试看会不会是 emacsclient 的问题。
请教下大家,什么情况下用 emacsclient ?
dcdr
2023 年9 月 25 日 06:43
11
目前试验出来能用的方案是这样:
使用 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?
dcdr
2023 年9 月 25 日 07:19
13
这个不知道. 可能不行.
不过你可以在任何 remote linux 机器 (应该包括 Docker 里) 上开 emacs --daemon
, 然后在那个机器上跑 emacsclient -c xxx
这样的话,还是直接开,直接用。在相应的配置下,控制打开的时长在1秒内。感觉就好多了~ 避免长时间等待。
用Emacsclient可能还有个问题,配置更新,要不热加载,要不重启Emacs deamon 守护进程服务,这就复杂了 ~
不知道从 session/workspace 的管理方面会不会带来些方便?
dcdr
2023 年9 月 25 日 08:03
15
刚刚配置了下Raycast, 可以不开显示地开terminal 来开启 emacsclient -c xxx
了.
用这个就行: Raycast Store: Shell
回头只需要配置好这个 mac-pseudo-daemon , 应该就可以比较完美地使用了: 随时瞬开 GUI-based emacsclient. 这个是在 @Nasy 给的issue 里找的,非常感谢.
1 个赞
dcdr
2023 年9 月 25 日 08:10
16
@EthanLin 还有, 使用 emacsclient 不只是为了一个 emacs 窗口打开得快.
按照我的理解和测试, 是可以任意多个emacs窗口都可以瞬开.
这样才有使用 IDE (JetBrains) 或者 VSCode 的体验.
1 个赞
bxd
2023 年9 月 25 日 11:47
17
1 个赞
这个没有差别啊,emacsclient最终还是用的emacs
早上Mac下试了,确实没区别。
正常运行Emac,再启动新的Frame,也是秒开。不知道这个emacsclient有什么特殊用途