2019年8月31日土曜日

yascrollがemacsの仕様変更で動かなくなったので修正してみた

yascrollが動かなくなっていることに今頃気付いた。

試しに M-x yascroll:show-scroll-bar を実行してみると:
Wrong number of arguments: (left-width right-width outside-margins), 4
なるerror messageが返って来る。どうやらEmacs側の仕様変更があった模様。

git logで調べてみるとこれだった:
commit 8e0ebb9a3cb9beef2f5ff50436fef1c54a3e3c92
Author: Martin Rudalics <rudalics@gmx.at>
Date:   Mon Jul 22 09:19:18 2019 +0200
    Handle persistence of windows' scroll bar and fringes settings (Bug#36193)
src/window.cに含まれるwindow-fringesというCで書かれたfunctionは、これまで指定された (Emacsにおける) windowのleft-widgh, right-width, outside-marginsの3つのparametersを返していた。

このcommitで加えられた変更により、新たに4つ目のpersistentというparameterが追加された。これがyascrollの側でparametersの数が合わないというerrorの原因となっていた。

なお、window-fringesの詳細はEmacsからF1 helpで参照できる:
window-fringes is a built-in function in ‘C source code’.
(window-fringes &optional WINDOW)
  Probably introduced at or before Emacs version 22.1.
  This function does not change global state, including the match data.
Return fringe settings for specified WINDOW.
WINDOW must be a live window and defaults to the selected one.
Value is a list of the form (LEFT-WIDTH RIGHT-WIDTH OUTSIDE-MARGINS
PERSISTENT), see ‘set-window-fringes’.
さて、実際にerrorを起こしていたのはyascroll.el内に定義されたyascroll:choose-scroll-barである:
(defun yascroll:choose-scroll-bar ()
  (when (memq window-system yascroll:enabled-window-systems)
    (cl-destructuring-bind (left-width right-width outside-margins)
        (window-fringes)
      (cl-loop for scroll-bar in (yascroll:listify yascroll:scroll-bar)
               if (or (eq scroll-bar 'text-area)
                      (and (eq scroll-bar 'left-fringe)
                           (> left-width 0))
                      (and (eq scroll-bar 'right-fringe)
                           (> right-width 0)))
               return scroll-bar))))
left-width, right-width, outside-marginesの3つがcl-destructuring-bindに指定されているため、新たに4つ目のpersistentを返すようになったwindow-fringesと不整合を起こした。

解決方法は簡単で、
(cl-destructuring-bind (left-width right-width outside-margins persistent)
のように適当な名前のvariableを追加すれば良い (なお、このvariableは使われない)。

fileを修正したら、M-x byte-recompile-fileなどでyascroll.elcを再生成し、el-get-reload (他お好みのpackage management systemの作法)でyascrollをreloadする。

0 件のコメント:

コメントを投稿