gpt4 book ai didi

emacs - 在 Emacs 中将光标移动到 12 个月旋转日历上的日期的算法

转载 作者:行者123 更新时间:2023-12-04 12:32:11 24 4
gpt4 key购买 nike

目标 :这个线程的目标是创建两 (2) 个数学公式来替换函数 lawlist-calendar-cursor-to-visible-date 中 @lawlist 的长期解决方案(以下)。

故事问题

现在在 Emacs 中存在一个 12 个月的日历,每次向前和向后滚动一个月(或更多)。函数lawlist-calendar-cursor-to-visible-date用于为指定事件(例如生日、节假日、约会等)标记日期;或者,简单地将光标移动到特定日期。 @lawlist 设计了一个长期解决方案,它并不完全使用数学方程来计算所显示的 365 天中每一天的光标位置。可以创建两 (2) 个简洁的算法来代替长期解决方案。

可以在此处找到 12 个月滚动日历的工作草案(没有长期解决方案):

https://stackoverflow.com/a/21409154/2112489

传奇 :
displayed-month (数字 1 到 12)是出现在缓冲区左上角的月份,当 12 个月的日历向前或向后滚动时,它会发生变化。

目标month (数字 1 到 12)是我们需要借助两个数学公式来定位的月份——它的位置取决于标记的日期(例如,生日、假期、约会),并取决于 displayed-month在缓冲区的左上角。目标month可以在 12 个可能的位置中的任何一个。有三 (3) 个可能的 x轴坐标(即 6 31 56 )。有四 (4) 个可能的 y轴坐标(即 0 , 9 , 18 27 )。 [引用 x/y 坐标:http://www.mathsisfun.com/data/cartesian-coordinates.html ]

一个 row横向定义为 3 个月。

一个 column垂直定义为 4 个月。

第一个论坛必须等于 0 , 9 , 18 27 取决于该点是否在 row 上1、2、3 或 4 - 即从上到下。

第二个公式必须等于 6 , 31 , 或 56 取决于该点是否在 column 上1、2 或 3 - 即从左到右。

示例 :

  • 如果 displayed-month是一月(即 1)和目标 month是八月(即 8),然后是 row等于 18 column等于 31 .
  • 如果 displayed-month是二月(即 2),目标 month是八月(即 8),然后是 row等于 18 column等于 6 .
  • 如果 displayed-month是三月(即 3),目标 month是八月(即 8),然后是 row等于 9 column等于 56 .
  • 如果 displayed-month是四月(即 4)和目标 month是八月(即 8),然后是 row等于 9 column等于 31 .
  • 如果 displayed-month是 5 月(即 5)和目标 month是八月(即 8),然后是 row等于 9 column等于 6 .

  • 当布局一次向前滚动一个月时,12 个月的日历如下所示:
    ;;  1 2 3
    ;; 4 5 6
    ;; 7 8 9
    ;; 10 11 12

    ;; 2 3 4
    ;; 5 6 7
    ;; 8 9 10
    ;; 11 12 1

    ;; 3 4 5
    ;; 6 7 8
    ;; 9 10 11
    ;; 12 1 2

    ;; 4 5 6
    ;; 7 8 9
    ;; 10 11 12
    ;; 1 2 3

    ;; 5 6 7
    ;; 8 9 10
    ;; 11 12 1
    ;; 2 3 4

    ;; 6 7 8
    ;; 9 10 11
    ;; 12 1 2
    ;; 3 4 5

    ;; 7 8 9
    ;; 10 11 12
    ;; 1 2 3
    ;; 4 5 6

    ;; 8 9 10
    ;; 11 12 1
    ;; 2 3 4
    ;; 5 6 7

    ;; 9 10 11
    ;; 12 1 2
    ;; 3 4 5
    ;; 6 7 8

    ;; 10 11 12
    ;; 1 2 3
    ;; 4 5 6
    ;; 7 8 9

    ;; 11 12 1
    ;; 2 3 4
    ;; 5 6 7
    ;; 8 9 10

    ;; 12 1 2
    ;; 3 4 5
    ;; 6 7 8
    ;; 9 10 11

    @lawlist 的长期解决方案如下:
    (defun lawlist-calendar-cursor-to-visible-date (date)
    "Move the cursor to DATE that is on the screen."
    (let* (
    (month (calendar-extract-month date))
    (day (calendar-extract-day date))
    (year (calendar-extract-year date))
    (first-of-month-weekday (calendar-day-of-week (list month 1 year))))
    (goto-line
    (+ 3
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (cond
    ;; 1 2 3
    ;; 4 5 6
    ;; 7 8 9
    ;; 10 11 12
    ((and
    (eq displayed-month 1)
    (memq month `(1 2 3)))
    0)
    ((and
    (eq displayed-month 1)
    (memq month `(4 5 6)))
    9)
    ((and
    (eq displayed-month 1)
    (memq month `(7 8 9)))
    18)
    ((and
    (eq displayed-month 1)
    (memq month `(10 11 12)))
    27)
    ;; 2 3 4
    ;; 5 6 7
    ;; 8 9 10
    ;; 11 12 1
    ((and
    (eq displayed-month 2)
    (memq month `(2 3 4)))
    0)
    ((and
    (eq displayed-month 2)
    (memq month `(5 6 7)))
    9)
    ((and
    (eq displayed-month 2)
    (memq month `(8 9 10)))
    18)
    ((and
    (eq displayed-month 2)
    (memq month `(11 12 1)))
    27)
    ;; 3 4 5
    ;; 6 7 8
    ;; 9 10 11
    ;; 12 1 2
    ((and
    (eq displayed-month 3)
    (memq month `(3 4 5)))
    0)
    ((and
    (eq displayed-month 3)
    (memq month `(6 7 8)))
    9)
    ((and
    (eq displayed-month 3)
    (memq month `(9 10 11)))
    18)
    ((and
    (eq displayed-month 3)
    (memq month `(12 1 2)))
    27)
    ;; 4 5 6
    ;; 7 8 9
    ;; 10 11 12
    ;; 1 2 3
    ((and
    (eq displayed-month 4)
    (memq month `(4 5 6)))
    0)
    ((and
    (eq displayed-month 4)
    (memq month `(7 8 9)))
    9)
    ((and
    (eq displayed-month 4)
    (memq month `(10 11 12)))
    18)
    ((and
    (eq displayed-month 4)
    (memq month `(1 2 3)))
    27)
    ;; 5 6 7
    ;; 8 9 10
    ;; 11 12 1
    ;; 2 3 4
    ((and
    (eq displayed-month 5)
    (memq month `(5 6 7)))
    0)
    ((and
    (eq displayed-month 5)
    (memq month `(8 9 10)))
    9)
    ((and
    (eq displayed-month 5)
    (memq month `(11 12 1)))
    18)
    ((and
    (eq displayed-month 5)
    (memq month `(2 3 4)))
    27)
    ;; 6 7 8
    ;; 9 10 11
    ;; 12 1 2
    ;; 3 4 5
    ((and
    (eq displayed-month 6)
    (memq month `(6 7 8)))
    0)
    ((and
    (eq displayed-month 6)
    (memq month `(9 10 11)))
    9)
    ((and
    (eq displayed-month 6)
    (memq month `(12 1 2)))
    18)
    ((and
    (eq displayed-month 6)
    (memq month `(3 4 5)))
    27)
    ;; 7 8 9
    ;; 10 11 12
    ;; 1 2 3
    ;; 4 5 6
    ((and
    (eq displayed-month 7)
    (memq month `(7 8 9)))
    0)
    ((and
    (eq displayed-month 7)
    (memq month `(10 11 12)))
    9)
    ((and
    (eq displayed-month 7)
    (memq month `(1 2 3)))
    18)
    ((and
    (eq displayed-month 7)
    (memq month `(4 5 6)))
    27)
    ;; 8 9 10
    ;; 11 12 1
    ;; 2 3 4
    ;; 5 6 7
    ((and
    (eq displayed-month 8)
    (memq month `(8 9 10)))
    0)
    ((and
    (eq displayed-month 8)
    (memq month `(11 12 1)))
    9)
    ((and
    (eq displayed-month 8)
    (memq month `(2 3 4)))
    18)
    ((and
    (eq displayed-month 8)
    (memq month `(5 6 7)))
    27)
    ;; 9 10 11
    ;; 12 1 2
    ;; 3 4 5
    ;; 6 7 8
    ((and
    (eq displayed-month 9)
    (memq month `(9 10 11)))
    0)
    ((and
    (eq displayed-month 9)
    (memq month `(12 1 2)))
    9)
    ((and
    (eq displayed-month 9)
    (memq month `(3 4 5)))
    18)
    ((and
    (eq displayed-month 9)
    (memq month `(6 7 8)))
    27)
    ;; 10 11 12
    ;; 1 2 3
    ;; 4 5 6
    ;; 7 8 9
    ((and
    (eq displayed-month 10)
    (memq month `(10 11 12)))
    0)
    ((and
    (eq displayed-month 10)
    (memq month `(1 2 3)))
    9)
    ((and
    (eq displayed-month 10)
    (memq month `(4 5 6)))
    18)
    ((and
    (eq displayed-month 10)
    (memq month `(7 8 9)))
    27)
    ;; 11 12 1
    ;; 2 3 4
    ;; 5 6 7
    ;; 8 9 10
    ((and
    (eq displayed-month 11)
    (memq month `(11 12 1)))
    0)
    ((and
    (eq displayed-month 11)
    (memq month `(2 3 4)))
    9)
    ((and
    (eq displayed-month 11)
    (memq month `(5 6 7)))
    18)
    ((and
    (eq displayed-month 11)
    (memq month `(8 9 10)))
    27)
    ;; 12 1 2
    ;; 3 4 5
    ;; 6 7 8
    ;; 9 10 11
    ((and
    (eq displayed-month 12)
    (memq month `(12 1 2)))
    0)
    ((and
    (eq displayed-month 12)
    (memq month `(3 4 5)))
    9)
    ((and
    (eq displayed-month 12)
    (memq month `(6 7 8)))
    18)
    ((and
    (eq displayed-month 12)
    (memq month `(9 10 11)))
    27) )
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (/ (+ day -1
    (mod
    (- (calendar-day-of-week (list month 1 year)) calendar-week-start-day)
    7))
    7)))
    (move-to-column
    (+
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (cond
    ;; 1 2 3
    ;; 4 5 6
    ;; 7 8 9
    ;; 10 11 12
    ((and
    (eq displayed-month 1)
    (memq month `(1 4 7 10)))
    6)
    ((and
    (eq displayed-month 1)
    (memq month `(2 5 8 11)))
    31)
    ((and
    (eq displayed-month 1)
    (memq month `(3 6 9 12)))
    56)
    ;; 2 3 4
    ;; 5 6 7
    ;; 8 9 10
    ;; 11 12 1
    ((and
    (eq displayed-month 2)
    (memq month `(2 5 8 11)))
    6)
    ((and
    (eq displayed-month 2)
    (memq month `(3 6 9 12)))
    31)
    ((and
    (eq displayed-month 2)
    (memq month `(4 7 10 1)))
    56)
    ;; 3 4 5
    ;; 6 7 8
    ;; 9 10 11
    ;; 12 1 2
    ((and
    (eq displayed-month 3)
    (memq month `(3 6 9 12)))
    6)
    ((and
    (eq displayed-month 3)
    (memq month `(4 7 10 1)))
    31)
    ((and
    (eq displayed-month 3)
    (memq month `(5 8 11 2)))
    56)
    ;; 4 5 6
    ;; 7 8 9
    ;; 10 11 12
    ;; 1 2 3
    ((and
    (eq displayed-month 4)
    (memq month `(4 7 10 1)))
    6)
    ((and
    (eq displayed-month 4)
    (memq month `(5 8 11 2)))
    31)
    ((and
    (eq displayed-month 4)
    (memq month `(6 9 12 3)))
    56)
    ;; 5 6 7
    ;; 8 9 10
    ;; 11 12 1
    ;; 2 3 4
    ((and
    (eq displayed-month 5)
    (memq month `(5 8 11 2)))
    6)
    ((and
    (eq displayed-month 5)
    (memq month `(6 9 12 3)))
    31)
    ((and
    (eq displayed-month 5)
    (memq month `(7 10 1 4)))
    56)
    ;; 6 7 8
    ;; 9 10 11
    ;; 12 1 2
    ;; 3 4 5
    ((and
    (eq displayed-month 6)
    (memq month `(6 9 12 3)))
    6)
    ((and
    (eq displayed-month 6)
    (memq month `(7 10 1 4)))
    31)
    ((and
    (eq displayed-month 6)
    (memq month `(8 11 2 5)))
    56)
    ;; 7 8 9
    ;; 10 11 12
    ;; 1 2 3
    ;; 4 5 6
    ((and
    (eq displayed-month 7)
    (memq month `(7 10 1 4)))
    6)
    ((and
    (eq displayed-month 7)
    (memq month `(8 11 2 5)))
    31)
    ((and
    (eq displayed-month 7)
    (memq month `(9 12 3 6)))
    56)
    ;; 8 9 10
    ;; 11 12 1
    ;; 2 3 4
    ;; 5 6 7
    ((and
    (eq displayed-month 8)
    (memq month `(8 11 2 5)))
    6)
    ((and
    (eq displayed-month 8)
    (memq month `(9 12 3 6)))
    31)
    ((and
    (eq displayed-month 8)
    (memq month `(10 1 4 7)))
    56)
    ;; 9 10 11
    ;; 12 1 2
    ;; 3 4 5
    ;; 6 7 8
    ((and
    (eq displayed-month 9)
    (memq month `(9 12 3 6)))
    6)
    ((and
    (eq displayed-month 9)
    (memq month `(10 1 4 7)))
    31)
    ((and
    (eq displayed-month 9)
    (memq month `(11 2 5 8)))
    56)
    ;; 10 11 12
    ;; 1 2 3
    ;; 4 5 6
    ;; 7 8 9
    ((and
    (eq displayed-month 10)
    (memq month `(10 1 4 7)))
    6)
    ((and
    (eq displayed-month 10)
    (memq month `(11 2 5 8)))
    31)
    ((and
    (eq displayed-month 10)
    (memq month `(12 3 6 9)))
    56)
    ;; 11 12 1
    ;; 2 3 4
    ;; 5 6 7
    ;; 8 9 10
    ((and
    (eq displayed-month 11)
    (memq month `(11 2 5 8)))
    6)
    ((and
    (eq displayed-month 11)
    (memq month `(12 3 6 9)))
    31)
    ((and
    (eq displayed-month 11)
    (memq month `(1 4 7 10)))
    56)
    ;; 12 1 2
    ;; 3 4 5
    ;; 6 7 8
    ;; 9 10 11
    ((and
    (eq displayed-month 12)
    (memq month `(12 3 6 9)))
    6)
    ((and
    (eq displayed-month 12)
    (memq month `(1 4 7 10)))
    31)
    ((and
    (eq displayed-month 12)
    (memq month `(2 5 8 11)))
    56) )
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (* 3 (mod
    (- (calendar-day-of-week date) calendar-week-start-day)
    7))))))

    最佳答案

    我一定遗漏了一些东西,因为看起来公式就像(伪代码)一样简单:

    first  = 9 * ( rows - 1 ) 
    second = 6 + 25 * ( cols - 1 )

    根据您的编辑,您可以计算要移动的行和列:
    if target > display
    difference = target - display
    else
    difference = 12 + target - display
    rows = difference / 3
    cols = difference % 3
    rowmove = 9 * rows
    colmove = 6 + 25 * cols

    然后使用上面的公式。

    我对 elisp 的尝试:
    (let difference (if (>= target-month display-month) 
    (- target-month display-month)
    (- (+ target-month 12) display-month)))
    (let rows (/ difference 3))
    (let cols (% difference 3))
    (let rowmove (* 9 rows))
    (let colmove (+ 6 (* 25 cols)))

    关于emacs - 在 Emacs 中将光标移动到 12 个月旋转日历上的日期的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21642010/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com