GNU公式の Emacs 26.2 で日本語IMEパッチが取り込まれたようですね。これでやっと公式バイナリを心置きなく使えるようになりました。
と、ホクホクしていたのもつかの間。今度はewwでhit-a-hintがエラーになってしまいました。
hit-a-hintは Emacs のテキストブラウザ eww でページを開いている時に、’o’を押すことでリンク文字の先頭にace-jumpできる機能ですが、これが無いとeww使う気になれません…。でも腱鞘炎があまりにひどいので、マウスなんて触りたくもありません…。(T^T)
毎回というわけではなく、上記画面のようにリンク文字がバッファ下端行にある時に発生するようです。(上端でも同様。要はリンク文字列がバッファ外にまたがっていた場合のようです)
hint文字表示するのに、いちいちバッファ下端行を確認してられないので、原因を少しだけ調べてみました。
まずは toggle-debug-on-error でバックトレースを表示。
ふむふむ、’o’を押した時に、ace-link–eww-collect関数の中で型が不正になってエラーになってますね。buffer-substring-no-properiesはバッファ内の任意位置の文字列を抜き出す関数ですね。この指定パラメータがnilになってしまったのが問題のようです。
なんでnilになってしまうのか…それを追ってみたかったのですが、まぁとりあえず回避してしまえ~という事で、ace-link–eww-collect関数を書き換えてしまいました。ちなみにbegとendのいずれもnilになっては駄目なので、これを除外すれば良いはず。
変更箇所はハイライトされたところで、text-property-not-allとbuffer-substring-no-propertiesを呼び出す際にbeg/endのnil判定を追加しました。とにかく動けば良いや~って投げやりなコードなんで、良い子はこんなコード書いては駄目ですね…反省orz
(defun ace-link--eww-collect ()
"Collect the positions of visible links in the current `eww' buffer."
(save-excursion
(save-restriction
(narrow-to-region
(window-start)
(window-end))
(goto-char (point-min))
(let (beg end candidates)
(setq end
(if (get-text-property (point) 'help-echo)
(point)
(text-property-any
(point) (point-max) 'help-echo nil)))
(while (setq beg (when (not (eq end nil))
(text-property-not-all
end (point-max) 'help-echo nil)))
(goto-char beg)
(setq end (text-property-any
(point) (point-max) 'help-echo nil))
(when (and (not (eq beg nil)) (not (eq end nil)))
(push (cons (buffer-substring-no-properties beg end) beg)
candidates)))
(nreverse candidates)))))
ace-link.elcを削除して、ace-link.elの上記関数を直接書き換えました。
上記画像の通り、これでバッファ下端行にリンク行が存在しても、hint文字が表示されるようになりました。最下端のリンク行にhint文字が出ていませんが、これはsubstringの終端がnilの時を除外したためでしょう。根本的な原因までは追っていませんが、とりあえず動作したので良しとしておきます。