2016/06/26 16:24:28

vimでjkでの縦スクロールが遅くなる(重くなる)件について


Warning: Attempt to read property "post_excerpt" on null in /home/kpkyvkzp/public_html/unskilled.site/wp-content/themes/unskilled2/content-header-eyecatch.php on line 5
目次(クリックするとジャンプします)
  • 1:vimがもっさりする
  • 2:原因を探してみる
  • 2.1:カーソル行のハイライト
  • 2.2:行番号の相対表示
  • 3:解決したか?
  • 4:補足・ハマったポイント
  • 5:まとめ

vimがもっさりする

最近になってvimの動作が重くなることが増えた気がしてきました。いろんな設定やプラグインを入れたりしたのであまり整理できていないのも原因カモしれません。

一番困っていた動作もっさりポイントは「縦スクロールもっさり」です。

vimではカーソル移動にhjklを使うと思います。@MINOも矢印キーを無効にして、hjklだけで操作ができるように訓練しています。

jは上行、kが下降になるかと思いますが、このキーでスクロールすると動作がもっさりとします。

具体的にはつっかかるような動きがあり、キーを離しても直ぐには止まらず、ダララッと動いてしまいます。

おそらく処理が追いつかずに遅延しているための挙動なのだと思います。

poworlineにてCPU稼働率を表示させていますが、jkキーによるスクロールをすると稼働率が100近くまでいき、スクロールしている間はずっと90〜100程度を行ったり来たりします。

最初はキーリピートを疑ったのですが、いろいろ設定してみても特にもっさり感は治らず。

vimを使い始めた時は速かったので、やはりどうもvimの設定なりプラグインからの問題のようです…。

大きな移動にはctrl+dやctrl+bを使いますが、どちらかというとjkキースクロール派なので、このもっさり感は大いにストレスになりました。

原因を探してみる

そこで一旦vimの設定ファイルを無視して起動してみて、設定を一つ一つ洗うことにしました。

調べ方としてはすごくアナログですが、設定を1つずつ単独で試していき、それぞれの設定下でCPU稼働率がどうなるかを見ました。

すごく時間がかかりましたよ…。

その過程で浮かび上がってきた設定が2つありました。設定を外すとCPU稼働率が劇的に下がった設定です。

結論から言うと画面描画の負荷が問題になっていたようです。

カーソル行のハイライト

:set cursorline

現在のカーソル行を目立たせる設定ですが、これは全行描画を行う設定になるそうで、動作がもっさりする原因になり得るとのことです。

確かにこの設定をoffにすると、jkスクロール時のCPU稼働率が40〜60とそれなりに下がりました。

行番号の相対表示

:set relativenumber

行番号を相対表示させる設定です。この設定も全行描画を行うとのことです。

この設定をしておくと行をわざわざ数える必要がないので便利なのですが、どうやらそれなりの負荷があるようです。

この設定を外すと、先ほど同様にjkスクロール時のCPU稼働率が40〜60程度に下がりました。

この設定は最近したもので記事にも書きました。どうやらjkスクロールのもっさりはこの設定も原因のようです。

解決したか?

この2つの設定をoffにした状態で、従来の設定ファイルを有効にした結果、jkスクロール時のCPU稼働率は50〜60程度になりました。

つっかかるような挙動や、動きがすぐに止まらないような挙動は無くなりました。

設定を明示的にoffにするにはvim.rcに以下の様に記述します。

:set nocursorline
:set norelativenumber

一応もっさり感はなくなったのですが、まだCPU稼働率が高いような気もします。

(単に@MINOのノートがヘボいのかもしれませんが…。)

おそらく調べきれていない部分があるのだと思いますが、これ以上調査すると結構時間が持って行かれるので、再度の調査はまた時間を作ってから行いたいと思います。

補足・ハマったポイント

:set cursorlineは行のハイライトですが、同じような設定に

:set cursocolumn

があります。これは列のハイライトです。@MINOはこの設定を入れていなかったのですが、この設定も全行描画を行うとのことで意外と負荷が高いのかもしれません。

もしこの設定をonにしていて、スクロールがもっさりする場合は

:set nocursocolumn

としてoffにして挙動を確認シてみることをオススメします。

まとめ

vimの設定項目は大量にあり、なおかつターミナルエミュレータの挙動も関わってくるとのことで、不具合や変な挙動をどうやって調べるかも初心者にとってはとても難しいですね。

今回は描画系の負荷が原因になっていたようですが、おそらくまだ他にも関連していることがありそうです。

不要な設定や使っていないプラグインはどんどん整理した方がいいですね。

vimと付き合うのってたいへんだなぁ。