VSCodeを使っていると、より便利にするために挙動を少し変えたいと思うときがある。ほんとにちょっとした変更の場合、拡張を書くまではしたくないので、いい方法がないかなと思っていたところ、vscode-powertoolsを使うと自分好みにできそうだった。
今回僕が困っていたのは、Emacs Friendly Keymap拡張のemacs.C-yコマンドが、選択範囲がある時に選択範囲を消さずにペーストしてしまうことだった。この挙動を改善する。
https://github.com/egodigital/vscode-powertools#commands- を使うとVSCodeのコマンドを自分で実装できるので、この機能を使う。
やることとしては
- settings.jsonでvscode-powertoolsの設定を書く
- commandをjsファイルで実装する
- Keyboard Shortcutsを設定する
settings.jsonでvscode-powertoolsの設定を書く
以下のような設定をsettings.jsonに書く。
{
"ego.power-tools": {},
"ego.power-tools.user": {
"commands": {
// emacs.C-yの挙動を変え、選択範囲は消えるようにする
"emacs.better-C-y": {
"name": "emacs better C-y",
"description": "emacs better C-y",
"script": "emacs-better-c-y.js"
}
}
},
}
この設定の要点は
- ego.power-toolsの設定はworkspace単位になるので、グローバルなコマンドを作りたければego.power-tools.userに設定する。
- emacs.better-C-yというIDのコマンドが作られる
- コマンドを実行するとemacs-better-c-y.jsというファイルが実装される。グローバルなコマンドは~/.vscode-powertools/以下にファイルを作成する
commandをjsファイルで実装する
あとはcommandをjsファイルで実装する。
~/.vscode-powertools/emacs-better-c-y.js
exports.execute = async args => {
const vscode = args.require("vscode");
await vscode.commands.executeCommand("editor.action.clipboardPasteAction");
await vscode.commands.executeCommand("emacs.exitMarkMode");
};
Emacs Friendly KeymapではPromise.allでeditor.action.clipboardPasteActionとemacs.exitMarkModeを実行していたので、exitMarkModeが先に実行されると選択範囲が消えない現象になっていた。そこでawaitで順序を固定することで解決した。この挙動はたぶんバグなので、今度PRしようとは思っている。
Keyboard Shortcutsを設定する
最後に作ったコマンドにKeyboard Shortcutsを設定する。
keybindings.json
[
// emacs.C-yと違い、範囲選択時には範囲を消してからペーストするように
{
"key": "ctrl+y",
"command": "emacs.better-C-y",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "ctrl+y",
"command": "-emacs.C-y",
"when": "editorTextFocus && !editorReadonly"
},
]
まとめ
vscode-powertoolsを使って、VSCodeの挙動を自分好みに変える方法を書いた。これでどんどん自分好みにカスタマイズしていけそう。さらにvscode-powertoolsはいろいろなものを作れるので、他にも試したいと思う。