<2016-11-09 Wed>todotxt.elで挙動がおかしくなるのでコードを修正しました。

現在行をハイライトする global-hl-line-mode は、
当たり前すぎてもはや空気のようなマイナーモードだと思います。

しかし、これを有効にするとカーソル移動がけっこう重くなります。

Core i7でも重くなったと感じるくらいなので、
多くのマシンで影響がでることでしょう。

C-nで延々と下にカーソルを移動して描画が止まったら
重くなった証拠です。

原因は pre-command-hookpost-command-hook という
各コマンドの前後に実行されるフックです。

たくさんのパッケージを使っていると、
これらのフックにたくさんの関数が登録されるため、
どんどん重くなっていきます。

確かに便利なフックですが、多用すると
まるで足枷をはめながら動くことになります。

では、どうすればいいかというと、代わりに
run-with-idle-timer というアイドル時に実行される
タイマー関数を設定すればよいことです。

アイドル時に実行されるので、タイマーが実行される前に
次のコマンドを実行すればその間は関数が実行されません。

global-hl-line-modeを使う代わりに
タイマーを使ってみてください。

この設定で0.03秒後に現在行がハイライトされるようになります。

(require 'hl-line)
;;; hl-lineを無効にするメジャーモードを指定する
(defvar global-hl-line-timer-exclude-modes '(todotxt-mode))
(defun global-hl-line-timer-function ()
  (unless (memq major-mode global-hl-line-timer-exclude-modes)
    (global-hl-line-unhighlight-all)
    (let ((global-hl-line-mode t))
      (global-hl-line-highlight))))
(setq global-hl-line-timer
      (run-with-idle-timer 0.03 t 'global-hl-line-timer-function))
;; (cancel-timer global-hl-line-timer)

騙されたと思って設定してみてください。

ほんと、カーソル移動が軽くなりますから!!

<2016-11-09 Wed>hl-lineを無効にするメジャーモードを指定

るびきち塾 の塾生からtodotxt.elとこの設定が競合するという報告を頂きました。
元のglobal-hl-line-timerのコードではtodotxt.elがうまく動きません。
よって、todotxt-modeではglobal-hl-line-timerを働かないようにコードを改良しました。
他にも、global-hl-line-timerと愛称の悪いメジャーモードがあったら、 global-hl-line-timer-exclude-modes に加えてください。
報告していただけると、コードを更新します。

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。