原始问题:我正在寻求一些帮助,以区分可能存在的叠加层。如果使用overlays-at
lawlist-red-face
点,则执行X
。如果overlays-at
点位于calendar-holiday-marker
,则执行Y
。叠加是通过这两个功能完成的。
(calendar-mark-visible-date (car holiday) lawlist-red-face)
(calendar-mark-visible-date (car holiday) calendar-holiday-marker)
编辑(2014年1月1日):@Drew在calendar+.el
(http://www.emacswiki.org/emacs/calendar%2B.el)中为此写了一个很好的测试:
(when
(memq lawlist-red-face
(mapcar (function (lambda (ovr)
(overlay-get ovr 'face))) (overlays-at (point))))
... )
编辑(2014年2月13日):上面列出的代码段也可以与(while (re-search-backward "[0-9]" nil t)
之类的内容一起使用,以创建叠加日期的组合列表 - 月,使用calendar-extract-day
,calendar-extract-month
和calendar-extract-year
提取日期和年份 - 使用(calendar-cursor-to-nearest-date)
获取日期:
;; modified with the help of @phils based on comments down below.
(setq lawlist-mouse-marked
(append lawlist-mouse-marked
`((holiday-sexp '(list ,month ,day ,year) ""))))
然后,该列表可以与calendar-holiday-list
(或下面修改过的代码)之类的内容一起用于在生成新日历布局后在新日历布局上添加日期。如果用户手动标记日期(例如,使用鼠标)并且在向前/向后滚动日历之后希望重新出现这些日期,则这是有用的。库holidays.el
包含函数holiday-sexp
,该函数使用过滤函数holiday-filter-visible-calendar
来编辑日期列表,以便只显示新日历上可见的日期:
(dolist (holiday
(let (res h err)
(sort
(dolist (p lawlist-mouse-marked res)
(if (setq h (eval p))
(setq res (append h res))))
'calendar-date-compare)))
(calendar-mark-visible-date (car holiday) lawlist-mouse-calendar-face))
答案 0 :(得分:4)
好的,让我们试着解决这个问题(不了解日历的任何内容)。
(overlays-at)
会返回叠加层列表。我会保持这个简单,只处理第一个,如果你想检查所有这些,只需循环它们直到你找到一个合适的。
此外,face
属性可能比简单的面部名称更复杂,如果是这种情况,您也需要处理它。
但无论如何,这是一段简单的代码(希望)可以满足您的需求:
(let ((overlays (overlays-at (point))))
(if overlays
(let ((face (overlay-get (car overlays) 'face)))
(cond ((eq face 'lawlist-red-face)
;; Do something
)
((eq face 'holiday)
;; Do another thing
)
(t
;; Do something else)))))