💻

Visual Studio Code の統合ターミナルで tmux を利用する

2023/10/09に公開

tl; dr

Visual Studio Code (以下、VSCode) で「フォルダーを開く (Ctrl-K Ctrl-O)」をすると統合ターミナルのシェルが切断されてしまうので tmux と組み合わせたらいい感じになります

やっていく

事象の説明

前提: 作業フォルダA、作業フォルダBがあるとする

  1. 作業フォルダAを VSCode で開いて、統合ターミナルを起動する
  2. 「フォルダーを開く」で作業フォルダBを開く
    • このタイミングで作業フォルダAで動作していた統合ターミナルのシェルは切断される
  3. 作業フォルダAを VSCode で開いて、統合ターミナルを起動する
  4. 履歴(History)は回復されるが、シェル自体はセッションが切断されている

シェルが切断している様子

~/.zshrc を読んでもらえないので、デフォルトの PROMPT='%m%#' でプロンプトが表示されています。

これだとちょっとつらいので tmux と組み合わせてシェルセッションを維持したい。

設定内容

VSCode の settings.json で下記のように設定します。

settings.json
    "terminal.integrated.defaultProfile.linux": "tmux",
    "terminal.integrated.profiles.linux": {
        "tmux": {
            "overrideName": true,
            "path": "bash",
            "args": [
                "-c",
                "tmux new-session -A -s \"${PWD/$HOME/\\~}\"",
            ],
        },
    },

これによってシェルを起動する際には下記コマンドが実行されます。

bash -c 'tmux new-session -A -s "${PWD/$HOME/\~}"'

これで、セッション名をカレントディレクトリとした tmux の新規セッションが立ち上がります。ただし、-A オプションを付けているので、同じ名前のセッションが既にある場合には、新規セッションではなく既存セッションにアタッチされます。また、このままだと VSCode 上のプロファイル名が bash になってしまうので、overrideNametrue にして tmux となるようにしています。

単純に、下記のようにしてしまってもいいのですが、これだとホームディレクトリ以下でもフルパスになってしまって長いので、bash の変数置換を利用して $HOME~ に置換しています。

settings.json
    "terminal.integrated.defaultProfile.linux": "tmux",
    "terminal.integrated.profiles.linux": {
        "tmux": {
            "path": "tmux",
            "args": [
                "new-session", "-A", "-s", "${workspaceFolder}",
            ],
        },
    },

あとは、tmux.conf#S (セッション名) がキチンと表示されるように設定しておけば OK です。私は画面右下に設定しました。

設定後の起動例

副次的な効果として、処理の時間が掛かるコマンドを叩いた後、完了を待たずに「フォルダーを開く」で別の作業フォルダに移動しても tmux のおかげでコマンドが中断されなくなりました。複数フォルダで作業をするときにワークスペースで複数フォルダを開かなくても捗ると思います。

Discussion