VSCode + Python で複数行の Run Selection がしたい (つづき)

概要

前回記事 の結果、選択された複数行の Python コードを iPython に流し込めるようになった。しかし、流し込んだだけでは実行されず、ターミナルにフォーカスを置いた状態で Enter を 1-2 回叩打しないと実行されないという問題があった。これについては こちら でも議論されていたが、

We're not fixing the issue as stated because of limitations with the terminal.

などといって強制 close されていて悲しい気持ちになったので自力で解決を試みることにした。

本稿では、前回のマクロに追記し「エディタからコピー→ターミナルにフォーカス→ターミナルにペースト→ターミナルで 2 回改行する」という動作を一挙に行うショートカットを用意する。

作業

まず考えられるのが、このように workbench.action.terminal.sendSequence を用いることにより改行文字をターミナルに流し込む方法である。

[
    "macros": {
        "copySelectionAndPasteToActiveTerminal": [
            "editor.action.clipboardCopyAction",
            "workbench.action.terminal.focus",
            "workbench.action.terminal.paste",
            {"command": "workbench.action.terminal.sendSequence", "args": {"text": "\u000d"}},
            {"command": "workbench.action.terminal.sendSequence", "args": {"text": "\u000d"}},
        ]
    },
]

しかし、実際にこれを settings.json に追記してみても「ターミナルでなぜか最初に 2 行改行されたあとペーストが行われ、結局コードは実行されずじまい」という現象が発生する。おそらくなんか非同期処理みたいなものが走っており、時間のかかる処理 (ペースト) が終了する前に改行が実行されてしまっているため一見実行順がおかしくなっているように見えるとか、そういう類の問題であると考えられる。

この現象に対しても こちらこちら で議論がなされており、プルリクで修正がなされている。だがどういうわけか何年経ってもマージされる気配がないため、今回はローカルでインストールされている拡張機能のコード (extension.js) を こちら のものに差し替える方針とする。修正すべきファイルは以下の場所に存在する。

  • macOS: /Users/{username}/.vscode/extensions/geddski.macros-1.2.1/extension.js
  • Windows: C:/Users/{username}/.vscode/extensions/geddski.macros-1.2.1/extension.js
  • Windows + WSL: /home/ubuntu/.vscode-server/extensions/geddski.macros-1.2.1/extension.js

これに対して上記の差し替え作業を行い、VSCode を再起動すれば無事上記のマクロが順序通りに実行されるようになる。わーい!