Buat fungsi untuk mengaktifkan tema

8

Bagaimana saya bisa membuat fungsi interaktif untuk beralih di antara dua tema warna?

Dari apa yang saya dapat temukan tidak ada set variabel untuk apa tema warna yang sedang digunakan, sebenarnya beberapa dapat dimuat secara bersamaan?

Juga, untuk beralih Anda harus terlebih dahulu lakukan disable-themeuntuk tema yang sedang dimuat, untuk tidak membuat tema berbenturan.

Bagaimana cara melakukannya tanpa mengetahui tema mana yang sedang dimuat?

Jborg
sumber
2
(car custom-enabled-themes)mengembalikan tema yang saat ini diaktifkan.
mutbuerger
Kemungkinan duplikat dari Cara mengatur ulang tema warna?
mutbuerger
Cukup gunakan nasihat-beban-tema, jika Anda menggunakan nasihat.
InHarmsWay

Jawaban:

4

Saya telah membuatnya tetapi saya beralih 3 tema (Kosmos saya sendiri, leuven dan default)

Anda dapat memeriksa https://github.com/habamax/.emacs.d/blob/master/lisp/haba-appearance.el

kutipan dari itu:

(defvar *haba-theme-dark* 'kosmos)
(defvar *haba-theme-light* 'leuven)
(defvar *haba-current-theme* *haba-theme-dark*)

;; disable other themes before loading new one
(defadvice load-theme (before theme-dont-propagate activate)
  "Disable theme before loading new one."
  (mapcar #'disable-theme custom-enabled-themes))


(defun haba/next-theme (theme)
  (if (eq theme 'default)
      (disable-theme *haba-current-theme*)
    (progn
      (load-theme theme t)))
  (setq *haba-current-theme* theme))

(defun haba/toggle-theme ()
  (interactive)
  (cond ((eq *haba-current-theme* *haba-theme-dark*) (haba/next-theme *haba-theme-light*))
        ((eq *haba-current-theme* *haba-theme-light*) (haba/next-theme 'default))
        ((eq *haba-current-theme* 'default) (haba/next-theme *haba-theme-dark*))))

Kemudian ikat beberapa tombol ke haba / toggle-theme.

Saya menggunakan emacs pada 2 mesin dan lingkungan yang berbeda (siang, larut malam) sehingga ada fasilitas untuk menyimpan / mengembalikan tema saat ini pada berhenti / memuat emacs. Yang berguna :)

Maxim Kim
sumber
5

Saya menulis beberapa fungsi untuk menelusuri sekelompok tema.

(setq ivan/themes '(elixir elixir-dark))
(setq ivan/themes-index 0)

(defun ivan/cycle-theme ()
  (interactive)
  (setq ivan/themes-index (% (1+ ivan/themes-index) (length ivan/themes)))
  (ivan/load-indexed-theme))

(defun ivan/load-indexed-theme ()
  (ivan/try-load-theme (nth ivan/themes-index ivan/themes)))

(defun ivan/try-load-theme (theme)
  (if (ignore-errors (load-theme theme :no-confirm))
      (mapcar #'disable-theme (remove theme custom-enabled-themes))
    (message "Unable to find theme file for ‘%s’" theme)))

Saya memanggil ivan/load-indexed-themefile init saya untuk menginisialisasi tema saya.

Aku mengikat ivan/cycle-themeke Space\dalam modus kejahatan. ( Spaceadalah kunci pemimpin saya.)

ivan
sumber
2

Meskipun jawaban yang ada berfungsi dengan baik, saya ingin membagikan yang lebih sederhana:

(defun toggle-theme ()
  (interactive)
  (if (eq (car custom-enabled-themes) 'leuven)
      (disable-theme 'leuven)
    (enable-theme 'leuven)))
(global-set-key [f5] 'toggle-theme)

Ini tidak menonaktifkan tema khusus default terlebih dahulu, tapi saya suka itu.

Michel de Ruiter
sumber
1

Ini adalah modul yang saya tulis untuk .emacs saya sendiri untuk menyelesaikan masalah ini. Pendekatan dasar saya tampaknya mirip dengan maksud untuk solusi Maxim Kim (berputar melalui daftar tema), tetapi saya pikir milik saya lebih modular dan karena itu mungkin lebih mudah diakses oleh orang luar. Di sisi lain, saya tidak memiliki fitur kegigihan Kim.

Berikut adalah kode yang relevan, meninggalkan deklarasi variabel dan komentar paket:

(require 'dash)

(defun multitheme--enable (theme)
  "As `enable-theme', but load the theme if necessary.
Respect `custom-safe-themes'."
  (if (custom-theme-p theme)
      (enable-theme theme)
    (load-theme theme)))

(defun multitheme-cycle ()
  "Cycle between the themes in `multitheme-base-theme-list'.
If none of these themes is currently active, instead enable the
first element of `multitheme-base-theme-list'.

Also re-enable `multitheme-overtheme' so it remains \"on top\" of
the base theme.

If a theme to be enabled is not yet defined, attempt to load it
first (using `load-theme').  Respect `custom-safe-themes'.

After all theme changes have been made, run
`multitheme-base-change-hook'."
  (interactive)
  (when (require 'validate nil :noerror)
    (validate-variable 'multitheme-base-theme-list)
    (validate-variable 'multitheme-overtheme)
    (validate-variable 'multitheme-base-theme-change-hook))
  (let ((themes (-drop-while
                 (lambda (thm) (not (custom-theme-enabled-p thm)))
                 multitheme-base-theme-list)))
    ;; Cycle base theme
    (if (null themes)
        (multitheme--enable (car multitheme-base-theme-list))
      (disable-theme (car themes))
      (multitheme--enable (or (cadr themes)
                              (car multitheme-base-theme-list))))
    ;; Reassert overtheme
    (when multitheme-overtheme
      (multitheme--enable multitheme-overtheme))
    ;; Run hooks
    (run-hooks 'multitheme-base-theme-change-hook)))
Aaron Harris
sumber
0

Saya memiliki pengaturan ini untuk tema bersepeda:

(defvar quick-switch-themes
  (let ((themes-list (list 'jazz
                           ;; 'vicarie-and-blackboard
                           ;; 'tangotango
                           'poet)))
    (nconc themes-list themes-list))
  "A circular list of themes to keep switching between.
Make sure that the currently enabled theme is at the head of this
list always.

A nil value implies no custom theme should be enabled.")

(defun quick-switch-themes* ()
  "Switch between to commonly used faces in Emacs.
One for writing code and the other for reading articles."
  (interactive)
  (if-let* ((next-theme (cadr quick-switch-themes)))
      (progn (when-let* ((current-theme (car quick-switch-themes)))
               (disable-theme (car quick-switch-themes)))
             (load-theme next-theme t)
             (message "Loaded theme: %s" next-theme))
    ;; Always have the dark mode-line theme
    (mapc #'disable-theme (delq 'smart-mode-line-dark custom-enabled-themes)))
  (setq quick-switch-themes (cdr quick-switch-themes)))
narendraj9
sumber
0

Saya tahu saya sedikit terlambat ke pesta tetapi saya membuat paket untuk melakukan hal itu, dan banyak lagi.

Ini pada dasarnya memungkinkan Anda menentukan daftar tema warna favorit Anda (yang opsional) dan menelusuri daftar dengan mudah.

myTerminal
sumber