Buat emacsclient buat bingkai hanya jika belum ada

11

Bagaimana saya bisa membuat emacsclient -a '' -nmembuat bingkai baru hanya jika belum ada?

Masalah dengan -cbendera adalah bahwa ia menciptakan bingkai baru setiap waktu. Masalah tanpa itu adalah bahwa jika tidak ada bingkai terbuka itu akan terbuka di baris perintah.

Jika saya dapat memeriksa apakah ada bingkai Emacs terbuka dari shell, saya bisa menelepon dengan atau tanpa -cbergantung pada itu untuk mendapatkan perilaku yang saya inginkan. Saya mencoba:

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

Saya selalu mendapatkan hasil yang sama.

Saya bisa menggunakan file sementara atau pgrep, tetapi pendekatan itu sangat rawan kesalahan.

Ini mirip dengan pertanyaan ini , tetapi itu bukan duplikat, karena OP di sana puas dengan harus memiliki bingkai terbuka sebelum menelepon emacsclient.

spelufo
sumber
1
Pertanyaan yang sama superuser.com/questions/358037/… dengan elisp, bashdan shjawaban.
Konstantin Morenko

Jawaban:

3

Saya akhirnya membuat skrip ini berdasarkan ini

#!/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 "$@"

Jika tidak ada tampilan itu terbuka dengan -nw. Jika $DISPLAYdiatur, ia mencari bingkai di tampilan itu untuk melihat apakah perlu membuat yang baru.

Sunting: Saya telah memodifikasinya sehingga Anda dapat menentukan secara manual -nwapakah Anda ingin membuka terminal meskipun ada tampilan.

spelufo
sumber
1
Nitpick kecil: $@ harus dikutip .
dshepherd
0

Kamu bisa menggunakan:

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

untuk memeriksa apakah server Emacs "server_name"sudah berjalan. Jika perintah mengembalikan kode keluar 0, itu sedang berjalan. Jika demikian, cukup gunakan emacsclientperintah:

emacsclient -s server_name -n file_name.txt

Jika tidak berjalan, Anda dapat membuka server Emacs baru dengan misalnya:

emacs --eval '(setq server-name "server_name")' --eval '(server-start)' file_name.txt &
Håkon Hægland
sumber
Tapi begitu begitu Anda menutup shell Anda akan membunuh server, kan? The emacsclient -a ''dimulai emacs --daemonjika perlu, yang tetap berlangsung bahkan jika Anda menutup shell.
spelufo
@spelufo Server tidak terbunuh dengan mematikan shell. Perhatikan bagian &akhir perintah; artinya menjalankan server sebagai proses latar belakang ..
Håkon Hægland
Yang mem-forks ke latar belakang shell saat ini. Ini tidak terbunuh ketika Anda mendapatkan kembali shell Anda, tetapi IS IS dibunuh ketika Anda menutup shell itu sepenuhnya ( C-d).
spelufo
Daemon terus berjalan bahkan jika Anda menutup semua terminal Anda. Itu hanya akan terus berjalan jika server-startmemulai server sebagai proses daemon. Apa yang Anda dapatkan jika Anda memulai emacs seperti itu dan kemudian menutup semua emacs dan terminal, kemudian buka terminal baru dan jalankan pgrep emacs?
spelufo
@ spelufo Sebenarnya masih berjalan setelah C-d. Saya mencoba ini sekarang menggunakan gnome-terminalUbuntu 14.10 .. Saya pikir Anda merujuk ke instance yang berjalan setelah menutup semua frame Emacs? Kemudian, itu akan membutuhkan proses daemon ya ..
Håkon Hægland