/terminal-presets

VSCode extension that lets you configure "presets" of terminals (Working dir, icon, color ... )

Primary LanguageTypeScript

Terminal presets

Quickly create presets of preconfigured terminals (including terminal name, icon, color...)

This extension can be usefull when working in a monorepo where you work with multiple terminals open at the same time:

Instead of creating each terminal manually, write a config file that will describe your "terminal presets".

Each terminal preset consist of a name and a list of terminal to create. For each terminal in a preset you can configure:

  • It's name, icon, color
  • It's shell process and args
  • Environment variables
  • A default command to execute once the terminal is started

How to use it

First create a config file named .terminal-presets.json in your root folder.

Search in the command palette for the Terminal presets command.

Once invoked this command will ask you to select a preset and will create the appropriate terminals.

Config file search algorithm

The extension will look for a config file named .terminal-presets.json that will contain your preset description.

Search is done with the following logic:

  • If a folder is open in vscode, search will start at the root of that folder and search in parent directory recursively until the file is found.

  • If workspace is open in vscode, search will start in the same directory as the one containing the *.code-workspace file and search in parent directory recursively until the file is found.

  • If nothing is open in vscode, search will start in the current working directory (i.e the directory where vscode was started) and search in parent directory recursively until the file is found.

Config file layout

Here is the "typescript" version of the expected config file layout:

// Configuration object for a single terminal
interface Terminal {
  // The working directory of the terminal
  cwd?: string;
  // The name of the terminal
  name?: string;
  // The icon of the terminal
  // See https://code.visualstudio.com/api/references/icons-in-labels#icon-listing for a list of available icon
  icon?: string;
  // A message to display before the prompt is displayed
  message?: string;
  // The color of the terminal icon
  // See below for a list of available color
  color?: TerminalColor;
  // A map of enironment variable to pass to the terminal
  env?: Record<string, string>;
  // The path to your favorite shell
  shellPath?: string;
  // Args to pass to the shell process
  shellArgs?: string[];
  // A bash command executed in the terminal on startup
  command?: string;
}

// Configuration object for a whole preset
interface Preset {
  // Name displayed in the preset picker
  name: string;
  // The list of terminal to instanciate for that profile
  terminals: Terminal[];
}

// The config file layout
interface ConfigFile {
  // A default terminal configuration that will be merged with each individual terminal config in a preset
  default: Partial<Terminal>;
  // The list of available presets
  presets: Partial<Preset>[];
}

Note that every fields are optional.
Once a terminal configuration is merged with the default config, if some fields are still missing they will be populated with the following values:

{
  "icon": "terminal-view-icon",
  "color": "white",
}

Available icons

You can provide any icon listed here:
https://code.visualstudio.com/api/references/icons-in-labels#icon-listing

Available colors

  • "black"
  • "white"
  • "red"
  • "green"
  • "yellow"
  • "blue"
  • "magenta"
  • "cyan"

Configuration file example

{
  "default": {
    "shellPath": "/opt/homebrew/bin/zsh",
    "shellArgs": ["-l"]
  },
  "presets": [
    {
      "name": "My App",
      "terminals": [
        {
          "icon": "default-view-icon",
          "name": "api",
          "color": "red",
          "cwd": "packages/api"
        },
        {
          "icon": "default-view-icon",
          "name": "app",
          "color": "green",
          "cwd": "packages/app",
          "env": {
            "api_url": "https://myapi.dev"
          }
        }
      ]
    }
  ]
}