ЦЕЛЬ: Цель этой темы - создать математическую формулу для замены долговременного решения на @lawlist в функции lawlist-target-year-function
(см. Ниже).Алгоритм для расчета целевого года целевого месяца - 12 месяцев * Календарь *
ПРИМЕЧАНИЕ: Решение этой теме несколько похожи, но все же будет отличаться, чем алгоритм написан @AShelly в соответствующей теме: https://stackoverflow.com/a/21709710/2112489
STORY ПРОБЛЕМА
Там в настоящее время существует 12-месячный календарь в Emacs, который прокручивает вперед и назад один месяц (или больше) за раз. Вспомогательная функция, называемая lawlist-target-year-function
, используется в праздничных функциях севера для размещения наложения в каждый праздник.
Полный рабочий проект 12-месячного календаря прокруткой
(
включая длинные руки раствор)
можно найти здесь - [исходный код Github был пересмотрен, чтобы включить краткое решение алгоритма по @legoscia ]:
https://github.com/lawlist/calendar-yearly-scroll-by-month/blob/master/lawlist-cal.el
ЛЕГЕНДА:
displayed-month
(номер с 1 по 12) является месяцем, что приложение ушей в верхнем левом углу буфера, и это изменяется, когда 12-месячный календарь прокручивается вперед или назад.
target-month
(числа с 1 по 12) - это месяц, который содержит праздник, который будет отмечен наложением. Существует три (3) возможных координаты оси x
(т. Е. Столбец 1, столбец 2 или столбец 3). Существует четыре (4) возможных координаты оси y
(т. Е. Строка 1, строка 2, строка 3 или строка 4). [Цитирование к координатам x/y: http://www.mathsisfun.com/data/cartesian-coordinates.html]
displayed-year
- это год, который появляется в верхнем левом углу буфера, и это изменяется по мере прокрутки 12-месячного календаря вперед или назад.
Целью year
является год target-month
.
ПРИМЕР:
Когда
displayed-month
январь (то есть 1), то год является одинаковым для всех целевых месяцев.Когда
displayed-month
февраль (то есть, 2):(if (memq target-month `(2 3 4 5 6 7 8 9 10 11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
март (то есть 3):(if (memq target-month `(3 4 5 6 7 8 9 10 11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
апрель (т.е., 4):(if (memq target-month `(4 5 6 7 8 9 10 11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
является май (т.е., 5)(if (memq target-month `(5 6 7 8 9 10 11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
июнь (т.е. 6):(if (memq target-month `(6 7 8 9 10 11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
является Июль (т. Е. 7):(if (memq target-month `(7 8 9 10 11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
август (т.е. 8):(if (memq target-month `(8 9 10 11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
сентябрь (т.е. 9):(if (memq target-month `(9 10 11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
октябрь (т.е., 10):(if (memq target-month `(10 11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
ноябрь (т.е., 11):(if (memq target-month `(11 12)) displayed-year (+ displayed-year 1))
Когда
displayed-month
декабрь (т.е. 12):(if (memq target-month `(12)) displayed-year (+ displayed-year 1))
календарь 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-target-year-function (target-month)
(cond
;; 1 2 3
;; 4 5 6
;; 7 8 9
;; 10 11 12
((eq displayed-month 1)
displayed-year)
;; 2 3 4
;; 5 6 7
;; 8 9 10
;; 11 12 1
((eq displayed-month 2)
(if (memq target-month `(2 3 4 5 6 7 8 9 10 11 12))
displayed-year
(+ displayed-year 1)))
;; 3 4 5
;; 6 7 8
;; 9 10 11
;; 12 1 2
((eq displayed-month 3)
(if (memq target-month `(3 4 5 6 7 8 9 10 11 12))
displayed-year
(+ displayed-year 1)))
;; 4 5 6
;; 7 8 9
;; 10 11 12
;; 1 2 3
((eq displayed-month 4)
(if (memq target-month `(4 5 6 7 8 9 10 11 12))
displayed-year
(+ displayed-year 1)))
;; 5 6 7
;; 8 9 10
;; 11 12 1
;; 2 3 4
((eq displayed-month 5)
(if (memq target-month `(5 6 7 8 9 10 11 12))
displayed-year
(+ displayed-year 1)))
;; 6 7 8
;; 9 10 11
;; 12 1 2
;; 3 4 5
((eq displayed-month 6)
(if (memq target-month `(6 7 8 9 10 11 12))
displayed-year
(+ displayed-year 1)))
;; 7 8 9
;; 10 11 12
;; 1 2 3
;; 4 5 6
((eq displayed-month 7)
(if (memq target-month `(7 8 9 10 11 12))
displayed-year
(+ displayed-year 1)))
;; 8 9 10
;; 11 12 1
;; 2 3 4
;; 5 6 7
((eq displayed-month 8)
(if (memq target-month `(8 9 10 11 12))
displayed-year
(+ displayed-year 1)))
;; 9 10 11
;; 12 1 2
;; 3 4 5
;; 6 7 8
((eq displayed-month 9)
(if (memq target-month `(9 10 11 12))
displayed-year
(+ displayed-year 1)))
;; 10 11 12
;; 1 2 3
;; 4 5 6
;; 7 8 9
((eq displayed-month 10)
(if (memq target-month `(10 11 12))
displayed-year
(+ displayed-year 1)))
;; 11 12 1
;; 2 3 4
;; 5 6 7
;; 8 9 10
((eq displayed-month 11)
(if (memq target-month `(11 12))
displayed-year
(+ displayed-year 1)))
;; 12 1 2
;; 3 4 5
;; 6 7 8
;; 9 10 11
((eq displayed-month 12)
(if (memq target-month `(12))
displayed-year
(+ displayed-year 1)))))
Да, это прекрасно работает - большое спасибо - очень благодарен! :) – lawlist