Emacsclient: Satu proses emacs tunggal sepanjang waktu dari awal & tidak pernah menutup & lebih baik menyembunyikan GUI

9

Karena emacsclient dapat menangani waktu pemuatan paket yang lama dengan benar, saya benar-benar ingin menjaga setidaknya satu proses emacs, dan sebagian besar waktu hanya satu proses emacs , terbuka sebagai proses latar belakang dan lebih baik menyembunyikan GUI.

Saat ini saya mendefinisikan fungsi berikut di .bashrc:

emc () 
{ 
    if [[ $# -eq 0 ]]; then
        emacs --eval "(suspend-frame)" &
        return
    fi
    args=($*);
    setsid emacsclient -c -e "(find-file \"${args[*]}\")"
}

Dan juga memiliki baris berikut di .bashrc:

emc

Jadi setiap kali saya membuka shell, saya akan berakhir dengan proses emacs baru.

Masalahnya adalah saya akan memiliki banyak proses emacs tambahan yang tidak perlu setelah membuka banyak shell. Namun, saya hanya ingin mempertahankan satu proses emacs tunggal sepanjang waktu dari startup lebih baik menyembunyikan GUI .

phonycollectibles
sumber
5
Saya tidak terbiasa dengan praktik emacs --eval "(suspend-frame)"daripada emacs --daemon( emacswiki.org/emacs/EmacsAsDaemon ). Apakah ada alasan Anda memilih untuk tidak memanggil emacs sebagai daemon? Anda dapat menggunakan sesuatu seperti pgrep -U `whoami` emacs || emacs --daemon &untuk memastikan itu berfungsi.
ebpa
Lihat skrip MJ Wall untuk menggunakan klien Emacs.
Tianxiang Xiong

Jawaban:

13

Saya melakukan ini dengan memulai daemon emacs ketika saya login. Di mana Anda meletakkan perintah ini tergantung pada manajer desktop Anda. Saya menggunakan i3, yang dikonfigurasi untuk menjalankan skrip saat masuk yang mencakup yang berikut:

emacs --daemon &

Dengan itu, emacs selalu berjalan di latar belakang, dan saya membuka klien baru emacsclient -c -n, terikat dengan pengikatan tombol yang nyaman di window manager. Jika Anda bekerja di terminal, Anda hanya perlu alias sederhana seperti alias emc='emacsclient', mungkin dengan -n, -catau -targumen, tergantung pada bagaimana Anda menggunakannya.

Periksa opsi-opsi untuk emacsclient dalam manual: ( (emacs) Opsi emacsclient , dapat diakses dari Emacs oleh C-h r m emacsclient options <enter>). Anda dapat menggunakan -abendera untuk secara otomatis memulai daemon emacs jika belum berjalan, dan -catau -tuntuk membuka klien bingkai atau terminal baru, daripada menggunakan kembali yang sudah ada (dalam sesi yang sama):

'-sebuah perintah'
'--alternate-editor = PERINTAH'
     Tentukan perintah yang akan dijalankan jika 'emacsclient' gagal menghubungi Emacs.
     Ini berguna saat menjalankan 'emacsclient' dalam sebuah skrip.

     Sebagai pengecualian khusus, jika PERINTAH adalah string kosong, maka
     'emacsclient' memulai Emacs dalam mode daemon (sebagai 'emacs --daemon') dan
     lalu coba sambungkan lagi.

'-c'
'- buat-bingkai'
     Buat "bingkai klien" grafis baru, alih-alih menggunakan yang sudah ada
     Bingkai Emacs. Lihat di bawah untuk perilaku khusus 'Cx C-c' di a
     bingkai klien. Jika Emacs tidak dapat membuat bingkai grafis baru (misalnya,
     jika tidak dapat terhubung ke server X), ia mencoba membuat teks
     bingkai klien terminal, seolah-olah Anda telah menyediakan opsi '-t'
     sebagai gantinya.

'-t'
'--tty'
'-nw'
     Buat bingkai klien baru di terminal teks saat ini, bukan
     menggunakan bingkai Emacs yang ada. Ini berperilaku seperti '-c'
     opsi, dijelaskan di atas, kecuali bahwa itu menciptakan terminal teks
     frame (* note Terminal Non-Jendela: :).
Tyler
sumber
4

Jika Anda menggunakan sistem operasi yang menggunakan manajer layanan systemd (yang saat ini mencakup sebagian besar distribusi GNU / Linux), maka solusi terbaik mungkin menggunakan systemd untuk memulai daemon Emacs Anda saat boot. Anda dapat melakukan ini dengan membuat file $HOME/.config/systemd/user/emacs.servicedengan konten berikut:

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

Maka Anda harus memulai layanan dan mengaturnya untuk mulai secara otomatis untuk semua booting berikutnya:

$ systemctl enable --user emacs
$ systemctl start --user emacs

Anda sekarang dapat menggunakan emacsclientseperti biasa. Jika Anda biasanya menjalankannya dengan -n, -catau -tpilihan, Anda dapat mengatur sebuah alias di shell Anda. Anda mungkin juga ingin mengatur variabel lingkungan EDITORdan / atau VISUALuntuk menjalankan emacsclientcara yang Anda suka. Misalnya, di Bash, Anda dapat menambahkan yang berikut ke .bashrcfile Anda :

alias emc="emacsclient -c"
export VISUAL="emacsclient -c"
export EDITOR="emacsclient -t"

Jika Anda perlu menghentikan daemon Emacs, Anda dapat melakukan ini sebagai berikut:

$ systemctl stop --user emacs

Dan jika Anda ingin menghentikannya secara permanen saat boot:

$ systemctl disable --user emacs
Psychonaut
sumber
1
mungkin tautan ini ke EmacsWiki harus diakui: EmacsAsDaemon
HongboZhu
0

Cara saya melakukannya sangat mirip dengan jawaban sebelumnya, dengan memiliki alias yang didefinisikan dalam .bashrc saya untuk emacs --daemon

alias ds="emacs --daemon"

Terlepas dari ini, saya memiliki pintasan papan tombol ctrl-alt-Ediatur ke emacsclient -c. Ketika saya ingin mulai bekerja pada emacs saya membuka terminal dan mengetik dsdan memanggil setiap instance emacsclient dengan shortcut saya.

Semoga ini bisa membantu seseorang.

Nidish Narayanaa
sumber