src/Tools/VSCode/extension/src/extension.ts
author Thomas Lindae <thomas.lindae@in.tum.de>
Wed, 01 May 2024 12:30:53 +0200
changeset 81024 d1535ba3b1ca
parent 75295 38398766be6b
child 81035 56594fac1dab
permissions -rw-r--r--
lsp: added vscode_html_output option;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75234
57de0062dc1c proper file headers;
wenzelm
parents: 75209
diff changeset
     1
/*  Author:     Makarius
57de0062dc1c proper file headers;
wenzelm
parents: 75209
diff changeset
     2
    Author:     Denis Paluca, TU Muenchen
57de0062dc1c proper file headers;
wenzelm
parents: 75209
diff changeset
     3
    Author:     Fabian Huch, TU Muenchen
57de0062dc1c proper file headers;
wenzelm
parents: 75209
diff changeset
     4
57de0062dc1c proper file headers;
wenzelm
parents: 75209
diff changeset
     5
Isabelle/VSCode extension.
57de0062dc1c proper file headers;
wenzelm
parents: 75209
diff changeset
     6
*/
57de0062dc1c proper file headers;
wenzelm
parents: 75209
diff changeset
     7
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     8
'use strict';
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     9
75172
26ac98871d42 clarified modules;
wenzelm
parents: 75136
diff changeset
    10
import * as platform from './platform'
65968
44e703278dfd clarified modules;
wenzelm
parents: 65958
diff changeset
    11
import * as library from './library'
75191
fbff7bfd5802 clarified modules;
wenzelm
parents: 75189
diff changeset
    12
import * as file from './file'
75209
4187f6f18232 provide symbols statically via ISABELLE_VSCODE_WORKSPACE, instead of LSP/PIDE protocol;
wenzelm
parents: 75201
diff changeset
    13
import * as symbol from './symbol'
75181
98fbc9accb51 clarified module;
wenzelm
parents: 75175
diff changeset
    14
import * as vscode_lib from './vscode_lib'
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
    15
import * as decorations from './decorations'
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
    16
import * as preview_panel from './preview_panel'
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
    17
import * as lsp from './lsp'
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
    18
import * as state_panel from './state_panel'
66216
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
    19
import { Uri, TextEditor, ViewColumn, Selection, Position, ExtensionContext, workspace, window,
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
    20
  commands, ProgressLocation } from 'vscode'
75134
c04ccea8bdd2 update VSCode plugin dependencies;
Fabian Huch <huch@in.tum.de>
parents: 75129
diff changeset
    21
import { LanguageClient, LanguageClientOptions, ServerOptions } from 'vscode-languageclient/node'
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
    22
import { Output_View_Provider } from './output_view'
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
    23
import { register_script_decorations } from './script_decorations'
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    24
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    25
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
    26
let last_caret_update: lsp.Caret_Update = {}
65180
b5a8f27a4980 tuned signature;
wenzelm
parents: 65172
diff changeset
    27
75295
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    28
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    29
/* command-line arguments from "isabelle vscode" */
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    30
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    31
interface Args
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    32
{
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    33
  options?: string[],
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    34
  logic?: string,
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    35
  logic_ancestor?: string,
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    36
  logic_requirements?: boolean,
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    37
  sesion_dirs?: string[],
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    38
  include_sessions?: string[],
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    39
  modes?: string[],
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    40
  log_file?: string,
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    41
  verbose?: boolean
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    42
}
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    43
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    44
function print_value(x: any): string
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    45
{
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    46
  return typeof(x) === "string" ? x : JSON.stringify(x)
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    47
}
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    48
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    49
function isabelle_options(args: Args): string[]
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    50
{
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    51
  var result: string[] = []
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    52
  function add(s: string) { result.push(s) }
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    53
  function add_value(opt: string, slot: string)
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    54
  {
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    55
    const x = args[slot]
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    56
    if (x) { add(opt); add(print_value(x)) }
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    57
  }
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    58
  function add_values(opt: string, slot: string)
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    59
  {
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    60
    const xs: any[] = args[slot]
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    61
    if (xs) {
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    62
      for (const x of xs) { add(opt); add(print_value(x)) }
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    63
    }
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    64
  }
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    65
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    66
  add("-o"); add("vscode_unicode_symbols")
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    67
  add("-o"); add("vscode_pide_extensions")
81024
d1535ba3b1ca lsp: added vscode_html_output option;
Thomas Lindae <thomas.lindae@in.tum.de>
parents: 75295
diff changeset
    68
  add("-o"); add("vscode_html_output")
75295
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    69
  add_values("-o", "options")
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    70
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    71
  add_value("-A", "logic_ancestor")
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    72
  if (args.logic) { add_value(args.logic_requirements ? "-R" : "-l", "logic") }
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    73
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    74
  add_values("-d", "session_dirs")
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    75
  add_values("-i", "include_sessions")
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    76
  add_values("-m", "modes")
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    77
  add_value("-L", "log_file")
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    78
  if (args.verbose) { add("-v") }
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    79
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    80
  return result
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    81
}
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    82
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    83
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    84
/* activate extension */
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    85
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
    86
export async function activate(context: ExtensionContext)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    87
{
65182
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
    88
  /* server */
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
    89
75129
49f9fa8f9601 refer to Isabelle settings via environment, which is provided via "isabelle vscode";
wenzelm
parents: 75127
diff changeset
    90
  try {
49f9fa8f9601 refer to Isabelle settings via environment, which is provided via "isabelle vscode";
wenzelm
parents: 75127
diff changeset
    91
    const isabelle_home = library.getenv_strict("ISABELLE_HOME")
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65167
diff changeset
    92
    const isabelle_tool = isabelle_home + "/bin/isabelle"
75295
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    93
    const args = JSON.parse(library.getenv("ISABELLE_VSCODIUM_ARGS") || "{}")
65167
wenzelm
parents: 65165
diff changeset
    94
75295
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    95
    const server_opts = isabelle_options(args)
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65167
diff changeset
    96
    const server_options: ServerOptions =
75172
26ac98871d42 clarified modules;
wenzelm
parents: 75136
diff changeset
    97
      platform.is_windows() ?
75191
fbff7bfd5802 clarified modules;
wenzelm
parents: 75189
diff changeset
    98
        { command: file.cygwin_bash(),
75295
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
    99
          args: ["-l", isabelle_tool, "vscode_server"].concat(server_opts) } :
64755
ceb81f4928ea support for Windows;
wenzelm
parents: 64753
diff changeset
   100
        { command: isabelle_tool,
75295
38398766be6b command-line arguments for "isabelle vscode", similar to "isabelle jedit";
wenzelm
parents: 75264
diff changeset
   101
          args: ["vscode_server"].concat(server_opts) }
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   102
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   103
    const language_client_options: LanguageClientOptions = {
69322
ce6d43af5bcb more robust (see https://code.visualstudio.com/docs/extensionAPI/document-selectors);
wenzelm
parents: 66395
diff changeset
   104
      documentSelector: [
75264
5cae3e486cec tuned signature;
wenzelm
parents: 75262
diff changeset
   105
        { language: "isabelle", scheme: vscode_lib.file_scheme },
5cae3e486cec tuned signature;
wenzelm
parents: 75262
diff changeset
   106
        { language: "isabelle-ml", scheme: vscode_lib.file_scheme },
5cae3e486cec tuned signature;
wenzelm
parents: 75262
diff changeset
   107
        { language: "bibtex", scheme: vscode_lib.file_scheme }
75262
ec62c5401522 discontinued isabelle_filesystem (superseded by isabelle_encoding), see also da1108a6d249;
wenzelm
parents: 75240
diff changeset
   108
      ]
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   109
    }
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   110
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   111
    const language_client =
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   112
      new LanguageClient("Isabelle", server_options, language_client_options, false)
65094
386d9d487f62 support for decorations;
wenzelm
parents: 64874
diff changeset
   113
65182
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
   114
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   115
    window.withProgress({location: ProgressLocation.Notification, cancellable: false},
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   116
      async (progress) =>
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   117
        {
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   118
          progress.report({
75182
fae759dcf55f tuned message;
wenzelm
parents: 75181
diff changeset
   119
            message: "Waiting for Isabelle language server..."
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   120
          })
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   121
          await language_client.onReady()
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   122
        })
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   123
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   124
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   125
    /* decorations */
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   126
66097
ee4c2d5b650e tuned signature;
wenzelm
parents: 66096
diff changeset
   127
    decorations.setup(context)
65975
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
   128
    context.subscriptions.push(
66097
ee4c2d5b650e tuned signature;
wenzelm
parents: 66096
diff changeset
   129
      workspace.onDidChangeConfiguration(() => decorations.setup(context)),
65975
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
   130
      workspace.onDidChangeTextDocument(event => decorations.touch_document(event.document)),
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
   131
      window.onDidChangeActiveTextEditor(decorations.update_editor),
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
   132
      workspace.onDidCloseTextDocument(decorations.close_document))
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   133
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   134
    language_client.onReady().then(() =>
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   135
      language_client.onNotification(lsp.decoration_type, decorations.apply_decoration))
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   136
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
   137
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   138
    /* super-/subscript decorations */
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   139
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   140
    register_script_decorations(context)
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   141
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   142
65978
wenzelm
parents: 65977
diff changeset
   143
    /* caret handling */
65191
4c9c83311cad dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents: 65189
diff changeset
   144
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   145
    function update_caret()
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   146
    {
65969
1f93eb5c3d77 tuned imports;
wenzelm
parents: 65968
diff changeset
   147
      const editor = window.activeTextEditor
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   148
      let caret_update: lsp.Caret_Update = {}
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   149
      if (editor) {
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   150
        const uri = editor.document.uri
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   151
        const cursor = editor.selection.active
75181
98fbc9accb51 clarified module;
wenzelm
parents: 75175
diff changeset
   152
        if (vscode_lib.is_file(uri) && cursor)
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   153
          caret_update = { uri: uri.toString(), line: cursor.line, character: cursor.character }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   154
      }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   155
      if (last_caret_update !== caret_update) {
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   156
        if (caret_update.uri) {
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   157
          language_client.sendNotification(lsp.caret_update_type, caret_update)
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   158
        }
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   159
        last_caret_update = caret_update
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   160
      }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   161
    }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   162
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   163
    function goto_file(caret_update: lsp.Caret_Update)
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   164
    {
66216
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   165
      function move_cursor(editor: TextEditor)
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   166
      {
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   167
        const pos = new Position(caret_update.line || 0, caret_update.character || 0)
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   168
        editor.selections = [new Selection(pos, pos)]
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   169
      }
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   170
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   171
      if (caret_update.uri) {
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   172
        workspace.openTextDocument(Uri.parse(caret_update.uri)).then(document =>
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   173
        {
75181
98fbc9accb51 clarified module;
wenzelm
parents: 75175
diff changeset
   174
          const editor = vscode_lib.find_file_editor(document.uri)
66216
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   175
          const column = editor ? editor.viewColumn : ViewColumn.One
d4949bae0bad clarified editor focus;
wenzelm
parents: 66215
diff changeset
   176
          window.showTextDocument(document, column, !caret_update.focus).then(move_cursor)
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   177
        })
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   178
      }
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   179
    }
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   180
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   181
    language_client.onReady().then(() =>
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   182
    {
65975
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
   183
      context.subscriptions.push(
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
   184
        window.onDidChangeActiveTextEditor(_ => update_caret()),
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
   185
        window.onDidChangeTextEditorSelection(_ => update_caret()))
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   186
      update_caret()
66215
9a8b6b86350c proper hyperlink_command, notably for locate_query;
wenzelm
parents: 66211
diff changeset
   187
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   188
      language_client.onNotification(lsp.caret_update_type, goto_file)
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   189
    })
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   190
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
   191
65978
wenzelm
parents: 65977
diff changeset
   192
    /* dynamic output */
wenzelm
parents: 65977
diff changeset
   193
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   194
    const provider = new Output_View_Provider(context.extensionUri)
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   195
    context.subscriptions.push(
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   196
      window.registerWebviewViewProvider(Output_View_Provider.view_type, provider))
65978
wenzelm
parents: 65977
diff changeset
   197
65983
d8c5603c1732 explicit preview request/response;
wenzelm
parents: 65979
diff changeset
   198
    language_client.onReady().then(() =>
65978
wenzelm
parents: 65977
diff changeset
   199
    {
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   200
      language_client.onNotification(lsp.dynamic_output_type,
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   201
        params => provider.update_content(params.content))
65978
wenzelm
parents: 65977
diff changeset
   202
    })
wenzelm
parents: 65977
diff changeset
   203
wenzelm
parents: 65977
diff changeset
   204
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66097
diff changeset
   205
    /* state panel */
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66072
diff changeset
   206
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66072
diff changeset
   207
    context.subscriptions.push(
71476
ecefde4f9103 proper message passing -- discontinued obsolete auxiliary commands;
wenzelm
parents: 71475
diff changeset
   208
      commands.registerCommand("isabelle.state", uri => state_panel.init(uri)))
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66072
diff changeset
   209
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66097
diff changeset
   210
    language_client.onReady().then(() => state_panel.setup(context, language_client))
66096
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66072
diff changeset
   211
6187612e83c1 support for separate proof state output;
wenzelm
parents: 66072
diff changeset
   212
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66097
diff changeset
   213
    /* preview panel */
65958
6338355b2a88 basic setup for document preview;
wenzelm
parents: 65233
diff changeset
   214
65984
8e6a833da7db register commands earlier, before prover startup;
wenzelm
parents: 65983
diff changeset
   215
    context.subscriptions.push(
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66097
diff changeset
   216
      commands.registerCommand("isabelle.preview", uri => preview_panel.request(uri, false)),
71479
6aa2dc263912 less ambitious preview: discontinued preview-update / preview-source which did not work on the spot via WebviewPanel;
wenzelm
parents: 71476
diff changeset
   217
      commands.registerCommand("isabelle.preview-split", uri => preview_panel.request(uri, true)))
65984
8e6a833da7db register commands earlier, before prover startup;
wenzelm
parents: 65983
diff changeset
   218
66098
5aa9cb83e70e clarified modules;
wenzelm
parents: 66097
diff changeset
   219
    language_client.onReady().then(() => preview_panel.setup(context, language_client))
65958
6338355b2a88 basic setup for document preview;
wenzelm
parents: 65233
diff changeset
   220
6338355b2a88 basic setup for document preview;
wenzelm
parents: 65233
diff changeset
   221
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   222
    /* spell checker */
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   223
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   224
    language_client.onReady().then(() =>
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   225
    {
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   226
      context.subscriptions.push(
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   227
        commands.registerCommand("isabelle.include-word", uri =>
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   228
          language_client.sendNotification(lsp.include_word_type)),
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   229
        commands.registerCommand("isabelle.include-word-permanently", uri =>
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   230
          language_client.sendNotification(lsp.include_word_permanently_type)),
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   231
        commands.registerCommand("isabelle.exclude-word", uri =>
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   232
          language_client.sendNotification(lsp.exclude_word_type)),
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   233
        commands.registerCommand("isabelle.exclude-word-permanently", uri =>
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   234
          language_client.sendNotification(lsp.exclude_word_permanently_type)),
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   235
        commands.registerCommand("isabelle.reset-words", uri =>
75201
8f6b8a46f54c clarified modules: more uniform .scala vs. ts (amending 4519eeefe3b5);
wenzelm
parents: 75191
diff changeset
   236
          language_client.sendNotification(lsp.reset_words_type)))
66138
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   237
    })
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   238
f7ef4c50b747 added commands for spell-checker dictionary;
wenzelm
parents: 66098
diff changeset
   239
65182
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
   240
    /* start server */
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
   241
65986
d2b2f08533c5 added update operation;
wenzelm
parents: 65985
diff changeset
   242
    context.subscriptions.push(language_client.start())
65094
386d9d487f62 support for decorations;
wenzelm
parents: 64874
diff changeset
   243
  }
75129
49f9fa8f9601 refer to Isabelle settings via environment, which is provided via "isabelle vscode";
wenzelm
parents: 75127
diff changeset
   244
  catch (exn) {
49f9fa8f9601 refer to Isabelle settings via environment, which is provided via "isabelle vscode";
wenzelm
parents: 75127
diff changeset
   245
    window.showErrorMessage(exn)
49f9fa8f9601 refer to Isabelle settings via environment, which is provided via "isabelle vscode";
wenzelm
parents: 75127
diff changeset
   246
  }
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   247
}
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   248
75126
da1108a6d249 various improvements to Isabelle/VSCode (by Denis Paluca and Fabian Huch);
wenzelm
parents: 71479
diff changeset
   249
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   250
export function deactivate() { }