😽

VSCodeをvim bindingで使い始めたのでまとめる

2024/09/29に公開

やりたかったことが実現したのでまとめます。

実現したこと

  • カーソル移動はvimがいいが、たくさんのコマンドは覚えたくない
  • VSCodeの操作性は落としたくない

最低限のカーソル移動

  • vim bindingにするために使っている拡張

  • 必要最低限の操作方法まとめ(chatgptに助けられた)

    カテゴリ コマンド 動作
    細かい移動 h, j, k, l 言わずと知れたvimの移動方法、説明割愛
    単語移動 b 現在の単語の先頭、または前の単語の先頭
    単語移動 e 現在の単語の末尾、または次の単語の末尾
    行内移動 ^ 行の最初の非空白文字

    似たコマンドに0があるが、空白文字を含む行頭に移動するので^の方が使い勝手がいい
    行内移動 g_ 行の最後の非空白文字

    似たコマンドに$があるが、visualモードの時に改行文字を含むのでg_の方が使い勝手がいい
    画面内移動 shift + h 画面の一番上に移動

    後続のm,lと合わせてHigh, Middle, Lowで覚えるといい

    後続の「画面をスクロール」系のものでスクロール後に使うといい
    画面内移動 shift + m 画面の真ん中に移動
    画面内移動 shift + l 画面の最後に移動
    画面をスクロール ctrl + y 画面を一行上にスクロール

    長押しするとホイールのような感覚でスクロールする
    画面をスクロール ctrl + e 画面を一行下にスクロール

    長押しするとホイールのような感覚でスクロールする
    画面をスクロール ctrl + b 画面を1画面幅分上にスクロール

    ドカンとスクロールしたいときに
    画面をスクロール ctrl + f 画面を1画面幅分下にスクロール

    ドカンとスクロールしたいときに
  • そのほか使いやすさのためにカスタムしたコマンド(一番最後にsetting.json貼るので一部だけ抜粋)

    コマンド 動作 When
    jj 挿入モードをノーマルモードに

    escの代わり
    ctrl + j エディタとファイルエクスプローラーのフォーカス切り替え
    j, k 上下移動 ファイルエクスプローラーフォーカス時
    n ファイル作成 ファイルエクスプローラーフォーカス時
    f フォルダ作成 ファイルエクスプローラーフォーカス時

VSCodeの操作性は落としたくない

  • 新しく設定したショートカット

    • マウスを触りたくなかったり、vimにショートカットが取られたりしたため新たに設定
    コマンド 動作
    alt + d 選択した文字列と同じ文字列を追加選択

    ctrl + dがvimに取られるのでその代わり
    ctrl + tab 開いてるファイルの次のファイルに移動
    ctrl + shift + tab 開いてるファイルの前のファイルに移動
    ctrl + f12 ホバーの表示

    型とかが表示される
  • 新しく知ったショートカット

    コマンド 動作
    f12 カーソル位置の変数の定義へ移動 & 参照してる箇所へ移動

    ctrl + クリックを利用していたのでショートカットを使うようにした

ショートカットの設定ファイル全文

// Place your key bindings in this file to override the defaults
[
  {
    "key": "ctrl+j",
    "command": "workbench.view.explorer",
    "when": "editorFocus && vim.mode == 'Normal'"
  },
  {
    "key": "ctrl+j",
    "command": "workbench.action.focusActiveEditorGroup",
    "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
  },
  {
    "key": "j",
    "command": "list.focusDown",
    "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
  },
  {
    "key": "k",
    "command": "list.focusUp",
    "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
  },
  {
    "key": "n",
    "command": "explorer.newFile",
    "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
  },
  {
    "key": "f",
    "command": "explorer.newFolder",
    "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
  },
  {
    "key": "enter",
    "command": "-renameFile",
    "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
  },
  {
    "key": "r",
    "command": "renameFile",
    "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
  },
  {
    "key": "d",
    "command": "deleteFile",
    "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
  },
  {
    "key": "y",
    "command": "filesExplorer.copy",
    "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
  },
  {
    "key": "p",
    "command": "filesExplorer.paste",
    "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
  },
  {
    "key": "ctrl+f12",
    "command": "editor.action.showHover",
    "when": "editorFocus && vim.mode == 'Normal'"
  },
  {
    "key": "alt+d",
    "command": "editor.action.addSelectionToNextFindMatch",
    "when": "editorFocus && vim.mode == 'Visual'"
  },
  {
    "key": "ctrl+tab",
    "command": "workbench.action.nextEditor"
  },
  {
    "key": "ctrl+shift+tab",
    "command": "workbench.action.previousEditor"
  }
]

Discussion