Emacs 26.2 + ace-link-20190716.920 でewwのhit-a-hintがエラーになる

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の時を除外したためでしょう。根本的な原因までは追っていませんが、とりあえず動作したので良しとしておきます。

Author: kan
初めてプログラムらしきものを作ったのは幼稚園の時。それから約40年経ち、現在はデジタル回路設計から信号処理、機械学習まで幅広い経験を活かしてシステムアーキテクトとして活動中。超並列処理、デジタル回路とソフトウェアのバランス設計が得意分野。 Linux/Mac/Windows使い。 C/C++を主要言語として、Unity、Qtなどのフレームワーク興味あり。UI/UXデザイン、STL拡張など。 音声処理、画像処理、技術コンサルは仕事でも請け負います。 一般ソフトウェア開発プロセス、医療機器ソフトウェア開発プロセス作成も進行中。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください