$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

vscode-powertoolsを使って、VSCodeの挙動を自分好みに変える

VSCodeを使っていると、より便利にするために挙動を少し変えたいと思うときがある。ほんとにちょっとした変更の場合、拡張を書くまではしたくないので、いい方法がないかなと思っていたところ、vscode-powertoolsを使うと自分好みにできそうだった。

今回僕が困っていたのは、Emacs Friendly Keymap拡張emacs.C-yコマンドが、選択範囲がある時に選択範囲を消さずにペーストしてしまうことだった。この挙動を改善する。

https://github.com/egodigital/vscode-powertools#commands- を使うとVSCodeのコマンドを自分で実装できるので、この機能を使う。

やることとしては

  • settings.jsonvscode-powertoolsの設定を書く
  • commandをjsファイルで実装する
  • Keyboard Shortcutsを設定する

settings.jsonvscode-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はいろいろなものを作れるので、他にも試したいと思う。