🎉

VSCode拡張で便利なショートカットを作る(multi-command, ssmacro)

2023/12/22に公開

ショートカットを作るときに便利なVSCode拡張を2つ紹介します。
(わりとオレオレです。組み合わせは自由、記法はいろいろなので、他にもよいものあれば教えてください)

はじめに

想定読者

  • VSCodeを使っている
  • ショートカットの設定が好き
  • ターミナル実行後のRedo -> 例えば ファイル編集 -> "保存、ターミナルに戻る、実行"を1操作でやりたい

他のkeybindings情報

マクロ操作やkeybindingsなど、とても詳しくて良かったです。
https://blog.engineer.adways.net/entry/2023/12/01/170000

keybindings.jsonの準備

ここからの説明では、keybindings.jsonに設定を書いていきます。

ファイルの開き方の例:

  • 開き方1: 設定アイコン->Keybordshortcut->くるっと回るアイコンを押す
  • 開き方2: Command Palette (Ctrl+Shift+P) から Preferences: Open Keyboard Shortcuts (JSON)を開く

multiCommand

VSCodeのデフォルトではできない、コマンドを繰り返す操作ができるようになる拡張です。

https://marketplace.visualstudio.com/items?itemName=ryuta46.multi-command

https://ryuta46.com/173

連続した動作のアサイン

まず通常のショートカット設定ですが、ctrl+Hに左矢印キーをアサインしています。

keybindings.json
  {
    "key": "ctrl+h",
    "command": "cursorLeft"
  },

これを連続して実行させるコマンドがVSCodeにはないです(今後追加されるかもですが)。
multiCommandならこのように書きます。10回連続で実行しています。

keybindings.json
  {
    "key": "ctrl+shift+h",
    "command": "extension.multiCommand.execute",
    "args": {
      "sequence": [
        "cursorLeft",
        "cursorLeft",
        "cursorLeft",
        "cursorLeft",
        "cursorLeft",
        "cursorLeft",
        "cursorLeft",
        "cursorLeft",
        "cursorLeft",
        "cursorLeft",
      ]
    }
  },

アクティブなファイルを実行

pythonのファイルを編集したあと、保存して、実行したいときに使います。

keybindings.json
  {
    "key": "alt+g",
    "command": "extension.multiCommand.execute",
    "args": {
      "sequence": [
        {
          "command": "workbench.action.files.saveAll"
        },
        {
          "command": "workbench.action.terminal.sendSequence",
          "args": {
            "text": "python ${file}\n"
          }
        }
      ]
    }
  },

上のを分割して説明。まず実行前に保存しています。
(saveAllの部分は好みなのでsaveに変えていただいてもよいです)

        {
          "command": "workbench.action.files.saveAll"
        },

ターミナルにコマンドを送る部分。${file}がアクティブなファイル。\nでEnter。

        {
          "command": "workbench.action.terminal.sendSequence",
          "args": {
            "text": "python ${file}\n"
          }
        }

直前のコマンドを実行

「ファイルをセーブしてターミナルに移動して下を押してエンター....」のショートカットです。

「下を押してエンター」をsendSequenceの"\u001b[A\u000d"でやっています。
個人的に、この方法が一番役に立っています。

keybindings.json
  {
    "key": "alt+x",
    "command": "extension.multiCommand.execute",
    "args": {
      "sequence": [
        {
          "command": "workbench.action.files.saveAll"
        },
        {
          "command": "workbench.action.terminal.sendSequence",
          "args": {
            "text": "\u001b[A\u000d"
          }
        }
      ]
    }
  },

参考
https://stackoverflow.com/questions/61742559/need-vscode-sendsequence-keybindings-for-previous-command-next-command-move-to

コピーした文字列でprint("some_var", some_var)と出力する

Pythonのprintデバッグ用に使っています。some_varという文字列がクリップボードに入っているときにprint("some_var", some_var)を出力します。

keybindings.json
  {
    "key": "alt+ctrl+p",
    "command": "extension.multiCommand.execute",
    "args": {
      "sequence": [
        { "command": "type", "args": { "text": "print(\"" } },
        "editor.action.clipboardPasteAction",
        { "command": "type", "args": { "text": "\", " } },
        "editor.action.clipboardPasteAction",
        { "command": "type", "args": { "text": ")" } }
      ]
    }
  },

おまけ:snippetを実行する

(multi-command使っているわけではなく、VSCode標準です)
スニペットの設定は先程も紹介したこちらのブログにあります。

例えばこうの設定があったとします。

  "my_print_xx": {
    "prefix": "p",
    "body": ["print('xxxxxxxxxx')"]
  },

これをショートカットにします。つけたスニペット名で登録すればよいです。

keybindings.json
  {
    "key": "alt+p",
    "command": "editor.action.insertSnippet",
    "args": { "name": "my_print_xx" }
  },

おまけ: アクティブなファイルのあるディレクトリに、ターミナル上で移動する

ポイントは、${fileDirname} がVSCodeの変数として使えることです。

keybindings.json
  {
   // Change dir to where the current file is.
   // Cannot use for dir with spaces in the name.
   "key": "alt+d",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "cd ${fileDirname}\n"
   }
 },

変数の紹介はこちらです。
https://code.visualstudio.com/docs/editor/variables-reference


ssmacro

VSCodeでマクロを実行できるようになる拡張です。

https://marketplace.visualstudio.com/items?itemName=joekon.ssmacro

https://www.off-soft.net/ja/super-simple-macro-for-vscode

複雑な処理ができるのですが、私はもっぱら文字の置換に使っています。詳細は著者ページをご参考。

全角スペースを半角スペースにする

変更が面倒なので一度でできるようにしています。

わかりにくいですが、"find": " "は全角スペース、"replace": " "は半角スペースとしています。all, reg, flagとかはあまり気にしていません。。

ssmacro_sample.json
[
    {
        "args": {
            "find": " ",
            "replace": " ",
            "all": true,
            "reg": true,
            "flag": "gmi"
        },
        "command": "ssmacro.replace"
    }
]

keybindings.json で好みのキーにアサインします。pathはフルパスにしています。

keybindings.json
  {
    "key": "ctrl+7",
    "command": "ssmacro.macro",
    "args": {
      "path": "/full/path/to/ssmacro_sample.json"
    }
  },

AWS用語を短く変換する

特に認定試験で、ドキュメントをコピペしていると文字が増えてきて困るな〜というときに使っていました。
以下のパターンは全てEC2に変換されます。

Amazon EC2
Amazon Elastic Compute Cloud
Elastic Compute Cloud
Elastic Compute Cloud (Amazon EC2)
Elastic Compute Cloud (EC2)
Elastic Compute Cloud(EC2) # (の前にスペースがない
ssmacro_sample.json
[
    {
        "args": {
            "find": "Elastic Compute Cloud( ?\\((Amazon )*(EC2)\\))*",
            "replace": "EC2",
            "all": true,
            "reg": true,
            "flag": "gmi"
        },
        "command": "ssmacro.replace"
    },
 ]

Availability Zoneの例

以下のパターンがAZ,AZsに変換されます。

アベイラビリティゾーン
アベイラビリティーゾーン
Availability Zone
Availability Zone (AZ)
Availability Zones
ssmacro_sample.json
    {
        "args": {
            "find": "Availability Zone(s)*( \\((AZs*)\\))*|アベイラビリティー*ゾーン",
            "replace": "AZ$1",
            "all": true,
            "reg": true,
            "flag": "gmi"
        },
        "command": "ssmacro.replace"
    },

まとめ

  • VSCodeのショートカットに使える拡張multi-command、ssmacoを紹介しました。

Discussion