Tema berbeda untuk bingkai terminal dan grafik saat menggunakan daemon Emacs

20

Saya mencoba mencapai perilaku berikut di Emacs24:

Saya suka menggunakan tema yang berbeda (solarized-dark vs solarized-light) tergantung pada apakah saya terhubung ke server yang sedang berjalan dengan bingkai terminal

% emacsclient -t

atau dengan bingkai gtk

% emacsclient -c

Tampaknya ini berhasil di Emacs yang lebih lama, tetapi Emacs saat ini saya tidak bisa menemukan jalan. Saya sudah mengecek SO (mis., Https://stackoverflow.com/q/18904529/152439 dan jawaban) dan milis (mis. Https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.html dan https://lists.gnu.org/archive/html/help-gnu-emacs/2012-02/msg00237.html ).

Setup saya saat ini terlihat seperti ini:

(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/solarized")
(if (daemonp)
  (add-hook 'after-make-frame-functions
    (lambda (frame)
      (select-frame frame)
      (if (display-graphic-p frame)
        (load-theme 'solarized-light t)
        (load-theme 'solarized-dark t)
      )
    )
  )
  (load-theme 'solarized-light t)
)

Masalah dengan ini adalah bahwa jika saya memiliki bingkai grafis terbuka dan kemudian membuka bingkai terminal dengan emacsclient -t, tema solarized-dark diterapkan ke frame terminal baru (yang benar) dan bingkai grafis yang sudah terbuka (yang harus dibiarkan tidak tersentuh, idealnya). Setara terjadi ketika bingkai terminal sudah terbuka dan saya membuka bingkai grafis baru dengan emacsclient -c.

EDIT: Dalam hal ini tidak mungkin dengan Emacs24 saat ini, apakah ada rencana untuk membuatnya mungkin lagi?

andreas-h
sumber
1
Afaik (dari pencarian lain untuk tujuan ini), implementasi tema warna yang lama diizinkan untuk beberapa pengaturan per buffer. Dengan emacs 24 muncul dukungan tema bawaan (dikenal sebagai deftheme atau load-theme), yang tidak mendukung ini: temanya sama untuk seluruh sesi emacs. Untuk pengaturan semacam ini, mungkin Anda dapat mengelola peretasan yang dapat diterima dengan selalu memuat solarized-dark, dan menggunakan flag -rv untuk memulai frame grafis, tetapi itu akan jauh dari sempurna.
T. Verron
Salah satu solusinya adalah menjalankan klien terpisah untuk terminal dan untuk GUI seperti yang dibahas di sini: emacs.stackexchange.com/q/41/93 Tergantung pada alur kerja Anda, ini mungkin bukan solusi yang layak. Ini bekerja untuk saya karena saya melakukan berbagai jenis tugas di masing-masing, dengan sedikit atau tanpa tumpang tindih.
nispio
Jika theme custom inbuilt di emacs24 tidak sesuai dengan kebutuhan Anda, Anda selalu dapat menggunakan color-theme.elIIRC mana yang memiliki pengaturan warna tergantung frame. Tidak ada keuntungan besar dalam menggunakan kemampuan bertema inbuilt selain dari mana-mana.
Vamsi
2
color-theme-buffer-local menyediakan dukungan tema buffer-local untuk color-themesistem tema Emacs 24 dan keduanya . Versi saya dari tema solarized juga mendukung kedua sistem, jika Anda memutuskan untuk pergi rute ini.
sanityinc
@sanityinc Terima kasih; Saya menggunakan Emacs 24.3, dan sepertinya ada beberapa masalah, lihat github.com/vic/color-theme-buffer-local/issues/5 . Tapi saya akan mengawasi proyek ini.
andreas-h

Jawaban:

8

Anda tidak dapat melakukan ini menggunakan tema yang berbeda. Solusinya adalah membuat tema yang memiliki definisi wajah berbeda tergantung pada terminal. Jika Anda melihat contoh seperti font-lock-comment-face, Anda akan melihat cara kerjanya. Alih-alih menentukan ((class color) (min-colors 88) (background dark))Anda juga bisa menentukan (type tty)atau (type graphic)dll. Manual ini memiliki lebih banyak info .

(defface font-lock-comment-face
  '((((class grayscale) (background light))
 :foreground "DimGray" :weight bold :slant italic)
(((class grayscale) (background dark))
 :foreground "LightGray" :weight bold :slant italic)
(((class color) (min-colors 88) (background light))
 :foreground "Firebrick")
(((class color) (min-colors 88) (background dark))
 :foreground "chocolate1")
(((class color) (min-colors 16) (background light))
 :foreground "red")
(((class color) (min-colors 16) (background dark))
 :foreground "red1")
(((class color) (min-colors 8) (background light))
 :foreground "red")
(((class color) (min-colors 8) (background dark))
 :foreground "yellow")
(t :weight bold :slant italic))
  "Font Lock mode face used to highlight comments."
  :group 'font-lock-faces)

Saya kira Anda dapat menulis fungsi yang mengambil dua tema dan menghasilkan tema yang digabungkan, dengan wajah dari satu tema yang ditugaskan (type tty)dan wajah dari tema lain yang ditugaskan di (type graphic)mana kedua tema asli digunakan t.

Alex Schröder
sumber
6

color-theme-buffer-local menyediakan dukungan tema buffer-local untuk kedua tema warna dan sistem tema Emacs 24. Versi saya dari tema solarized juga mendukung kedua sistem, jika Anda memutuskan untuk pergi rute ini.

sanityinc
sumber
terima kasih untuk pointer ke versi solarized Anda, saya sangat menyukainya!
andreas-h
2

Anda dapat menentukan kondisi untuk kustomisasi wajah, seperti "mode terminal" atau "warna minimal" di editor penyesuaian:

Saat menyesuaikan wajah, klik tombol [Negara] dan pilih "Tampilkan semua spesifikasi tampilan". Kemudian Anda dapat mengatur kondisi untuk spesialisasi wajah lebih lanjut.

Berikut varian minimal untuk mengatur warna latar belakang menjadi hitam saat bingkai tty:

(custom-set-faces
 '(default (
            (((type tty) (min-colors 256))
             (:background "black"))
            (t
             (:background "#181a26")))
    ))
TheJJ
sumber