src/Tools/VSCode/src/vscode_main.scala
author wenzelm
Tue, 22 Mar 2022 12:48:27 +0100
changeset 75292 4ce0a4d90dfa
parent 75285 src/Tools/VSCode/src/vscode_setup.scala@2b64d5657592
child 75293 c5da08c5b01b
permissions -rw-r--r--
run Isabelle/VSCode via Scala;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
     1
/*  Title:      Tools/VSCode/src/vscode_main.scala
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     3
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
     4
Main application entry point for Isabelle/VSCode.
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     5
*/
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     6
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     7
package isabelle.vscode
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     8
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
     9
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    10
import isabelle._
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    11
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    12
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    13
object VSCode_Main
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    14
{
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    15
  /* command-line interface */
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    16
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    17
  private def platform_path(s: String): String = File.platform_path(Path.explode(s))
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    18
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    19
  def run_cli(args: List[String],
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    20
    environment: Iterable[(String, String)] = Nil,
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    21
    background: Boolean = false,
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    22
    progress: Progress = new Progress): Process_Result =
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    23
  {
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    24
    val env = new java.util.HashMap(Isabelle_System.settings())
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    25
    for ((a, b) <- environment) env.put(a, b)
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    26
    env.put("ISABELLE_VSCODIUM_APP", platform_path("$ISABELLE_VSCODIUM_RESOURCES/vscodium"))
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    27
    env.put("ELECTRON_RUN_AS_NODE", "1")
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    28
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    29
    val electron = Isabelle_System.getenv("ISABELLE_VSCODIUM_ELECTRON")
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    30
    if (electron.isEmpty) {
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    31
      error("""Undefined $ISABELLE_VSCODIUM_ELECTRON: missing "vscodium" component""")
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    32
    }
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    33
    val args0 =
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    34
      List(platform_path("$ISABELLE_VSCODIUM_RESOURCES/vscodium/out/cli.js"),
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    35
        "--ms-enable-electron-run-as-node", "--locale", "en-US",
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    36
        "--user-data-dir", platform_path("$ISABELLE_VSCODE_SETTINGS/user-data"),
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    37
        "--extensions-dir", platform_path("$ISABELLE_VSCODE_SETTINGS/extensions"))
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    38
    val script =
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    39
      Bash.strings(electron :: args0 ::: args) +
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    40
        (if (background) " > /dev/null 2> /dev/null &" else "")
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    41
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    42
    Isabelle_System.bash(script, env = env)
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    43
  }
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    44
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    45
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    46
  /* settings */
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    47
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    48
  def settings_path: Path =
75257
d1e5f9dbf885 clarified startup of "isabelle vscode": vscodium component is required, with patches for Isabelle/VSCode;
wenzelm
parents: 75252
diff changeset
    49
    Path.explode("$ISABELLE_VSCODE_SETTINGS/user-data/User/settings.json")
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    50
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    51
  private val default_settings = """  {
75166
wenzelm
parents: 75165
diff changeset
    52
    "editor.fontFamily": "'Isabelle DejaVu Sans Mono'",
wenzelm
parents: 75165
diff changeset
    53
    "editor.fontSize": 18,
wenzelm
parents: 75165
diff changeset
    54
    "editor.lineNumbers": "off",
wenzelm
parents: 75165
diff changeset
    55
    "editor.renderIndentGuides": false,
wenzelm
parents: 75165
diff changeset
    56
    "editor.rulers": [80, 100],
75171
96b26b0d2cc5 clarified rendering;
wenzelm
parents: 75167
diff changeset
    57
    "editor.unicodeHighlight.ambiguousCharacters": false,
75166
wenzelm
parents: 75165
diff changeset
    58
    "extensions.autoCheckUpdates": false,
75167
wenzelm
parents: 75166
diff changeset
    59
    "extensions.autoUpdate": false,
75178
01017b938135 proper monospace font for terminal;
wenzelm
parents: 75171
diff changeset
    60
    "terminal.integrated.fontFamily": "monospace",
75167
wenzelm
parents: 75166
diff changeset
    61
    "update.mode": "none"
75166
wenzelm
parents: 75165
diff changeset
    62
  }
wenzelm
parents: 75165
diff changeset
    63
"""
wenzelm
parents: 75165
diff changeset
    64
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    65
  def init_settings(): Unit =
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    66
  {
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    67
    if (!settings_path.is_file) {
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    68
      Isabelle_System.make_directory(settings_path.dir)
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    69
      File.write(settings_path, default_settings)
75163
c440b77c79c0 tuned message;
wenzelm
parents: 75162
diff changeset
    70
    }
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    71
  }
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    72
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    73
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    74
  /* Isabelle tool wrapper */
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    75
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    76
  val isabelle_tool =
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    77
    Isabelle_Tool("vscode", "Isabelle/VSCode interface wrapper", Scala_Project.here, args =>
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    78
    {
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    79
      val getopts = Getopts("""
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    80
Usage: isabelle vscode -- VSCODE_OPTIONS
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    81
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    82
  Start Isabelle/VSCode application, with automatic configuration of
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    83
  user settings.
75163
c440b77c79c0 tuned message;
wenzelm
parents: 75162
diff changeset
    84
c440b77c79c0 tuned message;
wenzelm
parents: 75162
diff changeset
    85
  The following initial settings are provided for a fresh installation:
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    86
""" + default_settings)
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    87
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    88
      val more_args = getopts(args)
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    89
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    90
      val progress = new Console_Progress()
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    91
75292
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    92
      init_settings()
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    93
      run_cli(List("--version")).check
4ce0a4d90dfa run Isabelle/VSCode via Scala;
wenzelm
parents: 75285
diff changeset
    94
      run_cli(more_args, background = true, progress = progress).check
75083
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    95
    })
35a5c4b16024 setup VSCode from VSCodium distribution;
wenzelm
parents:
diff changeset
    96
}