令人困惑的是,emacsclient表示在bash中执行emacs --daemon
之后无法找到套接字:
$ ps aux | grep emacs
shiangro 1744 0.0 0.0 2432784 604 s000 S+ 1:03下午 0:00.00 grep emacs
$ /usr/local/bin/emacs --daemon
("emacs")
Starting Emacs daemon.
Restarting server
$ /usr/local/bin/emacsclient -t
emacsclient: can't find socket; have you started the server?
To start the server in Emacs, type "M-x server-start".
emacsclient: No socket or alternate editor. Please use:
--socket-name
--server-file (or environment variable EMACS_SERVER_FILE)
--alternate-editor (or environment variable ALTERNATE_EDITOR)
我的.emacs中有这个设置:
(server-start)
(setq server-socket-dir "~/.emacs.d/server")
并且它工作,服务器文件~/.emacs.d/server/server
就在那里,但是emacsclient说它找不到套接字,所以我不得不使用-s
选项告诉他套接字文件。 / p>
我发现这个棘手的问题,我想让emacs在每次使用crontab的◎reboot
特殊字符串重新启动(启动)systerm后作为守护进程运行。
在这种情况下,cron成功启动了emacs服务器,服务器文件~/.emacs.d/server/server
也在那里,但后来当我启动一个终端并尝试emacsclient -t
时,它失败并抱怨无法找到套接字文件!
虽然每次我执行emacsclient时都可以使用-s ~/.emacs.d/server/server
来解决此问题,或者将emacsclient命名为emacsclient -s ~/.emacs.d/server/server
,但是这样可以更好地安慰我的心?
背景:
系统:Mac OS X 10.9.2
emacs:由homebrew安装的GNU Emacs 24.3.1
答案 0 :(得分:11)
查找服务器套接字文件是一个棘手的问题,您可以使用lsof
来查找它,然后使用grep
来提取套接字路径/文件名。
lsof -c emacs | grep server | grep -E -o '[^[:blank:]]*$'
或者在您希望运行/Application/Emacs
时在OSX上更改命令名称lsof
正在寻找-c Emacs
。即
lsof -c Emacs | grep server | grep -E -o '[^[:blank:]]*$'
您可以使用cut
代替凌乱的过滤grep
(搜索非空格直到结束[^[:blank:]]*$
)
lsof -c Emacs | grep server | cut -c70-
更好的是,挤压间距并使用cut
的字段切割。
lsof -c Emacs | grep server | tr -s " " | cut -d' ' -f8
既然您已经拥有套接字(或者它是空的),您可以在emacsclient
上进行条件启动,即
#!/bin/bash
socket_file=$(lsof -c Emacs | grep server | tr -s " " | cut -d' ' -f8)
if [[ $socket_file == "" ]]; then
# Just run Emacs (with any arguments passed to the script)
# It would be a good idea to parse the arguments and clean/remove
# anything emacsclient specific.
# (ie. -e should be --eval for emacs)
# note that emacsclient doesn't fix these args for you either
# when using -a / --alternate-editor
emacs $@ &
# or on OSX
/Application/Emacs.app/Contents/MacOS/Emacs $@ &
else
emacsclient $@ -n -s $socket_file
fi
答案 1 :(得分:9)
自从你完成了:
/usr/local/bin/emacs --daemon
服务器已经启动。所以,你实际上并不需要:
(server-start)
(setq server-socket-dir "~/.emacs.d/server")
你的.emacs中的。当您遵循该方法时,服务器将放在/ tmp / emacs502(或者其他一些数字)中。在linux上,emacsclient似乎没有在那里找到它(在那种情况下,我看到/ tmp / emacs1920),所以“emacsclient -nw”工作。我正在使用HomeBrew在OSX上尝试它,就像你一样,我发现我必须使用连接:
emacsclient -nw -s /tmp/emacs502/server
(如果您使用了--deamon = name,那么您将在最后一行使用“name”而不是“server”。)
答案 2 :(得分:1)
我认为emacsclient
只能在标准路径中查找特殊文件server
,例如在/tmp/emacs1000
。如果您更改此参数server-socket-dir
,则应按键emacsclient
将其告知-s
。
答案 3 :(得分:1)
如果我从命令行运行emacs
,则emacsclient仅查找emacs服务器。如果我从Ubuntu启动器运行emacs,则emacsclient
无法连接到服务器。
如果要使用Emacs守护程序而不是服务器,请定义两个环境变量
export ALTERNATE_EDITOR=""
export EDITOR=emacsclient
您可以在~/.bashrc
或~/.profile
中添加这些环境变量。
如果ALTERNATE_EDITOR环境变量为空,则Emacs将运行其守护程序并连接到它。