VSCodeを使っていると、より便利にするために挙動を少し変えたいと思うときがある。ほんとにちょっとした変更の場合、拡張を書くまではしたくないので、いい方法がないかなと思っていたところ、vscode-powertoolsを使うと自分好みにできそうだった。
今回僕が困っていたのは、Emacs Friendly Keymap拡張のemacs.C-yコマンドが、選択範囲がある時に選択範囲を消さずにペーストしてしまうことだった。この挙動を改善する。
https://github.com/egodigital/vscode-powertools#commands- を使うとVSCodeのコマンドを自分で実装できるので、この機能を使う。
やることとしては
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はいろいろなものを作れるので、他にも試したいと思う。