テーマを切り替える関数を作成する


8

2つのカラーテーマを切り替えるインタラクティブな機能を作成するにはどうすればよいですか?

私が見つけたものから、現在使用されているカラーテーマに設定されている変数はありません、実際にはいくつかを同時にロードできますか?

また、切り替えるにはdisable-theme、現在読み込まれているテーマに対して最初に行う必要があります。テーマが競合しないようにするためです。

現在どのテーマがロードされているかを知らずにそれを行う方法は?


2
(car custom-enabled-themes)現在有効なテーマを返します。
mutbuerger


カウンセルを使用する場合は、カウンセルロードテーマを使用してください。
InHarmsWay

回答:


4

作成しましたが、3つのテーマ(自分のコスモス、ルーベン、デフォルト)を切り替えます

あなたはhttps://github.com/habamax/.emacs.d/blob/master/lisp/haba-appearance.elを確認することができます

それからの抜粋:

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

次に、いくつかのキーをhaba / toggle-themeにバインドします。

私は2つの異なるマシンと環境(日中、深夜)でemacsを使用しているため、quit / load emacsで現在のテーマを保存/復元する機能があります。これは便利です:)


5

テーマのグループを循環する関数をいくつか書きました。

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

ivan/load-indexed-themeテーマを初期化するために、initファイルを呼び出します。

私は邪悪なモードでバインドivan/cycle-themeSpace\ます。(Spaceは私のリーダーキーです。)


2

既存の回答は問題なく機能しますが、より簡単な回答を共有したいと思います。

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

最初にデフォルトのカスタムテーマが無効になるわけではありませんが、気に入っています。


1

これは、この問題を解決するために自分の.emacs用に作成したモジュールです。私の基本的なアプローチはMaxim Kimのソリューション(テーマのリストをローテーションする)と同じように見えますが、私の方がよりモジュール化されているため、部外者がアクセスしやすいと思います。一方、Kimの永続化機能はありません。

変数の宣言とパッケージのコメントは省略して、関連するコードを次に示します。

(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

私はテーマをサイクリングするためにこの設定をしています:

(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

私はパーティーに少し遅れていることを知っていますが、それを正確に行うためのパッケージを作成しまし

基本的に、お気に入りのカラーテーマのリスト(オプション)を定義し、リスト内を簡単に移動できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.