Emacsclient'ı yalnızca zaten bir çerçeve yoksa oluşturun


11

Nasıl emacsclient -a '' -nyeni bir çerçeve oluşturmayı nasıl yapabilirim ?

-cBayrağın sorunu, her seferinde yeni bir çerçeve oluşturmasıdır. Onsuz sorun, açık bir çerçeve yoksa komut satırında açılacağıdır.

Kabuktan açık bir Emacs çerçevesi olup olmadığını kontrol edebilirsem, -cistediğim davranışı elde etmek için buna bağlı olarak veya olmadan arayabilirim . Denedim:

$ emacsclient -a '' --eval '(frames-on-display-list)'
(#<frame F1 0xba2740>)

Hep aynı sonucu alırım.

Geçici dosyalar veya pgrep kullanabilirim, ancak bu yaklaşımlar hataya açıktır.

Bu, bu soruya benzer , ancak yinelenen bir durum değildir, çünkü OP, aramadan önce açık bir çerçeveye sahip olmaktan memnun kaldı emacsclient.


1
Aynı soru superuser.com/questions/358037/... ile elisp, bashve shcevapları.
Konstantin Morenko

Yanıtlar:


3

Ben dayalı bu senaryoyu yapma sona erdi bu

#!/bin/bash -e

if [[ "$DISPLAY" ]]; then
        frame=`emacsclient -a '' -e "(member \"$DISPLAY\" (mapcar 'terminal-name (frames-on-display-list)))" 2>/dev/null`
        [[ "$frame" == "nil" ]] && opts='-c' # if there is no frame open create one
        [[ "${@/#-nw/}" == "$@" ]] && opts="$opts -n" # don't wait unless we've asked to run in a terminal
else
        opts='-nw'
fi

exec emacsclient -a '' $opts "$@"

Ekran yoksa ile birlikte açılır -nw. Eğer $DISPLAYis set bunun bir yenisini yapmaya gerekip gerekmediğini görmek için bu ekranda kare arar.

Düzenleme: -nwBir ekran olsa bile bir terminalde açmak isteyip istemediğinizi manuel olarak belirtebileceğiniz şekilde değiştirdim .


1
Küçük nitpick: $@ alıntılanmalıdır .
dshepherd

0

Kullanabilirsiniz:

emacsclient -s server_name -e '(+ 1 0)' >/dev/null 2>&1

Emacs sunucusunun "server_name"çalışıp çalışmadığını kontrol etmek için . Komut çıkış kodu 0'ı döndürürse, çalışıyor demektir. Öyleyse, sadece emacsclientkomutu kullanın:

emacsclient -s server_name -n file_name.txt

Çalışmıyorsa, aşağıdakilerle yeni bir Emacs sunucusu açabilirsiniz:

emacs --eval '(setq server-name "server_name")' --eval '(server-start)' file_name.txt &

Ancak bu şekilde kabuğu kapattığınızda sunucuyu öldüreceksiniz, değil mi? emacsclient -a ''Başlar emacs --daemonEğer kabuk kapatsanız bile devam ederse gerekirse.
spelufo

@spelufo Sunucu kabuğu öldürerek öldürülmez. &Komutun sonundaki not ; sunucuyu bir arka plan işlemi olarak çalıştırmak anlamına gelir ..
Håkon Hægland

Hangi mevcut kabuk arka planına çatal. Kabuğunuzu geri aldığınızda öldürülmez, ancak o kabuğu tamamen kapattığınızda öldürülür ( C-d).
spelufo

Tüm terminallerinizi kapatsanız bile arka plan programı çalışmaya devam eder. Yalnızca server-startsunucuyu arka plan programı olarak başlatırsa çalışmaya devam eder. Emac'leri bu şekilde başlatır ve sonra tüm emacs ve terminalleri kapatırsanız, yeni bir terminal açar ve çalıştırırsanız ne elde edersiniz pgrep emacs?
spelufo

@spelufo Aslında hala peşinden koşuyor C-d. Ben şimdi gnome-terminalUbuntu 14.10 kullanarak denedim .. Bence tüm Emacs çerçevelerini kapattıktan sonra çalışan bir örneğe başvuruyor? Sonra, bu bir daemon süreci gerektirecektir evet ..
Håkon Hægland
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.