はじめに
今更ながら Atom から VSCode に乗り換えました。
そこで早速 VSCodeVim をインストールし快適なvimライフ(?)を送っていたのですが、いくつかキーバインドに不満があったので設定してみました。
基本的には vimrc
で書いている設定をそのまま利用できるので、わざわざ記事を書くまでもないかもしれませんが、同じような不満を抱えている方の参考になれば幸いです。
1. Escキーで検索のハイライトを消す
{
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["<Esc>"],
"commands": [":nohl"]
}
]
}
本当はEscキー2回に割り当てたかったのですが、 ["<Esc>", "<Esc>"]
としても反応せず...どなたか分かる方いましたら教えてください。
ちなみに vimrc
では以下に相当します。
nnoremap <ESC><ESC> :nohl<CR>
2. ノーマルモードのときにxキー、sキーで削除した文字をヤンクしない
{
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["x"],
"after": ["\"", "_", "x"]
},
{
"before": ["s"],
"after": ["\"", "_", "s"]
}
]
}
これは vimrc
で設定することと全く同じですね。
nnoremap x "_x
nnoremap s "_s
3. ビジュアルモードで連続ペーストする
デフォルトの状態ですと、削除された方のテキストがヤンクされてしまうので、貼り付けた側のテキストをヤンクします。
ヤンク自体を防ぐ方法は見つからなかったのですが、貼り付けたテキストを再びヤンクすることで解決できます。
{
"vim.visualModeKeyBindingsNonRecursive": [
{
"before": ["p"],
"after": ["p", "g", "v", "y", "e"]
}
]
}
少しカーソルの動きが変な感じになるかもしれませんが、気にしなければこれで以下のような挙動に近づきます。
vnoremap p "_dP
※ 追記
素直に上のマッピングを書いてあげればいいことに気が付きました...
{
"vim.visualModeKeyBindingsNonRecursive": [
{
"before": ["p"],
"after": ["\"", "_", "d", "P"]
}
]
}
4. ビジュアルモードでインデントした際にビジュアルモードを保持する
ビジュアルモードのときに <
>
でインデントを増減させると、そこでビジュアルモードを抜けてしまうので、選択を保持するように設定します。
{
"vim.visualModeKeyBindingsNonRecursive": [
{
"before": [">"],
"after": [">", "g", "v"]
},
{
"before": ["<"],
"after": ["<", "g", "v"]
}
],
}
対応するvimの設定は以下。
vnoremap > >gv
vnoremap < <gv
5. ビジュアルモードのときにTabキーでインデントを調整する
<
>
でもインデントはできるのですが、Tabキーのほうが楽なので登録してあげます。
setting.json
の vim.visualModeKeyBindingsNonRecursive
では Shift+Tab をキーバインドにマッピングする方法が分からなかったので、 keybindings.json
で設定します。
[
{
"key": "tab",
"command": "editor.action.indentLines",
"when": "editorTextFocus && !editorReadonly && vim.active && vim.mode != 'Insert'"
},
{
"key": "shift+tab",
"command": "editor.action.outdentLines",
"when": "editorTextFocus && !editorReadonly && vim.active && vim.mode != 'Insert'"
}
]
vim.active && vim.mode == 'Normal|Insert|Visual'
を使うとだいたいのvimのキーバインドが実現できそうです。
vimrc
でいうところの以下の設定。
nnoremap <Tab> >>
nnoremap <S-Tab> <<
vnoremap <Tab> >gv
vnoremap <S-Tab> <gv
6. 行をまたいで移動する
{
"vim.whichwrap": "h,l,<,>,[,],b,s"
}
これも vimrc
と同じ書き方ですね。
set whichwrap+=h,l,<,>,[,],b,s
おわりに
私はそこまでvimのキーバインドの設定をいじっていない&使いこなせていないので、これで一旦のところ不満なくVSCodeを使えそうです。
皆さんもおすすめの設定がありましたらコメント等で教えてください。
それでは、良いvimライフを。