执行'emacs --daemon'后为什么emacsclient无法找到套接字

时间:2014-04-18 06:37:45

标签: emacs

令人困惑的是,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

4 个答案:

答案 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将运行其守护程序并连接到它。