独自の 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を返す