2014-04-18 11 views
8

O kadar o emacsclient o soket yok dedi kafa karıştırıcı 'emacs --daemon' yürüttükten sonra soketi bulamıyor:Neden emacsclient sadece bash <code>emacs --daemon</code> yürüttükten sonra

$ 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) 

Bu ayarlar var benim .emacs:

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

ve işe yarıyor, sunucu dosya ~/.emacs.d/server/server sadece orada, ama ben -s seçeneğini kullanarak ona soket dosyasını anlatmak zorunda böylece can sıkıcı, soket bulamıyorum emacsclient söylerler. Crontab'ın ◎reboot özel dizgilerini kullanarak her zaman yeniden başlatma (başlat) systerm'den sonra bir daemon olarak çalışmasına izin vermek istiyorum iken bu dikenli sorunu buluyorum.

Bu durumda, cron başarıyla emacs sunucusunu başlattı ve ~/.emacs.d/server/server sunucu dosyası da vardı, ancak daha sonra bir terminali başlattığımda ve emacsclient -t'u denediğimde başarısız oldu ve şikayet dosyası soket dosyasını bulamıyor!

Her ne kadar bu sorunu, emacsclient -s ~/.emacs.d/server/server olarak emacsclient veya diğer ad emacsclient'i kullandım, ancak kalbimi rahatlatmanın daha iyi bir yolu olan kullanarak bu sorunu atlatabilir miyim?

Arka Plan:

sistemi: Mac OS X 10.9.2

emacs: GNU Emacs 24.3.1 Ben emacsclient standart yolunda özel dosyası server arayabilirsiniz düşünüyorum homebrewleri

+1

Sadece bağlanmak istediğiniz Emacs sunucusunda bulunan bir değeri otomatik olarak bilmek için emacsclient bekliyorsunuz! En basit şey 'server-socket-dir' değiştirmemektir. Bunu değiştirirseniz, emacsclient'e de söylemeniz gerekecek kadar doğaldır. – phils

+0

Evet, haklısınız, teşekkürler! –

cevap

1

tarafından yüklenen sadece /tmp/emacs1000. Bu parametreyi server-socket-dir değiştirirseniz, emacsclient anahtarını -s anahtarıyla bildirmeniz gerekir.

+0

zaten Mac ve Linux için aynı sunucu soket dir belirtebilirsiniz. – nXqd

+0

@nXqd ayarlanmış ortam değişkeni EMACS_SERVER_FILE içinde .bashrc – netawater

9

yaptığın beri: Zaten

/usr/local/bin/emacs --daemon 

sunucusu başlatılır. Yani, aslında .emacs içinde

'a ihtiyacınız yoktur. Bu yaklaşımı izlediğinizde, sunucu/tmp/emacs502'ye (veya belki başka bir numaraya) yerleştirilir. Linux üzerinde, emacsclient orada bulmakta zorluk çekiyor gibi görünmüyor (bu durumda/tmp/emacs1920 görüyorum), ve böylece "emacsclient -nw" çalışıyor. Ben de senin kadar, Homebrew kullanarak OSX üzerinde çalışıyorum ve ben kullanarak bağlanmak zorunda bulmak: Eğer --deamon = isim kullandıysanız

emacsclient -nw -s /tmp/emacs502/server 

(o zaman " "adını" kullanırız yerine ediyorum sunucu "son satır."

+8

Bunun olası bir nedeni, Mac OS X stok emacsclient'i (sürüm 22) Emacs 24'ü bulamıyor olmanızdır. $ PATH'nizin şu şekilde görünmediğinden emin olun:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin: 'çünkü homebrew symlinks'in çalışması için/usr/local/bin gelmelidir _before_/usr/bin – dcorking

+0

teşekkürler dcorking - bu benim sorunumdu! Stok emaclarını sildim ve homebrew ile yeni bir tane kurdum. Emacsclient de – WuTheFWasThat

+0

@WuTheFWasThat silmek için gerekli - stok emacs silmek gerekmez. İlk önce homebrew dizinine bakmak için yolu doğru şekilde ayarlayın. (Sanırım bu/usr/local, IIRC.) – Diagon

9

Sunucu soket dosyasını bulmak zor bir bittir, onu bulmak için lsof'u ve ardından soket yolunu/dosya adını ayıklamak için grep-bit'i kullanabilirsiniz.

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

Yoksa komut adını lsof değiştirecek /Application/Emacs çalışıyor olması beklediğiniz OSX'te

-c Emacs ile aramaktadır. yani.

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

Sen cut yerine iyisi

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

(hat sonu [^[:blank:]]*$ kadar olmayan boşlukları ararken) dağınık filtreleme grep kullanımı ara mesafeye ezmek ve cut 'ın saha doğrama kullanabilirsiniz.

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

Şimdi soket sahip olduğunu (ya da o boş) Eğer emacsclient üzerinde yani bir koşullu bir başlangıç ​​yapabilirsiniz. Ben komut satırından emacs çalıştırırsanız

#!/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 sadece emacs sunucusu bulur. Ubuntu başlatıcısından emacs çalıştırırsam emacsclient sunucuya bağlanamaz. Eğer sunucusu yerine Emacs cini kullanmak istiyorsanız

, Sen ~/.bashrc veya ~/.profile ya bu ortam değişkenleri ekleyebilirsiniz iki ortam değişkenleri

export ALTERNATE_EDITOR="" export EDITOR=emacsclient

tanımlar.

ALTERNATE_EDITOR ortam değişkeni boşsa, Emacs onun sunucusunu çalıştıracak ve ona bağlanacaktır.

+0

Bu, bir goofy çözümü gibi görünüyor, ancak her iki macunda (değişkenini emacsclient'e tam yol olarak ayarla) ve FreeBSD'de uygulamak ve çalışmak en kolaydı. – rfinz