2020-06-21 , ,

月相をEmacsのカレンダーに追加する

きっかけは夏至。今日は夏至かぁ……と思ってorg-modeのアジェンダやcalendarを見ても夏至(Summer Solstice)が表示されていません。Emacsでは標準で表示するはずなのに。調べてみたところ、japanese-holidays.el 用の設定で変数 calendar-holidays の値を日本の休日で完全に置き換えてしまっていました。その際に元々あった (solar-equinoxes-solstices) が消えていたんですね。 calendar-holidays(solar-equinoxes-solstices) を追加したら表示されるようになりました。ついでに英語だとなんだかしっくりこないので solar-n-hemi-seasons("春分" "夏至" "秋分" "冬至") に修正しました。

ついでなので月相も追加してしまおうと思いました。変数 calendar-holidays の説明に次のように書いてあったからです。

To include the phases of the moon, add

(lunar-phases)

to the holiday list, …

M-x describe-function lunar-phases してみるとそういう名前の関数はあるみたいです。なので calendar-holidays(lunar-phases) を追加して M-x calendar してみたところエラー(Wrong type argument: listp, 109)と共に直近の主要な月相一覧が表示されました。 lunar-phases を詳しく調べてみるとこの関数は単に新月、上弦の月、満月、下弦の月の日時を三ヶ月分表示するものだったようです。

再度変数 calendar-holidays の説明をよく見ると続きがあって

To include the phases of the moon, add

(lunar-phases)

to the holiday list, where ‘lunar-phases’ is an Emacs-Lisp function that you’ve written to return a (possibly empty) list of the relevant VISIBLE dates with descriptive strings such as

(((2 6 1989) "New Moon") ((2 12 1989) "First Quarter Moon") … ).

と書いてありました。要するに lunar-phases というのはあくまで例として挙げた架空の関数で、あなたが書いてくださいよ、ということのようです。既にないか探したのですが見つからなかったので仕方なく自分で書くことにしました。

(require 'lunar)
(require 'cl)

(defun my-lunar-phases-for-calendar-holidays ()
  (let ((m displayed-month)
        (y displayed-year))
    (calendar-increment-month m y -1)
    (loop for x in (lunar-phase-list m y)
          collect (list
                   (nth 0 x)
                   (concat
                    (lunar-phase-name (nth 2 x))
                    " "
                    (nth 1 x))))))

(lunar-phase-list) がほぼそのまま使えるかと期待したのですが微妙に形式が違うので変換する必要がありました。

それで、この関数を指定するリスト '(my-lunar-phases-for-calendar-holidays) を変数 calendar-holidays に追加します。 japanese-holidays.el を使っていたりするとすでに書き替えている場所があるかもしれないのでうまいこと追加してください。

lunar-phase-names も日本語にしてしまいましょう。 ("新月" "上弦の月" "満月" "下弦の月")

というわけでなんとか主要な月相をcalendarやorg-modeのアジェンダに表示できました。

2020-06-21-lunar-phases.png

そういえば今日は部分日食が話題になっていました。なるほど月は太陽の方向にあるから新月ですね。

それにしても何で標準で用意されていないのでしょうね。ここまで用意しておきながら。Emacs上で月相を知りたい人は居ないのかな。……居ないんでしょうね。

再度調べてみると次のような質問を見つけました。

org-agendaに直接月相を表示する方法です。calendarに入れなくてもいいならこれでも可。

ところで月の出と月の入りも表示できると便利な気もするのですが……

(2020-06-24追記):次の記事では毎日の月の出と月の入り、南中の時刻、そして毎日の月齢も実現します。

Pingback / Trackback