✍️

VSCodeでゆっくりVimに入門する

2024/03/31に公開

はじめに

vim慣れるとめちゃくちゃ便利なんだろうなぁと思いつつ、独特なキー操作に慣れる気がせずずっと放置していました。

しかし最近になって単語単位でカーソル移動したいなど、これvimを使えばいいのでは?と感じる回数が増えてきたので、ようやく重い腰を上げてVSCodeメインにしつつ、vimコマンドも使える環境を整えました。

軽くハマった点もあったので手順をまとめます。

環境

  • MacBook Air M2
  • macOS sonoma 14.3.1

手順

NeoVimのインストール

homebrewでneovimをインストールします。

brew install neovim

今回構築する環境はneovim(nvim)が裏で立ち上がって、VSCodeの拡張が通信することで成り立つらしいです。この辺りは以下の記事を参照させていただきました。
https://zenn.dev/yutakatay/articles/vscode-neovim

init.luaの作成

neovimはスクリプト言語luaのエンジンを組み込んでおり、luaで書かれた設定ファイルを読み込めます。vimmerたちはこの設定ファイルこそが財産だそうです。

init.luaは次のパスに作成します。

mkdir ~/.config/nvim
touch ~/.config/nvim/init.lua

このファイルにvimの標準コマンド以外の使い方をしたい設定などを書きます。
本当に色々あり、zennやQiitaのセットアップ記事を見るととんでもない情報量です。

しかし、私は超超初心者でよくわからないので次の設定だけ有効活用できています。最初かこれぐらいからゆっくり育てればいいよと友人に言われました。

init.lua
vim.keymap.set('i', 'jj', '<ESC>', { silent = true })

インサートモードからノーマルモードに戻るとき、jjと押せば良いという設定です。
<ESC>ctrl+cでも戻れますが遠いのでこれは快適です。

VSCodeの設定

VSCode Neovimのインストール

https://marketplace.visualstudio.com/items?itemName=asvetliakov.vscode-neovim

この拡張がnvimと通信してくれます。起動するとaffinity云々を設定するか聞いてきますのでyesで大丈夫です。

settings.jsonの設定

nvimの場所と設定ファイルの場所をVSCodeに教えてあげます。
cmd+shift+pからsettings.jsonを開き、編集しましょう。先ほどのaffinityの設定も含めるとsettings.jsonは次のようになっているはずです。

settings.json
{
  "extensions.experimental.affinity": {
      "asvetliakov.vscode-neovim": 1
  },
  "vscode-neovim.neovimExecutablePaths.darwin": "/opt/homebrew/bin/nvim",
  "vscode-neovim.neovimInitVimPaths.darwin": "/Users/<user_name>/.config/nvim/init.lua"
}

ここまででVSCodeでvimコマンドが使えるようになります!

keybindings.jsonの設定

いざ使ってみると先ほど設定したはずのjjコマンドが効きません。
実はインサートモードの制御はVSCodeに移ってしまうので、nvimの設定(init.lua)は無視されてしまうのです。

VSCode Neovim公式の案内に従って、keybindings.jsonを編集します。
https://github.com/vscode-neovim/vscode-neovim?tab=readme-ov-file#composite-escape-keys

keybindings.json
[
  {
    "command": "vscode-neovim.compositeEscape1",
    "key": "j",
    "when": "neovim.mode == insert && editorTextFocus",
    "args": "j"
  }
]

keybindings.jsonがない場合もあるので、その時は基本設定>キーボードショートカットを開き、右上のこいつを押してください。

結局、さっき設定したinit.luajjしか設定しない限り無用の長物ですが、色々設定していくと必要になりますし、nvim単体で使う場合には必要なのでそのままにしておきましょう。

感想

今回の構成はインサートモードで利用すれば、これまでのVSCodeのままであることが一番のポイントです。
単語ごとの選択をしたいケースや、ちょっとvimコマンド使って慣れていこうかな、という気分の変化に対応しながらvimに慣れることができます。

:wで保存せずにcmd+sで保存すればいい、別にマウスでカーソル移動してもいい。
でもvimコマンドを使えばもっと速いんじゃ...???

自分のinit.luaが膨れていくのが楽しみです。

参考

本文中で触れていないものも含めて構築において参考にさせていただいた情報源を全て貼ります。
製作者の皆様、ありがとうございます。

そもそもの構築系

https://zenn.dev/bun913/articles/02785aed0ba50e
https://zenn.dev/apuspac/articles/neovim-tukau
https://qiita.com/jintz/items/d357478271179c90ffab
https://zenn.dev/kakifl/articles/vscode-vim-to-neovim
https://zenn.dev/yubrot/articles/1bf4b8d79d7cae

vim設定ファイルなど

https://qiita.com/KowerKoint/items/387074cf7022e2e0c8fe
https://zenn.dev/hituzi_no_sippo/articles/871c06cdbc45b53181e3
https://zenn.dev/slin/articles/2020-11-03-neovim-lua2
https://github.com/willelz/nvim-lua-guide-ja/blob/master/README.ja.md

Discussion