emacs-jp/japanese-holidays

eldoc 連携できないか

tkita opened this issue · 3 comments

tkita commented

h をタイプすることで calendar-cursor-holidays が起動してエコーエリアに表示されますが、
eldoc から calendar-cursor-holidays を起動できれば h のタイプを省略できるようになります。

ソースを見ていますが、私にとってはちょっとハードル高そうです。
どなたか実装できませんか?

(defun my/eldoc-function (&rest _args)
  (if (= (mod (point) 2) 0)
      "point is even"
    "point is odd"))

(add-hook 'ruby-mode-hook 'eldoc-mode)
(add-hook 'ruby-mode-hook
	  (lambda ()
	    (add-hook 'eldoc-documentation-functions #'my/eldoc-function nil t)))

簡単すぎる例ですが, こんな感じにやれば普通は使えるはずなのですが, calendar-mode に適用しようとしても期待通りの挙動になりませんでした. 頑張れば実装はできるのでしょうけど, 手っ取り早く実装するなら calendar-move-hookcalendar-cursor-holidays をセットするか, 祝日だけ表示したいのであれば下記のような関数をセットする方が良さそうです.

(defun my/japanese-holiday-show (&rest _args)
  (let* ((date (calendar-cursor-to-date t))
	 (date-string (calendar-date-string date))
	 (holiday-list (calendar-check-holidays date)))
    (when holiday-list
      (message "%s: %s" date-string (mapconcat #'identity holiday-list "; ")))))

org-eldocからの抜粋ですが、Emacs-27はアドバイスにより制御するみたいです。

;;;###autoload
(defun org-eldoc-load ()
  "Set up org-eldoc documentation function."
  (interactive)
  ;; This approach is taken from python.el.
  (with-no-warnings
    (cond
     ((null eldoc-documentation-function) ; Emacs<25
      (setq-local eldoc-documentation-function
		  #'org-eldoc-documentation-function))
     ((boundp 'eldoc-documentation-functions) ; Emacs>=28
      (add-hook 'eldoc-documentation-functions
		#'org-eldoc-documentation-function nil t))
     (t
      (add-function :before-until (local 'eldoc-documentation-function)
		    #'org-eldoc-documentation-function)))))

Emacs-28でのカスタマイズがスマートですね。

tkita commented

@syohex さま、落ち着いて考えてみると確かに eldoc は必須ではないですね。ご指摘ありがとうございます。
とはいえ、自分のチャレンジとして eldoc 連携もやってたく、
@conao3 さまのヒントは助かりました。ありがとうございます。

いったん close します。