概要
Windows10でSpacemacsを使っている時、Helm Git Grep ( Space g /
)で文字の高速タイピングをすると高確率でフリーズする。
1文字打つ度に反応速度が凄い (デフォルトは0.01秒っぽい)ので、高速タイプによって処理が衝突したりしているのかもしれない。
1文字ずつ反応を確かめながら打たねばならずストレスが凄い。
ひとまずの対処
Spacemacsの設定ファイル .spacemacs
( Space f e d
)の dotspacemacs/user-config ()
内で、Helmの入力に対する反応速度を操作する。
具体的には以下をやる。
- Helmのミニバッファ (
Space f f
など)が開いたら追加の判定を始める - もしHelm Git Grepのバッファなら、入力から反応までの遅延時間
helm-input-idle-delay
を0.5秒に遅らせる - それ以外のバッファなら、
helm-input-idle-delay
を0.01秒に戻す
以下のように追記する。
(defun dotspacemacs/user-config ()
;;; Helm
;; 入力への反応時間を `Git Grep`のときだけ遅らせ、それ以外では戻す
(add-hook 'helm-minibuffer-set-up-hook
(function (lambda ()
(if (equal (helm-buffer-get) "*helm git grep*")
;; (message "Helm Git Grepですねぇ!")
(setq helm-input-idle-delay 0.5)
(setq helm-input-idle-delay 0.01)))))
)
毎回書き換えが起こるのはつらいな、と思い、こういう方法もあるかも。
(バッファ名がhelmじゃないなら書き換え自体しない)
(add-hook 'helm-minibuffer-set-up-hook
(function
(lambda ()
(let ((buffer-name (helm-buffer-get)))
(if (string-match "*helm.*" buffer-name)
(if (equal buffer-name "*helm git grep*")
;; (message "Helm Git Grepですねぇ!")
(setq helm-input-idle-delay 0.5)
(setq helm-input-idle-delay 0.01))
nil)))))
場当たり的に対処するなら
helmの設定に helm-input-idle-delay
を追加すれば、以下のように遅延時間を (全体的に)0.2秒遅らせることもできる。
dotspacemacs-configuration-layers
'(
;; ここ
(helm :variables
helm-input-idle-delay 0.2)
)
ただし、これだと Ctrl + l
でのディレクトリ移動など、通常のHelm操作までラグる。
解決までの経緯
dotspacemacs-which-key-delay
ではダメ
最初にSpacemacs自体の設定で解決することを考えたが、 dotspacemacs-which-key-delay
では対象範囲が広すぎた。
しかもSpacemacs全体の反応速度は落ちるくせに、Helm Git Grepは元気に反応してしまう。
helm-input-idle-delay
は有効
次に、各レイヤーの設定を見た。幸いHelm layerには helm-input-idle-delay
の存在を確認できた。
定義ジャンプすると、初期値は0.01秒っぽい。
これで急場はしのげたが、Helm全体の反応速度を落としてしまうので良くない。
helm-grep-input-idle-delay
が使えない
巷でやり玉に挙げられていたのは helm-grep-input-idle-delay
だった。
cf. Emacs helm grep flickering
定義を見るとこんな感じで、grepのときだけ別途に遅延させてくれるらしい。
(defcustom helm-grep-input-idle-delay 0.6
"Same as `helm-input-idle-delay' but for grep commands.
It have a higher value than `helm-input-idle-delay' to avoid
flickering when updating."
:group 'helm-grep
:type 'float)
……が、Spacemacsではどうやら機能していなかった
helm-input-idle-delay
を動的に変えることに
どうしようもないので、バッファがHelm Git Grepのときだけ一時的に遅延時間を変えられないか、と考えていた。その結果、生まれたのが冒頭のアレ。
バッファ判定はどのタイミングでフックすればできるのか、そのバッファ名をどうやれば取得できるのか、自力で調べるのがとてもつらかった。
もっと良い方法もあるだろうが、これ以上は頑張れない。。。