merged, with minor edits: Admin/PLATFORMS, CONTRIBUTORS;
authorwenzelm
Sun, 24 Jan 2021 19:34:37 +0100
changeset 73183 ebf7babc05ce
parent 73142 0398f18ec76c (current diff)
parent 73182 a8a8bc42d552 (diff)
child 73184 a5998396051e
merged, with minor edits: Admin/PLATFORMS, CONTRIBUTORS;
Admin/PLATFORMS
CONTRIBUTORS
src/Pure/Admin/build_history.scala
src/Pure/Admin/isabelle_cronjob.scala
--- a/.hgtags	Thu Jan 21 18:18:19 2021 +0100
+++ b/.hgtags	Sun Jan 24 19:34:37 2021 +0100
@@ -40,3 +40,4 @@
 21ff9c1a464494b3a61c3538650664cc1b42c0cb Isabelle2021-RC0
 d4b67dc6f4ebd5f0fbd4ed1cccd0cc32c344d122 Isabelle2021-RC1
 802647edfe7be4478ca47a6e54e4d73733347e02 Isabelle2021-RC2
+02422c9add5e1c608290e48f3f0815c93ab00c1d Isabelle2021-RC3
--- a/ANNOUNCE	Thu Jan 21 18:18:19 2021 +0100
+++ b/ANNOUNCE	Sun Jan 24 19:34:37 2021 +0100
@@ -12,7 +12,7 @@
 
 * Isabelle/jEdit: improved monitoring of Java and ML process.
 
-* Isabelle/jEdit: look-and-feel and IDE feedback improvements.
+* Isabelle/jEdit: improved look-and-feel and IDE feedback.
 
 * Pure: improved handling of named contexts and local syntax bundles.
 
@@ -28,7 +28,7 @@
 
 * System: support for Isabelle/Scala services defined in user-space.
 
-* Experimental support for ARM64 platform on Linux and macOS (Apple Silicon).
+* Partial support for ARM64 platform on Linux and macOS (Apple Silicon).
 
 
 You may get Isabelle2021 from the following mirror sites:
--- a/Admin/components/components.sha1	Thu Jan 21 18:18:19 2021 +0100
+++ b/Admin/components/components.sha1	Sun Jan 24 19:34:37 2021 +0100
@@ -82,6 +82,7 @@
 ae7ee5becb26512f18c609e83b34612918bae5f0  exec_process-1.0.tar.gz
 7a4b46752aa60c1ee6c53a2c128dedc8255a4568  flatlaf-0.46-1.tar.gz
 ed5cbc216389b655dac21a19e770a02a96867b85  flatlaf-0.46.tar.gz
+d37b38b9a27a6541c644e22eeebe9a339282173d  flatlaf-1.0-rc1.tar.gz
 683acd94761ef460cca1a628f650355370de5afb  hol-light-bundle-0.5-126.tar.gz
 20b53cfc3ffc5b15c1eabc91846915b49b4c0367  isabelle_fonts-20151021.tar.gz
 736844204b2ef83974cd9f0a215738b767958c41  isabelle_fonts-20151104.tar.gz
@@ -209,6 +210,9 @@
 ad5d0e640ce3609a885cecab645389a2204e03bb  macos_app-20150916.tar.gz
 400af57ec5cd51f96928d9de00d077524a6fe316  macos_app-20181205.tar.gz
 3bc42b8e22f0be5ec5614f1914066164c83498f8  macos_app-20181208.tar.gz
+0fbc826e4fcb95bb9e1814642f7fce788e7fe1c3  naproche-20210122-1.tar.gz
+eda10c62da927a842c0a8881f726eac85e1cb4f7  naproche-20210122.tar.gz
+edcb517b7578db4eec1b6573b624f291776e11f6  naproche-20210124.tar.gz
 26df569cee9c2fd91b9ac06714afd43f3b37a1dd  nunchaku-0.3.tar.gz
 e573f2cbb57eb7b813ed5908753cfe2cb41033ca  nunchaku-0.5.tar.gz
 fe57793aca175336deea4f5e9c0d949a197850ac  opam-1.2.2.tar.gz
--- a/Admin/components/main	Thu Jan 21 18:18:19 2021 +0100
+++ b/Admin/components/main	Sun Jan 24 19:34:37 2021 +0100
@@ -4,7 +4,7 @@
 csdp-6.1.1
 cvc4-1.8
 e-2.5-1
-flatlaf-0.46-1
+flatlaf-1.0-rc1
 isabelle_fonts-20190717
 jdk-15.0.1+9
 jedit_build-20201223
--- a/NEWS	Thu Jan 21 18:18:19 2021 +0100
+++ b/NEWS	Sun Jan 24 19:34:37 2021 +0100
@@ -4,11 +4,6 @@
 (Note: Isabelle/jEdit shows a tree-view of the NEWS file in Sidekick.)
 
 
-New in this Isabelle version
-----------------------------
-
-
-
 New in Isabelle2021 (February 2021)
 -----------------------------------
 
@@ -62,12 +57,16 @@
 * Update to jedit-5.6.0, the latest release. This version works properly
 on macOS by default, without the special MacOSX plugin.
 
-* On macOS Big Sur full-screen mode works requires to change "System
-Preferences / General / Prefer tabs: in full screen" to never.
-
 * Action "full-screen-mode" (shortcut F11 or S+F11) has been modified
 for better approximate window size on macOS and Linux/X11.
 
+* Improved GUI support for macOS 11.1 Big Sur: native fullscreen mode,
+but non-native look-and-feel (FlatLaf).
+
+* IDE support for Naproche-SAD: Proof Checking of Natural Mathematical
+Documents. See also $NAPROCHE_HOME/examples for files with .ftl or
+.ftl.tex extension.
+
 
 *** Document preparation ***
 
@@ -293,6 +292,10 @@
 (for DVI documents) has been discontinued. Former option -n has been
 turned into -o with explicit file name. Minor INCOMPATIBILITY.
 
+* The command-line tool "isabelle components" supports new options -u
+and -x to manage $ISABELLE_HOME_USER/etc/components without manual
+editing of Isabelle configuration files.
+
 * The shell function "isabelle_directory" (within etc/settings of
 components) augments the list of special directories for persistent
 symbolic path names. This improves portability of heap images and
@@ -364,6 +367,10 @@
 * Experimental support for arm64-linux platform. The reference platform
 is Raspberry Pi 4 with 8 GB RAM running Pi OS (64 bit).
 
+* Partial support for arm64-darwin (Apple Silicon): most x86_64
+executables work well with runtime translation by Rosetta, but
+occasional problems remain (e.g. external provers).
+
 
 
 New in Isabelle2020 (April 2020)
--- a/etc/settings	Thu Jan 21 18:18:19 2021 +0100
+++ b/etc/settings	Sun Jan 24 19:34:37 2021 +0100
@@ -159,7 +159,7 @@
 
 ISABELLE_STACK_ROOT="$USER_HOME/.stack"
 
-ISABELLE_STACK_RESOLVER="lts-16.12"
+ISABELLE_STACK_RESOLVER="lts-16.31"
 
 ISABELLE_GHC_VERSION="ghc-8.8.4"
 
--- a/lib/Tools/components	Thu Jan 21 18:18:19 2021 +0100
+++ b/lib/Tools/components	Sun Jan 24 19:34:37 2021 +0100
@@ -19,11 +19,15 @@
   echo "    -R URL       component repository (default \$ISABELLE_COMPONENT_REPOSITORY)"
   echo "    -a           resolve all missing components"
   echo "    -l           list status"
+  echo "    -u DIR       update \$ISABELLE_HOME_USER/components: add directory"
+  echo "    -x DIR       update \$ISABELLE_HOME_USER/components: remove directory"
   echo
-  echo "  Resolve Isabelle components via download and installation."
-  echo "  COMPONENTS are identified via base name."
+  echo "  Resolve Isabelle components via download and installation: given COMPONENTS"
+  echo "  are identified via base name. Further operations manage etc/settings and"
+  echo "  etc/components in \$ISABELLE_HOME_USER."
   echo
   echo "  ISABELLE_COMPONENT_REPOSITORY=\"$ISABELLE_COMPONENT_REPOSITORY\""
+  echo "  ISABELLE_HOME_USER=\"$ISABELLE_HOME_USER\""
   echo
   exit 1
 }
@@ -43,8 +47,9 @@
 COMPONENT_REPOSITORY="$ISABELLE_COMPONENT_REPOSITORY"
 ALL_MISSING=""
 LIST_ONLY=""
+declare -a UPDATE_COMPONENTS=()
 
-while getopts "IR:al" OPT
+while getopts "IR:alu:x:" OPT
 do
   case "$OPT" in
     I)
@@ -59,6 +64,12 @@
     l)
       LIST_ONLY="true"
       ;;
+    u)
+      UPDATE_COMPONENTS["${#UPDATE_COMPONENTS[@]}"]="+$OPTARG"
+      ;;
+    x)
+      UPDATE_COMPONENTS["${#UPDATE_COMPONENTS[@]}"]="-$OPTARG"
+      ;;
     \?)
       usage
       ;;
@@ -70,7 +81,7 @@
 
 # args
 
-[ "$#" -eq 0 -a -z "$INIT_SETTINGS" -a -z "$ALL_MISSING" -a -z "$LIST_ONLY" ] && usage
+[ "$#" -eq 0 -a -z "$INIT_SETTINGS" -a -z "$ALL_MISSING" -a -z "$LIST_ONLY" -a "${#UPDATE_COMPONENTS[@]}" -eq 0 ] && usage
 
 if [ -z "$ALL_MISSING" ]; then
   splitarray ":" "$@"
@@ -112,6 +123,9 @@
   echo
   echo "Missing components:"
   for NAME in "${MISSING_COMPONENTS[@]}"; do echo "  $NAME"; done
+elif [ "${#UPDATE_COMPONENTS[@]}" -ne 0 ]; then
+  isabelle_admin_build jars || exit $?
+  exec isabelle java isabelle.Components "${UPDATE_COMPONENTS[@]}"
 else
   for NAME in "${SELECTED_COMPONENTS[@]}"
   do
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/scripts/java-gui-setup	Sun Jan 24 19:34:37 2021 +0100
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+#
+# java-gui-setup --- platform-specific setup for Java/Swing GUI applications
+
+if [ "$ISABELLE_PLATFORM_FAMILY" = "macos" ]
+then
+  JAVA_VERSION="$("$ISABELLE_JDK_HOME/bin/java" -version 2>&1 | head -n 1 | cut -d '"' -f2)"
+  JAVA_DOMAIN="com.azul.zulu.${JAVA_VERSION}.java"
+  defaults read "$JAVA_DOMAIN" AppleWindowTabbingMode >/dev/null 2>/dev/null ||
+    defaults write "$JAVA_DOMAIN" AppleWindowTabbingMode manual >/dev/null 2>/dev/null
+fi
--- a/src/Doc/JEdit/JEdit.thy	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Doc/JEdit/JEdit.thy	Sun Jan 24 19:34:37 2021 +0100
@@ -73,11 +73,11 @@
   \end{figure}
 
   Isabelle/jEdit (\figref{fig:isabelle-jedit}) consists of some plugins for
-  the jEdit text editor, while preserving its general look-and-feel as far as
-  possible. The main plugin is called ``Isabelle'' and has its own menu
-  \<^emph>\<open>Plugins~/ Isabelle\<close> with access to several actions and add-on panels (see
-  also \secref{sec:dockables}), as well as \<^emph>\<open>Plugins~/ Plugin Options~/
-  Isabelle\<close> (see also \secref{sec:options}).
+  the jEdit text editor, while preserving its overall look-and-feel. The main
+  plugin is called ``Isabelle'' and has its own menu \<^emph>\<open>Plugins~/ Isabelle\<close>
+  with access to several actions and add-on panels (see also
+  \secref{sec:dockables}), as well as \<^emph>\<open>Plugins~/ Plugin Options~/ Isabelle\<close>
+  (see also \secref{sec:options}).
 
   The options allow to specify a logic session name, but the same selector is
   also accessible in the \<^emph>\<open>Theories\<close> panel (\secref{sec:theories}). After
@@ -305,7 +305,7 @@
 
   The \<^verbatim>\<open>-n\<close> option reports the server name, and the \<^verbatim>\<open>-s\<close> option provides a
   different server name. The default server name is the official distribution
-  name (e.g.\ \<^verbatim>\<open>Isabelle2020\<close>). Thus @{tool jedit_client} can connect to the
+  name (e.g.\ \<^verbatim>\<open>Isabelle2021\<close>). Thus @{tool jedit_client} can connect to the
   Isabelle desktop application without further options.
 
   The \<^verbatim>\<open>-p\<close> option allows to override the implicit default of the system
@@ -320,56 +320,54 @@
 
 section \<open>GUI rendering\<close>
 
-subsection \<open>Look-and-feel \label{sec:look-and-feel}\<close>
+text \<open>
+  Isabelle/jEdit is a classic Java/AWT/Swing application: its GUI rendering
+  usually works well, but there are technical side-conditions on the Java
+  window system and graphics engine. When researching problems and solutions
+  on the Web, it often helps to include other well-known Swing applications,
+  notably IntelliJ IDEA and Netbeans.
+\<close>
+
+
+subsection \<open>Portable and scalable look-and-feel\<close>
 
 text \<open>
-  jEdit is a Java/AWT/Swing application with the ambition to support
-  ``native'' look-and-feel on all platforms, within the limits of what Java
-  provider and major operating systems allow (see also \secref{sec:problems}).
-
-  Isabelle/jEdit enables platform-specific look-and-feel by default as
-  follows.
-
-    \<^descr>[Linux:] The platform-independent \<^emph>\<open>Metal\<close> is used by default.
-
-    The Linux-specific \<^emph>\<open>GTK+\<close> look-and-feel often works, but the overall GTK
-    theme and options need to be selected to suite Java/AWT/Swing. Note that
-    the Java Virtual Machine has no direct influence of GTK rendering: it
-    happens within external C libraries.
-
-    \<^descr>[Windows:] Regular \<^emph>\<open>Windows\<close> look-and-feel is used by default.
-
-    \<^descr>[macOS:] Regular \<^emph>\<open>Mac OS X\<close> look-and-feel is used by default.
-
-  Users may experiment with different Swing look-and-feels, but need to keep
-  in mind that this extra variance of GUI functionality often causes problems.
-  The platform-independent \<^emph>\<open>Metal\<close> look-and-feel should work smoothly on all
-  platforms, although its is technically and stylistically outdated.
-
-  Changing the look-and-feel in \<^emph>\<open>Global Options~/ Appearance\<close> may update the
-  GUI only partially: a proper restart of Isabelle/jEdit is usually required.
+  In the past, \<^emph>\<open>system look-and-feels\<close> tried hard to imitate native GUI
+  elements on specific platforms (Windows, macOS/Aqua, Linux/GTK+), but many
+  technical problems have accumulated in recent years (e.g.\ see
+  \secref{sec:problems}).
+
+  In 2021, we are de-facto back to \<^emph>\<open>portable look-and-feels\<close>, which also
+  happen to be \emph{scalable} on high-resolution displays:
+
+    \<^item> \<^verbatim>\<open>FlatLaf Light\<close> is the default for Isabelle/jEdit on all platforms. It
+    generally looks good and adapts itself pretty well to high-resolution
+    displays.
+
+    \<^item> \<^verbatim>\<open>FlatLaf Dark\<close> is an alternative, but it requires further changes of
+    editor colors by the user (or by the jEdit plugin \<^verbatim>\<open>Editor Scheme\<close>). Also
+    note that Isabelle/PIDE has its own extensive set of rendering options
+    that need to be revisited.
+
+    \<^item> \<^verbatim>\<open>Metal\<close> still works smoothly, although it is stylistically outdated. It
+    can accommodate high-resolution displays via font properties (see below).
+
+  Changing the look-and-feel in \<^emph>\<open>Global Options~/ Appearance\<close> often updates
+  the GUI only partially: a full restart of Isabelle/jEdit is required to see
+  the true effect.
 \<close>
 
 
-subsection \<open>Displays with high resolution \label{sec:hdpi}\<close>
+subsection \<open>Adjusting fonts\<close>
 
 text \<open>
-  In 2020, we usually see displays with high resolution like ``Ultra HD'' /
-  ``4K'' at $3840 \times 2160$, or more. Old ``Full HD'' displays at $1920
-  \times 1080$ pixels are still being used, but Java 11 font-rendering might
-  look bad on it. GUI layouts are lagging behind the high resolution trends,
-  and implicitly assume very old-fashioned $1024 \times 768$ or $1280 \times
-  1024$ screens and fonts with 12 or 14 pixels. Java and jEdit do provide
-  reasonable support for high resolution, but this requires manual
-  adjustments as described below.
-
-  \<^medskip> The \<^bold>\<open>operating-system\<close> often provides some configuration for global
-  scaling of text fonts, e.g.\ to enlarge it uniformly by $200\%$. This
-  impacts regular GUI elements, when used with native look-and-feel: Linux
-  \<^emph>\<open>GTK+\<close>, \<^emph>\<open>Windows\<close>, \<^emph>\<open>Mac OS X\<close>, respectively. Alternatively, it is
-  possible to use the platform-independent \<^emph>\<open>Metal\<close> look-and-feel and change
-  its main font sizes via jEdit options explained below. The Isabelle/jEdit
-  \<^bold>\<open>application\<close> provides further options to adjust font sizes in particular
+  The preferred font family for Isabelle/jEdit is \<^verbatim>\<open>Isabelle DejaVu\<close>: it is
+  used by default for the main text area and various GUI elements. The default
+  font sizes attempt to deliver a usable application for common display types,
+  such as ``Full HD'' at $1920 \times 1080$ and ``Ultra HD'' at $3840 \times
+  2160$.
+
+  \<^medskip> Isabelle/jEdit provides various options to adjust font sizes in particular
   GUI elements. Here is a summary of all relevant font properties:
 
     \<^item> \<^emph>\<open>Global Options / Text Area / Text font\<close>: the main text area font,
@@ -383,7 +381,7 @@
 
     \<^item> \<^emph>\<open>Global Options / Appearance / Button, menu and label font\<close> as well as
     \<^emph>\<open>List and text field font\<close>: this specifies the primary and secondary font
-    for the \<^emph>\<open>Metal\<close> look-and-feel (\secref{sec:look-and-feel}).
+    for the \<^emph>\<open>Metal\<close> look-and-feel.
 
     \<^item> \<^emph>\<open>Plugin Options / Isabelle / General / Reset Font Size\<close>: the main text
     area font size for action @{action_ref "isabelle.reset-font-size"}, e.g.\
@@ -391,19 +389,6 @@
 
     \<^item> \<^emph>\<open>Plugin Options / Console / General / Font\<close>: the console window font,
     e.g.\ relevant for Isabelle/Scala command-line.
-
-  In \figref{fig:isabelle-jedit-hdpi} the \<^emph>\<open>Metal\<close> look-and-feel is configured
-  with custom fonts at 36 pixels, and the main text area and console at 40
-  pixels. This leads to fairly good rendering quality, despite the
-  old-fashioned appearance of \<^emph>\<open>Metal\<close>.
-
-  \begin{sidewaysfigure}[!htb]
-  \begin{center}
-  \includegraphics[width=\textwidth]{isabelle-jedit-hdpi}
-  \end{center}
-  \caption{Metal look-and-feel with custom fonts for high resolution}
-  \label{fig:isabelle-jedit-hdpi}
-  \end{sidewaysfigure}
 \<close>
 
 
@@ -715,10 +700,9 @@
 subsection \<open>PIDE resources via virtual file-systems\<close>
 
 text \<open>
-  The jEdit file browser is docked by default, e.g. see
-  \figref{fig:isabelle-jedit-hdpi} (left docking area). It provides immediate
-  access to the local file-system, as well as important Isabelle resources via
-  the \<^emph>\<open>Favorites\<close> menu. Environment variables like \<^verbatim>\<open>$ISABELLE_HOME\<close> are
+  The jEdit file browser is docked by default. It provides immediate access to
+  the local file-system, as well as important Isabelle resources via the
+  \<^emph>\<open>Favorites\<close> menu. Environment variables like \<^verbatim>\<open>$ISABELLE_HOME\<close> are
   discussed in \secref{sec:local-files}. Virtual file-systems are more
   special: the idea is to present structured information like a directory
   tree. The following URLs are offered in the \<^emph>\<open>Favorites\<close> menu, or by
@@ -2188,13 +2172,6 @@
   \<^bold>\<open>Workaround:\<close> Rebind key via \<^emph>\<open>Global Options~/ Shortcuts\<close> according to the
   national keyboard layout, e.g.\ \<^verbatim>\<open>COMMAND+SLASH\<close> on English ones.
 
-  \<^item> \<^bold>\<open>Problem:\<close> On macOS Big Sur full-screen mode causes problems with dialog windows
-  (e.g. \<^emph>\<open>Search and Replace\<close> or \<^emph>\<open>Hypersearch Results\<close>).
-
-  \<^bold>\<open>Workaround:\<close> Go to \<^emph>\<open>System Preferences / General\<close> and change the default
-  ``\<^emph>\<open>Prefer tabs: \<^bold>\<open>in full screen\<close> when opening documents\<close>'' to
-  ``\<^emph>\<open>\<^bold>\<open>never\<close>\<close>''.
-
   \<^item> \<^bold>\<open>Problem:\<close> On macOS with native Apple look-and-feel, some exotic
   national keyboards may cause a conflict of menu accelerator keys with
   regular jEdit key bindings. This leads to duplicate execution of the
@@ -2255,15 +2232,7 @@
   For the latter platforms, it is approximated by educated guesses on the
   window size (excluding the macOS menu bar).
 
-  \<^bold>\<open>Workaround:\<close> Use native full-screen control of the macOS window manager,
-  unless it is macOS 11.1 (Big Sur).
-
-  \<^item> \<^bold>\<open>Problem:\<close> Native full-screen mode on macOS 11.1 is incompatible with
-  Java window management: it puts dialog windows (Search, Hypersearch, etc.)
-  into an unusable state.
-
-  \<^bold>\<open>Workaround:\<close> use the approximative action @{action_ref
-  "toggle-full-screen"}.
+  \<^bold>\<open>Workaround:\<close> Use native full-screen control of the macOS window manager.
 
   \<^item> \<^bold>\<open>Problem:\<close> Heap space of the JVM may fill up and render the Prover IDE
   unresponsive, e.g.\ when editing big Isabelle sessions with many theories.
Binary file src/Doc/JEdit/document/auto-tools.png has changed
Binary file src/Doc/JEdit/document/bibtex-mode.png has changed
Binary file src/Doc/JEdit/document/cite-completion.png has changed
Binary file src/Doc/JEdit/document/isabelle-jedit-hdpi.png has changed
Binary file src/Doc/JEdit/document/isabelle-jedit.png has changed
Binary file src/Doc/JEdit/document/markdown-document.png has changed
Binary file src/Doc/JEdit/document/ml-debugger.png has changed
Binary file src/Doc/JEdit/document/output-and-state.png has changed
Binary file src/Doc/JEdit/document/output-including-state.png has changed
Binary file src/Doc/JEdit/document/output.png has changed
Binary file src/Doc/JEdit/document/popup1.png has changed
Binary file src/Doc/JEdit/document/popup2.png has changed
Binary file src/Doc/JEdit/document/query.png has changed
Binary file src/Doc/JEdit/document/scope1.png has changed
Binary file src/Doc/JEdit/document/scope2.png has changed
Binary file src/Doc/JEdit/document/sidekick-document.png has changed
Binary file src/Doc/JEdit/document/sidekick.png has changed
Binary file src/Doc/JEdit/document/sledgehammer.png has changed
Binary file src/Doc/JEdit/document/theories.png has changed
--- a/src/Doc/ROOT	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Doc/ROOT	Sun Jan 24 19:34:37 2021 +0100
@@ -229,7 +229,6 @@
     "bibtex-mode.png"
     "build"
     "cite-completion.png"
-    "isabelle-jedit-hdpi.png"
     "isabelle-jedit.png"
     "markdown-document.png"
     "ml-debugger.png"
--- a/src/Doc/System/Environment.thy	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Doc/System/Environment.thy	Sun Jan 24 19:34:37 2021 +0100
@@ -58,7 +58,7 @@
     \<^enum> The file \<^path>\<open>$ISABELLE_HOME_USER/etc/settings\<close> (if it
     exists) is run in the same way as the site default settings. Note that the
     variable @{setting ISABELLE_HOME_USER} has already been set before ---
-    usually to something like \<^verbatim>\<open>$USER_HOME/.isabelle/Isabelle2020\<close>.
+    usually to something like \<^verbatim>\<open>$USER_HOME/.isabelle/Isabelle2021\<close>.
 
     Thus individual users may override the site-wide defaults. Typically, a
     user settings file contains only a few lines, with some assignments that
@@ -148,7 +148,7 @@
   of the @{executable isabelle} executable.
 
   \<^descr>[@{setting_def ISABELLE_IDENTIFIER}\<open>\<^sup>*\<close>] refers to the name of this
-  Isabelle distribution, e.g.\ ``\<^verbatim>\<open>Isabelle2020\<close>''.
+  Isabelle distribution, e.g.\ ``\<^verbatim>\<open>Isabelle2021\<close>''.
 
   \<^descr>[@{setting_def ML_SYSTEM}, @{setting_def ML_HOME}, @{setting_def
   ML_OPTIONS}, @{setting_def ML_PLATFORM}, @{setting_def ML_IDENTIFIER}\<open>\<^sup>*\<close>]
--- a/src/Doc/System/Misc.thy	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Doc/System/Misc.thy	Sun Jan 24 19:34:37 2021 +0100
@@ -71,7 +71,7 @@
   Isabelle installation: it needs to be a suitable version of Ubuntu Linux.
   The default \<^verbatim>\<open>ubuntu\<close> refers to the latest LTS version provided by Canonical
   as the official Ubuntu vendor\<^footnote>\<open>\<^url>\<open>https://hub.docker.com/_/ubuntu\<close>\<close>. For
-  Isabelle2020 this should be Ubuntu 18.04 LTS.
+  Isabelle2021 this should be Ubuntu 20.04 LTS.
 
   Option \<^verbatim>\<open>-p\<close> includes additional Ubuntu packages, using the terminology
   of \<^verbatim>\<open>apt-get install\<close> within the underlying Linux distribution.
@@ -98,45 +98,49 @@
   Produce a Dockerfile (without image) from a remote Isabelle distribution:
   @{verbatim [display]
 \<open>  isabelle build_docker -E -n -o Dockerfile
-    https://isabelle.in.tum.de/website-Isabelle2020/dist/Isabelle2020_linux.tar.gz\<close>}
+    https://isabelle.in.tum.de/website-Isabelle2021/dist/Isabelle2021_linux.tar.gz\<close>}
 
   Build a standard Isabelle Docker image from a local Isabelle distribution,
   with \<^verbatim>\<open>bin/isabelle\<close> as executable entry point:
 
   @{verbatim [display]
-\<open>  isabelle build_docker -E -t test/isabelle:Isabelle2020 Isabelle2020_linux.tar.gz\<close>}
+\<open>  isabelle build_docker -E -t test/isabelle:Isabelle2021 Isabelle2021_linux.tar.gz\<close>}
 
   Invoke the raw Isabelle/ML process within that image:
   @{verbatim [display]
-\<open>  docker run test/isabelle:Isabelle2020 process -e "Session.welcome ()"\<close>}
+\<open>  docker run test/isabelle:Isabelle2021 process -e "Session.welcome ()"\<close>}
 
   Invoke a Linux command-line tool within the contained Isabelle system
   environment:
   @{verbatim [display]
-\<open>  docker run test/isabelle:Isabelle2020 env uname -a\<close>}
+\<open>  docker run test/isabelle:Isabelle2021 env uname -a\<close>}
   The latter should always report a Linux operating system, even when running
   on Windows or macOS.
 \<close>
 
 
-section \<open>Resolving Isabelle components \label{sec:tool-components}\<close>
+section \<open>Managing Isabelle components \label{sec:tool-components}\<close>
 
 text \<open>
-  The @{tool_def components} tool resolves Isabelle components:
+  The @{tool_def components} tool manages Isabelle components:
   @{verbatim [display]
 \<open>Usage: isabelle components [OPTIONS] [COMPONENTS ...]
 
   Options are:
     -I           init user settings
-    -R URL       component repository
-                 (default $ISABELLE_COMPONENT_REPOSITORY)
+    -R URL       component repository (default $ISABELLE_COMPONENT_REPOSITORY)
     -a           resolve all missing components
     -l           list status
+    -u DIR       update $ISABELLE_HOME_USER/components: add directory
+    -x DIR       update $ISABELLE_HOME_USER/components: remove directory
 
-  Resolve Isabelle components via download and installation.
-  COMPONENTS are identified via base name.
+  Resolve Isabelle components via download and installation: given COMPONENTS
+  are identified via base name. Further operations manage etc/settings and
+  etc/components in $ISABELLE_HOME_USER.
 
-  ISABELLE_COMPONENT_REPOSITORY="https://isabelle.in.tum.de/components"\<close>}
+  ISABELLE_COMPONENT_REPOSITORY="..."
+  ISABELLE_HOME_USER="..."
+\<close>}
 
   Components are initialized as described in \secref{sec:components} in a
   permissive manner, which can mark components as ``missing''. This state is
@@ -153,13 +157,20 @@
   installation takes place in the location that was specified in the attempt
   to initialize the component before.
 
+  \<^medskip>
   Option \<^verbatim>\<open>-l\<close> lists the current state of available and missing components
   with their location (full name) within the file-system.
 
+  \<^medskip>
   Option \<^verbatim>\<open>-I\<close> initializes the user settings file to subscribe to the standard
   components specified in the Isabelle repository clone --- this does not make
   any sense for regular Isabelle releases. If the file already exists, it
   needs to be edited manually according to the printed explanation.
+
+  \<^medskip>
+  Options \<^verbatim>\<open>-u\<close> and \<^verbatim>\<open>-x\<close> operate on user components listed in
+  \<^path>\<open>$ISABELLE_HOME_USER/etc/components\<close>: this avoid manual editing if
+  Isabelle configuration files.
 \<close>
 
 
@@ -357,7 +368,7 @@
 
   \<^medskip>
   The default is to output the full version string of the Isabelle
-  distribution, e.g.\ ``\<^verbatim>\<open>Isabelle2020: April 2020\<close>.
+  distribution, e.g.\ ``\<^verbatim>\<open>Isabelle2021: February 2021\<close>.
 
   The \<^verbatim>\<open>-i\<close> option produces a short identification derived from the Mercurial
   id of the @{setting ISABELLE_HOME} directory.
--- a/src/HOL/Cardinals/Wellorder_Extension.thy	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/HOL/Cardinals/Wellorder_Extension.thy	Sun Jan 24 19:34:37 2021 +0100
@@ -77,8 +77,9 @@
   then have 0: "Partial_order I"
     by (auto simp: partial_order_on_def preorder_on_def antisym_def antisym_init_seg_of refl_on_def
       trans_def I_def elim: trans_init_seg_of)
-  { fix R assume "R \<in> Chains I"
-    then have Ris: "R \<in> Chains init_seg_of" using mono_Chains [OF I_init] by blast
+  have "\<Union>R \<in> ?K \<and> (\<forall>r\<in>R. (r,\<Union>R) \<in> I)" if "R \<in> Chains I" for R
+  proof -
+    from that have Ris: "R \<in> Chains init_seg_of" using mono_Chains [OF I_init] by blast
     have subch: "chain\<^sub>\<subseteq> R" using \<open>R \<in> Chains I\<close> I_init
       by (auto simp: init_seg_of_def chain_subset_def Chains_def)
     have "\<forall>r\<in>R. Refl r" and "\<forall>r\<in>R. trans r" and "\<forall>r\<in>R. antisym r" and
@@ -106,10 +107,10 @@
       by (rule downset_on_Union [OF \<open>\<And>r. r \<in> R \<Longrightarrow> downset_on (Field r) p\<close>])
     moreover have "extension_on (Field (\<Union>R)) (\<Union>R) p"
       by (rule chain_subset_extension_on_Union [OF subch \<open>\<And>r. r \<in> R \<Longrightarrow> extension_on (Field r) r p\<close>])
-    ultimately have "\<Union>R \<in> ?K \<and> (\<forall>r\<in>R. (r,\<Union>R) \<in> I)"
+    ultimately show ?thesis
       using mono_Chains [OF I_init] and \<open>R \<in> Chains I\<close>
       by (simp (no_asm) add: I_def del: Field_Union) (metis Chains_wo)
-  }
+  qed
   then have 1: "\<exists>u\<in>Field I. \<forall>r\<in>R. (r, u) \<in> I" if "R\<in>Chains I" for R 
     using that by (subst FI) blast
   txt \<open>Zorn's Lemma yields a maximal wellorder m.\<close>
@@ -196,8 +197,6 @@
     where "p \<subseteq> r" and wo: "Well_order r" and univ: "Field r = UNIV" by blast
   let ?r = "{(x, y). x \<in> A \<and> y \<in> A \<and> (x, y) \<in> r}"
   from \<open>p \<subseteq> r\<close> have "p \<subseteq> ?r" using \<open>Field p \<subseteq> A\<close> by (auto simp: Field_def)
-  have 1: "Field ?r = A" using wo univ
-    by (fastforce simp: Field_def order_on_defs refl_on_def)
   have "Refl r" "trans r" "antisym r" "Total r" "wf (r - Id)"
     using \<open>Well_order r\<close> by (simp_all add: order_on_defs)
   have "refl_on A ?r" using \<open>Refl r\<close> by (auto simp: refl_on_def univ)
--- a/src/Pure/Admin/build_history.scala	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/Admin/build_history.scala	Sun Jan 24 19:34:37 2021 +0100
@@ -7,11 +7,6 @@
 package isabelle
 
 
-import java.io.{File => JFile}
-import java.time.format.DateTimeFormatter
-import java.util.Locale
-
-
 object Build_History
 {
   /* log files */
--- a/src/Pure/Admin/build_release.scala	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/Admin/build_release.scala	Sun Jan 24 19:34:37 2021 +0100
@@ -287,6 +287,8 @@
 
 declare -a JAVA_OPTIONS=($(perl -p -e 's,#.*$,,g;' "$ISABELLE_HOME/Isabelle.options"))
 
+"$ISABELLE_HOME/lib/scripts/java-gui-setup"
+
 exec "$ISABELLE_JDK_HOME/bin/java" \
   "-Disabelle.root=$ISABELLE_HOME" "${JAVA_OPTIONS[@]}" \
   -classpath """" + classpath.map(p => "$ISABELLE_HOME/" + p.implode).mkString(":") + """" \
@@ -310,7 +312,7 @@
 <key>CFBundleIconFile</key>
 <string>isabelle.icns</string>
 <key>CFBundleIdentifier</key>
-<string>de.tum.in.isabelle.""" + isabelle_name + """</string>
+<string>de.tum.in.isabelle</string>
 <key>CFBundleDisplayName</key>
 <string>""" + isabelle_name + """</string>
 <key>CFBundleInfoDictionaryVersion</key>
@@ -320,11 +322,11 @@
 <key>CFBundlePackageType</key>
 <string>APPL</string>
 <key>CFBundleShortVersionString</key>
-<string>""" + isabelle_rev + """</string>
+<string>""" + isabelle_name + """</string>
 <key>CFBundleSignature</key>
 <string>????</string>
 <key>CFBundleVersion</key>
-<string>1</string>
+<string>""" + isabelle_rev + """</string>
 <key>NSHumanReadableCopyright</key>
 <string></string>
 <key>LSMinimumSystemVersion</key>
--- a/src/Pure/Admin/components.scala	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/Admin/components.scala	Sun Jan 24 19:34:37 2021 +0100
@@ -130,6 +130,55 @@
     File.write(components_sha1, entries.sortBy(_.file_name).mkString("", "\n", "\n"))
 
 
+  /** manage user components **/
+
+  val components_path = Path.explode("$ISABELLE_HOME_USER/etc/components")
+
+  def read_components(): List[String] =
+    if (components_path.is_file) Library.trim_split_lines(File.read(components_path))
+    else Nil
+
+  def write_components(lines: List[String]): Unit =
+  {
+    Isabelle_System.make_directory(components_path.dir)
+    File.write(components_path, Library.terminate_lines(lines))
+  }
+
+  def update_components(add: Boolean, path0: Path, progress: Progress = new Progress): Unit =
+  {
+    val path = path0.expand.absolute
+    if (!(path + Path.explode("etc/settings")).is_file &&
+        !(path + Path.explode("etc/components")).is_file) error("Bad component directory: " + path)
+
+    val lines1 = read_components()
+    val lines2 =
+      lines1.filter(line =>
+        line.isEmpty || line.startsWith("#") || !File.eq(Path.explode(line), path))
+    val lines3 = if (add) lines2 ::: List(path.implode) else lines2
+
+    if (lines1 != lines3) write_components(lines3)
+
+    val prefix = if (lines1 == lines3) "Unchanged" else if (add) "Added" else "Removed"
+    progress.echo(prefix + " component " + path)
+  }
+
+
+  /* main entry point */
+
+  def main(args: Array[String]): Unit =
+  {
+    Command_Line.tool {
+      for (arg <- args) {
+        val add =
+          if (arg.startsWith("+")) true
+          else if (arg.startsWith("-")) false
+          else error("Bad argument: " + quote(arg))
+        val path = Path.explode(arg.substring(1))
+        update_components(add, path, progress = new Console_Progress)
+      }
+    }
+  }
+
 
   /** build and publish components **/
 
--- a/src/Pure/Admin/isabelle_cronjob.scala	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/Admin/isabelle_cronjob.scala	Sun Jan 24 19:34:37 2021 +0100
@@ -10,7 +10,6 @@
 import java.nio.file.Files
 
 import scala.annotation.tailrec
-import scala.collection.mutable
 
 
 object Isabelle_Cronjob
--- a/src/Pure/General/symbol.ML	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/General/symbol.ML	Sun Jan 24 19:34:37 2021 +0100
@@ -59,6 +59,7 @@
   val is_quasi: symbol -> bool
   val is_blank: symbol -> bool
   val is_block_ctrl: symbol -> bool
+  val has_block_ctrl: symbol list -> bool
   val is_quasi_letter: symbol -> bool
   val is_letdig: symbol -> bool
   val beginning: int -> symbol list -> string
@@ -408,6 +409,7 @@
 fun is_blank s = kind s = Blank;
 
 val is_block_ctrl = member (op =) ["\<^bsub>", "\<^esub>", "\<^bsup>", "\<^esup>"];
+val has_block_ctrl = exists is_block_ctrl;
 
 fun is_quasi_letter s = let val k = kind s in k = Letter orelse k = Quasi end;
 fun is_letdig s = let val k = kind s in k = Letter orelse k = Digit orelse k = Quasi end;
--- a/src/Pure/Syntax/lexicon.ML	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/Syntax/lexicon.ML	Sun Jan 24 19:34:37 2021 +0100
@@ -40,8 +40,10 @@
   val terminals: string list
   val is_terminal: string -> bool
   val get_terminal: string -> token option
-  val literal_markup: string -> Markup.T
-  val report_of_token: token -> Position.report
+  val suppress_literal_markup: string -> bool
+  val suppress_markup: token -> bool
+  val literal_markup: string -> Markup.T list
+  val reports_of_token: token -> Position.report list
   val reported_token_range: Proof.context -> token -> string
   val valued_token: token -> bool
   val implode_string: Symbol.symbol list -> string
@@ -197,28 +199,35 @@
 
 (* markup *)
 
+val suppress_literal_markup = Symbol.has_block_ctrl o Symbol.explode;
+fun suppress_markup tok = is_literal tok andalso suppress_literal_markup (str_of_token tok);
+
 fun literal_markup s =
-  if Symbol.is_ascii_identifier s orelse exists Symbol.is_letter (Symbol.explode s)
-  then Markup.literal
-  else Markup.delimiter;
+  let val syms = Symbol.explode s in
+    if Symbol.has_block_ctrl syms then []
+    else if Symbol.is_ascii_identifier s orelse exists Symbol.is_letter syms
+    then [Markup.literal]
+    else [Markup.delimiter]
+  end;
 
 val token_kind_markup =
- fn Type_Ident => Markup.tfree
-  | Type_Var => Markup.tvar
-  | Num => Markup.numeral
-  | Float => Markup.numeral
-  | Str => Markup.inner_string
-  | String => Markup.inner_string
-  | Cartouche => Markup.inner_cartouche
-  | Comment _ => Markup.comment1
-  | _ => Markup.empty;
+ fn Type_Ident => [Markup.tfree]
+  | Type_Var => [Markup.tvar]
+  | Num => [Markup.numeral]
+  | Float => [Markup.numeral]
+  | Str => [Markup.inner_string]
+  | String => [Markup.inner_string]
+  | Cartouche => [Markup.inner_cartouche]
+  | Comment _ => [Markup.comment1]
+  | _ => [];
 
-fun report_of_token tok =
+fun reports_of_token tok =
   let
-    val markup =
+    val pos = pos_of_token tok;
+    val markups =
       if is_literal tok then literal_markup (str_of_token tok)
       else token_kind_markup (kind_of_token tok);
-  in (pos_of_token tok, markup) end;
+  in map (pair pos) markups end;
 
 fun reported_token_range ctxt tok =
   if is_proper tok
--- a/src/Pure/Syntax/printer.ML	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/Syntax/printer.ML	Sun Jan 24 19:34:37 2021 +0100
@@ -138,7 +138,7 @@
           (if Lexicon.is_terminal s then 1000 else p);
 
         fun xsyms_to_syms (Syntax_Ext.Delim s :: xsyms) =
-              apfst (cons (String (not (exists Symbol.is_block_ctrl (Symbol.explode s)), s)))
+              apfst (cons (String (not (Lexicon.suppress_literal_markup s), s)))
                 (xsyms_to_syms xsyms)
           | xsyms_to_syms (Syntax_Ext.Argument s_p :: xsyms) =
               apfst (cons (arg s_p)) (xsyms_to_syms xsyms)
@@ -232,7 +232,7 @@
             val (Ts, args') = synT m (symbs, args);
             val T =
               if do_mark
-              then Pretty.marks_str (m @ [Lexicon.literal_markup s], s)
+              then Pretty.marks_str (m @ Lexicon.literal_markup s, s)
               else Pretty.str s;
           in (T :: Ts, args') end
       | synT m (Block ({markup, consistent, unbreakable, indent}, bsymbs) :: symbs, args) =
--- a/src/Pure/Syntax/syntax_phases.ML	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/Syntax/syntax_phases.ML	Sun Jan 24 19:34:37 2021 +0100
@@ -158,6 +158,10 @@
     fun report pos = Position.store_reports reports [pos];
     val append_reports = Position.append_reports reports;
 
+    fun report_pos tok =
+      if Lexicon.suppress_markup tok then Position.none
+      else Lexicon.pos_of_token tok;
+
     fun trans a args =
       (case trf a of
         NONE => Ast.mk_appl (Ast.Constant a) args
@@ -169,7 +173,7 @@
       else [];
 
     fun ast_of_position tok =
-      Ast.Variable (Term_Position.encode (Lexicon.pos_of_token tok));
+      Ast.Variable (Term_Position.encode (report_pos tok));
 
     fun ast_of_dummy a tok =
       Ast.Appl [Ast.Constant "_constrain", Ast.Constant a, ast_of_position tok];
@@ -179,13 +183,13 @@
 
     and asts_of (Parser.Node ("_class_name", [Parser.Tip tok])) =
           let
-            val pos = Lexicon.pos_of_token tok;
+            val pos = report_pos tok;
             val (c, rs) = Proof_Context.check_class ctxt (Lexicon.str_of_token tok, pos);
             val _ = append_reports rs;
           in [Ast.Constant (Lexicon.mark_class c)] end
       | asts_of (Parser.Node ("_type_name", [Parser.Tip tok])) =
           let
-            val pos = Lexicon.pos_of_token tok;
+            val pos = report_pos tok;
             val (Type (c, _), rs) =
               Proof_Context.check_type_name {proper = true, strict = false} ctxt
                 (Lexicon.str_of_token tok, pos);
@@ -204,7 +208,7 @@
             val _ = pts |> List.app
               (fn Parser.Node _ => () | Parser.Tip tok =>
                 if Lexicon.valued_token tok then ()
-                else report (Lexicon.pos_of_token tok) (markup_entity ctxt) a);
+                else report (report_pos tok) (markup_entity ctxt) a);
           in [trans a (maps asts_of pts)] end
       | asts_of (Parser.Tip tok) = asts_of_token tok
 
@@ -340,7 +344,7 @@
     val ast_tr = Syntax.parse_ast_translation syn;
 
     val toks = Syntax.tokenize syn raw syms;
-    val _ = Context_Position.reports ctxt (map Lexicon.report_of_token toks);
+    val _ = Context_Position.reports ctxt (maps Lexicon.reports_of_token toks);
 
     val pts = Syntax.parse syn root (filter Lexicon.is_proper toks)
       handle ERROR msg =>
--- a/src/Pure/System/java_statistics.scala	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/System/java_statistics.scala	Sun Jan 24 19:34:37 2021 +0100
@@ -21,8 +21,8 @@
   def memory_status(): Memory_Status =
   {
     val heap_size = Runtime.getRuntime.totalMemory()
-    val heap_used = heap_size - Runtime.getRuntime.freeMemory()
-    Memory_Status(heap_size, heap_used)
+    val heap_free = Runtime.getRuntime.freeMemory()
+    Memory_Status(heap_size, heap_free)
   }
 
 
--- a/src/Pure/System/options.scala	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/System/options.scala	Sun Jan 24 19:34:37 2021 +0100
@@ -120,7 +120,7 @@
           case bad => error(bad.toString)
         }
       try { (options.set_section("") /: ops) { case (opts, op) => op(opts) } }
-      catch { case ERROR(msg) => error(msg + Position.File(file_name)) }
+      catch { case ERROR(msg) => error(msg + Position.here(Position.File(file_name))) }
     }
 
     def parse_prefs(options: Options, content: String): Options =
--- a/src/Pure/Thy/bibtex.ML	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/Thy/bibtex.ML	Sun Jan 24 19:34:37 2021 +0100
@@ -46,17 +46,19 @@
         (Scan.option (Parse.verbatim || Parse.cartouche) -- Parse.and_list1 Args.name_position))
       (fn ctxt => fn (opt, citations) =>
         let
-          val thy = Proof_Context.theory_of ctxt;
-          val bibtex_entries = Resources.theory_bibtex_entries (Context.theory_long_name thy);
           val _ =
-            if null bibtex_entries andalso Context.theory_name thy <> Context.PureN then ()
+            Context_Position.reports ctxt
+              (map (fn (name, pos) => (pos, Markup.citation name)) citations);
+
+          val thy_name = Context.theory_long_name (Proof_Context.theory_of ctxt);
+          val bibtex_entries = Resources.theory_bibtex_entries thy_name;
+          val _ =
+            if null bibtex_entries andalso thy_name <> Context.PureN then ()
             else
               citations |> List.app (fn (name, pos) =>
                 if member (op =) bibtex_entries name then ()
                 else error ("Unknown Bibtex entry " ^ quote name ^ Position.here pos));
-          val _ =
-            Context_Position.reports ctxt
-              (map (fn (name, pos) => (pos, Markup.citation name)) citations);
+
           val opt_arg = (case opt of NONE => "" | SOME s => "[" ^ s ^ "]");
           val arg = "{" ^ space_implode "," (map #1 citations) ^ "}";
         in Latex.string ("\\" ^ Config.get ctxt cite_macro ^ opt_arg ^ arg) end));
--- a/src/Pure/Tools/server.scala	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Pure/Tools/server.scala	Sun Jan 24 19:34:37 2021 +0100
@@ -139,7 +139,7 @@
         while (!finished) {
           Exn.capture(socket.accept) match {
             case Exn.Res(client) =>
-              Isabelle_Thread.fork(name = "server_connection") {
+              Isabelle_Thread.fork(name = "client") {
                 using(Connection(client))(connection =>
                   if (connection.read_password(password)) handle(connection))
               }
--- a/src/Tools/Haskell/Haskell.thy	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Tools/Haskell/Haskell.thy	Sun Jan 24 19:34:37 2021 +0100
@@ -67,7 +67,6 @@
   space_explode, split_lines, trim_line, clean_name)
 where
 
-import Data.Maybe
 import qualified Data.List as List
 import qualified Data.List.Split as Split
 import qualified Isabelle.Symbol as Symbol
@@ -181,7 +180,6 @@
   (print_bool, parse_bool, parse_nat, print_int, parse_int, print_real, parse_real)
 where
 
-import Data.Maybe
 import qualified Data.List as List
 import qualified Text.Read as Read
 
@@ -307,6 +305,8 @@
 See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/markup.ML\<close>.
 -}
 
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
 module Isabelle.Markup (
   T, empty, is_empty, properties,
 
@@ -759,7 +759,6 @@
 module Isabelle.File (setup, read, write, append) where
 
 import Prelude hiding (read)
-import System.IO (IO)
 import qualified System.IO as IO
 
 setup :: IO.Handle -> IO ()
@@ -791,11 +790,11 @@
 See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/xml.ML\<close>.
 -}
 
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
 module Isabelle.XML (Attributes, Body, Tree(..), wrap_elem, unwrap_elem, content_of)
 where
 
-import qualified Data.List as List
-
 import Isabelle.Library
 import qualified Isabelle.Properties as Properties
 import qualified Isabelle.Markup as Markup
@@ -874,6 +873,8 @@
 See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/xml.ML\<close>.
 -}
 
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
 module Isabelle.XML.Encode (
   A, T, V, P,
 
@@ -965,6 +966,8 @@
 See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/xml.ML\<close>.
 -}
 
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
 module Isabelle.XML.Decode (
   A, T, V, P,
 
@@ -974,8 +977,6 @@
 )
 where
 
-import Data.List ((!!))
-
 import Isabelle.Library
 import qualified Isabelle.Value as Value
 import qualified Isabelle.Properties as Properties
@@ -1078,6 +1079,8 @@
 See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/yxml.ML\<close>.
 -}
 
+{-# OPTIONS_GHC -fno-warn-missing-signatures -fno-warn-incomplete-patterns #-}
+
 module Isabelle.YXML (charX, charY, strX, strY, detect, output_markup,
   buffer_body, buffer, string_of_body, string_of, parse_body, parse)
 where
@@ -1205,6 +1208,8 @@
 See also \<^file>\<open>$ISABELLE_HOME/src/Pure/General/pretty.ML\<close>.
 -}
 
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
 module Isabelle.Pretty (
   T, symbolic, formatted, unformatted,
 
@@ -1416,7 +1421,6 @@
 where
 
 import Isabelle.Library
-import qualified Isabelle.XML as XML
 import Isabelle.XML.Encode
 import Isabelle.Term
 
@@ -1457,11 +1461,12 @@
 See also \<^file>\<open>$ISABELLE_HOME/src/Pure/term_xml.ML\<close>.
 -}
 
+{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
+
 module Isabelle.Term_XML.Decode (indexname, sort, typ, typ_body, term)
 where
 
 import Isabelle.Library
-import qualified Isabelle.XML as XML
 import Isabelle.XML.Decode
 import Isabelle.Term
 
@@ -1514,7 +1519,6 @@
 where
 
 import Data.ByteString (ByteString)
-import qualified Data.ByteString
 import Data.UUID (UUID)
 import qualified Data.UUID as UUID
 import Data.UUID.V4 (nextRandom)
@@ -1564,11 +1568,14 @@
 and \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/byte_message.scala\<close>.
 -}
 
+{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
+
 module Isabelle.Byte_Message (
     write, write_line,
     read, read_block, trim_line, read_line,
     make_message, write_message, read_message,
-    make_line_message, write_line_message, read_line_message
+    make_line_message, write_line_message, read_line_message,
+    read_yxml, write_yxml
   )
 where
 
@@ -1577,11 +1584,10 @@
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as ByteString
 import qualified Data.ByteString.UTF8 as UTF8
-import Data.Word (Word8)
-
-import Control.Monad (when)
+import qualified Isabelle.XML as XML
+import qualified Isabelle.YXML as YXML
+
 import Network.Socket (Socket)
-import qualified Network.Socket as Socket
 import qualified Network.Socket.ByteString as ByteString
 
 import Isabelle.Library hiding (trim_line)
@@ -1713,6 +1719,16 @@
       case Value.parse_nat (UTF8.toString line) of
         Nothing -> return $ Just line
         Just n -> fmap trim_line . fst <$> read_block socket n
+
+
+read_yxml :: Socket -> IO (Maybe XML.Body)
+read_yxml socket = do
+  res <- read_line_message socket
+  return (YXML.parse_body . UTF8.toString <$> res)
+
+write_yxml :: Socket -> XML.Body -> IO ()
+write_yxml socket body =
+  write_line_message socket (UTF8.fromString (YXML.string_of_body body))
 \<close>
 
 generate_file "Isabelle/Isabelle_Thread.hs" = \<open>
@@ -1739,7 +1755,6 @@
 where
 
 import Data.Unique
-import Data.Maybe
 import Data.IORef
 import System.IO.Unsafe
 
@@ -1747,7 +1762,6 @@
 import Control.Monad (when, forM_)
 import Data.Map.Strict (Map)
 import qualified Data.Map.Strict as Map
-import Control.Exception.Base (SomeException)
 import Control.Exception as Exception
 import Control.Concurrent (ThreadId)
 import qualified Control.Concurrent as Concurrent
@@ -1898,7 +1912,7 @@
 
 module Isabelle.Server (
   localhost_name, localhost, publish_text, publish_stdout,
-  server
+  server, connection
 )
 where
 
@@ -1913,6 +1927,7 @@
 import qualified Isabelle.UUID as UUID
 import qualified Isabelle.Byte_Message as Byte_Message
 import qualified Isabelle.Isabelle_Thread as Isabelle_Thread
+import qualified Data.ByteString.UTF8 as UTF8
 
 
 {- server address -}
@@ -1963,6 +1978,32 @@
             Left exn -> IO.hPutStrLn IO.stderr $ Exception.displayException exn
             Right () -> return ())
       return ()
+
+
+{- client connection -}
+
+connection :: String -> String -> (Socket -> IO a) -> IO a
+connection port password client =
+  Socket.withSocketsDo $ do
+    addr <- resolve
+    Exception.bracket (open addr) Socket.close body
+  where
+    resolve = do
+      let hints =
+            Socket.defaultHints {
+              Socket.addrFlags = [Socket.AI_NUMERICHOST, Socket.AI_NUMERICSERV],
+              Socket.addrSocketType = Socket.Stream }
+      head <$> Socket.getAddrInfo (Just hints) (Just "127.0.0.1") (Just port)
+
+    open addr = do
+      socket <- Socket.socket (Socket.addrFamily addr) (Socket.addrSocketType addr)
+                  (Socket.addrProtocol addr)
+      Socket.connect socket $ Socket.addrAddress addr
+      return socket
+
+    body socket = do
+      Byte_Message.write_line socket (UTF8.fromString password)
+      client socket
 \<close>
 
 export_generated_files _
--- a/src/Tools/VSCode/extension/README.md	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Tools/VSCode/extension/README.md	Sun Jan 24 19:34:37 2021 +0100
@@ -1,14 +1,15 @@
 # Isabelle Prover IDE support
 
 This extension connects VSCode to the Isabelle Prover IDE infrastructure: it
-requires a repository version of Isabelle.
+requires Isabelle2021.
 
 The implementation is centered around the VSCode Language Server protocol, but
 with many add-ons that are specific to VSCode and Isabelle/PIDE.
 
 See also:
 
-  * <https://isabelle.in.tum.de/repos/isabelle/file/tip/src/Tools/VSCode>
+  * <https://isabelle.in.tum.de/website-Isabelle2021>
+  * <https://isabelle.in.tum.de/repos/isabelle/file/Isabelle2021/src/Tools/VSCode>
   * <https://github.com/Microsoft/language-server-protocol>
 
 
@@ -58,8 +59,8 @@
 
 ### Isabelle/VSCode Installation
 
-  * Download a recent Isabelle development snapshot from
-  <https://isabelle.in.tum.de/devel/release_snapshot>
+  * Download Isabelle2021 from <https://isabelle.in.tum.de/website-Isabelle2021>
+    or any of its mirror sites.
 
   * Unpack and run the main Isabelle/jEdit application as usual, to ensure that
   the logic image is built properly and Isabelle works as expected.
@@ -68,7 +69,7 @@
 
   * Open the VSCode *Extensions* view and install the following:
 
-      + *Isabelle* (needs to fit to the underlying Isabelle release).
+      + *Isabelle2021* (needs to fit to the underlying Isabelle release).
 
       + *Prettify Symbols Mode* (important for display of Isabelle symbols).
 
@@ -89,17 +90,17 @@
 
       + Linux:
         ```
-        "isabelle.home": "/home/makarius/Isabelle"
+        "isabelle.home": "/home/makarius/Isabelle2021"
         ```
 
       + Mac OS X:
         ```
-        "isabelle.home": "/Users/makarius/Isabelle.app/Isabelle"
+        "isabelle.home": "/Users/makarius/Isabelle.app/Isabelle2021"
         ```
 
       + Windows:
         ```
-        "isabelle.home": "C:\\Users\\makarius\\Isabelle"
+        "isabelle.home": "C:\\Users\\makarius\\Isabelle2021"
         ```
 
   * Restart the VSCode application to ensure that all extensions are properly
--- a/src/Tools/VSCode/extension/package.json	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Tools/VSCode/extension/package.json	Sun Jan 24 19:34:37 2021 +0100
@@ -1,6 +1,6 @@
 {
-    "name": "Isabelle",
-    "displayName": "Isabelle",
+    "name": "Isabelle2021",
+    "displayName": "Isabelle2021",
     "description": "Isabelle Prover IDE",
     "keywords": [
         "theorem prover",
@@ -10,7 +10,7 @@
         "document preparation"
     ],
     "icon": "isabelle.png",
-    "version": "1.2.1",
+    "version": "1.2.2",
     "publisher": "makarius",
     "license": "MIT",
     "repository": {
@@ -189,92 +189,350 @@
                     "default": "",
                     "description": "Cygwin installation on Windows (only relevant when running directly from the Isabelle repository)."
                 },
-                "isabelle.unprocessed_light_color": { "type": "string", "default": "rgba(255, 160, 160, 1.00)" },
-                "isabelle.unprocessed_dark_color": { "type": "string", "default": "rgba(97, 0, 97, 1.00)" },
-                "isabelle.unprocessed1_light_color": { "type": "string", "default": "rgba(255, 160, 160, 0.20)" },
-                "isabelle.unprocessed1_dark_color": { "type": "string", "default": "rgba(97, 0, 97, 0.20)" },
-                "isabelle.running_light_color": { "type": "string", "default": "rgba(97, 0, 97, 1.00)" },
-                "isabelle.running_dark_color": { "type": "string", "default": "rgba(255, 160, 160, 1.00)" },
-                "isabelle.running1_light_color": { "type": "string", "default": "rgba(97, 0, 97, 0.40)" },
-                "isabelle.running1_dark_color": { "type": "string", "default": "rgba(255, 160, 160, 0.40)" },
-                "isabelle.canceled_light_color": { "type": "string", "default": "rgba(255, 106, 106, 0.40)" },
-                "isabelle.canceled_dark_color": { "type": "string", "default": "rgba(255, 106, 106, 0.40)" },
-                "isabelle.bad_light_color": { "type": "string", "default": "rgba(255, 106, 106, 0.40)" },
-                "isabelle.bad_dark_color": { "type": "string", "default": "rgba(255, 106, 106, 0.40)" },
-                "isabelle.intensify_light_color": { "type": "string", "default": "rgba(255, 204, 102, 0.40)" },
-                "isabelle.intensify_dark_color": { "type": "string", "default": "rgba(204, 136, 0, 0.20)" },
-                "isabelle.markdown_bullet1_light_color": { "type": "string", "default": "rgba(218, 254, 218, 1.00)" },
-                "isabelle.markdown_bullet1_dark_color": { "type": "string", "default": "rgba(5, 199, 5, 0.20)" },
-                "isabelle.markdown_bullet2_light_color": { "type": "string", "default": "rgba(255, 240, 204, 1.00)" },
-                "isabelle.markdown_bullet2_dark_color": { "type": "string", "default": "rgba(204, 143, 0, 0.20)" },
-                "isabelle.markdown_bullet3_light_color": { "type": "string", "default": "rgba(231, 231, 255, 1.00)" },
-                "isabelle.markdown_bullet3_dark_color": { "type": "string", "default": "rgba(0, 0, 204, 0.20)" },
-                "isabelle.markdown_bullet4_light_color": { "type": "string", "default": "rgba(255, 224, 240, 1.00)" },
-                "isabelle.markdown_bullet4_dark_color": { "type": "string", "default": "rgba(204, 0, 105, 0.20)" },
-                "isabelle.quoted_light_color": { "type": "string", "default": "rgba(139, 139, 139, 0.10)" },
-                "isabelle.quoted_dark_color": { "type": "string", "default": "rgba(150, 150, 150, 0.15)" },
-                "isabelle.antiquoted_light_color": { "type": "string", "default": "rgba(255, 200, 50, 0.10)" },
-                "isabelle.antiquoted_dark_color": { "type": "string", "default": "rgba(255, 214, 102, 0.15)" },
-                "isabelle.writeln_light_color": { "type": "string", "default": "rgba(192, 192, 192, 1.0)" },
-                "isabelle.writeln_dark_color": { "type": "string", "default": "rgba(192, 192, 192, 1.0)" },
-                "isabelle.information_light_color": { "type": "string", "default": "rgba(193, 223, 238, 1.0)" },
-                "isabelle.information_dark_color": { "type": "string", "default": "rgba(193, 223, 238, 1.0)" },
-                "isabelle.warning_light_color": { "type": "string", "default": "rgba(255, 140, 0, 1.0)" },
-                "isabelle.warning_dark_color": { "type": "string", "default": "rgba(255, 140, 0, 1.0)" },
-                "isabelle.error_light_color": { "type": "string", "default": "rgba(178, 34, 34, 1.00)" },
-                "isabelle.error_dark_color": { "type": "string", "default": "rgba(178, 34, 34, 1.00)" },
-                "isabelle.spell_checker_light_color": { "type": "string", "default": "rgba(0, 0, 255, 1.0)" },
-                "isabelle.spell_checker_dark_color": { "type": "string", "default": "rgba(86, 156, 214, 1.00)" },
-                "isabelle.main_light_color": { "type": "string", "default": "rgba(0, 0, 0, 1.00)" },
-                "isabelle.main_dark_color": { "type": "string", "default": "rgba(212, 212, 212, 1.00)" },
-                "isabelle.keyword1_light_color": { "type": "string", "default": "rgba(175, 0, 219, 1.00)" },
-                "isabelle.keyword1_dark_color": { "type": "string", "default": "rgba(197, 134, 192, 1.00)" },
-                "isabelle.keyword2_light_color": { "type": "string", "default": "rgba(9, 136, 90, 1.00)" },
-                "isabelle.keyword2_dark_color": { "type": "string", "default": "rgba(181, 206, 168, 1.00)" },
-                "isabelle.keyword3_light_color": { "type": "string", "default": "rgba(38, 127, 153, 1.00)" },
-                "isabelle.keyword3_dark_color": { "type": "string", "default": "rgba(78, 201, 176), 1.00)" },
-                "isabelle.quasi_keyword_light_color": { "type": "string", "default": "rgba(153, 102, 255, 1.00)" },
-                "isabelle.quasi_keyword_dark_color": { "type": "string", "default": "rgba(153, 102, 255, 1.00)" },
-                "isabelle.improper_light_color": { "type": "string", "default": "rgba(205, 49, 49, 1.00)" },
-                "isabelle.improper_dark_color": { "type": "string", "default": "rgba(244, 71, 71, 1.00)" },
-                "isabelle.operator_light_color": { "type": "string", "default": "rgba(50, 50, 50, 1.00)" },
-                "isabelle.operator_dark_color": { "type": "string", "default": "rgba(212, 212, 212, 1.00)" },
-                "isabelle.tfree_light_color": { "type": "string", "default": "rgba(160, 32, 240, 1.00)" },
-                "isabelle.tfree_dark_color": { "type": "string", "default": "rgba(160, 32, 240, 1.00)" },
-                "isabelle.tvar_light_color": { "type": "string", "default": "rgba(160, 32, 240, 1.00)" },
-                "isabelle.tvar_dark_color": { "type": "string", "default": "rgba(160, 32, 240, 1.00)" },
-                "isabelle.free_light_color": { "type": "string", "default": "rgba(0, 0, 255, 1.00)" },
-                "isabelle.free_dark_color": { "type": "string", "default": "rgba(86, 156, 214, 1.00)" },
-                "isabelle.skolem_light_color": { "type": "string", "default": "rgba(210, 105, 30, 1.00)" },
-                "isabelle.skolem_dark_color": { "type": "string", "default": "rgba(210, 105, 30, 1.00)" },
-                "isabelle.bound_light_color": { "type": "string", "default": "rgba(0, 128, 0, 1.00)" },
-                "isabelle.bound_dark_color": { "type": "string", "default": "rgba(96, 139, 78, 1.00)" },
-                "isabelle.var_light_color": { "type": "string", "default": "rgba(0, 16, 128, 1.00)" },
-                "isabelle.var_dark_color": { "type": "string", "default": "rgba(156, 220, 254, 1.00)" },
-                "isabelle.inner_numeral_light_color": { "type": "string", "default": "rgba(9, 136, 90, 1.00)" },
-                "isabelle.inner_numeral_dark_color": { "type": "string", "default": "rgba(181, 206, 168, 1.00)" },
-                "isabelle.inner_quoted_light_color": { "type": "string", "default": "rgba(163, 21, 21, 1.00)" },
-                "isabelle.inner_quoted_dark_color": { "type": "string", "default": "rgba(206, 145, 120, 1.00)" },
-                "isabelle.inner_cartouche_light_color": { "type": "string", "default": "rgba(129, 31, 63, 1.00)" },
-                "isabelle.inner_cartouche_dark_color": { "type": "string", "default": "rgba(209, 105, 105, 1.00)" },
-                "isabelle.inner_comment_light_color": { "type": "string", "default": "rgba(0, 128, 0, 1.00)" },
-                "isabelle.inner_comment_dark_color": { "type": "string", "default": "rgba(96, 139, 78, 1.00)" },
-                "isabelle.comment1_light_color": { "type": "string", "default": "rgba(129, 31, 63, 1.00)" },
-                "isabelle.comment1_dark_color": { "type": "string", "default": "rgba(100, 102, 149, 1.00)" },
-                "isabelle.comment2_light_color": { "type": "string", "default": "rgba(209, 105, 105, 1.00)" },
-                "isabelle.comment2_dark_color": { "type": "string", "default": "rgba(206, 155, 120, 1.00)" },
-                "isabelle.comment3_light_color": { "type": "string", "default": "rgba(0, 128, 0, 1.00)" },
-                "isabelle.comment3_dark_color": { "type": "string", "default": "rgba(96, 139, 78, 1.00)" },
-                "isabelle.dynamic_light_color": { "type": "string", "default": "rgba(121, 94, 38, 1.00)" },
-                "isabelle.dynamic_dark_color": { "type": "string", "default": "rgba(220, 220, 170, 1.00)" },
-                "isabelle.class_parameter_light_color": { "type": "string", "default": "rgba(210, 105, 30, 1.00)" },
-                "isabelle.class_parameter_dark_color": { "type": "string", "default": "rgba(210, 105, 30, 1.00)" },
-                "isabelle.antiquote_light_color": { "type": "string", "default": "rgba(102, 0, 204, 1.00)" },
-                "isabelle.antiquote_dark_color": { "type": "string", "default": "rgba(197, 134, 192, 1.00)" },
-                "isabelle.raw_text_light_color": { "type": "string", "default": "rgba(102, 0, 204, 1.00)" },
-                "isabelle.raw_text_dark_color": { "type": "string", "default": "rgba(197, 134, 192, 1.00)" },
-                "isabelle.plain_text_light_color": { "type": "string", "default": "rgba(102, 0, 204, 1.00)" },
-                "isabelle.plain_text_dark_color": { "type": "string", "default": "rgba(197, 134, 192, 1.00)" }
+                "isabelle.unprocessed_light_color": {
+                    "type": "string",
+                    "default": "rgba(255, 160, 160, 1.00)"
+                },
+                "isabelle.unprocessed_dark_color": {
+                    "type": "string",
+                    "default": "rgba(97, 0, 97, 1.00)"
+                },
+                "isabelle.unprocessed1_light_color": {
+                    "type": "string",
+                    "default": "rgba(255, 160, 160, 0.20)"
+                },
+                "isabelle.unprocessed1_dark_color": {
+                    "type": "string",
+                    "default": "rgba(97, 0, 97, 0.20)"
+                },
+                "isabelle.running_light_color": {
+                    "type": "string",
+                    "default": "rgba(97, 0, 97, 1.00)"
+                },
+                "isabelle.running_dark_color": {
+                    "type": "string",
+                    "default": "rgba(255, 160, 160, 1.00)"
+                },
+                "isabelle.running1_light_color": {
+                    "type": "string",
+                    "default": "rgba(97, 0, 97, 0.40)"
+                },
+                "isabelle.running1_dark_color": {
+                    "type": "string",
+                    "default": "rgba(255, 160, 160, 0.40)"
+                },
+                "isabelle.canceled_light_color": {
+                    "type": "string",
+                    "default": "rgba(255, 106, 106, 0.40)"
+                },
+                "isabelle.canceled_dark_color": {
+                    "type": "string",
+                    "default": "rgba(255, 106, 106, 0.40)"
+                },
+                "isabelle.bad_light_color": {
+                    "type": "string",
+                    "default": "rgba(255, 106, 106, 0.40)"
+                },
+                "isabelle.bad_dark_color": {
+                    "type": "string",
+                    "default": "rgba(255, 106, 106, 0.40)"
+                },
+                "isabelle.intensify_light_color": {
+                    "type": "string",
+                    "default": "rgba(255, 204, 102, 0.40)"
+                },
+                "isabelle.intensify_dark_color": {
+                    "type": "string",
+                    "default": "rgba(204, 136, 0, 0.20)"
+                },
+                "isabelle.markdown_bullet1_light_color": {
+                    "type": "string",
+                    "default": "rgba(218, 254, 218, 1.00)"
+                },
+                "isabelle.markdown_bullet1_dark_color": {
+                    "type": "string",
+                    "default": "rgba(5, 199, 5, 0.20)"
+                },
+                "isabelle.markdown_bullet2_light_color": {
+                    "type": "string",
+                    "default": "rgba(255, 240, 204, 1.00)"
+                },
+                "isabelle.markdown_bullet2_dark_color": {
+                    "type": "string",
+                    "default": "rgba(204, 143, 0, 0.20)"
+                },
+                "isabelle.markdown_bullet3_light_color": {
+                    "type": "string",
+                    "default": "rgba(231, 231, 255, 1.00)"
+                },
+                "isabelle.markdown_bullet3_dark_color": {
+                    "type": "string",
+                    "default": "rgba(0, 0, 204, 0.20)"
+                },
+                "isabelle.markdown_bullet4_light_color": {
+                    "type": "string",
+                    "default": "rgba(255, 224, 240, 1.00)"
+                },
+                "isabelle.markdown_bullet4_dark_color": {
+                    "type": "string",
+                    "default": "rgba(204, 0, 105, 0.20)"
+                },
+                "isabelle.quoted_light_color": {
+                    "type": "string",
+                    "default": "rgba(139, 139, 139, 0.10)"
+                },
+                "isabelle.quoted_dark_color": {
+                    "type": "string",
+                    "default": "rgba(150, 150, 150, 0.15)"
+                },
+                "isabelle.antiquoted_light_color": {
+                    "type": "string",
+                    "default": "rgba(255, 200, 50, 0.10)"
+                },
+                "isabelle.antiquoted_dark_color": {
+                    "type": "string",
+                    "default": "rgba(255, 214, 102, 0.15)"
+                },
+                "isabelle.writeln_light_color": {
+                    "type": "string",
+                    "default": "rgba(192, 192, 192, 1.0)"
+                },
+                "isabelle.writeln_dark_color": {
+                    "type": "string",
+                    "default": "rgba(192, 192, 192, 1.0)"
+                },
+                "isabelle.information_light_color": {
+                    "type": "string",
+                    "default": "rgba(193, 223, 238, 1.0)"
+                },
+                "isabelle.information_dark_color": {
+                    "type": "string",
+                    "default": "rgba(193, 223, 238, 1.0)"
+                },
+                "isabelle.warning_light_color": {
+                    "type": "string",
+                    "default": "rgba(255, 140, 0, 1.0)"
+                },
+                "isabelle.warning_dark_color": {
+                    "type": "string",
+                    "default": "rgba(255, 140, 0, 1.0)"
+                },
+                "isabelle.error_light_color": {
+                    "type": "string",
+                    "default": "rgba(178, 34, 34, 1.00)"
+                },
+                "isabelle.error_dark_color": {
+                    "type": "string",
+                    "default": "rgba(178, 34, 34, 1.00)"
+                },
+                "isabelle.spell_checker_light_color": {
+                    "type": "string",
+                    "default": "rgba(0, 0, 255, 1.0)"
+                },
+                "isabelle.spell_checker_dark_color": {
+                    "type": "string",
+                    "default": "rgba(86, 156, 214, 1.00)"
+                },
+                "isabelle.main_light_color": {
+                    "type": "string",
+                    "default": "rgba(0, 0, 0, 1.00)"
+                },
+                "isabelle.main_dark_color": {
+                    "type": "string",
+                    "default": "rgba(212, 212, 212, 1.00)"
+                },
+                "isabelle.keyword1_light_color": {
+                    "type": "string",
+                    "default": "rgba(175, 0, 219, 1.00)"
+                },
+                "isabelle.keyword1_dark_color": {
+                    "type": "string",
+                    "default": "rgba(197, 134, 192, 1.00)"
+                },
+                "isabelle.keyword2_light_color": {
+                    "type": "string",
+                    "default": "rgba(9, 136, 90, 1.00)"
+                },
+                "isabelle.keyword2_dark_color": {
+                    "type": "string",
+                    "default": "rgba(181, 206, 168, 1.00)"
+                },
+                "isabelle.keyword3_light_color": {
+                    "type": "string",
+                    "default": "rgba(38, 127, 153, 1.00)"
+                },
+                "isabelle.keyword3_dark_color": {
+                    "type": "string",
+                    "default": "rgba(78, 201, 176), 1.00)"
+                },
+                "isabelle.quasi_keyword_light_color": {
+                    "type": "string",
+                    "default": "rgba(153, 102, 255, 1.00)"
+                },
+                "isabelle.quasi_keyword_dark_color": {
+                    "type": "string",
+                    "default": "rgba(153, 102, 255, 1.00)"
+                },
+                "isabelle.improper_light_color": {
+                    "type": "string",
+                    "default": "rgba(205, 49, 49, 1.00)"
+                },
+                "isabelle.improper_dark_color": {
+                    "type": "string",
+                    "default": "rgba(244, 71, 71, 1.00)"
+                },
+                "isabelle.operator_light_color": {
+                    "type": "string",
+                    "default": "rgba(50, 50, 50, 1.00)"
+                },
+                "isabelle.operator_dark_color": {
+                    "type": "string",
+                    "default": "rgba(212, 212, 212, 1.00)"
+                },
+                "isabelle.tfree_light_color": {
+                    "type": "string",
+                    "default": "rgba(160, 32, 240, 1.00)"
+                },
+                "isabelle.tfree_dark_color": {
+                    "type": "string",
+                    "default": "rgba(160, 32, 240, 1.00)"
+                },
+                "isabelle.tvar_light_color": {
+                    "type": "string",
+                    "default": "rgba(160, 32, 240, 1.00)"
+                },
+                "isabelle.tvar_dark_color": {
+                    "type": "string",
+                    "default": "rgba(160, 32, 240, 1.00)"
+                },
+                "isabelle.free_light_color": {
+                    "type": "string",
+                    "default": "rgba(0, 0, 255, 1.00)"
+                },
+                "isabelle.free_dark_color": {
+                    "type": "string",
+                    "default": "rgba(86, 156, 214, 1.00)"
+                },
+                "isabelle.skolem_light_color": {
+                    "type": "string",
+                    "default": "rgba(210, 105, 30, 1.00)"
+                },
+                "isabelle.skolem_dark_color": {
+                    "type": "string",
+                    "default": "rgba(210, 105, 30, 1.00)"
+                },
+                "isabelle.bound_light_color": {
+                    "type": "string",
+                    "default": "rgba(0, 128, 0, 1.00)"
+                },
+                "isabelle.bound_dark_color": {
+                    "type": "string",
+                    "default": "rgba(96, 139, 78, 1.00)"
+                },
+                "isabelle.var_light_color": {
+                    "type": "string",
+                    "default": "rgba(0, 16, 128, 1.00)"
+                },
+                "isabelle.var_dark_color": {
+                    "type": "string",
+                    "default": "rgba(156, 220, 254, 1.00)"
+                },
+                "isabelle.inner_numeral_light_color": {
+                    "type": "string",
+                    "default": "rgba(9, 136, 90, 1.00)"
+                },
+                "isabelle.inner_numeral_dark_color": {
+                    "type": "string",
+                    "default": "rgba(181, 206, 168, 1.00)"
+                },
+                "isabelle.inner_quoted_light_color": {
+                    "type": "string",
+                    "default": "rgba(163, 21, 21, 1.00)"
+                },
+                "isabelle.inner_quoted_dark_color": {
+                    "type": "string",
+                    "default": "rgba(206, 145, 120, 1.00)"
+                },
+                "isabelle.inner_cartouche_light_color": {
+                    "type": "string",
+                    "default": "rgba(129, 31, 63, 1.00)"
+                },
+                "isabelle.inner_cartouche_dark_color": {
+                    "type": "string",
+                    "default": "rgba(209, 105, 105, 1.00)"
+                },
+                "isabelle.inner_comment_light_color": {
+                    "type": "string",
+                    "default": "rgba(0, 128, 0, 1.00)"
+                },
+                "isabelle.inner_comment_dark_color": {
+                    "type": "string",
+                    "default": "rgba(96, 139, 78, 1.00)"
+                },
+                "isabelle.comment1_light_color": {
+                    "type": "string",
+                    "default": "rgba(129, 31, 63, 1.00)"
+                },
+                "isabelle.comment1_dark_color": {
+                    "type": "string",
+                    "default": "rgba(100, 102, 149, 1.00)"
+                },
+                "isabelle.comment2_light_color": {
+                    "type": "string",
+                    "default": "rgba(209, 105, 105, 1.00)"
+                },
+                "isabelle.comment2_dark_color": {
+                    "type": "string",
+                    "default": "rgba(206, 155, 120, 1.00)"
+                },
+                "isabelle.comment3_light_color": {
+                    "type": "string",
+                    "default": "rgba(0, 128, 0, 1.00)"
+                },
+                "isabelle.comment3_dark_color": {
+                    "type": "string",
+                    "default": "rgba(96, 139, 78, 1.00)"
+                },
+                "isabelle.dynamic_light_color": {
+                    "type": "string",
+                    "default": "rgba(121, 94, 38, 1.00)"
+                },
+                "isabelle.dynamic_dark_color": {
+                    "type": "string",
+                    "default": "rgba(220, 220, 170, 1.00)"
+                },
+                "isabelle.class_parameter_light_color": {
+                    "type": "string",
+                    "default": "rgba(210, 105, 30, 1.00)"
+                },
+                "isabelle.class_parameter_dark_color": {
+                    "type": "string",
+                    "default": "rgba(210, 105, 30, 1.00)"
+                },
+                "isabelle.antiquote_light_color": {
+                    "type": "string",
+                    "default": "rgba(102, 0, 204, 1.00)"
+                },
+                "isabelle.antiquote_dark_color": {
+                    "type": "string",
+                    "default": "rgba(197, 134, 192, 1.00)"
+                },
+                "isabelle.raw_text_light_color": {
+                    "type": "string",
+                    "default": "rgba(102, 0, 204, 1.00)"
+                },
+                "isabelle.raw_text_dark_color": {
+                    "type": "string",
+                    "default": "rgba(197, 134, 192, 1.00)"
+                },
+                "isabelle.plain_text_light_color": {
+                    "type": "string",
+                    "default": "rgba(102, 0, 204, 1.00)"
+                },
+                "isabelle.plain_text_dark_color": {
+                    "type": "string",
+                    "default": "rgba(197, 134, 192, 1.00)"
+                }
             }
         }
     },
@@ -285,9 +543,9 @@
     },
     "devDependencies": {
         "@types/mocha": "^2.2.48",
-        "@types/node": "^7.0.66",
+        "@types/node": "^7.10.14",
         "mocha": "^3.5.3",
-        "typescript": "^2.9.2",
+        "typescript": "^3.7.9",
         "vscode": "^1.1.36"
     },
     "dependencies": {
--- a/src/Tools/VSCode/extension/src/symbol.ts	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Tools/VSCode/extension/src/symbol.ts	Sun Jan 24 19:34:37 2021 +0100
@@ -122,7 +122,7 @@
   if (prettify_symbols_mode) {
     prettify_symbols_mode.activate().then(() =>
     {
-      const substitutions = [] as [Substitution]
+      const substitutions: Substitution[] = []
       for (const entry of names) {
         const sym = entry[0]
         substitutions.push(
--- a/src/Tools/jEdit/lib/Tools/jedit	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Tools/jEdit/lib/Tools/jedit	Sun Jan 24 19:34:37 2021 +0100
@@ -408,6 +408,8 @@
 
 if [ "$BUILD_ONLY" = false ]
 then
+  "$ISABELLE_HOME/lib/scripts/java-gui-setup"
+
   export JEDIT_SESSION_DIRS JEDIT_LOGIC JEDIT_LOGIC_ANCESTOR JEDIT_LOGIC_REQUIREMENTS \
     JEDIT_INCLUDE_SESSIONS JEDIT_PRINT_MODE JEDIT_NO_BUILD JEDIT_BUILD_MODE
   export JEDIT_ML_PROCESS_POLICY="$ML_PROCESS_POLICY"
--- a/src/Tools/jEdit/src/jEdit.props	Thu Jan 21 18:18:19 2021 +0100
+++ b/src/Tools/jEdit/src/jEdit.props	Sun Jan 24 19:34:37 2021 +0100
@@ -187,6 +187,7 @@
 helpviewer.font=Isabelle DejaVu Serif
 helpviewer.fontsize=12
 home.shortcut=
+hypersearch-results.dock-position=right
 insert-newline-indent.shortcut=
 insert-newline.shortcut=
 isabelle-debugger.dock-position=floating