独自の eldoc関数を設定することに関するメモ
jedi-eldocを作ったときあんまり参考資料がなかったので
メモを残しておきます。
eldoc-documentation-functionを設定する
具体的になるやるかというと, eldoc-documentation-functionに関数を
設定するだけです。minor-modeの初期化時に以下のようにすればよい
でしょう。
(set (make-local-variable 'eldoc-documentation-function) #'my-own-eldoc-function)
eldocを有効にするには turn-on-eldoc-modeを実行することで
行えます。上記の設定の後あたりに以下を追加すればよいでしょう。
(turn-on-eldoc-mode)
現在のカーソル位置に対応する引数をハイライトするという機能の
ようなものがあるかと思ったんですが、そんなものはないようで
eldoc-documentationで設定した関数内で自分自身で行う必要が
あります。
戻り値
同期的な場合
同期的な場合は表示したいものを返してください
非同期
非同期処理を用いる場合、設定する関数の戻り値は nilにしておくと
よいと思います。該当の関数の戻り値が nil以外だとそれを文字列化
したものが minibufferに表示されてしまうので美しくないです。
表示は明示的に eldoc-messageを呼び出してください。
これで機能します。
以下に jedi-eldocの場合を載せておきます。
(defun* jedi-eldoc:format--for-eldoc (&key params index call_name) (let ((current-arg (nth index params))) (if current-arg (setf (nth index params) (propertize current-arg 'face 'jedi-eldoc:highlight-function-argument))) (concat call_name "(" (mapconcat #'identity params ", ") ")"))) (defun jedi-eldoc:format-for-eldoc (args) (when args ;; 明示的に eldoc-messeageを呼ぶことで minibufferに表示する (eldoc-message (apply #'jedi-eldoc:format--for-eldoc args)))) (defun jedi-eldoc:documentation-function () (deferred:nextc (jedi:call-deferred 'get_in_function_call) #'jedi-eldoc:format-for-eldoc) nil) ;; 非同期なので nilを返す