2014-04-18 16 views
8

Nó là như vậy khó hiểu emacsclient mà nói nó không thể tìm thấy ổ cắm ngay sau khi thực hiện emacs --daemon trong bash:Tại sao emacsclient không thể tìm thấy ổ cắm sau khi thực hiện '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) 

tôi có các cài đặt này trong emacs của tôi:

(server-start) 
(setq server-socket-dir "~/.emacs.d/server") 

và nó hoạt động, các tập tin máy chủ ~/.emacs.d/server/server chỉ ở đó, nhưng emacsclient nói rằng nó không thể tìm thấy ổ cắm, vì vậy gây phiền nhiễu mà tôi phải nói cho anh ta những file socket sử dụng tùy chọn -s.

Tôi thấy vấn đề hóc búa này trong khi tôi muốn để các emacs chạy như một daemon sau mỗi lần khởi động lại (bắt đầu) systerm bằng cách sử dụng các chuỗi đặc biệt của crontab ◎reboot. Trong trường hợp này, cron khởi động thành công máy chủ emacs và tập tin máy chủ ~/.emacs.d/server/server cũng ở đó, nhưng sau đó khi tôi khởi động một thiết bị đầu cuối và cố gắng emacsclient -t, nó bị lỗi và không thể tìm thấy tập tin ổ cắm!

Mặc dù tôi có thể bỏ qua vấn đề này bằng cách sử dụng -s ~/.emacs.d/server/server mỗi khi tôi chỉ định emacsclient, hoặc bí danh emacsclient là emacsclient -s ~/.emacs.d/server/server, nhưng có cách nào tốt hơn để an ủi trái tim tôi không?

Backgroud:

hệ thống: Mac OS X 10.9.2

emacs: GNU Emacs 24.3.1 cài đặt bởi homebrew

+1

Bạn đang mong đợi không quen thuộc để tự động biết giá trị chỉ tồn tại trong máy chủ Emacs mà bạn muốn kết nối! Điều đơn giản nhất là không thay đổi 'server-socket-dir'. Nếu bạn thay đổi nó, nó chỉ là tự nhiên mà bạn cũng sẽ cần phải nói cho emacsclient. – phils

+0

Có, bạn nói đúng, cảm ơn! –

Trả lời

1

Tôi nghĩ emacsclient có thể tìm kiếm tập tin đặc biệt server trong con đường tiêu chuẩn chỉ, ví dụ trong số /tmp/emacs1000. Nếu bạn thay đổi thông số này server-socket-dir, thì bạn nên thông báo cho số này emacsclient theo khóa -s.

+0

là có anyway mà chúng tôi có thể chỉ định cùng một ổ cắm máy chủ dir cho cả Mac và Linux. – nXqd

+0

@nXqd thử đặt biến môi trường EMACS_SERVER_FILE trong .bashrc – netawater

9

Vì bạn đã thực hiện:

/usr/local/bin/emacs --daemon 

máy chủ đã được bắt đầu. Vì vậy, bạn thực sự không cần:

(server-start) 
(setq server-socket-dir "~/.emacs.d/server") 

trong .emacs của bạn. Khi bạn làm theo cách tiếp cận đó, máy chủ được đặt trong/tmp/emacs502 (hoặc có thể một số số khác). Trên linux, emacsclient dường như không gặp khó khăn khi tìm nó ở đó (trong trường hợp đó tôi thấy/tmp/emacs1920), và do đó "emacsclient -nw" hoạt động. Tôi đang cố gắng nó trên OSX sử dụng homebrew, như bạn đang có, và tôi thấy tôi phải kết nối sử dụng:

emacsclient -nw -s /tmp/emacs502/server 

(Nếu bạn sử dụng --deamon = tên, sau đó bạn sẽ sử dụng "tên" thay vì " máy chủ "ở dòng cuối cùng đó.)

+8

Nguyên nhân có thể là bạn đang sử dụng mã cổ phiếu Mac OS X emacsclient (phiên bản 22) không thể tìm thấy Emacs 24. Kiểm tra xem $ PATH của bạn không giống như sau: '/ usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:' vì symebrew symlink hoạt động,/usr/local/bin phải đến _before_/usr/bin – dcorking

+0

nhờ dcorking - rằng là vấn đề của tôi! Tôi đã xóa các cổ phiếu emacs và cài đặt một cái mới với homebrew. cần thiết để xóa emacsclient cũng như – WuTheFWasThat

+0

@WuTheFWasThat - không cần xóa các emacs cổ phiếu. Chỉ cần thiết lập đường dẫn đúng cách, để tìm trong thư mục homebrew đầu tiên. (Tôi nghĩ đó là/usr/local, IIRC.) – Diagon

9

Tìm tệp socket máy chủ là bit khó, bạn có thể sử dụng lsof để tìm nó và sau đó một chút là grep -ing để trích xuất đường dẫn/tên tệp ổ cắm.

lsof -c emacs | grep server | grep -E -o '[^[:blank:]]*$' 

Hoặc trên OSX khi bạn mong đợi để được chạy /Application/Emacs bạn muốn thay đổi tên lệnh lsof đang tìm kiếm với -c Emacs. I E.

lsof -c Emacs | grep server | grep -E -o '[^[:blank:]]*$' 

Bạn có thể sử dụng cut thay vì lọc lộn xộn grep (tìm kiếm phi khoảng trống cho đến khi dòng cuối [^[:blank:]]*$)

lsof -c Emacs | grep server | cut -c70- 

Hơn thế nữa, squish các interspacing và sử dụng cut của lĩnh vực thớt.

lsof -c Emacs | grep server | tr -s " " | cut -d' ' -f8 

Bây giờ bạn có ổ cắm (hoặc nó có sản phẩm nào), bạn có thể làm một sự khởi đầu có điều kiện trên emacsclient, tức là.

#!/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 [email protected] & 

    # or on OSX 

    /Application/Emacs.app/Contents/MacOS/Emacs [email protected] & 

else 

    emacsclient [email protected] -n -s $socket_file 

fi 
1

emacsclient chỉ tìm thấy máy chủ emacs nếu tôi chạy emacs từ dòng lệnh. Nếu tôi chạy các emacs từ trình khởi chạy Ubuntu thì emacsclient không thể kết nối với máy chủ.

Nếu bạn muốn sử dụng daemon Emacs thay vì máy chủ, xác định hai biến môi trường

export ALTERNATE_EDITOR="" export EDITOR=emacsclient

Bạn có thể thêm các biến môi trường trong cả hai ~/.bashrc hay ~/.profile.

Nếu biến môi trường ALTERNATE_EDITOR trống, thì Emacs sẽ chạy daemon của nó và kết nối với nó.

+0

Điều này có vẻ giống như một giải pháp ngốc nghếch, nhưng nó là đơn giản nhất để thực hiện và làm việc trên cả hai macOS (thiết lập biến cho đường dẫn đầy đủ để emacsclient) và FreeBSD – rfinz

Các vấn đề liên quan