現在行をハイライトする global-hl-line-mode は、
当たり前すぎてもはや空気のようなマイナーモードだと思います。
しかし、これを有効にするとカーソル移動がけっこう重くなります。
Core i7でも重くなったと感じるくらいなので、
多くのマシンで影響がでることでしょう。
C-nで延々と下にカーソルを移動して描画が止まったら
重くなった証拠です。
原因は pre-command-hook と post-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)
騙されたと思って設定してみてください。
ほんと、カーソル移動が軽くなりますから!!
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 に加えてください。
報告していただけると、コードを更新します。
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。