半端VimerのVSCode+Vimの設定
(2021年12月6日 追記)
この記事を見てくれてる方へ
この記事はやたら頻繁に更新されます。これからも多分突然更新するため、もし気になる設定あればどっかにコピペしとくことをオススメします。次見たときには消えてるかもしれません。
あと、他にも「こんなのおすすめ!」とか「それよりもこっちのがいいよ!」とかあれば教えて下さい。
(追記終わり)
VSCode-Vimを使いこなす
vimに惚れた
vimはすごい。といっても素のvimなんてほとんど使ったことないんだけど。数年前にPyCharmでVim拡張使ってみてはまった比較的歴史の浅いVim好きだ。独自設定もたいしてしてないし、バリバリ使いこなしてるわけではない。だがしかし!それでも便利なのがvimのすごいところなのだ。
VSCodeも負けちゃいない
とはいえ、意外とVSCodeも負けてはいない。Vim拡張なんて入れなくても便利な機能もショートカットもふんだんにそろっていて、たぶんキーボードだけで結構なことができるようになってる。こっちも使いこなしてるわけではないが、まぁそれでも便利なんだ。
Let’sいいとこどり
どっちも便利なんだから両方合わせたら超絶便利に決まってる。というわけでうまくいいとこどりして組み合わせていきたいのだ。
すでにVSCodeにVim拡張は入ってるものとして話をすすめる。
ちなみにWindows環境での設定。Linuxで同じ設定したら微妙に挙動が違ったの気がするので適宜微調整必要。
関連するVSCode拡張機能
VSCodeVimはもちろんだが、それ以外にもいろいろ拡張機能を使用している。
- leader + s -> CodeRunner
- Ctrl+m + <キー> -> Bookmarks
などなど。他にも拡張をインストールしないと動かないキー設定があるためあしからず。
VSCode-Vimのためのsetting.json
VSCode-vim基本設定
setting.json 内のVSCode基本設定とvim関連設定はこんな感じ。(その他拡張機能関連は省略してる)
//----------------------------
// 見た目の設定
//----------------------------
"editor.rulers": [88], // 88文字にライン表示
"editor.renderControlCharacters": 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は表示しない
"workbench.activityBar.location": "top", // 横幅とるため、アクティビティバーを上に
"workbench.iconTheme": "vscode-icons", //iconテーマ
"workbench.startupEditor": "none", // 開始時空画面表示なし
"workbench.editor.closeEmptyGroups": false, // 空グループは閉じない
"workbench.editor.wrapTabs": true, // タブは折り返す
//----------------------------
// 機能の設定
//----------------------------
"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内は検索対象外
"files.eol": "\n", // 改行は常にLF (Linuxに合わせる)
"editor.formatOnSave": true, // 基本的に保存時にフォーマット(このファイル以外)
"[settings.json]": { "editor.formatOnSave": false },
"editor.formatOnPaste": true, // 貼り付け時もフォーマット
"editor.formatOnType": false, // 入力時はフォーマットしない
"terminal.integrated.defaultProfile.windows": "PowerShell", //wiターミナルはPowerShell
"git.autofetch": true, // git fetch自動実行
"editor.inlineSuggest.enabled": true,
"editor.quickSuggestionsDelay": 100,
"editor.accessibilitySupport": "off",
"search.exclude": { "**/.venv": true }, // 仮想環境内は検索対象外
//----------------------------
// 言語別
//----------------------------
// python
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.formatOnSave":true
},
"black-formatter.showNotifications": "onError",
"flake8.args": [
"--ignore=E203,E121,E123,E126,E226,E24,E704,W503,F401",
"--max-line-length=88"
],
// js, ts
"javascript.updateImportsOnFileMove.enabled": "always",// ファイル移動時にimport更新
"reactSnippets.settings.prettierEnabled": true,
"[typescriptreact]": {
"editor.tabSize": 2,
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.tabSize": 2,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnType": true // 保存のたびにホットリロード走るので
},
"[javascript]": {
"editor.tabSize": 2,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnType": true // 保存のたびにホットリロード走るので
},
"[svelte]": {
"editor.defaultFormatter": "svelte.svelte-vscode"
},
// json
"json.schemas": [],
"[jsonc]": {
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
},
// C#
"omnisharp.useEditorFormattingSettings": false,
"[csharp]": {
"editor.defaultFormatter": "ms-dotnettools.csharp"
},
// c++
"cmake.configureOnOpen": true,
"cmake.generator": "Visual Studio 17 2022",
"C_Cpp.clang_format_fallbackStyle": "LLVM",
"cmake.configureArgs": [
"-DVCPKG_TARGET_TRIPLET=x86-windows-static-md",
"-LH",
"-A Win32"
],
// jupyter
"jupyter.askForKernelRestart": false,
"notebook.output.scrolling": true,
"notebook.output.textLineLimit": 50,
// html, xml
"emmet.showAbbreviationSuggestions": false,
"emmet.showExpandedAbbreviation": "never",
"[xml]": {
"editor.defaultFormatter": "redhat.vscode-xml"
},
// --------------------------------------------------------
// code runner
// --------------------------------------------------------
"code-runner.runInTerminal": true, // terminalで実行
// --- ファイル名から実行コマンド決める
"code-runner.executorMapByGlob": {
"test_*.py": "cd $workspaceRoot && $pythonPath -m pytest $fullFileName",
"*.test.tsx": "npm test $fileName",
"*.test.ts": "npm test $fileName"
},
// --- 拡張子から実行コマンドを決める
"code-runner.executorMapByFileExtension": {
".md": "marp --html --preview $fullFileName"
},
// --- 言語ごと設定
"code-runner.executorMap": {
"javascript": "node",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"python": "$pythonPath -u $fullFileName",
"go": "go run",
"powershell": "powershell -ExecutionPolicy ByPass -File",
"bat": "cmd /c",
"shellscript": "bash",
"csharp": "scriptcs",
"rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt",
"vbscript": "cscript //Nologo",
"typescript": "ts-node",
"r": "Rscript",
"haskell": "runhaskell",
"autoit": "autoit3",
"sass": "sass --style expanded",
"scss": "scss --style expanded",
"dart": "dart",
"java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
"groovy": "groovy",
"ruby": "ruby",
},
//-----------------------------
// 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拡張機能はsneak,surroundを有効にしてある。最初はeasymotionも有効にしてたんだけど、sneakと数字+jk移動で十分だった。
左右移動で行またぎは既存のエディタと同じ感覚で移動できるようにしただけなのだけど、vimになれるといらないかもしれない。
最下部4行のノーマルモード時のみIME切設定は以下のリンクのzenhan.exeを使わせてもらっている。zenhan.exeをC:/Windows/に入れとかないと設定効かないので注意。
Win版の VS Code+VSCodeVim でノーマルモードに戻った時にIMEを半角英数入力にする – Qiita
vim キー設定
vimのキーマップはsetting.jsonに記述する。
vimキー変更
個人的にvimのキーで気に食わないところをいくつか変更している。コメントアウトはgccがめんどいのでccだけでできるように、shiftやctrlとの組み合わせよりも単発キーのが当然押しやすいためマーク位置ジャンプは¥を割り当ててる。
shift+hlは上下が見えないのが嫌なので、画面中央位置に補正する。
インサートモードではctrl+lをDeleteキー(右側消去)にしている。括弧の入力で勝手に出てくる閉じ括弧を消したいことが結構あるので。
多分他のvim系変更はよく見るようなやつだと思う。
vim仕様からVSCode仕様に
Undo,Redo,ジャンプリストはVSCode仕様に変更している。
VSCode Vimのundo,redoはVSCode(というか普通の)undo,redoとは挙動が異なるのでVSCodeに合わせておく方が事故が少ない。おそらくディープなVimmerでない限りVSCode仕様のほうが自然に感じると思う。
ジャンプリストは悩みどころだが、vimはおおざっぱ、かつエディタグループの位置を記憶しないので、VSCode仕様に合わせておく方が自然に見える。
leader設定
スペースが押しやすいため、leaderキーを多用するスタイル。ほとんどのキーにleader+を設定している。
leader+の組み合わせは2ストロークにはなるけども、Shift+やCtrl+より押しやすいと思う。よく使うコマンドは一通りはleader+キーで実行できるようにしておく。
あと特殊な貼付けを追加した。めったに使うもんじゃないけど、カッコ内置換やコメント化して貼り付け、コメント解除して貼り付けは意外と使うことに気づいた。
というわけで、これらまとめたsetting.json の続きがこれ。
//-----------------------------
// 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": [
// vim 設定変更
{ "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", "a"] }, // マクロは使用頻度低いためShift必要に,aに記録
{ "before": ["@"], "after": ["@", "a"] }, // マクロ実行はaのマクロを実行
{ "before": ["leader", "Q"], "after": ["q"] }, // キー指定で記録と実行するときはleader使う
{ "before": ["leader", "@"], "after": ["@"] }, //
{ "before": ["ctrl+m"], "after": ["ctrl+a"] }, // インクリメント(実際はctrl+s) ★
{ "before": ["_", "w"], "after": ["\"_", "d","i", "w"] }, // ブラックホールをワンキーで
{ "before": ["_", "\""], "after": ["\"_", "d","i", "\""] }, // ブラックホールをワンキーで
{ "before": ["_", "("], "after": ["\"_", "d","i", "("] }, // ブラックホールをワンキーで
{ "before": ["_", ")"], "after": ["\"_", "d","i", "("] }, // ブラックホールをワンキーで
// vs-code機能拡張
{ "before": ["q"], "commands": ["editor.action.showHover","editor.action.showHover"] }, // ホバー表示 ★★★
{ "before": ["ctrl+h"], "commands": ["workbench.action.previousEditorInGroup"] }, // 次のファイルへ★★★
{ "before": ["ctrl+l"], "commands": ["workbench.action.nextEditorInGroup"] }, // 前のファイルへ★★★
{ "before": ["\\"], "after": [":", "%", "s", "/"] }, // ファイル内置換★★
// カスタム
{ "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式貼り付け,
// ,u-小文字★,v-前の選択範囲★使うことあるため割当禁止, t-タブ移動はつぶす)
{ "before": ["g", "j"], "after": ["L"] }, // 画面上一番下へ移動 ★
{ "before": ["g", "k"], "after": ["H"] }, // 画面上一番上へ移動 ★
{ "before": ["g", "h"], "commands": ["workbench.action.focusLeftGroup"] }, // 隣へ
{ "before": ["g", "l"], "commands": ["workbench.action.focusRightGroup"] }, // 隣へ
{ "before": ["g", "s"], "commands": ["workbench.action.focusSideBar"] }, // サイドバーへ
{ "before": ["g", "t"], "commands": ["workbench.action.terminal.focus"] }, // ターミナルへ
{ "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"] },
// カーソル位置変えずに表示位置変更を推しやすい位置に(zzはそのまま)
{ "before": ["z", "k"], "after": ["z", "t"] },
{ "before": ["z", "j"], "after": ["z", "b"] },
// 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.toggle"] }, // ブックマーク切り替え★★
{ "before": ["M"], "commands": ["bookmarks.jumpToNext"] }, // 次のブックマークへ変更★★
{ "before": ["`"], "commands": ["bookmarks.list"] },
// VSCode仕様からvim仕様へ(全選択,同じ単語マルチカーソル)
{ "before": ["ctrl+a"], "after": ["g", "g", "V", "G"] },
{ "before": ["ctrl+d"], "after": ["g", "b"] },
// leader設定をアルファベット順に並べておく
//{ "before": [ "leader", "a" ] => AI prefix (copilot)
{ "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.revealDefinition",
"workbench.action.moveEditorToNextGroup",
"workbench.action.focusLeftGroup"
] }, // 定義を表示して右へ移動★★
{ "before": ["leader", "e"], "commands": ["editor.action.marker.nextInFiles"] }, // 次のエラーに移動 ★★★
{ "before": ["leader", "f"], "commands": ["search.action.openNewEditor"] }, // 全てから検索 ★★★
//{ "before": [ "leader", "g" ] =>gitプレフィクス ★★★
{ "before": ["leader", "h"], "commands": ["workbench.files.action.showActiveFileInExplorer"] }, // このファイルをエクスプローラ上で表示 ★★
{ "before": ["leader", "i"], "commands": ["workbench.files.action.compareWithSaved"] }, // 保存済みと比較★★
{
"before": ["leader", "j"],
"commands": [
"workbench.action.focusPanel",
"workbench.action.focusActiveEditorGroup",
"workbench.action.files.saveAll",
"workbench.action.terminal.scrollToBottom",
{
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "\u001b[A\n" }
}
]
},// 保存してから直前に実行したコマンドを再度実行 ★★★
{ "before": ["leader", "k"], "commands": ["workbench.action.quickchat.toggle"] }, // quick chat
{ "before": ["leader", "l"], "commands": ["workbench.files.action.showActiveFileInExplorer"] }, // このファイルをエクスプローラ上で表示 ★★
{ "before": ["leader", "m"], "commands": ["bookmarks.toggleLabeled"] }, // ラベル付きブックマーク
{ "before": ["leader", "n"], "commands": ["editor.action.rename"] }, // 変数名変更 ★★★
{ "before": ["leader", "o"], "commands": ["workbench.action.quickOpen"] }, // ファイルを開く ★★★
{ "before": ["leader", "p"], "after": ["b", "i", "p", "r", "i", "n", "t", "(", "f", "\"", "{", "Esc","l", "e", "i", "=", "}", "\"", ")", "Esc" ] }, // pythonのprintコード化
// { "before": ["leader", "q"], =>囲み系"commands":["editor.action.marker.prevInFiles"] }, // 前のエラー
{ "before": ["leader", "r"], "commands": ["editor.action.goToReferences"] }, // 参照位置に移動 ★★★
{
"before": ["leader", "s"], // 保存実行 ★★★
"commands": [
"workbench.action.files.saveAll",
"workbench.action.terminal.scrollToBottom",
"code-runner.run"
]
},
{ "before": ["leader", "t"], "commands": ["copyFilePath", "workbench.action.terminal.focus"] }, //ファイル名コピーしてターミナルへ移動
{ "before": ["leader", "u"], "commands": ["editor.toggleFold"] }, // 折り畳みの切替★
{ "before": ["leader","leader", "u"], "commands": ["editor.unfoldAll"] }, // すべて展開★
//{ "before": [ "leader", "v" ] =>貼り付けprefix
{ "before": ["leader", "w"], "commands": ["workbench.action.files.save"] }, // 保存 ★★★
{ "before": ["leader", "W"], "commands": ["workbench.action.files.saveWithoutFormatting"] }, // フォーマットなし保存★
{ "before": ["leader", "leader", "w"], "commands": ["workbench.action.files.saveAll"] }, // すべて保存 ★★
//{ "before": [ "leader", "x" ] =>表示prefix
{ "before": ["leader", "y"], "commands": ["revealFileInOS"] }, // エクスプローラで表示
{ "before": ["leader", "z"], "commands": [":q"] }, // 閉じる ★★
{ "before": ["leader", "leader", "z"], "commands": [":q!"] }, // 強制的に閉じる ★
{ "before": ["leader", "@"], "after": ["@"] }, // マクロ実行
{ "before": ["leader","leader" ,"@"], "after": ["q"] }, // マクロ記録
//{ "before": [ "leader", ";" ] =>現在行をターミナルで実行(Recursive)
//{ "before": [ "leader", ":" ] =>ターミナルコマンドprefix
{
"before": ["leader", "]"],
"commands": [
"workbench.action.moveEditorToNextGroup",
"workbench.action.focusLeftGroup"
]
}, //ファイルを隣のグループへ移す★
{
"before": ["leader", "["],
"commands": [
"workbench.action.moveEditorToPreviousGroup",
"workbench.action.focusRightGroup"
]
}, // ファイルを隣のグループへ移す★
// --- restructuredText用 ---
{ "before": ["leader", "#"], "after": ["shift+o", "Esc", "8", "9", "i", "#", "Esc", "y", "y", "j", "p"] },
{ "before": ["leader", "*"], "after": ["shift+o", "Esc", "8", "9", "i", "*", "Esc", "y", "y", "j", "p"] },
{ "before": ["leader", "="], "after": ["o", "Esc", "8", "9", "i", "=", "Esc"] },
{ "before": ["leader", "-"], "after": ["o", "Esc", "8", "9", "i", "-", "Esc"] },
// --- restructuredText用 ---
{ "before": ["leader", ","], "after": ["d", "i", "\""] }, // 引用符内を消去
{ "before": ["leader", "."], "commands": ["inlineChat.startWithCurrentLine"] }, // copilot
{ "before": ["leader", "/"], "commands": ["workbench.action.splitEditor"] }, // エディタ分割
{
"before": ["leader", "\\"],
"commands": [
"workbench.action.terminal.split",
"workbench.action.focusActiveEditorGroup"
]
}, //terminal分割
{ "before": ["leader", "\""], "after": ["v", "i", "w", "S", "\""] }, // 単語""囲み
{ "before": ["leader","(", "\""], "after": ["v", "i", "b", "S", "\""] },// ()内""囲み
{ "before": ["leader",")", "\""], "after": ["v", "i", "b", "S", "\""] },// ()内""囲み
{ "before": ["leader", "'"], "after": ["v", "i", "w", "S", "'"] }, // 単語''囲み
{ "before": ["leader","(", "'"], "after": ["v", "i", "b", "S", "'"] },// ()内''囲み
{ "before": ["leader",")", "'"], "after": ["v", "i", "b", "S", "'"] },// ()内''囲み
// ------- a => AI アシスタント (copilot) ----------
{ "before": ["leader", "a", "g"], "commands": ["github.copilot.chat.generate"] }, // 生成
{ "before": ["leader", "a", "r"], "commands": ["github.copilot.chat.review"] }, // ファイルをチャットに追加
{ "before": ["leader", "a", "c"], "commands": ["github.copilot.chat.review.continueInChat"] }, // ディレクトリ
{ "before": ["leader", "a", "t"], "commands": ["github.copilot.chat.generateTests"] }, // テスト生成
{ "before": ["leader", "a", "d"], "commands": ["github.copilot.chat.generateDocs"] }, // doc生成
{ "before": ["leader", "a", "f"], "commands": ["github.copilot.chat.attachFile"] }, // ファイルをチャットに追加
{ "before": ["leader", "a", "i"], "commands": ["inlineChat.startWithCurrentLine"] }, // inlineチャット開始(leader+.でも同じ)
{ "before": ["leader", "a", "a"], "commands": ["workbench.action.quickchat.toggle"] }, // quickchat
// ------- 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 => なにか情報表示----------
{ "before": ["leader", "x", "x"], "commands": [":register"] }, // レジスタリスト
{ "before": ["leader", "x", "j"], "commands": [":jump"] }, // ジャンプリスト
{ "before": ["leader", "x", "m"], "commands": ["bookmarks.listFromAllFiles"] }, // vimのマークリスト
{ "before": ["leader", "x", "f"], "commands": ["gitlens.views.branches.setFilesLayoutToList"] }, // 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": ["ctrl+d"], "after": ["g", "b"] },
{
"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
],
VSCode-Vimのためのkeybindings.json
ノーマルモードのキーマップはsettings.jsonだが、VSCodeのショートカットともかぶるCtrlとの組み合わせについてはkeybindings.jsonで設定する。
実際のファイルは最後に貼り付けるとして、どう設定してるかを軽く説明。
基本のCtrl+<?>
VSCode VimではデフォルトでCtrl同時押しのショートカットがほぼすべてvim仕様に変更されるので、生粋のvimmerであればイジる必要はないかもしれない。しかし半端もんvimmerとしてはVSCodeのキーも使いたい。
あと、他所で素のVimやVSCodeを使うときのことを考えるとよく使うキーの割り当て自体は変えたくない。(上ですでにvimのキー割り当てすでにかえてるけどそれはそれこれはこれ。)
なので基本はデフォルトのままVSCodeとVimでよく使う方を有効化。どっちも使わなければ空きキーとしてとっておく。どっちも使う場合は優先順位低い方を別に移す。という考え方でやっている。
Ctrl+S、Ctrl+Z、Ctrl+\、Ctrl+/などはそもそもvimに登録がないため、特に記述しなくてもVSCodeのショートカットキーが有効。上書き保存やUndoはつい癖で使ってしまうのでありがたい。Ctrl+/はコメント切替、Ctrl+\はエディタ画面の分割とこれらもそこそこ便利。
他にVSCodeを優先したのは、この辺。
- 便利なCtrl+Dのマルチカーソル (vimのgbコマンドは連打しにくい)
- Ctrl+Nで新規ファイル (そこまで使わないけど、vimでも使わないので)
- 選択範囲のインデント変更に便利なCtrl+[] (vimのvisualモードでの<>は選択範囲解除されてしまうので)
- (使いこなせてないけど)何かと便利そうなプレフィクスCtrl + K
意外と少なかった。VSCode, Vimのどちらも無効化して俺様設定作った(もしくは開けてある)のはこのあたり。
- Ctrl + G
- Ctrl + C
- Ctrl + M
- Ctrl + J
この辺はのちのち。
とにかく移動はhjkl
サジェストとかでもjk移動
基本的にCtrl+jkで上下移動して選択できるように設定した。
サジェスト、ヒント、リスト、はてはクイックメニューまでCtrl+JKで移動する。
エディタもhl移動
Ctrl+hlで隣のファイルに移動できるように設定。あと上記のsettings.jsonでleaderとhlでの組み合わせでエディタグループを移動できるようにしてある。
insertモードでもhjkl移動
できるだけ手を動かさず移動したいのでイレギュラーにAlt+hjklで移動できるようにした。
altが押しにくいのでそこまで快適ではないが、まぁちょこっと移動するときには便利。
エディタの外から
ここは別にvim関係ないのだけど、サイドパネルやターミナルにフォーカスがあるときにエディタに戻るためにvim風にCtrl+iを割り当てた。デフォルトと変えないとか言ってたくせにだんだんどうでもよくなってきた。
GitコマンドはCtrl + g , Ctrl + <?>
Gtrl+gはVSCode,Vimともどちらも使いそうにないので、Gitコマンドプレフィクスにしてある。
Git add などVSCodeのコマンドで実行するものだけでなく、git statusなどよく使うコマンドはそのままターミナルに流し込んで実行させるようにしてる。いちいちターミナルと行き来しなくていいので地味に便利。
うっかり押しちゃうと困るのもいくつか登録してあるが、左右に分けてあえて押しにくくしてるので今の所事故はない。
Bookmarks関連にCtrl + m, <?>
ctrl+mはvimでもvscodeでもたいして使わないのでBookmarks拡張専用のプレフィクスに。vimのマーク機能は一時的なマーク+ファイル内移動に、Bookmarksは長期的に使うマーク+ファイル間移動に利用している。
まぁ、まだあまり使いこなせてないんだけども。
ターミナルコマンド関連にCtrl + c, <?>
さっき思いついて追加したばかりなのでまだ実用的かはわからない。
とりあえず、ターミナルでいろいろやってるとわけわかんないところでgitコマンド使おうとしてしまったりするので、そんなとき用のcdをキーから呼べるようにしてみた。
WSL上にいるときと、Windowsにいるときで処理分けられないのが微妙に不便だけど、他にもいろいろ使い所はありそうだ。
ただこれはプロジェクトごとによく使うコマンドが異なりそうなので、workspaceごとの設定に入れてあげるほうがいいかもしれない。
keybindings.json全文
というわけで晒しておく。こんな変態設定そのまま使う人はいないだろうけど、使えそうだと思える部分があればぜひコピペして活用してもらいたい。
// 既定値を上書きするには、このファイル内にキー バインドを挿入しますauto[]
[
//-----------------------------------------------------------------
// vimキーとVSCodeキーの選択
//------------------------------------------------------------------
// ctrl+ の機能メモ
// a: vs(全選択) vim側で設定
// b: vim(pageUp)
// c: vs(コピー)
// d: vs(同じ単語でマルチカーソル) -> vim仕様に変更
// 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: vs(ウィンドウを閉じる)
// 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'&& activeWebviewPanelId != 'GitHub Copilot Suggestions'"
},
// {
// "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' && activeWebviewPanelId != 'GitHub Copilot Suggestions'"
},
// 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"
},
//-------------------------------------
// ctrl+k + hlはペイン移動に割り当てる
//-------------------------------------
{
"key": "shift+control+l",
"command": "workbench.action.focusFirstEditorGroup",
"when": "sideBarFocus"
},
{
"key": "shift+ctrl+h",
"command": "workbench.action.focusSideBar",
"when": "!panelFocus && !sideBarFocus && activeEditorGroupIndex==1"
},
{
"key": "shift+ctrl+h",
"command": "workbench.action.focusLeftGroup",
"when": "!panelFocus && !sideBarFocus&& activeEditorGroupIndex!=1"
},
{
"key": "shift+ctrl+k",
"command": "workbench.action.showCommands",
"when": "!panelFocus"
},
{
"key": "shift+ctrl+l",
"command": "workbench.action.focusRightGroup",
"when": "!panelFocus && !sideBarFocus"
},
{
"key": "shift+ctrl+l",
"command": "workbench.action.focusFirstEditorGroup",
"when": "sideBarFocus"
},
{
"key": "shift+ctrl+j",
"command": "workbench.action.focusPanel",
"when": "!panelFocus && !sideBarFocus"
},
{
"key": "shift+ctrl+k",
"command": "workbench.action.focusActiveEditorGroup",
"when": "panelFocus "
},
{
"key": "shift+ctrl+h",
"command": "workbench.action.terminal.focusPreviousPane",
"when": "terminalFocus"
},
{
"key": "shift+ctrl+l",
"command": "workbench.action.terminal.focusNextPane",
"when": "terminalFocus"
},
//-------------------------------------
// 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"
},
// hover内
{
"key": "ctrl+j",
"command": "editor.action.scrollDownHover",
"when": "editorHoverFocused && editorHoverVisible"
},
{
"key": "ctrl+k",
"command": "editor.action.scrollUpHover",
"when": "editorHoverFocused && editorHoverVisible"
},
// リスト
{
"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"
},
//-------------------------------
// エクスプローラー explorer
//-------------------------------
// {
// "key": "l",
// "command": "workbench.action.focusActiveEditorGroup",
// "when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
// },
//新規ファイル作成
{
"key": "ctrl+h",
"command": "workbench.action.previousSideBarView",
"when": "sideBarFocus && sideBarVisible"
},
{
"key": "ctrl+l",
"command": "workbench.action.nextSideBarView",
"when": "sideBarFocus && sideBarVisible"
},
//新規ファイル作成
{
"key": "n",
"command": "explorer.newFile",
"when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
},
//新規フォルダ作成
{
"key": "f",
"command": "explorer.newFolder",
"when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
},
//エクスプローラーでフォルダを開く
{
"key": "e",
"command": "revealFileInOS",
"when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
},
//リネーム
{
"key": "r",
"command": "renameFile",
"when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
},
//削除
{
"key": "d",
"command": "deleteFile",
"when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
},
//削除
{
"key": "g l",
"command": "workbench.action.focusFirstEditorGroup",
"when": "explorerViewletFocus && explorerViewletVisible && !inputFocus"
},
//-------------------------------
// ターミナル
// ctrl+ c, p, q, r は割り当てないように!
//-------------------------------
{
"key": "ctrl+j",
"command": "workbench.action.focusActiveEditorGroup",
"when": "terminalFocus"
},
{
"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+j",
"command": "workbench.action.terminal.scrollDownPage",
"when": "terminalFocus"
},
{
"key": "ctrl+g",
"command": "workbench.action.terminal.scrollUpPage",
"when": "terminalFocus"
},
{
"key": "ctrl+z",
"command": "workbench.action.terminal.kill",
"when": "terminalFocus"
},
{
"key": "ctrl+h",
"command": "workbench.action.terminal.focusPreviousPane",
"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"
},
//------------------------------------------------
// git hub copilot
// 主にパネルが表示されてるときのショートカット
//------------------------------------------------
{
"key": "ctrl+e",
"command":"workbench.action.focusLastEditorGroup",
"when":"github.copilot.activated && github.copilot.panelVisible && activeWebviewPanelId == 'GitHub Copilot Suggestions'"
},
//==============================================================
// 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"
},
{
"key": "ctrl+q",
"command": "workbench.action.quickOpenView",
"when": "!terminalFocus"
},
{
"key": "ctrl+q",
"command": "-workbench.action.quickOpenView"
},
{
"key": "ctrl+p",
"command": "workbench.action.quickOpen",
"when": "editorTextFocus"
},
{
"key": "ctrl+p",
"command": "-workbench.action.quickOpen"
},
{
"key": "ctrl+w",
"command": "-extension.vim_ctrl+w",
"when": "editorTextFocus && vim.active && vim.use<C-w> && !inDebugRepl"
},
{
"key": "ctrl+oem_4",
"command": "-editor.action.outdentLines",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "ctrl+oem_6",
"command": "-editor.action.indentLines",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "ctrl+oem_4",
"command": "inlineChat.start",
"when": "editorFocus && inlineChatHasProvider && !editorReadonly"
},
{
"key": "ctrl+i",
"command": "-inlineChat.start",
"when": "editorFocus && inlineChatHasProvider && !editorReadonly"
},
{
"key": "ctrl+oem_4",
"command": "workbench.action.terminal.chat.start",
"when": "terminalChatAgentRegistered && terminalFocusInAny && terminalHasBeenCreated || terminalChatAgentRegistered && terminalFocusInAny && terminalProcessSupported"
},
{
"key": "ctrl+i",
"command": "-workbench.action.terminal.chat.start",
"when": "terminalChatAgentRegistered && terminalFocusInAny && terminalHasBeenCreated || terminalChatAgentRegistered && terminalFocusInAny && terminalProcessSupported"
},
{
"key": "ctrl+oem_4",
"command": "workbench.action.terminal.chat.focusInput",
"when": "terminalChatFocus && !inlineChatFocused"
},
{
"key": "ctrl+i",
"command": "-workbench.action.terminal.chat.focusInput",
"when": "terminalChatFocus && !inlineChatFocused"
},
{
"key": "ctrl+oem_4",
"command": "workbench.action.chat.startVoiceChat",
"when": "chatIsEnabled && hasSpeechProvider && inChatInput && !chatSessionRequestInProgress && !editorFocus && !notebookEditorFocused && !scopedVoiceChatGettingReady && !speechToTextInProgress && !terminalChatActiveRequest || chatIsEnabled && hasSpeechProvider && inlineChatFocused && !chatSessionRequestInProgress && !editorFocus && !notebookEditorFocused && !scopedVoiceChatGettingReady && !speechToTextInProgress && !terminalChatActiveRequest"
},
{
"key": "ctrl+i",
"command": "-workbench.action.chat.startVoiceChat",
"when": "chatIsEnabled && hasSpeechProvider && inChatInput && !chatSessionRequestInProgress && !editorFocus && !notebookEditorFocused && !scopedVoiceChatGettingReady && !speechToTextInProgress && !terminalChatActiveRequest || chatIsEnabled && hasSpeechProvider && inlineChatFocused && !chatSessionRequestInProgress && !editorFocus && !notebookEditorFocused && !scopedVoiceChatGettingReady && !speechToTextInProgress && !terminalChatActiveRequest"
},
{
"key": "ctrl+oem_4",
"command": "workbench.action.chat.stopListeningAndSubmit",
"when": "inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'editor' || inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'inline' || inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'quick' || inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'terminal' || inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'view' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'editor' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'inline' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'quick' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'terminal' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'view'"
},
{
"key": "ctrl+i",
"command": "-workbench.action.chat.stopListeningAndSubmit",
"when": "inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'editor' || inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'inline' || inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'quick' || inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'terminal' || inChatInput && voiceChatInProgress && scopedVoiceChatInProgress == 'view' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'editor' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'inline' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'quick' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'terminal' || inlineChatFocused && voiceChatInProgress && scopedVoiceChatInProgress == 'view'"
},
{
"key": "ctrl+j",
"command": "workbench.action.togglePanel",
"when": "!editorHoverFocused && !quickInputVisible && !searchViewletVisible && !terminalFocus && !terminalFindWidgetFocus && !terminalFocusInFindWidget"
},
{
"key": "ctrl+k ctrl+l",
"command": "-editor.toggleFold",
"when": "editorTextFocus && foldingEnabled"
},
{
"key": "ctrl+shift+d",
"command": "-workbench.view.debug",
"when": "viewContainer.workbench.view.debug.enabled"
},
{
"key": "ctrl+shift+d",
"command": "addCursorsAtSearchResults",
"when": "fileMatchOrMatchFocus && searchViewletVisible"
},
{
"key": "ctrl+shift+l",
"command": "-addCursorsAtSearchResults",
"when": "fileMatchOrMatchFocus && searchViewletVisible"
},
{
"key": "ctrl+shift+d",
"command": "editor.action.selectHighlights",
"when": "editorFocus"
},
{
"key": "ctrl+shift+l",
"command": "-editor.action.selectHighlights",
"when": "editorFocus"
},
{
"key": "ctrl+shift+d",
"command": "notebook.selectAllFindMatches",
"when": "config.notebook.multiCursor.enabled && notebookFindWidgetFocused || config.notebook.multiCursor.enabled && notebookCellEditorFocused && activeEditor == 'workbench.editor.notebook'"
},
{
"key": "ctrl+shift+l",
"command": "-notebook.selectAllFindMatches",
"when": "config.notebook.multiCursor.enabled && notebookFindWidgetFocused || config.notebook.multiCursor.enabled && notebookCellEditorFocused && activeEditor == 'workbench.editor.notebook'"
},
{
"key": "ctrl+shift+d",
"command": "selectAllSearchEditorMatches",
"when": "inSearchEditor"
},
{
"key": "ctrl+shift+l",
"command": "-selectAllSearchEditorMatches",
"when": "inSearchEditor"
},
{
"key": "ctrl+shift+k",
"command": "-editor.action.deleteLines",
"when": "textInputFocus && !editorReadonly"
},
{
"key": "ctrl+shift+j",
"command": "-workbench.action.search.toggleQueryDetails",
"when": "inSearchEditor || searchViewletFocus"
},
{
"key": "ctrl+j",
"command": "-workbench.action.togglePanel"
}
]






ディスカッション
コメント一覧
まだ、コメントがありません