2つのカラーテーマを切り替えるインタラクティブな機能を作成するにはどうすればよいですか?
私が見つけたものから、現在使用されているカラーテーマに設定されている変数はありません、実際にはいくつかを同時にロードできますか?
また、切り替えるにはdisable-theme
、現在読み込まれているテーマに対して最初に行う必要があります。テーマが競合しないようにするためです。
現在どのテーマがロードされているかを知らずにそれを行う方法は?
2つのカラーテーマを切り替えるインタラクティブな機能を作成するにはどうすればよいですか?
私が見つけたものから、現在使用されているカラーテーマに設定されている変数はありません、実際にはいくつかを同時にロードできますか?
また、切り替えるにはdisable-theme
、現在読み込まれているテーマに対して最初に行う必要があります。テーマが競合しないようにするためです。
現在どのテーマがロードされているかを知らずにそれを行う方法は?
回答:
作成しましたが、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で現在のテーマを保存/復元する機能があります。これは便利です:)
テーマのグループを循環する関数をいくつか書きました。
(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-theme
しSpace\ます。(Spaceは私のリーダーキーです。)
既存の回答は問題なく機能しますが、より簡単な回答を共有したいと思います。
(defun toggle-theme ()
(interactive)
(if (eq (car custom-enabled-themes) 'leuven)
(disable-theme 'leuven)
(enable-theme 'leuven)))
(global-set-key [f5] 'toggle-theme)
最初にデフォルトのカスタムテーマが無効になるわけではありませんが、気に入っています。
これは、この問題を解決するために自分の.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)))
私はテーマをサイクリングするためにこの設定をしています:
(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)))
(car custom-enabled-themes)
現在有効なテーマを返します。