LoginSignup
61
40

More than 3 years have passed since last update.

VSCodeのvimキーバインドをいい感じにする

Last updated at Posted at 2020-01-09

はじめに

今更ながら Atom から VSCode に乗り換えました。
そこで早速 VSCodeVim をインストールし快適なvimライフ(?)を送っていたのですが、いくつかキーバインドに不満があったので設定してみました。
基本的には vimrc で書いている設定をそのまま利用できるので、わざわざ記事を書くまでもないかもしれませんが、同じような不満を抱えている方の参考になれば幸いです。

1. Escキーで検索のハイライトを消す

setting.json
{
    "vim.normalModeKeyBindingsNonRecursive": [
        {
            "before": ["<Esc>"],
            "commands": [":nohl"]
        }
    ]
}

本当はEscキー2回に割り当てたかったのですが、 ["<Esc>", "<Esc>"] としても反応せず...どなたか分かる方いましたら教えてください。
ちなみに vimrc では以下に相当します。

vimrc
nnoremap <ESC><ESC> :nohl<CR>

2. ノーマルモードのときにxキー、sキーで削除した文字をヤンクしない

setting.json
{
    "vim.normalModeKeyBindingsNonRecursive": [
        {
            "before": ["x"],
            "after": ["\"", "_", "x"]
        },
        {
            "before": ["s"],
            "after": ["\"", "_", "s"]
        }
    ]
}

これは vimrc で設定することと全く同じですね。

vimrc
nnoremap x "_x
nnoremap s "_s

3. ビジュアルモードで連続ペーストする

デフォルトの状態ですと、削除された方のテキストがヤンクされてしまうので、貼り付けた側のテキストをヤンクします。
ヤンク自体を防ぐ方法は見つからなかったのですが、貼り付けたテキストを再びヤンクすることで解決できます。

setting.json
{
    "vim.visualModeKeyBindingsNonRecursive": [
        {
            "before": ["p"],
            "after": ["p", "g", "v", "y", "e"]
        }
    ]
}

少しカーソルの動きが変な感じになるかもしれませんが、気にしなければこれで以下のような挙動に近づきます。

vimrc
vnoremap p "_dP

※ 追記
素直に上のマッピングを書いてあげればいいことに気が付きました...

setting.json
{
    "vim.visualModeKeyBindingsNonRecursive": [
        {
            "before": ["p"],
            "after": ["\"", "_", "d", "P"]
        }
    ]
}

4. ビジュアルモードでインデントした際にビジュアルモードを保持する

ビジュアルモードのときに < > でインデントを増減させると、そこでビジュアルモードを抜けてしまうので、選択を保持するように設定します。

setting.json
{
    "vim.visualModeKeyBindingsNonRecursive": [
        {
            "before": [">"],
            "after": [">", "g", "v"]
        },
        {
            "before": ["<"],
            "after": ["<", "g", "v"]
        }
    ],
}

対応するvimの設定は以下。

vimrc
vnoremap > >gv
vnoremap < <gv

5. ビジュアルモードのときにTabキーでインデントを調整する

< > でもインデントはできるのですが、Tabキーのほうが楽なので登録してあげます。
setting.jsonvim.visualModeKeyBindingsNonRecursive では Shift+Tab をキーバインドにマッピングする方法が分からなかったので、 keybindings.json で設定します。

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 でいうところの以下の設定。

vimrc
nnoremap <Tab> >>
nnoremap <S-Tab> <<
vnoremap <Tab> >gv
vnoremap <S-Tab> <gv

6. 行をまたいで移動する

setting.json
{
    "vim.whichwrap": "h,l,<,>,[,],b,s"
}

これも vimrc と同じ書き方ですね。

vimrc
set whichwrap+=h,l,<,>,[,],b,s

おわりに

私はそこまでvimのキーバインドの設定をいじっていない&使いこなせていないので、これで一旦のところ不満なくVSCodeを使えそうです。
皆さんもおすすめの設定がありましたらコメント等で教えてください。
それでは、良いvimライフを。

61
40
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
40