📝

VSCodeでVim拡張使っているとコードが勝手に領域展開しちゃう問題に対処する

2024/02/02に公開

Vimのキーバインドが好きな人はVSCodeでVim Extensionを使っていること思います。
https://marketplace.visualstudio.com/items?itemName=vscodevim.vim

自分もこのExtensionを愛用しているのですが若干悩みポイントが...。VSCodeでコードを折りたたむことがあるのですが、この折りたたんでいる部分を乗り越えようとすると、自動的にコードが展開されてしまうのです。

既知の問題

この問題に対する関連Issueは、VSCodeVim/Vimのリポジトリ内に存在しています。実はまだ根本解決はしていません。

一見直ったかのように見せかけた対処がVSCodeのsettings.jsonvim.foldFix: trueを追加するというものです。ただし、これは j k 移動のときに展開されなくなるだけで、 ctrl+uctrl+dでのスクロール時に対処できていません。

ショートカットの置き換えによるハック

解決策として、同Issueにて ctrl+uctrl+d他のコマンドの組み合わせに置き換える方法 が紹介されています。具体的には以下の設定をsettings.jsonに追加するというもの。

"vim.normalModeKeyBindings": [
  {
    "before": ["<C-u>"],
    "after": ["H", "z", "z"]
  },
  {
    "before": ["<C-d>"],
    "after": ["L", "z", "z"]
  }
]

この設定により、ctrl+uctrl+dの動作が変更されます。意味を解説すると以下のとおりです。

  • H: 現在の画面の上部にカーソルを移動
  • L: 現在の画面の下部にカーソルを移動
  • z: ここでは zz コマンドとなり、画面の中央に現在の行を再配置

この設定によって、ctrl+uctrl+dを押したときに画面を半ページ上下にスクロールさせる代わりに、画面の上部や下部にカーソルを移動させ、その位置を画面の中央に持ってくることになります。この方法であれば折りたたみ箇所を跨ぐ移動をしても、自動的にコードが展開されることがなくなります!

デフォルトで上の挙動になってほしい気持ちもありつつ、きっと色々と事情があるんだなと思うので同じ悩みを持っている人はぜひ試してみて下さい!

Discussion