Hatena::ブログ(Diary)

daimatzメモ

2012-02-15

[Emacs]linum-modeを軽くする

最近妙に Cocoa Emacs が重いなあと思っていたのだけれど、 linum-mode が原因のようで、こいつを切ると見違えたように軽くなった。

でもさすがに行番号がないのは寂しい。同じようなインターフェイスの wb-line-number はちょっと使ってみたけどいろいろダメだし。

どうするか・・

しょうがないのでソースを見ることに。

(define-minor-mode linum-mode
  "Toggle display of line numbers in the left marginal area."
  :lighter ""                           ; for desktop.el
  (if linum-mode
      (progn
        (if linum-eager
            (add-hook 'post-command-hook (if linum-delay
                                             'linum-schedule
                                           'linum-update-current) nil t)
          (add-hook 'after-change-functions 'linum-after-change nil t))
        (add-hook 'window-scroll-functions 'linum-after-scroll nil t)
        ;; mistake in Emacs: window-size-change-functions cannot be local
        (add-hook 'window-size-change-functions 'linum-after-size)
        (add-hook 'change-major-mode-hook 'linum-delete-overlays nil t)
        (add-hook 'window-configuration-change-hook
                  'linum-after-config nil t)
        (linum-update-current))
    (remove-hook 'post-command-hook 'linum-update-current t)
    (remove-hook 'post-command-hook 'linum-schedule t)
    (remove-hook 'window-size-change-functions 'linum-after-size)
    (remove-hook 'window-scroll-functions 'linum-after-scroll t)
    (remove-hook 'after-change-functions 'linum-after-change t)
    (remove-hook 'window-configuration-change-hook 'linum-after-config t)
    (remove-hook 'change-major-mode-hook 'linum-delete-overlays t)
    (linum-delete-overlays)))

すると、 add-hook の嵐。これじゃ重くて当然。

うーん。どれか削れるものはないか。

post-command-hook

前のコマンドを逐一見ているこいつが明らかに一番重い。作者もそれをわかっているのか

(if linum-delay
    'linum-schedule
  'linum-update-current)

のようにして、遅延を入れられるようにしているっぽい。で、 linum-delay という変数を見てみたがこれは単なる真理値。

問題は linum-schedule のほうで、こいつを見てみると

(defun linum-schedule ()
  ;; schedule an update; the delay gives Emacs a chance for display changes
  (run-with-idle-timer 0 nil #'linum-update-current))

このようになっているが、これって意味あるのか? 0 秒アイドル後に実行って、タイマー設定しないのと同じでは。

なのでここを適当な 0 でない値に変更することで遅延を入れられるはず。

ただ私の主義としてこういう場合は advice を定義したいので、結局

(setq linum-delay t)
(defadvice linum-schedule (around my-linum-schedule () activate)
  (run-with-idle-timer 0.2 nil #'linum-update-current))

この3行を .emacs に追記することで linum-mode が軽くなった。

ファイル編集中最後の行に追記したりすると表示がちょっと遅れるけど、これは大した問題ではないはず。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証