Tạo một chức năng để chuyển đổi chủ đề


8

Làm cách nào tôi có thể tạo một chức năng tương tác để chuyển đổi giữa hai chủ đề màu?

Từ những gì tôi có thể tìm thấy, không có biến nào được đặt thành chủ đề màu nào hiện đang được sử dụng, trên thực tế, một số có thể được tải cùng một lúc không?

Ngoài ra, để chuyển đổi, trước tiên bạn cần phải làm disable-themecho chủ đề hiện đang được tải, để không làm cho các chủ đề xung đột.

Làm thế nào để làm điều đó mà không biết chủ đề nào hiện đang được tải?


2
(car custom-enabled-themes)trả về chủ đề hiện được kích hoạt.
mutbuerger


Chỉ cần sử dụng tư vấn-tải-chủ đề, nếu bạn sử dụng tư vấn.
InHarmsWay

Câu trả lời:


4

Tôi đã thực hiện nhưng tôi chuyển 3 chủ đề (Kosmos của riêng tôi, leuven và mặc định)

Bạn có thể kiểm tra https://github.com/habamax/.emacs.d/blob/master/lisp/haba-appparent.el

đoạn trích từ nó:

(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*))))

Sau đó liên kết một số chìa khóa để haba / toggle-theme.

Tôi sử dụng emacs trên 2 máy và môi trường khác nhau (ngày, tối muộn) để có cơ sở lưu / khôi phục chủ đề hiện tại khi thoát / tải emacs. Cái nào cũng tiện :)


5

Tôi đã viết một vài chức năng để xoay vòng qua một nhóm các chủ đề.

(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)))

Tôi gọi ivan/load-indexed-themetrong tập tin init của tôi để khởi tạo chủ đề của tôi.

Tôi ràng buộc ivan/cycle-themeđể Space\trong chế độ ác. ( Spacelà chìa khóa lãnh đạo của tôi.)


2

Mặc dù các câu trả lời hiện có hoạt động tốt, tôi muốn chia sẻ một câu trả lời đơn giản hơn:

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

Điều này không vô hiệu hóa chủ đề tùy chỉnh mặc định đầu tiên, nhưng tôi thích điều đó.


1

Đây là mô-đun tôi đã viết cho .emacs của riêng tôi để giải quyết vấn đề này. Cách tiếp cận cơ bản của tôi dường như tương tự với ý định đối với giải pháp của Maxim Kim (xoay qua danh sách các chủ đề), nhưng tôi nghĩ rằng phương pháp của tôi mang tính mô đun hơn và do đó có thể dễ tiếp cận hơn với người ngoài. Mặt khác, tôi không có bất kỳ tính năng bền bỉ nào của Kim.

Đây là mã có liên quan, bỏ các khai báo biến và bình luận gói:

(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)))

0

Tôi có thiết lập này cho các chủ đề đi xe đạp:

(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)))

0

Tôi biết tôi đến bữa tiệc muộn một chút nhưng tôi đã tạo ra một gói để làm chính xác điều đó, và nhiều hơn nữa.

Về cơ bản, nó cho phép bạn xác định một danh sách các chủ đề màu yêu thích của bạn (tùy chọn) và di chuyển qua danh sách một cách thuận tiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.