如何区分不同的叠加点

时间:2013-12-21 04:34:09

标签: emacs elisp

原始问题:我正在寻求一些帮助,以区分可能存在的叠加层。如果使用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+.elhttp://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-daycalendar-extract-monthcalendar-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))

1 个答案:

答案 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)))))