VScode + vim拡張をカスタマイズする
はじめに(動機)
VScode に vim の拡張機能を入れて長い間操作してきました。
かなり vim の操作にも慣れて、この操作するにはどうすればいいんだろうと思うことが無くなってきましたが、逆にこれ使いづらいと感じることも多少なりとも感じるようになってきました。
例えば、ノーマルモードに抜けるときにエスケープキーを押す操作です。個人的な話ですが、エスケープキーが小さくごくまれに押し間違えて半角全角がおかしくなることがありました。
他にもありますが、とにかく vim 操作に対してもっと使いやすくを要求するようになったので......
自分専用にカスタマイズしていきます!
逆によく今まで特に変更なしで使ってきたなって感じですが、それほど vim が神ということですね
キーバインドを変更していく
settings.json に記述していきます。
ctrl + ,で設定を開いてから右上の設定(JOSN)を開くをクリックして開きます。
ワークスペースごとに .vscode/settings.json に書き込むこともできますが、キーバインドなんてワークスペースごとにわける意味もあまり感じられないのでグローバルな設定ファイルに書き込むのが一番いいと思います。
まずは、例にもあげたエスケープ問題を解決しようと思います。
これについては調べてみると結構みんな同じことを考えているようで解決策が提示されています。
インサートモードでjjと入力するとノーマルモードになるというものです。
初めて見たときはそんなもん文字入力してモード変更されたら大惨事だろと思ってたのですが、jjって打つことってないんですよね。しかも右手人差し指という一番打ちやすい位置にあるにも関わらず
というわけで記述していきます。
code:settings.json
"vim.insertModeKeyBindings": [
{
}
],
はい、これだけです。
これで設定を保存してからインサートモードに入ってjjと押してみてください。
ノーマルモードになったら成功です。
vim.insertModeKeyBindings のほかには normalMode~~ とか visualMode~~ とかがあります。
どのモードにおけるキーバインドなのかを表します。
before は設定したいキーバインド、 after は元々の操作を記述します。
逆じゃね?って思うかもしれませんが、
本家 vim の設定ファイルにnnoremap j gjみたいな感じに「設定するキーバインド、前のキーバインド」の順番で書くのでそれにならっているのではないかなと思います。
何を書けばいいかわからない時は ctrl + space で補完を呼び出せば大体わかると思います。
ここまで出来たら後は自分の好きなように設定していけるでしょう。
vscode 側のキーバインドも上手く使えばさらにカスタマイズできると思います。自分なりのキーバインドを探してみましょう。
良い vim 生活を
おまけ
yuusuine.iconの設定ファイルを随時書き込んでいくかもしれません.(2021/01/30更新)
code:yuusuine's settings.json
"vim.leader": "<Space>",
"vim.insertModeKeyBindings": [
{
"before": [
"j",
"j"
],
"after": [
"<Esc>"
]
}
],
"vim.normalModeKeyBindings": [
{
"before": [
"_",
"d"
],
"after": [
"\"",
"_",
"d"
]
},
{
"before": [
"z",
"h"
],
"after": [
"z",
"t"
],
},
{
"before": [
"z",
"l"
],
"after": [
"z",
"b"
]
},
{
"before": [
"z",
"m"
],
"after": [
"z",
"z"
]
},
{
"before": [
"<C-h>"
],
"after": [
"^"
]
},
{
"before": [
"<C-l>"
],
"after": [
"$"
]
},
{
"before": [
"<Leader>",
"l"
],
"after": [
"g",
"t"
]
},
{
"before": [
"<Leader>",
"h"
],
"after": [
"g",
"T"
]
},
{
"before": [
"<Leader>",
"<"
],
"commands": [
":tabm -1"
]
},
{
"before": [
"<Leader>",
">"
],
"commands": [
":tabm +1"
]
},
],
NonRecursive とは非再帰的という意味です。
例えば j を jj にした場合、NonRecursive がなければ jjjjjjjjjjj という風に無限ループに陥るでしょう。
普通の hoghogeMode~~ で上手く動作しないときにこっち側に書き込むと動くかもしれません。