VSCode+Vim設定を晒す

2023年2月22日

前にも設定載せたけど、あれからだいぶ変わったのでまたおいておく。

我ながら変態的な設定をしている自覚はあるので、これが誰かの参考になるかはわからないけど、部分的に役立つことくらいはあるかもしれない。

関連する拡張機能

pythonやpylanceは大前提として、その他に設定に関連する拡張機能はbookmarks, git graph, git lens,

(追記)vimのmark機能はすべてbookmarksに移行した。追加でspell checkerも入れてみた。alt+はpane移動に変更した。他色々。

settings.json

shiftやctrlと同時押しするよりもSpace->keyのほうが押しやすいので、こっちにメインコマンドを詰め込んでる。

★の数が多いほどよく使うという印。今回見直しのためにつけてみた。

星がないものはまだたいして使っておらず評価できないか、今回新たに追加したもの。

基本部分とvim関連のみ抜粋して貼り付ける

  //----------------------------
  // 見た目の設定
  //----------------------------
  "editor.rulers": [80], // 80文字にライン表示
  "editor.renderControlCharacters": true, // 制御文字表示
  "workbench.editor.wrapTabs": true, // タブを折り返す
  "editor.minimap.enabled": false, // ミニマップ非表示
  "workbench.tree.indent": 12, // explorerのツリーを見やすく
  "diffEditor.renderSideBySide": false, // 差分エディタはインライン表示
  "editor.lineNumbers": "relative", // 数字+jkで移動するため相対行番号表示
  "editor.hover.enabled": false, // マウスでのHover非表示
  "terminal.integrated.showLinkHover": false, // terminalでhover非表示
  "editor.guides.bracketPairs": true, // カッコペア表示
  "editor.bracketPairColorization.enabled": true, // カッコ色付表示
  "markdown.preview.breaks": true, // マークダウンで普通に改行
  "zenMode.hideLineNumbers": false, // zenモードで行番号表示
  "files.exclude": { "**/__pycache__": true }, // pycacheは表示しない
  //----------------------------
  // 機能の設定
  //----------------------------
  "editor.suggestSelection": "first", // サジェストは最初を選択
  "files.autoGuessEncoding": true, // エンコード推測
  "explorer.autoReveal": false, // エディタで選択時にエクスプローラで選択しない
  "explorer.confirmDragAndDrop": false, // Drag&Dropは確認なしで認める
  "files.trimFinalNewlines": true, // ファイル末尾の空行削除
  "files.trimTrailingWhitespace": true, // 行末尾の空白削除
  "workbench.list.openMode": "doubleClick", // シングルクリックではファイル開かない
  "cSpell.diagnosticLevel": "Hint", // スペルチェックはHint扱い
  "typescript.updateImportsOnFileMove.enabled": "always", //tsでファイル移動時import更新
  "files.watcherExclude": { "**/.venv/**": true }, // venv内は検索対象外
  //-----------------------------
  // vim設定
  //-----------------------------
  "vim.useSystemClipboard": true, // クリップボード共有
  "vim.hlsearch": true, // 検索単語ハイライト
  "vim.visualstar": true, // カーソル下を*で検索
  "vim.incsearch": true, //インクリメンタルサーチ
  "vim.leader": "<space>", // leaderはスペースキーに
  "vim.whichwrap": "h,l,<,>,[,]", // 左右移動で行またぐ
  "vim.foldfix": true, // 折りたたみ部分はまたいで移動
  // vim拡張設定
  "vim.sneak": true, // s+2文字で移動
  "vim.surround": true, // 囲い付け拡張
  // ノーマルモード時は日本語入力off
  "vim.autoSwitchInputMethod.obtainIMCmd": "C:\\Windows\\zenhan.exe 0",
  "vim.autoSwitchInputMethod.switchIMCmd": "C:\\Windows\\zenhan.exe {im}",
  "vim.autoSwitchInputMethod.defaultIM": "0",
  "vim.autoSwitchInputMethod.enable": true,
  //-----------------------------
  // vimキー変更
  //------------------------------
  "vim.normalModeKeyBindings": [
    // 現在行の行末までをターミナルで実行(READMEなどからそのまま実行時用)
    {
      "before": ["leader", "+"],
      "after": ["v", "$", "h", "leader", ":", "Esc"]
    },
    // 記憶したコマンドを実行
    {
      "before": ["leader", ";"],
      "after": ["o", "Esc", "\"", "c", "p", "leader", ":",":", "k", "d", "d", "k"]
    },
    // 現在行のコマンドでファイル実行して行消去
    {
      "before": ["leader", ":", "c"],
      "after": [ "c", "c", "leader", "w", "^", "l", "l", "v", "$", "h", "leader", "f", "V", "_", "d", "k", "<Enter>" ]
    },
    // 現在行をターミナルで実行して行消去(入力→実行用)
    {
      "before": ["leader", ":", ":"],
      "after": ["^", "v", "$", "h", "leader", ":", "V", "_", "d"]
    }
  ],
  "vim.normalModeKeyBindingsNonRecursive": [
    { "before": ["Y"], "after": ["y", "$"] },  // Yはカーソル後ヤンクに変更 ★★
    { "before": ["c", "c"], "after": ["g", "c", "c"] }, // c,cでコメントアウト★★★
    { "before": ["j"], "after": ["g", "j"] }, // 見た目の行で移動★★
    { "before": ["k"], "after": ["g", "k"] }, // 見た目の行で移動★★
    { "before": ["<Enter>"], "commands": ["editor.action.insertLineAfter"] }, // Enterで改行★
    { "before": ["Q"], "after": ["q"] }, // マクロは使用頻度低いためShift必要に★
    { "before": ["q"], "commands": ["editor.action.showHover"] }, // ホバー表示 ★★
    { "before":["ctrl+h"], "commands":["workbench.action.previousEditorInGroup"] }, // 次のファイルへ★★
    { "before":["ctrl+l"], "commands":["workbench.action.nextEditorInGroup"] },// 前のファイルへ★★
    { "before": ["\\"], "after": [":", "%", "s", "/"] }, // ファイル内置換(暫定)
    { "before": ["ctrl+m"], "after": ["ctrl+a"] }, // インクリメント(実際はctrl+s)
    { "before": ["-"], "after": ["@"] }, // マクロは押しにくい-に移動
    { "before": ["-", "-"], "after": ["@", "@"] },
    { "before": ["K"], "after": ["f", ",", "a", "Enter", "Esc"] }, // コンマ位置で改行
    { "before": ["H"], "after": ["1", "0", "h"] }, // 10文字h
    { "before": ["L"], "after": ["1", "0", "l"] }, // 10文字l
    { "before": ["R"], "after": ["$"] }, // 行末移動を押しやすい位置に
    { "before": ["["], "after": ["[", "m"] }, // メソッド単位で移動
    { "before": ["]"], "after": ["]", "m"] }, // メソッド単位で移動

    // g+ (m-画面中央移動,d-宣言位置★★,f-パス開く,i-戻ってimode,g-Topへ★★,p-win式貼り付け,
    //      t-タブ移動,u-小文字★,v-前の選択範囲★使うことあるため割当禁止)
    { "before": ["g", "j"], "after": ["L"] }, // 画面上一番下へ移動 ★
    { "before": ["g", "k"], "after": ["H"] }, //  画面上一番上へ移動 ★
    { "before": ["g", "h"], "after": ["^"] }, // 行頭へ★★
    { "before": ["g", "l"], "after": ["$"] }, // 行末へ★★
    { "before": ["g", "n"], "after": ["M"] }, // 画面上真ん中へ移動
    { "before": ["g", "r"], "commands": ["editor.action.goToReferences"] }, // 参照に移動

    // spellchecker (vimに近いキーバインドだが、wは無視に変更)
    { "before": ["z", "g"], "commands": ["cSpell.addWordToUserDictionary"] },
    { "before": ["z", "G"], "commands": ["cSpell.addWordToFolderDictionary"] },
    { "before": ["z", "w"], "commands": ["cSpell.addIgnoreWord"] },
    { "before": ["z", "W"], "commands": ["cSpell.addIgnoreWordsToWorkspace"] },
    { "before": ["z", "="], "commands": ["cSpell.suggestSpellingCorrections"] },

    // vim仕様からVSCode仕様に変更(undo,redo,jump,mark)
    { "before": ["u"], "commands": ["undo"] },
    { "before": ["ctrl+r"], "commands": ["redo"] },
    { "before": ["ctrl+o"], "commands": ["workbench.action.navigateBack"] },
    { "before": ["ctrl+i"], "commands": ["workbench.action.navigateForward"] },
    { "before": ["m"], "commands": ["bookmarks.toggleLabeled"] }, // ラベル付きマーク
    { "before": ["M"], "commands": ["bookmarks.toggle"] }, // ブックマーク切り替え
    { "before": ["@"], "commands": ["bookmarks.list"] }, // シフト不要に

    // VSCode仕様からvim仕様へ(全選択)
    { "before": ["ctrl+a"], "after": ["g", "g", "V", "G"] },


    // leader設定をアルファベット順に並べておく
    //{ "before": [ "leader", "a" ] =>ファイル追加系プレフィクス
    { "before": ["leader", "b"], "commands": ["workbench.action.tasks.build"] }, // ビルド(として登録したタスク実行)★★
    //{ "before": [ "leader", "b" ], "commands": [ "workbench.action.debug.start" ] }, // デバッグ開始(python)
    { "before": ["leader", "c"], "commands": ["workbench.files.action.compareFileWith"] }, // ファイルを比較★
    { "before": ["leader", "d"], "commands": ["editor.action.peekDefinition"] }, // 定義をここに表示(gdで移動) ★★★
    { "before": ["leader", "e"], "commands": ["editor.action.marker.nextInFiles"] }, // 次のエラーに移動 ★★★
    { "before": ["leader", "f"], "commands": ["search.action.openNewEditor"] }, // 全てから検索 ★
    //{ "before": [ "leader", "g" ] =>gitプレフィクス
    { "before": ["leader", "h"], "commands": ["workbench.action.focusLeftGroup"] }, // エディタグループ左移動 ★★★
    { "before": ["leader", "i"], "commands": ["workbench.files.action.compareWithSaved"] }, // 保存済みと比較★★
    { "before": ["leader", "j"], "commands": ["workbench.action.quickOpen"] }, // ファイルを選択★★
    { "before": ["leader", "k"], "after": ["z", "b"] }, // カーソル行を画面最下部へ
    { "before": ["leader", "l"], "commands": ["workbench.action.focusRightGroup"] }, // エディタグループ右移動 
    { "before": ["leader", "m"], "commands": [ "workbench.action.createTerminalEditor"]}, // エディタ領域にターミナル
    { "before": ["leader", "n"], "commands": ["editor.action.rename"] }, // 変数名変更 ★★★
    { "before": ["leader", "o"], "commands": ["workbench.action.quickOpen"] }, // ファイルを開く ★
    { "before": ["leader", "p"], "after": ["\"", "0", "p"] }, // 直前にコピーした行を貼り付け(切り取り含まず) ★
    // { "before": ["leader", "q"], =>囲み系"commands":["editor.action.marker.prevInFiles"] }, // 前のエラー
    { "before": ["leader", "r"], "commands": ["editor.action.goToReferences"] }, // 参照位置に移動 ★★★
    { "before": ["leader", "s"], // 保存実行 ★★★
      "commands": [ "workbench.action.files.save",
                    "workbench.action.terminal.scrollToBottom",
                    "code-runner.run"
                  ]
    },
    { "before": ["leader", "t"], "commands": ["copyFilePath", "workbench.action.terminal.focus"] }, //ファイル名コピーしてターミナルへ移動 
    { "before": ["leader", "u"], "commands": ["editor.toggleFold"] }, // 折り畳みの切替★
    //{ "before": [ "leader", "v" ] =>貼り付けprefix
    { "before": ["leader", "w"], "commands": ["workbench.action.files.save"] }, // 保存 ★★★
    { "before": ["leader", "leader", "w"], "commands": ["workbench.action.files.saveAll"] }, // すべて保存 ★★
    //{ "before": [ "leader", "x" ] =>表示prefix
    { "before": ["leader", "y"], "commands": ["editor.unfoldAll"] }, // すべて展開★
    { "before": ["leader", "z"], "commands": [":q"] }, // 閉じる ★
    { "before": ["leader", "leader", "z"], "commands": [":q!"] }, // 強制的に閉じる ★
    { "before": ["leader", "@"], "commands": ["workbench.action.gotoSymbol"] }, // シンボルに移動
    //{ "before": [ "leader", ";" ] =>現在行をターミナルで実行(Recursive)
    //{ "before": [ "leader", ":" ] =>ターミナルコマンドprefix
    { "before": ["leader", "]"], "commands": [ "workbench.action.moveEditorToNextGroup", "workbench.action.focusLeftGroup" ]
    }, //ファイルを隣のグループへ移す★
    {
      "before": ["leader", "["],
      "commands": [
        "workbench.action.moveEditorToPreviousGroup",
        "workbench.action.focusRightGroup"
      ]
    }, // ファイルを隣のグループへ移す★
    { "before": ["leader", ","], "after": ["d", "i", "\""] }, // 引用符内を消去
    {
      "before": ["leader", "."],
      "commands": [
        "workbench.action.terminal.kill",
        "workbench.action.focusActiveEditorGroup"
      ]
    }, //アクティブなターミナルを閉じる
    { "before": ["leader", "/"], "commands": ["workbench.action.splitEditor"] }, // エディタ分割
    {
      "before": ["leader", "\\"],
      "commands": [
        "workbench.action.terminal.split",
        "workbench.action.focusActiveEditorGroup"
      ]
    }, //terminal分割
    // ------- a => 新しいなにかを追加 ----------
    {
      "before": ["leader", "a", "f"],
      "commands": ["explorer.newFile"]
    }, // ファイル
    {
      "before": ["leader", "a", "d"],
      "commands": ["explorer.newFolder"]
    }, // ディレクトリ
    {
      "before": ["leader", "a", "j"],
      "commands": ["jupyter.createnewnotebook"]
    }, // Jupyter
    {
      "before": ["leader", "a", "p"],
      "commands": ["python.createNewFile"]
    }, // python
    {
      "before": ["leader", "a", "t"],
      "commands": ["workbench.action.terminal.new"]
    }, // terminal
    // ------- g => git プレフィクス ----------
    {
      "before": ["leader", "g", "a"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          // git add
          "command": "workbench.action.terminal.sendSequence",
          "args": {
            "text": "git add ${file} \n git status\n"
          }
        }
      ]
    },
    {
      "before": ["leader", "g", "b"],
      "commands": ["git.checkout"]
    }, // git checkout
    {
      "before": ["leader", "g", "c"],
      "commands": ["git.commit"]
    }, // git commit
    {
      "before": ["leader", "g", "d"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          // git diff
          "command": "workbench.action.terminal.sendSequence",
          "args": {
            "text": "git diff -- ${file}\n"
          }
        }
      ]
    },
    {
      "before": ["leader", "g", "e"],
      "commands": [
        {
          // git commit --amend
          "command": "workbench.action.terminal.sendSequence",
          "args": {
            "text": "git add ${file} \n git commit --amend --no-edit \n"
          }
        },
        "workbench.action.terminal.scrollToBottom"
      ]
    },
    {
      "before": ["leader", "g", "f"],
      "commands": [
        {
          // git add .
          "command": "workbench.action.terminal.sendSequence",
          "args": {
            "text": "git add . \n git status\n"
          }
        },
        "workbench.action.terminal.scrollToBottom"
      ]
    },
    {
      "before": ["leader", "g", "g"],
      "commands": ["git-graph.view"]
    }, // git-graph
    {
      "before": ["leader", "g", "l"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          // git log
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "git log -- ${file}\n" }
        }
      ]
    },
    {
      "before": ["leader", "g", "r"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          // git reflog
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "git reflog\n" }
        }
      ]
    },
    {
      "before": ["leader", "g", "s"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          // git status
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "git status\n" }
        }
      ]
    },
    {
      "before": ["leader", "g", "w"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          // git stash
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "git stash save \" ${fileBasenameNoExtension} editing\" \n" }
        }
      ]
    },
    {
      "before": ["leader", "g", "z"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          // ステージ取り消し
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "git reset HEAD\n" }
        }
      ]
    },
    {
      "before": ["leader", "g", "u", "f"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          // ファイルを元に戻す
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "git restore ${file} \n" }
        }
      ]
    },
    {
      "before": ["leader", "g", "u", "c"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          // 直前コミット取り消し
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "git reset --soft HEAD^ \n" }
        }
      ]
    },

    // ---- q => 単語囲み
    { "before": ["leader", "q", "\""], "after": ["v", "i", "w", "S", "\""] },
    { "before": ["leader", "q", "'"], "after": ["v", "i", "w", "S", "'"] },
    { "before": ["leader", "q", "`"], "after": ["v", "i", "w", "S", "`"] },
    { "before": ["leader", "q", "{"], "after": ["v", "i", "w", "S", "{"] },
    { "before": ["leader", "q", "}"], "after": ["v", "i", "w", "S", "}"] },
    { "before": ["leader", "q", "["], "after": ["v", "i", "w", "S", "["] },
    { "before": ["leader", "q", "]"], "after": ["v", "i", "w", "S", "]"] },
    { "before": ["leader", "q", "("], "after": ["v", "i", "w", "S", "("] },
    { "before": ["leader", "q", ")"], "after": ["v", "i", "w", "S", ")"] },
    { "before": ["leader", "q", "<"], "after": ["v", "i", "w", "S", "<"] },
    { "before": ["leader", "q", ">"], "after": ["v", "i", "w", "S", ">"] },
    // ------- v => 特殊な貼り付け ----------
    // --- []{}()<>"'`内をレジスタ内の値に置き換える
    { "before": ["leader", "v", "["], "after": [ "\"", "z", "d", "i", "[", "h", "p"] },
    { "before": ["leader", "v", "]"], "after": [ "\"", "z", "d", "i", "[", "h", "p"] },
    { "before": ["leader", "v", "{"], "after": [ "\"", "z", "d", "i", "{", "h", "p"] },
    { "before": ["leader", "v", "}"], "after": [ "\"", "z", "d", "i", "{", "h", "p"] },
    { "before": ["leader", "v", "("], "after": [ "\"", "z", "d", "i", "(", "h", "p"] },
    { "before": ["leader", "v", ")"], "after": [ "\"", "z", "d", "i", "(", "h", "p"] },
    { "before": ["leader", "v", "b"], "after": [ "\"", "z", "d", "i", "(", "h", "p"] },
    { "before": ["leader", "v", "B"], "after": [ "\"", "z", "d", "i", "(", "h", "p"] },
    { "before": ["leader", "v", "<"], "after": [ "\"", "z", "d", "i", "<", "h", "p"] },
    { "before": ["leader", "v", ">"], "after": [ "\"", "z", "d", "i", "<", "h", "p"] },
    { "before": ["leader", "v", "t"], "after": [ "\"", "z", "d", "i", "t", "h", "p"] },
    { "before": ["leader", "v", "T"], "after": [ "\"", "z", "d", "i", "t", "h", "p"] },
    { "before": ["leader", "v", "\""], "after": ["\"", "z", "d", "i", "\"", "h", "p"] },
    { "before": ["leader", "v", "`"], "after": ["\"", "z", "d", "i", "`", "h", "p"] },
    { "before": ["leader", "v", "'"], "after": ["\"", "z", "d", "i", "'", "h", "p"] },
    // --- 単語単位,行頭行末までを置き換える
    { "before": ["leader", "v", "w"], "after": ["\"", "z", "d", "i", "w", "h", "p"] },
    { "before": ["leader", "v", "e"], "after": ["\"", "z", "d", "e", "h", "p"] },
    { "before": ["leader", "v", "b"], "after": ["\"", "z", "d", "b", "h", "p"] },
    { "before": ["leader", "v", "I"], "after": ["\"", "z", "d", "^", "p"] },
    { "before": ["leader", "v", "D"], "after": ["\"", "z", "d", "$", "p"] },
    { "before": ["leader", "v", "C"], "after": ["\"", "z", "d", "$", "p"] },
    // ---- レジスタ内を貼り付け
    { "before": ["leader", "v", "1"], "after": ["\"", "1", "p"] },
    { "before": ["leader", "v", "2"], "after": ["\"", "2", "p"] },
    { "before": ["leader", "v", "3"], "after": ["\"", "3", "p"] },
    { "before": ["leader", "v", "4"], "after": ["\"", "4", "p"] },
    { "before": ["leader", "v", "5"], "after": ["\"", "5", "p"] },
    { "before": ["leader", "v", "6"], "after": ["\"", "6", "p"] },
    { "before": ["leader", "v", "7"], "after": ["\"", "7", "p"] },
    { "before": ["leader", "v", "8"], "after": ["\"", "8", "p"] },
    { "before": ["leader", "v", "9"], "after": ["\"", "9", "p"] },
    { "before": ["leader", "v", "z"], "after": ["\"", "z", "p"] }, // 上記置換貼付後、前括弧(引用符)内
    { "before": ["leader", "v", "-"], "after": ["\"", "-", "p"] }, // 1行以下の削除内容
    { "before": ["leader", "v", "%"], "after": ["\"", "%", "p"] }, // ファイル名
    { "before": ["leader", "v", "#"], "after": ["\"", "#", "p"] }, // 前のファイル名
    { "before": ["leader", "v", "*"], "after": ["\"", "*", "p"] }, // クリップボード内
    // --- 行単位を貼り付け+貼り付け部分になにかする(ファイル末尾では使えない)
    { "before": ["leader", "v", "v"], "after": ["m", "m", "g", "p", "k", "V", "`", "m", "j"] }, // 選択
    { "before": ["leader", "v", "c"], "after": ["m", "m", "g", "p", "k", "V", "`", "m", "j", "g", "c"] }, // コメントトグル
    // ------- x => vim系のなにか表示----------
    { "before": ["leader", "x", "x"], "commands": [":register"] }, // レジスタリスト
    { "before": ["leader", "x", "j"], "commands": [":jump"] }, // ジャンプリスト
    { "before": ["leader", "x", "m"], "commands": [":marks"] }, // vimのマークリスト
    // ------- : => コマンドライン ----------
    // { [ "leader", ":", ":"] -> 選択行をコマンド実行
    // { [ "leader", ":", "c" ] -> 選択行+ファイル名をコマンド実行
    {
      "before": ["leader", ":", "d"],
      "commands": [
        // cd
        "workbench.action.terminal.scrollToBottom",
        {
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "cd ${workspaceFolder}\n" }
        }
      ]
    },
    {
      "before": ["leader", ":", "l"],
      "commands": [
        // ls(tree)
        "workbench.action.terminal.scrollToBottom",
        {
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "tree\n" }
        }
      ]
    },
    {
      "before": ["leader", ":", "p"],
      "commands": [
        // python をモジュール実行
        "workbench.action.terminal.scrollToBottom",
        {
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "cd ${fileDirname}\n cd ..\npython -m ${relativeFileDirname}.${fileBasenameNoExtension}\n" }
        }
      ]
    },
    {
      "before": ["leader", ":", "m"],
      "commands": [
        // python オプション付きでモジュール実行
        "workbench.action.terminal.scrollToBottom",
        {
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "cd ${fileDirname}\n cd ..\npython -m ${relativeFileDirname}.${fileBasenameNoExtension} " }
        },
        "workbench.action.terminal.focus"
      ]
    },
    {
      "before": ["leader", ":", "t"],
      "commands": [
        // pytest
        "workbench.action.terminal.scrollToBottom",
        {
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "cd ${workspaceFolderBasename} \n pytest -m " }
        },
        "workbench.action.terminal.focus"
      ]
    }
  ],
  "vim.visualModeKeyBindings": [
    {
      "before": ["leader", ";"],
      "after": ["\"", "c", "y", "leader", ":"]
    } // コマンドを記憶して実行
  ],
  "vim.visualModeKeyBindingsNonRecursive": [
    { "before": ["leader", "j"], "after": ["L"] }, // 画面上一番下へ移動
    { "before": ["leader", "k"], "after": ["H"] }, //  画面上一番上へ移動
    { "before": ["g", "j"], "after": ["L"] }, // 画面上一番下へ移動 ★
    { "before": ["g", "k"], "after": ["H"] }, //  画面上一番上へ移動 ★
    { "before": ["j"], "after": ["g", "j"] }, // 見た目の行で移動
    { "before": ["k"], "after": ["g", "k"] }, // 見た目の行で移動
    { "before": ["g", "h"], "after": ["^"] }, // 行頭へ★★
    { "before": ["g", "l"], "after": ["$"] }, // 行末へ★★
    { "before": ["K"], "after": ["H", "z", "z"] }, // 実質半PageUp
    { "before": ["J"], "after": ["L", "z", "z"] }, // 実質半PageDown
    { "before": ["c"], "after": ["g", "c"] }, // コメント切り替え
    { "before": ["leader", "m"], "commands": ["editor.emmet.action.wrapWithAbbreviation"] }, //選択範囲をタグで囲む
    { "before": ["\\"], "after": [":", "s", "/"] }, // 範囲内置換(暫定)
    { "before": ["q"], "commands": ["editor.action.formatSelection"]}, // 範囲内を整形
    { "before": ["leader","f"], "after": ["/","\\","%","V"]}, //選択範囲内を検索
    { "before":["v"], "commands":["editor.action.smartSelect.expand"]},// 選択範囲を拡張
    // 選択範囲をターミナルで実行
    {
      "before": ["leader", ":"],
      "commands": [
        "workbench.action.terminal.scrollToBottom",
        {
          "command": "workbench.action.terminal.sendSequence",
          "args": { "text": "${selectedText}\n " }
        }
      ]
    },
  ],
  "vim.insertModeKeyBindings": [
    // emmet 展開(実際はshift+tab)
    { "before":["ctrl+p"], "after":["ctrl+d", "Esc", "s", ">","<", "a"]} ,
  ],
  "vim.insertModeKeyBindingsNonRecursive": [
    { "before": ["ctrl+l"], "commands": ["deleteRight"] }, // Deleteキー代わり
    { "before": ["j","j"], "after": ["Esc"] }, // jjでエスケープ
    {"before": ["ctrl+d"], "commands":["editor.emmet.action.expandAbbreviation"]} //実際はctrl+1
  ],
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////

keybindings.json

続いてkeybindings.json。主にctrl+キーの設定がこっち。

フォーカスがテキストエディタ外のときにも共通して使いたい機能なんかはこっちのほうが使い勝手がいい。

// 既定値を上書きするには、このファイル内にキー バインドを挿入しますauto[]
[
    //-----------------------------------------------------------------
    // vimキーとVSCodeキーの選択
    //------------------------------------------------------------------
    // ctrl+ の機能メモ
    // a: vs(全選択) vim側で設定
    // b: vim(pageUp)
    // c: vs(コピー)
    // d: vs(同じ単語でマルチカーソル)
    // e: vim(下スクロール:下と同じ入力)
    // f: vim(pageDown)
    // g: original(カーソル下に拡張)
    // h: original(タブ移動)
    // i: vim(next jump)
    // j: vs(panel toggle)
    // k: vs(prefix)
    // l: original(タブ移動)
    // m: original(bookmarks prefix)
    // n: なし 一応vsのnewfileが有効
    // o: vim(prev jump:command)
    // p: vs(open file)
    // q: vs(quick menu)
    // r: vim(redo: paste register)
    // s: original(incriment)
    // t: original(editor<->terminal)
    // u: vim(半pageUp:delete from start)
    // v: vim(矩形選択)
    // w: vim(prefix: 単語をここまで削除)
    // x: vim(decriment)
    // y: vim(上scroll:上と同じ入力)
    // z: vs(Undo)
    // []: vs(indent)
    // ^: vsCode切り替え(by PowerToys)
    // -: Edge切り替え(by PowerToys)
    // \: ワークスペース切り替え
    // /: vs(comment)
    //-----------------------------------------------------------------------
    // ctrl+aは全選択にしたいのでctrl+sでインクリメントする(ctrl+sがないので使わないctrl+mのコマンドに割り当てる)
    {
        "key": "ctrl+m",
        "command": "-extension.vim_ctrl+m",
        "when": "editorTextFocus && vim.active && vim.use<C-m> && !inDebugRepl || vim.active && vim.use<C-m> && !inDebugRepl && vim.mode == 'CommandlineInProgress' || vim.active && vim.use<C-m> && !inDebugRepl && vim.mode == 'SearchInProgressMode'"
    },
    {
        "key": "ctrl+s",
        "command": "extension.vim_ctrl+m",
        "when": "editorTextFocus && vim.active && vim.use<C-m> && !inDebugRepl"
    },
    // 癖で押してしまうためVSCode優先。
    {
        "key": "ctrl+c",
        "command": "-extension.vim_ctrl+c",
        "when": "editorTextFocus && vim.active && vim.overrideCtrlC && vim.use<C-c> && !inDebugRepl"
    },
    // カーソル拡張
    {
        "key": "ctrl+g",
        "command": "-workbench.action.gotoLine"
    },
    {
        "key": "ctrl+g",
        "command": "-extension.vim_ctrl+g",
        "when": "editorTextFocus && vim.active && vim.use<C-g> && !inDebugRepl"
    },
    {
        "key":"ctrl+g",
        "command":"editor.action.insertCursorBelow",
    },
    // 左右移動 (vimではノーマルモード時のみ移動にしたいのでsettingsで別設定)
    // {
    //     "key": "ctrl+h",
    //     "command": "-extension.vim_ctrl+h",
    //     "when": "editorTextFocus && vim.active && vim.use<C-h> && !inDebugRepl"
    // },
    {
        "key": "ctrl+h",
        "command": "workbench.action.previousEditorInGroup",
        "when": "!terminalFocus && vim.mode != 'Insert'"
    },
    // {
    //     "key": "ctrl+l",
    //     "command": "-extension.vim_navigateCtrlL",
    //     "when": "editorTextFocus && vim.active && vim.use<C-l> && !inDebugRepl"
    // },
    {
        "key": "ctrl+l",
        "command": "workbench.action.nextEditorInGroup",
        "when": "!terminalFocus&& vim.mode != 'Insert'"
    },
    // Vimのctrl+jは不要
    {
        "key": "ctrl+j",
        "command": "-extension.vim_ctrl+j",
        "when": "editorTextFocus && vim.active && vim.use<C-j> && !inDebugRepl"
    },
    // vimのマルチバイト入力は捨てる
    {
        "key": "ctrl+k",
        "command": "-extension.vim_ctrl+k",
        "when": "editorTextFocus && vim.active && vim.use<C-k> && !inDebugRepl"
    },
    // VSCodeのタブ機能切替は事故のもとなので無効化しておく。vimも使わないので空き。
    {
        "key": "ctrl+m",
        "command": "-editor.action.toggleTabFocusMode"
    },
    // vimのctrl+nは使わない
    {
        "key": "ctrl+n",
        "command": "-extension.vim_ctrl+n",
        "when": "editorTextFocus && vim.active && vim.use<C-n> && !inDebugRepl || vim.active && vim.use<C-n> && !inDebugRepl && vim.mode == 'CommandlineInProgress' || vim.active && vim.use<C-n> && !inDebugRepl && vim.mode == 'SearchInProgressMode'"
    },
    // vimのctrl+pは不要。
    {
        "key": "ctrl+p",
        "command": "-extension.vim_ctrl+p",
        "when": "suggestWidgetVisible && vim.active && vim.use<C-p> && !inDebugRepl || vim.active && vim.use<C-p> && !inDebugRepl && vim.mode == 'CommandlineInProgress' || vim.active && vim.use<C-p> && !inDebugRepl && vim.mode == 'SearchInProgressMode'"
    },
    // vimのctrl+qはctrl+vと同じなのでVSCodeのクイックメニューを優先。
    {
        "key": "ctrl+q",
        "command": "-extension.vim_winCtrlQ",
        "when": "editorTextFocus && vim.active && vim.use<C-q> && !inDebugRepl"
    },
    // vimのctrl+tは使わないのでターミナルとの行き来用に変更
    {
        "key": "ctrl+t",
        "command": "-extension.vim_ctrl+t",
        "when": "editorTextFocus && vim.active && vim.use<C-t> && !inDebugRepl"
    },
    {
        "key": "ctrl+t",
        "command": "-workbench.action.showAllSymbols"
    },
    {
        "key": "ctrl+t",
        "command": "workbench.action.terminal.focus",
    },
    // vimのctrl+vは必須。(本来設定なしで優先されるはずだが、貼り付けが発動することあったので一応無効化)
    {
        "key": "ctrl+v",
        "command": "-editor.action.clipboardPasteAction"
    },
    // VSCodeのマルチカーソル機能優先。vimのg->bも同じ機能だが押しにくい。
    {
        "key": "ctrl+d",
        "command": "-extension.vim_ctrl+d",
        "when": "editorTextFocus && vim.active && vim.use<C-d> && !inDebugRepl"
    },
    // tabは選択範囲を維持して入れられるVSCodeショートカットの方をを有効化
    {
        "key": "ctrl+[",
        "command": "-extension.vim_ctrl+[",
        "when": "editorTextFocus && vim.active && vim.use<C-[> && !inDebugRepl"
    },
    {
        "key": "ctrl+]",
        "command": "-extension.vim_ctrl+]",
        "when": "editorTextFocus && vim.active && vim.use<C-]> && !inDebugRepl"
    },

    //-------------------------------------
    // altはペイン移動に割り当てる
    //-------------------------------------
    {
        "key": "alt+j",
        "command": "workbench.action.terminal.focus",
        "when": "!panelFocus && !sideBarFocus"
    },
    {
        "key": "alt+k",
        "command": "workbench.action.focusActiveEditorGroup",
        "when": "panelFocus"
    },
    {
        "key": "alt+h",
        "command": "workbench.action.terminal.focusPreviousPane",
        "when": "terminalFocus"
    },
    {
        "key": "alt+l",
        "command": "workbench.action.terminal.focusNextPane",
        "when": "terminalFocus"
    },
    {
        "key": "alt+l",
        "command": "workbench.action.focusFirstEditorGroup",
        "when": "sideBarFocus"
    },
    {
        "key": "alt+h",
        "command": "workbench.action.focusLeftGroup",
        "when": "!panelFocus && !sideBarFocus"
    },
    {
        "key": "alt+l",
        "command": "workbench.action.focusRightGroup",
        "when": "!panelFocus && !sideBarFocus"
    },
    //-------------------------------------
    // ctrl+jkでいろいろ上下移動
    //-------------------------------------
    // 候補のフォーカス
    {
        "key": "ctrl+j",
        "command": "selectNextSuggestion",
        "when": "editorTextFocus && suggestWidgetMultipleSuggestions && suggestWidgetVisible"
    },
    {
        "key": "ctrl+k",
        "command": "selectPrevSuggestion",
        "when": "editorTextFocus && suggestWidgetMultipleSuggestions && suggestWidgetVisible"
    },
    // ヒント
    {
        "key": "ctrl+j",
        "command": "showNextParameterHint",
        "when": "editorTextFocus && parameterHintsMultipleSignatures && parameterHintsVisible && textInputFocus"
    },
    {
        "key": "ctrl+k",
        "command": "showPrevParameterHint",
        "when": "editorTextFocus && parameterHintsMultipleSignatures && parameterHintsVisible && textInputFocus"
    },
    // quick fix (効かない?)
    {
        "key": "j",
        "command": "selectNextQuickFix",
        "when": "editorFocus && quickFixWidgetVisible"
    },
    {
        "key": "k",
        "command":"selectPreviousQuickFix",
        "when": "editorFocus && quickFixWidgetVisible"
    },
    // リスト
    {
        "key": "ctrl+j",
        "command": "list.focusDown",
        "when": "listFocus"
    },
    {
        "key": "ctrl+k",
        "command":"list.focusUp",
        "when": "listFocus"
    },
    // クイックオープン
    {
        "key": "ctrl+j",
        "command":"workbench.action.quickOpenSelectNext",
        "when": "inQuickOpen"
    },
    {
        "key": "ctrl+k",
        "command":"workbench.action.quickOpenSelectPrevious",
        "when": "inQuickOpen"
    },
    // 閉じるのはEscだとクイックメニュー時に都合悪いので別のキーvim的には左か右で閉じる感覚
    {
        "key": "ctrl+h",
        "command": "workbench.action.closeQuickOpen",
        "when": "inQuickOpen"
    },
    {
        "key": "ctrl+l",
        "command": "workbench.action.closeQuickOpen",
        "when": "inQuickOpen"
    },
    //-------------------------------
    // エディタ外
    //-------------------------------
    {
        "key": "ctrl+i",
        "command": "workbench.action.focusActiveEditorGroup",
        "when":  "sidebarFocus || panelFocus"
    },
    {
        "key": "ctrl+r",
        "command": "renameFile",
        "when": "explorerViewletVisible && filesExplorerFocus"
    },
    //-------------------------------
    // ターミナル
    //-------------------------------

    {
        "key": "ctrl+t",
        "command": "workbench.action.focusActiveEditorGroup",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+oem_plus",
        "command": "workbench.action.toggleMaximizedPanel",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+k",
        "command": "workbench.action.terminal.scrollUpPage",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+g",
        "command": "workbench.action.terminal.scrollUpPage",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+z",
        "command": "workbench.action.terminal.kill",
        "when": "terminalFocus"
    },
    //------------------------------------------------
    // Bookmarks (ctrl+mをプレフィクスとして使う)
    // vimのマーク機能はファイル内一時マーク用
    //  Bookmarksはファイルまたいで長く使うマーク用
    //------------------------------------------------
    {
        "key": "ctrl+m ctrl+m",
        "command": "bookmarks.toggle",
        "when": "editorTextFocus"
    },
    // ラベル付きブックマーク
    {
        "key": "ctrl+m ctrl+n",
        "command":"bookmarks.toggleLabeled",
        "when": "editorTextFocus"
    },
    // リストから選ぶ ctrl押しっぱなしでm+kjだけで選択可
    {
        "key": "ctrl+m ctrl+j",
        "command":"bookmarks.listFromAllFiles",
    },
    {
        "key": "ctrl+m ctrl+k",
        "command":"bookmarks.listFromAllFiles",
    },
    // 次と前へ移動(defaultの表示の拡大縮小はいらないのでつぶす)
    {
        "key": "ctrl+oem_plus",
        "command":"bookmarks.jumpToNext",
        "when": "editorTextFocus"
    },
    {
        "key": "ctrl+-",
        "command":"bookmarks.jumpToPrevious",
        "when": "editorTextFocus"
    },
    {
        "key": "ctrl+m ctrl+i",
        "command":"bookmarks.list",
        "when": "editorTextFocus"
    },
    // マーク位置を選択
    {
        "key": "ctrl+m ctrl+o",
        "command": "bookmarks.selectLines",
        "when": "editorTextFocus",
    },
    // ファイル内全削除
    {
        "key": "ctrl+m c",
        "command":"bookmarks.clear"
    },
    //==============================================================
    // shift+tabをsetting.jsonでvimに割り当てるために
    {
        "key": "shift+tab",
        "command": "extension.vim_ctrl+p",
        "when": "vim.active && vim.use<C-p>",
    },
    {
        "key": "ctrl+1",
        "command": "extension.vim_ctrl+d",
        "when": "editorTextFocus && vim.active && vim.use<C-d> && vim.mode=='Insert'"
    },
    {
        "key": "shift+tab",
        "command": "-insertPrevSuggestion",
        "when": "hasOtherSuggestions && textInputFocus && !inSnippetMode && !suggestWidgetVisible && config.editor.tabCompletion == 'on'"
    },
    {
        "key": "ctrl+oem_102",
        "command": "vscodeWorkspaceSwitcher.openWorkspace"
    },
    {
        "key": "ctrl+k w",
        "command": "-vscodeWorkspaceSwitcher.openWorkspace"
    }
]

とりあえず2022年4月5月7月現在の設定として残しておくことにする。またすぐに変わりそうだな・・・

(追記)2023年2月に一部変更

vscode

Posted by gran-gran-gran