VSCodeでvimrcの設定を読み込みたい

## 動機

VSCode の豊富な拡張機能はさまざまな種類の開発を便利にします。  
私は普段主に Vim を使ってコーディングをしていましたが、 VSCode を使い始めることを決意しました（2020年執筆当時）。

それにあたり、 VSCode で Vim 風操作を実現することに加え、自分用にカスタマイズした vimrc の設定をインポートすることをこの記事の目標とします。

## インストール

軽く調べてみると、 VSCode には Vim 風の操作をエミュレートする拡張機能があるみたいです。

拡張機能のところからVimと検索すれば一番上に出てきますね。インストールします。

![Screen Shot 2020-06-25 at 16.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508344/691de0f6-1af4-8a6e-4d94-9ae499fb80f0.png)

そして　command+N を押して空ファイルを作ります。

![Screen Shot 2020-06-25 at 16.05.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508344/d6c2d546-5184-4e36-cdf4-5e473cd090cb.png)

この四角のカーソルを見ると、 Vim のノーマルモードに入っていることが感じられます。  
この状態でも、基本的な Vim キーバインドが利用できます。  
特にカスタムをしていない Vimmer であれば、これだけでも十分使いやすいでしょう。 [^vimmer]

[^vimmer]: そんな人がいればですが

## カスタムしたい

ここからは、この VSCodeVim 拡張機能に自分用の vimrc を適用することを目指します。

特に、私は Dvorak 配列というキーボード配列を使っています。  
Vim の代名詞である hjkl キーでの移動は一般的な QWERTY 配列に適したものです。  
しかし Dvorak 配列では dhtn がその位置にあたります。  
この差を吸収するために、 vimrc によるオリジナルの設定が必要不可欠なのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508344/0318cd21-5546-432b-b327-45fd9128f2d8.png)
*Dvorak キーボード配列。 `u` と `h` がそれぞれ左手・右手の人差し指にあたり、したがって QWERTY 配列でいうところの `hjkl` には `dhtn` が対応します。*

### settings.jsonというのがあるらしい

VSCodeに関する設定は、設定ファイルの`settings.json`に書き込むらしいです。  
拡張機能ごとの設定もこれに書き込むようですね。

https://code.visualstudio.com/docs/getstarted/settings

また、 VSCodeVim の公式ページを参照すると、この `settings.json` を変更することでカスタムのキーマップを実現できそうな気がしてきます。

https://github.com/VSCodeVim/Vim

一部抜粋すると、以下のようになりそうです。

```json
{
  // ...,
  // ノーマルモードにおける`h'を`j'に割り当て
  "vim.normalModeKeyBindings": {
    "before": ["h"],
    "after": ["j"]
  }, 
  // ノーマルモードにおける`t'を`k'に割り当て
  "vim.normalModeKeyBindings": {
    "before": ["t"],
    "after": ["k"]
  }, 
  // ...
}
```

大変まだるっこしいことがわかります。

### vimrcが使いたい

既存の vimrc から上記の JSON 形式に変換するのは大変面倒です。  
どうにか vimrc を直接読み込ませる方法はないでしょうか。

Google で検索してみると、 VSCode に移行しようとした Vimmer 先人各位が有益な記事を発信してくださっています。

https://www.pc-gear.com/post/vscode-vim-vimrc/

こちらの記事を参考にさせていただきました。

公式ページの記述はこちらです。

https://github.com/VSCodeVim/Vim#vimrc-support

なお、公式ページには以下のような文章があります。[^experimental]

[^experimental]: （2025/04 追記）記事を最初に執筆した 2020 年から変わらず experimental なようです。 remapping 以外の機能はあんまり需要ないんでしょうか？

> vimrc support is currently experimental. Only remaps are supported, and you may experience bugs. Please  [report them](https://github.com/VSCodeVim/Vim/issues/new?template=bug_report.md) !

訳すとこんな感じでしょうか。

> 現在、vimrcのサポートは実験的なものです。リマッピングのみ使用でき、また利用に際してバグに遭遇した場合は [報告してください](https://github.com/VSCodeVim/Vim/issues/new?template=bug_report.md)！

OSS ですから、バグに遭遇したら積極的に報告しましょう。

#### 読み込む

具体的な設定方法として、公式ページには以下のように書いてあります。

> Set  `vim.vimrc.enable`  to  `true`  and set  `vim.vimrc.path`  appropriately.

つまり、さきほど説明した `settings.json` に

```json
{
  // ...,
  "vim.vimrc.enable": true,
  "vim.vimrc.path": "/path/to/.vimrc"
}
```

のように追記すればいいらしいです。  
`"/path/to/.vimrc"` は各自お好みの .vimrc ファイルに設定しましょう。  
特に変更していなければ、基本的には `~/.vimrc` だと思われます。私も `~/.vimrc` を設定しました。

この設定は、文字通り

* vimrc の使用を有効にして、
* vimrc へのパスを設定する

内容ですね。
これで、皆さんが育ててきた vim 設定との快適なGUI生活が始まることでしょう。

#### 読み込まれない

※ ここからは半分筆者の環境特有の問題です。

上記のように settings.json を設定したものの、キー設定が読み込まれません。  
具体的には、私のキーボードで h,j,k,l に対応する d,h,t,n を押しても、カーソルが想定通りに移動してくれません。  
vimrcで設定されているはずですが……。  
原因を探ってみました。

公式ページの README には、先ほど設定した以上の記述はありません。  
また、参考にさせていただいたサイトとも、これと言った違いはないように見えます。

原因を切り分けるために、 `:` でコマンドモードに入り、手動で `~/.vimrc/` を読み込んでみましょう。

```
:source ~/.vimrc
```

```
Command :so[urce] is not ye implemented (PRs are welcome!)
```

なんと source コマンドには対応していない様子です。

私は `~/.vimrc` 単体が肥大化しすぎるのを避けるため、 `source` コマンドを使って別ファイルの Vim スクリプトファイルを読み込むよう設定していました。  
その先でのキー設定、プラグイン設定などを読み込んでいるわけです。  
したがって `~/.vimrc` そのものにはキーマッピング設定は存在せず、キーマッピング設定には個別のファイル （`~/.vim/rc/keymaps.vim`） を用意していました。

このため、 `~/.vimrc` を読み込んだところでキー設定はデフォルトのままなのでした。

#### 読み込む (2)

`source` コマンドが使えないのであれば、`settings.json`で読み込む Vim スクリプトをキーマッピング専用のファイルにしてしまいます。  
どうせキーリマッピングしか使えないのですから、大きな問題はないはずです。  
結果、 `settings.json` の設定は以下のようになりました。

```json
{
  // ...,
  "vim.vimrc.enable": true,
  "vim.vimrc.path": "~/.vim/rc/keymaps.vim"
}
```

そしてVSCodeのファイル編集画面に戻ると、

![vscodevim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508344/29b7f17f-3dcd-3a90-0b4d-db6b2517b0bb.gif)

意図した通りに編集操作ができています。  
いい感じですね。これで当初の目的が達成できました。

## まとめ

* VSCodeでもVimの機能が使える
* 実験的ではあるが、一部 vimrc 設定の読み込みも行える

まだ少しだけしか触れていませんが、結構快適です。  
インストール及び設定も特に難しい点はありませんでしたね。

ここまで読んでいただきありがとうございました。  
どなたかの参考になれば嬉しいです。