src/Tools/VSCode/extension/src/extension.ts
author wenzelm
Tue, 30 May 2017 19:25:06 +0200
changeset 65975 f20739a63a44
parent 65974 fd5f80ee2de0
child 65977 c51b74be23b6
permissions -rw-r--r--
more careful treatment of context.subscriptions;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     1
'use strict';
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     2
65969
1f93eb5c3d77 tuned imports;
wenzelm
parents: 65968
diff changeset
     3
import { ExtensionContext, workspace, window } from 'vscode';
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
     4
import * as path from 'path';
65172
365e97f009ed default cygwin_root from Isabelle distribution;
wenzelm
parents: 65171
diff changeset
     5
import * as fs from 'fs';
65968
44e703278dfd clarified modules;
wenzelm
parents: 65958
diff changeset
     6
import * as library from './library'
65094
386d9d487f62 support for decorations;
wenzelm
parents: 64874
diff changeset
     7
import * as decorations from './decorations';
65958
6338355b2a88 basic setup for document preview;
wenzelm
parents: 65233
diff changeset
     8
import * as preview from './preview';
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
     9
import * as protocol from './protocol';
65165
d98ede9e5917 updated to vscode-languageclient 3.0;
wenzelm
parents: 65153
diff changeset
    10
import { LanguageClient, LanguageClientOptions, SettingMonitor, ServerOptions, TransportKind, NotificationType }
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    11
  from 'vscode-languageclient';
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    12
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    13
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    14
let last_caret_update: protocol.Caret_Update = {}
65180
b5a8f27a4980 tuned signature;
wenzelm
parents: 65172
diff changeset
    15
65969
1f93eb5c3d77 tuned imports;
wenzelm
parents: 65968
diff changeset
    16
export function activate(context: ExtensionContext)
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    17
{
65968
44e703278dfd clarified modules;
wenzelm
parents: 65958
diff changeset
    18
  const isabelle_home = library.get_configuration<string>("home")
44e703278dfd clarified modules;
wenzelm
parents: 65958
diff changeset
    19
  const isabelle_args = library.get_configuration<Array<string>>("args")
44e703278dfd clarified modules;
wenzelm
parents: 65958
diff changeset
    20
  const cygwin_root = library.get_configuration<string>("cygwin_root")
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    21
65182
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
    22
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
    23
  /* server */
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
    24
65172
365e97f009ed default cygwin_root from Isabelle distribution;
wenzelm
parents: 65171
diff changeset
    25
  if (isabelle_home === "")
65969
1f93eb5c3d77 tuned imports;
wenzelm
parents: 65968
diff changeset
    26
    window.showErrorMessage("Missing user settings: isabelle.home")
64753
79ed396709e4 more robust startup;
wenzelm
parents: 64750
diff changeset
    27
  else {
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65167
diff changeset
    28
    const isabelle_tool = isabelle_home + "/bin/isabelle"
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65167
diff changeset
    29
    const standard_args = ["-o", "vscode_unicode_symbols", "-o", "vscode_pide_extensions"]
65167
wenzelm
parents: 65165
diff changeset
    30
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65167
diff changeset
    31
    const server_options: ServerOptions =
65970
05e317e291a8 clarified modules;
wenzelm
parents: 65969
diff changeset
    32
      library.platform_is_windows() ?
65172
365e97f009ed default cygwin_root from Isabelle distribution;
wenzelm
parents: 65171
diff changeset
    33
        { command:
365e97f009ed default cygwin_root from Isabelle distribution;
wenzelm
parents: 65171
diff changeset
    34
            (cygwin_root === "" ? path.join(isabelle_home, "contrib", "cygwin") : cygwin_root) +
365e97f009ed default cygwin_root from Isabelle distribution;
wenzelm
parents: 65171
diff changeset
    35
            "/bin/bash",
64874
e13ff666af96 enable vscode_unicode_symbols by default, despite asymmetry of input and output;
wenzelm
parents: 64833
diff changeset
    36
          args: ["-l", isabelle_tool, "vscode_server"].concat(standard_args, isabelle_args) } :
64755
ceb81f4928ea support for Windows;
wenzelm
parents: 64753
diff changeset
    37
        { command: isabelle_tool,
64874
e13ff666af96 enable vscode_unicode_symbols by default, despite asymmetry of input and output;
wenzelm
parents: 64833
diff changeset
    38
          args: ["vscode_server"].concat(standard_args, isabelle_args) };
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65167
diff changeset
    39
    const client_options: LanguageClientOptions = {
64833
0f410e3b1d20 support for bibtex entries;
wenzelm
parents: 64756
diff changeset
    40
      documentSelector: ["isabelle", "isabelle-ml", "bibtex"]
64753
79ed396709e4 more robust startup;
wenzelm
parents: 64750
diff changeset
    41
    };
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
    42
65168
9eabc312a2a2 prefer immutable bindings;
wenzelm
parents: 65167
diff changeset
    43
    const client = new LanguageClient("Isabelle", server_options, client_options, false)
65094
386d9d487f62 support for decorations;
wenzelm
parents: 64874
diff changeset
    44
65182
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
    45
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    46
    /* decorations */
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    47
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    48
    decorations.init(context)
65975
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    49
    context.subscriptions.push(
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    50
      workspace.onDidChangeConfiguration(() => decorations.init(context)),
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    51
      workspace.onDidChangeTextDocument(event => decorations.touch_document(event.document)),
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    52
      window.onDidChangeActiveTextEditor(decorations.update_editor),
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    53
      workspace.onDidCloseTextDocument(decorations.close_document))
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    54
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    55
    client.onReady().then(() =>
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    56
      client.onNotification(protocol.decoration_type, decorations.apply_decoration))
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    57
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    58
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    59
    /* caret handling and dynamic output */
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    60
65969
1f93eb5c3d77 tuned imports;
wenzelm
parents: 65968
diff changeset
    61
    const dynamic_output = window.createOutputChannel("Isabelle Output")
65191
4c9c83311cad dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents: 65189
diff changeset
    62
    context.subscriptions.push(dynamic_output)
4c9c83311cad dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents: 65189
diff changeset
    63
    dynamic_output.show(true)
4c9c83311cad dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents: 65189
diff changeset
    64
    dynamic_output.hide()
4c9c83311cad dynamic output, depending on caret focus (see also Tools/jEdit/src/output_dockable.scala);
wenzelm
parents: 65189
diff changeset
    65
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    66
    function update_caret()
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    67
    {
65969
1f93eb5c3d77 tuned imports;
wenzelm
parents: 65968
diff changeset
    68
      const editor = window.activeTextEditor
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    69
      let caret_update: protocol.Caret_Update = {}
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    70
      if (editor) {
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    71
        const uri = editor.document.uri
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    72
        const cursor = editor.selection.active
65972
9f6a154c6ca0 clarified modules;
wenzelm
parents: 65970
diff changeset
    73
        if (library.is_file(uri) && cursor)
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    74
          caret_update = { uri: uri.toString(), line: cursor.line, character: cursor.character }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    75
      }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    76
      if (last_caret_update !== caret_update) {
65202
187277b77d50 suppress vacuous messages;
wenzelm
parents: 65201
diff changeset
    77
        if (caret_update.uri)
187277b77d50 suppress vacuous messages;
wenzelm
parents: 65201
diff changeset
    78
          client.sendNotification(protocol.caret_update_type, caret_update)
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    79
        last_caret_update = caret_update
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    80
      }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    81
    }
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    82
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    83
    client.onReady().then(() =>
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    84
    {
65201
2d01b30e6ac6 clarified modules;
wenzelm
parents: 65200
diff changeset
    85
      client.onNotification(protocol.dynamic_output_type,
65200
1227a68fac7a more explicit message type: allows body to become empty;
wenzelm
parents: 65191
diff changeset
    86
        params => { dynamic_output.clear(); dynamic_output.appendLine(params.body) })
65975
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    87
      context.subscriptions.push(
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    88
        window.onDidChangeActiveTextEditor(_ => update_caret()),
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    89
        window.onDidChangeTextEditorSelection(_ => update_caret()))
65189
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    90
      update_caret()
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    91
    })
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    92
41d2452845fc support for caret handling and dynamic output;
wenzelm
parents: 65186
diff changeset
    93
65958
6338355b2a88 basic setup for document preview;
wenzelm
parents: 65233
diff changeset
    94
    /* preview */
6338355b2a88 basic setup for document preview;
wenzelm
parents: 65233
diff changeset
    95
6338355b2a88 basic setup for document preview;
wenzelm
parents: 65233
diff changeset
    96
    preview.init(context)
65975
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    97
    context.subscriptions.push(
f20739a63a44 more careful treatment of context.subscriptions;
wenzelm
parents: 65974
diff changeset
    98
      workspace.onDidChangeTextDocument(event => preview.touch_document(event.document)))
65958
6338355b2a88 basic setup for document preview;
wenzelm
parents: 65233
diff changeset
    99
6338355b2a88 basic setup for document preview;
wenzelm
parents: 65233
diff changeset
   100
65182
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
   101
    /* start server */
973b7669e7d9 proper Map operations;
wenzelm
parents: 65180
diff changeset
   102
65094
386d9d487f62 support for decorations;
wenzelm
parents: 64874
diff changeset
   103
    context.subscriptions.push(client.start());
386d9d487f62 support for decorations;
wenzelm
parents: 64874
diff changeset
   104
  }
64605
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   105
}
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   106
9c1173a7e4cb basic support for VSCode Language Server protocol;
wenzelm
parents:
diff changeset
   107
export function deactivate() { }