Mulai dua daemon emacs terpisah untuk konsol dan GUI

14

Biasanya saya memulai emacs dengan GUI, dan langsung memulai server (server-start). Sekarang saya dapat dengan mudah membuka dokumen ke sesi emacs saya yang ada dari terminal via emacsclient -n <file>, atau dari File Browser.

Namun, dari waktu ke waktu, saya ingin menjalankan emacs di dalam terminal saya menggunakan emacsclient -t. Ini paling sering terjadi ketika menulis git melakukan log atau melakukan tugas-tugas kecil lainnya. Dalam kasus tersebut, fakta bahwa file init saya dimuat dalam instance GUI emacs berarti bahwa saya tidak mendapatkan penyesuaian apa pun yang khusus untuk emacs TTY.

Saya tahu saya bisa lari

emacs -nw -q -l "some-custom-init-file.el"

tapi itu akan memuat ulang semua paket setiap saat. Bisakah saya mendapatkan yang terbaik dari kedua dunia? Apakah ada cara untuk mengatur "daemon TTY" sehingga saya dapat menggunakan kustomisasi terpisah untuk berjalan di dalam terminal dibandingkan dengan mengunjungi file di jendela emacs yang ada?

nispio
sumber
1
Bisakah Anda menunjukkan contoh penyesuaian Anda yang berbeda antara mode TTY dan GUI?
stsquad
1
@stsquad Satu yang sangat sederhana adalah saya menggunakan pinggiran kiri dalam mode GUI, tetapi karena pinggiran tidak ada dalam mode TTY, tidak ada ruang antara nomor baris dan teks. Ini dapat diperbaiki dengan (setq linum-format "%d ")di file kustomisasi TTY. Juga, tema warna saya selalu terlihat aneh dalam mode TTY, jadi saya pasti akan memilih tema yang berbeda untuk TTY. Saya sebenarnya tidak memiliki banyak perbedaan saat ini, tetapi sekarang saya tahu bahwa saya dapat memiliki server yang berbeda, daftarnya mungkin bertambah.
nispio
@nispio: Saya menyarankan Anda M-x report-emacs-bugdan meminta fitur baru seperti kemampuan untuk memiliki tema wajah yang berbeda di TTY dan di bingkai GUI (sebenarnya, sebuah tema dapat menentukan warna yang benar-benar berbeda untuk berbagai jenis bingkai, sehingga Anda juga dapat menyesuaikan tema Anda) . Menggunakan beberapa daemon untuk kasus-kasus yang terpisah hanyalah solusi untuk kurangnya fungsionalitas yang sesuai di Emacs.
Stefan

Jawaban:

14

Gunakan emacs --daemon=your-server-name -l "custom-init-file"untuk memulai server baru dan emacsclient -nw -s your-server-nameuntuk menghubungkannya dari terminal itu sendiri. Bagian tentang Menggunakan Emacs sebagai server dalam manual memiliki lebih banyak opsi inisialisasi.

Vamsi
sumber
Ini bekerja! Apakah ada cara yang baik untuk membunuh server dimulai dengan cara ini selain berburu dan menghapus file server?
nispio
(Saya harus menambahkan -qswitch untuk menjaga agar default saya tidak init.elberjalan sebelum file init khusus.)
nispio
2
Apakah emacsclient -s your-server-name -e "(kill-emacs)"melakukan yang Anda inginkan? Di atas hanya memanggil emacsclient dan evals (kill-emacs). Anda bisa mengganti (kill-emacs)dengan (save-buffers-kill-emacs)juga.
Vamsi
Dulu saya memiliki init.el yang sama untuk terminal dan gui emacs dan memuat file kustom terpisah untuk kustomisasi individu. Karenanya saya melewatkan-q
Vamsi
1
Solusi ini juga memperbaiki masalah yang saya miliki ketika menggunakan 'emacsclient -t' dengan mutt dan, di ruang kerja terpisah, 'emacsclient -c'. Sederhananya: daemon mogok ketika 'emacsclient -c' diluncurkan sebelum 'emacsclient -t'. Terima kasih, Vamsi
Boccaperta-IT
9

Selain jawaban @ Vamsi, Anda bisa mendapatkan banyak manfaat yang sama saat menjalankan hanya satu server dengan melampirkan saran make-frame-command.

Sebagai contoh, ketika berjalan di terminal saya ingin warna latar belakang black(yang memetakan ke #202020) tetapi saya ingin menggunakan #202020dalam mode grafis. Saya menerapkan ini dengan:

(defadvice make-frame-command (after make-frame-change-background-color last activate)
  "Adjusts the background color for different frame types. 
Graphical (X) frames should have the theme color, while terminal frames should match the terminal color (which matches the theme color...but terminal frames can't directly render this color)"
    (if (display-graphic-p)
        (set-background-color "#202020")
      (set-background-color "black")))

Anda bisa mendapatkan banyak jarak tempuh menggunakan ini make-variable-frame-local( set-background-colordi atas sudah frame-lokal).

Saya tidak tahu apakah ini adalah pola terbaik, tetapi jika Anda memiliki sedikit perbedaan antara TTY-mode dan X-mode Emacs, ini dapat membuat manajemen konfigurasi lebih mudah.

Kode di atas ditarik dari .emacs.d saya .

J David Smith
sumber
Saya bertanya-tanya apakah ada cara untuk "mendeteksi" mode yang saya gunakan berdasarkan per-frame.
nispio
1
Ini akan melakukannya. (display-graphic-p)memberi tjika bingkai saat ini adalah grafis, niljika tidak. Karena bingkai tidak dapat dipindahkan antara grafis dan bukan (afaik), melampirkan saran untuk pembuatan bingkai memastikan bahwa keadaan yang diinginkan tercapai untuk bingkai yang diberikan.
J David Smith
Ini jelas merupakan jawaban yang paling nyaman.
Malabarba
4

Anda tidak perlu saran untuk mengubah pengaturan frame yang berbeda yang berjalan di daemon emacs yang sama. Gunakan saja pengait after-make-frame-functionsseperti itu

(defvar my/ttheme 'tango-dark)
(defvar my/gtheme 'tango)
(defun my/frame-configuration (frame)
  "configure the current frame depending on the frame type"
  (with-selected-frame frame
    (if (display-graphic-p)
        (progn
          (message "after-make-frame-functions hook: window system")
          (set-frame-size frame 115 60)
          ;; other settings for a graphical frame
          (load-theme my/gtheme t))
      (message "after-make-frame-functions hook: text console")
      (load-theme my/ttheme t)
      (set-frame-parameter frame 'menu-bar-lines 0))))

(add-hook 'after-make-frame-functions 'my/frame-configuration)

;; normal start without daemon
(if (not (daemonp))
  (my/frame-configuration (selected-frame)))

Mendefinisikannya dengan cara ini memiliki bonus tambahan, yang mengatur konfigurasi bingkai yang diinginkan bahkan jika Anda tidak memulai dalam mode daemon.

Sayangnya load-themebukan bingkai lokal dan jadi bingkai lainnya berwarna juga jika Anda benar-benar menggunakan tema yang berbeda untuk teks dan bingkai grafis.

Informasi bonus: konfigurasikan terminal Anda dengan setidaknya 256 warna untuk mendapatkan nuansa nyata dari tema yang Anda pilih. Gunakan pengaturan seperti ini di salah satu file startup shell Anda:

TERM=xterm-256color
export TERM
Uwe Koloska
sumber
Tidak semua terminal mendukung 256 warna, misalnya xfce4-terminal masih hanya 8 (saya beralih ke sakura untuk warna-warna cantik).
Unhammer