【已解决】请问emacs中if语句怎么使用


#1

我现在想实现根据当前加载的主题应用不同的whitespace颜色

下面是我当前的代码,但是不起作用

(setq day-theme 'github)  ;; 白天使用的主题
(setq dark-theme 'hipster)  ;;晚上使用的主题

(defun set-whitespace-color ()
  (if (day-theme current-theme)
      (custom-set-faces '(whitespace-space ((t (:foreground "dim gray"))))))  ;;如果day-theme=当前应用的主题,则执行这一句
  (if (eq dark-theme current-theme)
      (custom-set-faces
       '(whitespace-space ((t (:foreground "dim gray"))))
       '(whitespace-space ((t (:background "dim black")))))) ;;如果dark-theme=当前应用的主题,则执行这一句
)
(run-with-timer 0 3600 'set-whitespace-color)
                                                                         

请问如何判断当前应用的主题呢? 我的if语句是对的吗?


#2

根据

https://www.reddit.com/r/emacs/comments/a10hnr/cycle_through_themes/

可以试试:

(car custom-enabled-themes)
;; => sanityinc-tomorrow-eighties

少了个 eq,除此之外你的 if 没问题。除了 if,你还可以用 when/cond/pcase/cl-case/etc


#3

你为什么不想一下你的两个if语句的判断形式都不一样呢


#4

我就是故意那么做的,发上来给大家看, 就是两种方法都不起效果。


#5

eq 我也试了,没有效果。


#6

你这个current-theme是什么东西?

我用describe-functiondescribe-variables都没有找到


#7

我也不知道,我看网上有些写的是 current-theme, 但是我把他换成 custom-enabled-themes 也是不行。


#8

我稍微改了一下(假设你同时只启用一个主题):

(defvar day-theme 'github)
(eefvar dark-theme 'hispter)

(defun set-whitespace-color ()
  (when (memq day-theme custom-enabled-themes)
    (custom-set-faces '(whitespace-space ((t (:foreground "dim gray"))))))
  (when (memq dark-theme custom-enabled-themes)
    (custom-set-faces
     '(whitespace-space ((t (:foreground "dim gray"))))
     '(whitespace-space ((t (:background "dim black")))))))

如果你就只用这两个主题的话,也可以这么写:

(defun set-whitespace-color ()
  (if (memq 'github custom-enabled-themes)
      (custom-set-faces '(whitespace-space ((t (:foreground "dim gray")))))
    (custom-set-faces
     '(whitespace-space ((t (:foreground "dim gray"))))
     '(whitespace-space ((t (:background "dim black")))))))

另外借鉴别人代码的时候,最好看看这段代码是单独的,还是属于某个repo的一部分。有些package/配置对function/variable的命名很不在意,结果就搞得特别像Emacs内建的……

以及我觉得这个需求可以给load-theme加一个advice解决?而不是采用隔一段时间检查一下这种。

而且不知道为何,你这代码里设置颜色的部分在我这里不起作用……


#9

不知道为啥,用您这个代码后,能判断设置hipster主题,但我加载github主题后,颜色不能变回来


#10

我也是半吊子一个……以及感谢你让我发现了我还真有这个需求……

(defun set-whitespace-color (&rest _)
  (if (memq 'github custom-enabled-themes)
      (custom-set-faces '(whitespace-space ((t (:foreground "dim gray")))))
    (custom-set-faces
     '(whitespace-space ((t (:background "dim black" :foreground "dim gray")))))))

(advice-add 'load-theme :after #'set-whitespace-color)

我现在就这么先用着……

=======Update=======

(defun set-whitespace-color (&rest _)
  (if (memq 'github custom-enabled-themes)
      (set-face-attribute 'whitespace-space nil :foreground "dim gray")
    (progn
      (set-face-attribute 'whitespace-space nil :background "dim black")
      (set-face-attribute 'whitespace-space nil :foreground "dim gray"))))

(advice-add 'load-theme :after #'set-whitespace-color)

现在是如此的状态……不使用custom-set-face了……


#11

感谢感谢,我这边可以了

我是这样的

;; 根据时间自动切换主题
(setq day-theme 'github)  ;; 白天使用的主题
(setq dark-theme 'hipster)  ;;晚上使用的主题
(defun synchronize-theme ()
    (setq hour
        (string-to-number
            (substring (current-time-string) 11 13)))
    (if (member hour (number-sequence 6 18))
        (setq now day-theme)
        (setq now dark-theme))
    (load-theme now)
)
(run-with-timer 0 3600 'synchronize-theme)

;; 自动颜色控制
(defun set-whitespace-color ()
  (when (memq day-theme custom-enabled-themes)
    (custom-set-faces
     '(whitespace-space ((t (:foreground "dim gray"))))
     )
    )
  (when (memq dark-theme custom-enabled-themes)
    (custom-set-faces
     '(whitespace-space ((t (:foreground "dim gray"))))
     '(whitespace-space ((t (:background "dim black"))))
     )
    )
)
(run-with-timer 0 3600 'set-whitespace-color)

现在的效果 github主题 Screenshot_2018-12-05_19-51-34

hipster主题 Screenshot_2018-12-05_19-52-01

现在可以根据使用的主题自动更改whitespace的配色了。


#12

两种颜色都有空格提示。非常nice


#13

我写的这东西并不可靠……因为我完全不考虑可能同时加载两个及以上theme的情况…… @xuchunyang(car custom-enabled-themes)更好点。

但是我有强迫症……所以就这么写了。

以及……你写Elisp的Code Style……好吧我有强迫症。


#14

就这样吧,能用就行,非常感谢。


#15

非常非常感谢。


#16

如果只是想根据明暗主题改变,

(defface aface '((((background light)) . (:background "black"))
                 (((background dark)) . (:background "white")))
  "The face that changes color.")

(setq over (make-overlay 1 (point-max)))

(overlay-put over 'face 'aface)

简单一点

把这个放到sractch buffer然后运行


#17

感谢,感谢!我试试。