text‹
Isabelle/jEdit is a Prover IDE that integrates ∗‹parallel proof checking› cite‹"Wenzel:2009" and "Wenzel:2013:ITP"› with ∗‹asynchronous user
interaction›cite‹"Wenzel:2010" and "Wenzel:2012:UITP-EPTCS" and
"Wenzel:2014:ITP-PIDE" and "Wenzel:2014:UITP"›, based on a document-oriented
approach to ∗‹continuous proof processing›cite‹"Wenzel:2011:CICM" and
"Wenzel:2012" and "Wenzel:2018:FIDE" and "Wenzel:2019:MKM"›. Many concepts
and system components are fit together in order to make this work. The main
building blocks are as follows.
🚫[Isabelle/ML] is the implementation and extension language of Isabelle,
see also cite‹"isabelle-implementation"›. It is integrated into the
logical context of Isabelle/Isar and allows to manipulate logical entities
directly. Arbitrary add-on tools may be implemented for object-logics such
as Isabelle/HOL.
🚫[Isabelle/Scala] is the system programming language of Isabelle. It
extends the pure logical environment of Isabelle/ML towards the outer
world of graphical user interfaces, text editors, IDE frameworks, web
services, SSH servers, SQL databases etc. Both Scala and ML provide
library modules to support formatted text with formal markup, and to
encode/decode algebraic datatypes. Scala communicates with ML via
asynchronous protocol commands; from the ML perspective this is wrapped up
as synchronous function call (RPC).
🚫[PIDE] is a general framework for Prover IDEs based on Isabelle/Scala. It
is built around a concept of parallel and asynchronous document
processing, which is supported natively by the parallel proof engine that
is implemented in Isabelle/ML. The traditional prover command loop is
given up; instead there is direct support for editing of source text, with
rich formal markup for GUI rendering.
🚫[jEdit] is a sophisticated text editor🚫‹🌐‹http://www.jedit.org››
implemented in Java🚫‹🌐‹https://openjdk.java.net››. The editor is easily
extensible by plugins written in any language that works on the JVM. In
the context of Isabelle this is usually
Scala🚫‹🌐‹https://www.scala-lang.org››.
🚫[Isabelle/jEdit] is the main application of the PIDE framework and the
default user-interface for Isabelle. It targets both beginners and
experts. Technically, Isabelle/jEdit consists of the original jEdit code
base with minimal patches and a special plugin for Isabelle. This is
integrated as a desktop application for the main operating system
families: Linux, Windows, macOS.
End-users of Isabelle download and run a standalone application that exposes
jEdit as a text editor on the surface. Thus there is occasionally a tendency
to apply the name ``jEdit'' to any of the Isabelle Prover IDE aspects,
without proper differentiation. When discussing these PIDE building blocks
in public forums, mailing lists, or even scientific publications, it is
particularly important to distinguish Isabelle/ML versus Standard ML,
Isabelle/Scala versus Scala, Isabelle/jEdit versus jEdit. ›
Isabelle/jEdit (\figref{fig:isabelle-jedit}) consists of some plugins for
the jEdit text editor, together with patches on the underlying code base.
The overall look-and-feel of jEdit is changed significantly, and the
different name of Isabelle/jEdit is justified even from the surface.
The main plugin is called ``Isabelle'' and has its own menu ∗‹Plugins~/
Isabelle› with access to several actions and add-on panels (see also \secref{sec:dockables}), as well as ∗‹Plugins~/ Plugin Options~/ Isabelle›
(see also \secref{sec:options}).
The plugin options allow to specify a logic session name, but the same
selector is also accessible in the ∗‹Theories› panel
(\secref{sec:theories}). After startup of the Isabelle plugin, the selected
logic session image is provided automatically by the Isabelle build tool cite‹"isabelle-system"›: if it is absent or outdated wrt.\ its sources,
the build process updates it within the running text editor. Prover IDE
functionality is only activated after successful termination of the build
process. A failure may require changing some options and restart of the
Isabelle plugin or application. Changing the logic session requires a
restart of the whole application to take effect.
┉ The main job of the Prover IDE is to manage sources and their changes,
taking the logical structure as a formal document into account (see also \secref{sec:document-model}). The editor and the prover are connected
asynchronously without locking. The prover is free to organize the checking
of the formal text in parallel on multiple cores, and provides feedback via
markup, which is rendered in the editor via colors, boxes, squiggly
underlines, hyperlinks, popup windows, icons, clickable output etc.
Using the mouse together with the modifier key ▩‹CONTROL› (Linux, Windows)
or ▩‹COMMAND› (macOS) exposes formal content via tooltips and/or
hyperlinks (see also \secref{sec:tooltips-hyperlinks}). Output (in popups
etc.) may be explored recursively, using the same techniques as in the
editor source buffer.
Thus the Prover IDE gives an impression of direct access to formal content
of the prover within the editor, but in reality only certain aspects are
exposed, according to the possibilities of the prover and its add-on tools. ›
subsection‹Documentation›
text‹
The ∗‹Documentation› panel of Isabelle/jEdit provides access to some example
theory files and the standard Isabelle documentation. PDF files are opened
by regular desktop operations of the underlying platform. The section
``Original jEdit Documentation'' contains the original ∗‹User's Guide› of
this sophisticated text editor. The same is accessible via the ▩‹Help› menu
or ▩‹F1› keyboard shortcut, using the built-in HTML viewer of Java/Swing.
The latter also includes ∗‹Frequently Asked Questions› and documentation of
individual plugins.
Most of the information about jEdit is relevant for Isabelle/jEdit as well,
but users need to keep in mind that defaults sometimes differ, and the
official jEdit documentation does not know about the Isabelle plugin with
its support for continuous checking of formal source text: jEdit is a plain
text editor, but Isabelle/jEdit is a Prover IDE. ›
subsection‹Plugins›
text‹
The ∗‹Plugin Manager› of jEdit allows to augment editor functionality by JVM
modules (jars) that are provided by the central plugin repository, which is
accessible via various mirror sites.
Connecting to the plugin server-infrastructure of the jEdit project allows
to update bundled plugins or to add further functionality. This needs to be
done with the usual care for such an open bazaar of contributions, many of
them unmaintained. Arbitrary combinations of add-on features are apt to
cause problems. It is advisable to start with the default configuration of
Isabelle/jEdit and develop a sense how it is meant to work, before loading
other plugins.
┉
The ∗‹Isabelle› plugin is responsible for the main Prover IDE functionality
of Isabelle/jEdit: it manages the prover session in the background. A few
additional plugins are bundled with Isabelle/jEdit for convenience or out of
necessity, notably ∗‹Console› with its ∗‹Scala› sub-plugin
(\secref{sec:scala-console}) and ∗‹SideKick› with some Isabelle-specific
parsers for document tree structure (\secref{sec:sidekick}). Other plugins
(e.g.\ ∗‹Console›, ∗‹ErrorList›, ∗‹SideKick›) are included to saturate the
dependencies of bundled plugins, but have no particular use in
Isabelle/jEdit. ›
subsection‹Options \label{sec:options}›
text‹
Both jEdit and Isabelle have distinctive management of persistent options.
Regular jEdit options are accessible via the dialogs ∗‹Utilities~/ Global
Options› or ∗‹Plugins~/ Plugin Options›, with a second chance to flip the
two within the central options dialog. Changes are stored in 🚫‹$JEDIT_SETTINGS/properties› and 🚫‹$JEDIT_SETTINGS/keymaps›.
Isabelle system options are managed by Isabelle/Scala and changes are stored
in 🚫‹$ISABELLE_HOME_USER/etc/preferences›, independently of
other jEdit properties. See also cite‹"isabelle-system"›, especially the
coverage of sessions and command-line tools like @{tool build} or @{tool
options}.
Those Isabelle options that are declared as ▩‹public› are configurable in
Isabelle/jEdit via ∗‹Plugin Options~/ Isabelle~/ General›. Moreover, there
are various options for rendering document content, which are configurable
via ∗‹Plugin Options~/ Isabelle~/ Rendering›. Thus ∗‹Plugin Options~/
Isabelle› in jEdit provides a view on a subset of Isabelle system options.
Note that some of these options affect general parameters that are relevant
outside Isabelle/jEdit as well, e.g.\ @{system_option threads} or
@{system_option parallel_proofs} for the Isabelle build tool cite‹"isabelle-system"›, but it is possible to use the settings variable
@{setting ISABELLE_BUILD_OPTIONS} to change defaults for batch builds on the
command-line, without affecting the Prover IDE.
The jEdit action @{action_def isabelle.options} opens the options dialog for
the Isabelle plugin; it can be mapped to editor GUI elements as usual.
┉
Options are usually loaded on startup and saved on shutdown of
Isabelle/jEdit. Editing the generated 🚫‹$JEDIT_SETTINGS/properties›
or 🚫‹$ISABELLE_HOME_USER/etc/preferences› manually while the
application is running may cause lost updates! ›
subsection‹Keymaps›
text‹
Keyboard shortcuts are managed as a separate concept of ∗‹keymap› that is
configurable via ∗‹Global Options~/ Shortcuts›. The ▩‹imported› keymap is
derived from the initial environment of properties that was available at the
first start of the editor; afterwards the keymap file takes precedence and
is no longer affected by change of default properties.
Users may modify their keymap later, but this can lead to conflicts with ▩‹shortcut› properties in 🚫‹$JEDIT_HOME/properties/jEdit.props›.
The action @{action_def "isabelle.keymap-merge"} helps to resolve pending
Isabelle keymap changes wrt. the current jEdit keymap; non-conflicting
changes are applied implicitly. This action is automatically invoked on
Isabelle/jEdit startup. ›
text‹
Isabelle/jEdit is normally invoked as a single-instance desktop application,
based on platform-specific executables for Linux, Windows, macOS.
It is also possible to invoke the Prover IDE on the command-line, with some
extra options and environment settings. The command-line usage of @{tool_def
jedit} is as follows:
@{verbatim [display] ‹Usage: isabelle jedit [OPTIONS] [FILES ...]
Options are:
-A NAME ancestor session for option -R (default: parent)
-D NAME=X set JVM system property
-J OPTION add JVM runtime option
(default $JEDIT_JAVA_SYSTEM_OPTIONS $JEDIT_JAVA_OPTIONS)
-R NAME build image with requirements from other sessions
-b build only
-d DIR include session directory
-f fresh build
-i NAME include session in name-space of theories
-j OPTION add jEdit runtime option
(default $JEDIT_OPTIONS)
-l NAME logic session name
-m MODE add print mode for output
-n no build of session image on startup
-o OPTION override Isabelle system OPTION (via NAME=VAL or NAME)
-p CMD command prefix for ML process (e.g. NUMA policy)
-s system build mode for session image (system_heaps=true)
-u user build mode for session image (system_heaps=false)
Start jEdit with Isabelle plugin setup and open FILES
(default "$USER_HOME/Scratch.thy" or ":" for empty buffer).›}
The ▩‹-l› option specifies the session name of the logic image to be used
for proof processing. Additional session root directories may be included
via option ▩‹-d› to augment the session name space (see also cite‹"isabelle-system"›). By default, the specified image is checked and built on
demand, but option ▩‹-n› bypasses the implicit build process for the
selected session image. Options ▩‹-s› and ▩‹-u› override the default system
option @{system_option system_heaps}: this determines where to store the
session image of @{tool build}.
The ▩‹-R› option builds an auxiliary logic image with all theories from
other sessions that are not already present in its parent; it also opens the
session ▩‹ROOT› entry in the editor to facilitate editing of the main
session. The ▩‹-A› option specifies and alternative ancestor session for
option ▩‹-R›: this allows to restructure the hierarchy of session images on
the spot. Options ▩‹-R› and ▩‹-l› are mutually exclusive.
The ▩‹-i› option includes additional sessions into the name-space of
theories: multiple occurrences are possible.
The ▩‹-m› option specifies additional print modes for the prover process.
Note that the system option @{system_option_ref jedit_print_mode} allows to
do the same persistently (e.g.\ via the ∗‹Plugin Options› dialog of
Isabelle/jEdit), without requiring command-line invocation.
The ▩‹-J› and ▩‹-j› options pass additional low-level options to the JVM or
jEdit, respectively. The defaults are provided by the Isabelle settings
environment cite‹"isabelle-system"›, but note that these only work for the
command-line tool described here, and not the desktop application.
The ▩‹-D› option allows to define JVM system properties; this is passed
directly to the underlying ▩‹java› process.
The ▩‹-b› and ▩‹-f› options control the self-build mechanism of
Isabelle/Scala. This is only relevant for building from sources, the
official Isabelle release already includes a pre-built version of
everything required for Isabelle/jEdit.
The ▩‹-o› option is analogous to @{tool build} cite‹"isabelle-system"›,
but it takes persistent preferences into account (\secref{sec:options}).
When options are loaded, command-line options take precedence. When options
are saved, command-line options are ignored (despite subsequent changes),
but original preferences take precedence (including subsequent changes).
━
It is also possible to connect to an already running Isabelle/jEdit process
via @{tool_def jedit_client}:
@{verbatim [display] ‹Usage: isabelle jedit_client [OPTIONS] [FILES ...]
Options are:
-c only check presence of server
-n only report server name
-s NAME server name (default "Isabelle")
Connect to already running Isabelle/jEdit instance and open FILES›}
The ▩‹-c› option merely checks the presence of the server, producing a
process return-code.
The ▩‹-n› option reports the server name, and the ▩‹-s› option provides a
different server name. The default server name is the official distribution
name (e.g.\ ▩‹Isabelle2025-1›). Thus @{tool jedit_client} can connect to the
Isabelle desktop application without further options.
The ▩‹-p› option allows to override the implicit default of the system
option @{system_option_ref process_policy} for ML processes started by
the Prover IDE, e.g. to control CPU affinity on multiprocessor systems.
The JVM system property ▩‹isabelle.jedit_server› provides a different server
name, e.g.\ use ▩‹isabelle jedit -Disabelle.jedit_server=›‹name› and ▩‹isabelle jedit_client -s›~‹name› to connect later on. ›
section‹GUI rendering›
text‹
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. ›
subsection‹Portable and scalable look-and-feel›
text‹
In the past, ∗‹system look-and-feels› 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}).
Already since 2021, we are de-facto back to ∗‹portable look-and-feels›,
which also happen to be ∗‹scalable› on high-resolution displays:
▪▩‹FlatLaf Light› (or ▩‹FlatLaf macOS Light›) is enabled by default. It
generally looks good on all platforms, and works smoothly with
high-resolution displays.
▪▩‹FlatLaf Dark› (or ▩‹FlatLaf macOS Dark›) is a notable alternative. It
indicates that ∗‹dark mode› should be used for rendering in
Isabelle/jEdit, via jEdit options with suffix ``▩‹.dark›'' and Isabelle
options with suffix ``▩‹_dark›''. The panels for ∗‹Global Options› and ∗‹Plugin Options / Isabelle / Rendering› operate on options according to
the current Swing look-and-feel, e.g. on ▩‹view.fgColor.dark› in dark mode
vs. ▩‹view.fgColor› in non-dark mode.
▪▩‹Metal› still works, although it is stylistically outdated. It might
require manual adjustments of font sizes for high-resolution displays (see \secref{sec:fonts}).
Most other look-and-feels are better ignored: they look rather bad, or cause
genuine problems with GUI interaction.
Changing the look-and-feel in ∗‹Global Options~/ Appearance› updates the GUI
only partially: a full restart of Isabelle/jEdit is required to see the true
effect. ›
subsection‹Adjusting fonts \label{sec:fonts}›
text‹
The preferred font collection for Isabelle/jEdit is ▩‹Isabelle DejaVu›: 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$.
┉ Isabelle/jEdit provides various options to adjust font sizes in particular
GUI elements. Here is a summary of all relevant font properties:
▪∗‹Global Options / Text Area / Text font›: the main text area font,
which is also used as reference point for various derived font sizes,
e.g.\ the ∗‹Output› (\secref{sec:output}) and ∗‹State›
(\secref{sec:state-output}) panels.
▪∗‹Global Options / Gutter / Gutter font›: the font for the gutter area
left of the main text area, e.g.\ relevant for display of line numbers
(disabled by default).
▪∗‹Global Options / Appearance / Button, menu and label font› as well as ∗‹List and text field font›: this specifies the primary and secondary font
for the ∗‹Metal› look-and-feel.
▪∗‹Plugin Options / Isabelle / General / Reset Font Size›: the main text
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "macro" is null
relevant for quick scaling like in common web browsers.
▪∗‹Plugin Options / Console / General / Font›: the console window font,
e.g.\ relevant for Isabelle/Scala command-line. ›
chapter‹Augmented jEdit functionality›
section‹Dockable windows \label{sec:dockables}›
text‹
In jEdit terminology, a ∗‹view› is an editor window with one or more ∗‹text
areas› that show the content of one or more ∗‹buffers›. A regular view may
be surrounded by ∗‹dockable windows› that show additional information in
arbitrary format, not just text; a ∗‹plain view› does not allow dockables.
The ∗‹dockable window manager› of jEdit organizes these dockable windows,
either as ∗‹floating› windows, or ∗‹docked› panels within one of the four
margins of the view. There may be any number of floating instances of some
dockable window, but at most one docked instance; jEdit actions that address ∗‹the› dockable window of a particular kind refer to the unique docked
instance.
Dockables are used routinely in jEdit for important functionality like ∗‹HyperSearch Results› or the ∗‹File System Browser›. Plugins often provide
a central dockable to access their main functionality, which may be opened
by the user on demand. The Isabelle/jEdit plugin takes this approach to the
extreme: its plugin menu provides the entry-points to many panels that are
managed as dockable windows. Some important panels are docked by default,
e.g.\ ∗‹Documentation›, ∗‹State›, ∗‹Theories›∗‹Output›, ∗‹Query›. The user
can change this arrangement easily and persistently.
Compared to plain jEdit, dockable window management in Isabelle/jEdit is
slightly augmented according to the the following principles:
▪ Floating windows are dependent on the main window as ∗‹dialog› in
the sense of Java/AWT/Swing. Dialog windows always stay on top of the view,
which is particularly important in full-screen mode. The desktop environment
of the underlying platform may impose further policies on such dependent
dialogs, in contrast to fully independent windows, e.g.\ some window
management functions may be missing.
▪ Keyboard focus of the main view vs.\ a dockable window is carefully
managed according to the intended semantics, as a panel mainly for output or
input. For example, activating the ∗‹Output› (\secref{sec:output}) or State
(\secref{sec:state-output}) panel via the dockable window manager returns
keyboard focus to the main text area, but for ∗‹Query› (\secref{sec:query})
or ∗‹Sledgehammer›\secref{sec:sledgehammer} the focus is given to the main
input field of that panel.
▪ Panels that provide their own text area for output have an additional
dockable menu item ∗‹Detach›. This produces an independent copy of the
current output as a floating ∗‹Info› window, which displays that content
independently of ongoing changes of the PIDE document-model. Note that
Isabelle/jEdit popup windows (\secref{sec:tooltips-hyperlinks}) provide a
similar ∗‹Detach› operation as an icon. ›
section‹Isabelle symbols \label{sec:symbols}›
text‹
Isabelle sources consist of ∗‹symbols› that extend plain ASCII to allow
infinitely many mathematical symbols within the formal sources. This works
without depending on particular encodings and varying Unicode
standards.🚫‹Raw Unicode characters within formal sources compromise
portability and reliability in the face of changing interpretation of
special features of Unicode, such as Combining Characters or Bi-directional
Text.› For further explanations, see cite‹"Wenzel:2011:CICM"›.
For the prover back-end, formal text consists of ASCII characters that are
grouped according to some simple rules, e.g.\ as plain ``▩‹a›'' or symbolic
``▩‹α›''. For the editor front-end, a certain subset of symbols is rendered
physically via Unicode glyphs, to show ``▩‹α›'' as ``‹α›'', for example.
This symbol interpretation is specified by the Isabelle system distribution
in 🚫‹$ISABELLE_HOME/etc/symbols› and may be augmented by the user in 🚫‹$ISABELLE_HOME_USER/etc/symbols›.
The appendix of cite‹"isabelle-isar-ref"› gives an overview of the
standard interpretation of finitely many symbols from the infinite
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "macro" is null
``▩‹🚫›''. Overlap of Unicode characters used in symbol
interpretation with informal ones (which might appear e.g.\ in comments)
needs to be avoided. Raw Unicode characters within prover source files
should be restricted to informal parts, e.g.\ to write text in non-latin
alphabets in comments (excluding actual Greek). ›
paragraph ‹Encoding.›
text‹Technically, the Unicode interpretation of Isabelle symbols is an ∗‹encoding› called ▩‹UTF-8-Isabelle› in jEdit (∗‹not› in the underlying
JVM). It is provided by the Isabelle Base plugin and enabled by default for
all source files in Isabelle/jEdit.
Sometimes such defaults are reset accidentally, or malformed UTF-8 sequences
in the text force jEdit to fall back on a different encoding like ▩‹ISO-8859-15›. In that case, verbatim ``▩‹α›'' will be shown in the text
buffer instead of its Unicode rendering ``‹α›''. The jEdit menu operation ∗‹File~/ Reload with Encoding~/ UTF-8-Isabelle› helps to resolve such
problems (after repairing malformed parts of the text).
If the loaded text already contains Unicode sequences that are in conflict
with the Isabelle symbol encoding, the fallback-encoding UTF-8 is used and
Isabelle symbols remain in literal ▩‹🚫› form. The jEdit menu
operation ∗‹Utilities~/ Buffer Options~/ Character encoding› allows to
enforce ▩‹UTF-8-Isabelle›, but this will also change original Unicode text
into Isabelle symbols when saving the file! ›
paragraph ‹Font.› text‹Correct rendering via Unicode requires a font that contains glyphs for
the corresponding codepoints. There are also various unusual symbols with
particular purpose in Isabelle, e.g.\ control symbols and very long arrows.
Isabelle/jEdit prefers its own font collection ▩‹Isabelle DejaVu›, with
families ▩‹Serif› (default for help texts), ▩‹Sans› (default for GUI
elements), ▩‹Mono Sans› (default for text area). This ensures that all
standard Isabelle symbols are shown on the screen (or printer) as expected.
Note that a Java/AWT/Swing application can load additional fonts only if
they are not installed on the operating system already! Outdated versions of
Isabelle fonts that happen to be provided by the operating system prevent
Isabelle/jEdit to use its bundled version. This could lead to missing glyphs
(black rectangles), when the system version of a font is older than the
application version. This problem can be avoided by refraining to
``install'' a copy of the Isabelle fonts in the first place, although it
might be tempting to use the same font in other applications.
HTML pages generated by Isabelle refer to the bundled Isabelle fonts as a
server-side resource. Thus a web-browser can use that without requiring a
locally installed copy. ›
paragraph ‹Input methods.› text‹In principle, Isabelle/jEdit could delegate the problem to produce
Isabelle symbols in their Unicode rendering to the underlying operating
system and its ∗‹input methods›. Regular jEdit also provides various ways to
work with ∗‹abbreviations› to produce certain non-ASCII characters. Since
none of these standard input methods work satisfactorily for the
mathematical characters required for Isabelle, various specific
Isabelle/jEdit mechanisms are provided.
This is a summary for practically relevant input methods for Isabelle
symbols.
▸ The ∗‹Symbols› panel: some GUI buttons allow to insert certain symbols in
the text buffer. There are also tooltips to reveal the official Isabelle
representation with some additional information about ∗‹symbol
abbreviations› (see below).
▸ Copy/paste from decoded source files: text that is already rendered as
Unicode can be re-used for other text. This also works between different
applications, e.g.\ Isabelle/jEdit and some web browser or mail client, as
long as the same Unicode interpretation of Isabelle symbols is used.
▸ Copy/paste from prover output within Isabelle/jEdit. The same principles
as for text buffers apply, but note that ∗‹copy› in secondary Isabelle/jEdit
windows works via the keyboard shortcuts ▩‹C+c› or ▩‹C+INSERT›, while jEdit
menu actions always refer to the primary text area!
▸ Completion provided by the Isabelle plugin (see \secref{sec:completion}).
Isabelle symbols have a canonical name and optional abbreviations. This can
be used with the text completion mechanism of Isabelle/jEdit, to replace a
prefix of the actual symbol like ▩‹λ›, or its name preceded by backslash ▩‹\lambda›, or its ASCII abbreviation ▩‹%› by the Unicode rendering.
The following table is an extract of the information provided by the
standard 🚫‹$ISABELLE_HOME/etc/symbols› file:
Note that the above abbreviations refer to the input method. The logical
notation provides ASCII alternatives that often coincide, but sometimes
deviate. This occasionally causes user confusion with old-fashioned Isabelle
source that use ASCII replacement notation like ▩‹!› or ▩‹ALL› directly in
the text.
On the other hand, coincidence of symbol abbreviations with ASCII
replacement syntax syntax helps to update old theory sources via explicit
completion (see also ▩‹C+b› explained in \secref{sec:completion}). ›
paragraph ‹Control symbols.› text‹There are some special control symbols to modify the display style of a
single symbol (without nesting). Control symbols may be applied to a region
of selected text, either using the ∗‹Symbols› panel or keyboard shortcuts or
jEdit actions. These editor operations produce a separate control symbol for
each symbol in the text, in order to make the whole text appear in a certain
style.
To produce a single control symbol, it is also possible to complete on ▩‹\sup›, ▩‹\sub›, ▩‹\bold›, ▩‹\emph› as for regular symbols.
The emphasized style only takes effect in document output (when used with a
cartouche), but not in the editor. ›
section‹Scala console \label{sec:scala-console}›
text‹
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "macro" is null ∗‹BeanShell›, which is the official jEdit scripting language, and the
cross-platform ∗‹System› shell. Thus the console provides similar
functionality than the Emacs buffers ▩‹*scratch*› and ▩‹*shell*›.
Isabelle/jEdit extends the repertoire of the console by ∗‹Scala›, which is
the default. This is the regular Scala toplevel loop running inside the same
JVM process as Isabelle/jEdit itself. So the Scala command interpreter has
access to the JVM name space and state of the running Prover IDE
application. The default environment imports the full content of packages ▩‹isabelle› and ▩‹isabelle.jedit›.
For example, ▩‹PIDE› refers to the Isabelle/jEdit plugin object, and ▩‹view›
to the current editor view of jEdit. The Scala expression ▩‹PIDE.snapshot(view)› makes a PIDE document snapshot of the current buffer
within the current editor view: it allows to retrieve document markup in a
timeless~/ stateless manner, while the prover continues its processing.
This helps to explore Isabelle/Scala functionality interactively. Some care
is required to avoid interference with the internals of the running
application. ›
section‹Physical and logical files \label{sec:files}›
text‹
File specifications in jEdit follow various formats and conventions
according to ∗‹Virtual File Systems›, which may be also provided by plugins.
This allows to access remote files via the ▩‹https:› protocol prefix, for
example. Isabelle/jEdit attempts to work with the file-system model of jEdit
as far as possible. In particular, theory sources are passed from the editor
to the prover, without indirection via the file-system. Thus files don't
need to be saved: the editor buffer content is used directly. ›
subsection‹Local files and environment variables \label{sec:local-files}›
text‹
Local files (without URL notation) are particularly important. The file path
notation is that of the Java Virtual Machine on the underlying platform. On
Windows the preferred form uses backslashes, but happens to accept forward
slashes like Unix/POSIX as well. Further differences arise due to Windows
drive letters and network shares: thus relative paths (with forward slashes)
are portable, but absolute paths are not.
File paths in Java are distinct from Isabelle; the latter uses POSIX
notation with forward slashes on ∗‹all› platforms. Isabelle/ML on Windows
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "macro" is null ▩‹/cygdrive/c›). Environment variables from the Isabelle process may be used
freely, e.g.\ 🚫‹$ISABELLE_HOME/etc/symbols› or 🚫‹$POLYML_HOME/README›.
There are special shortcuts: 🚫‹~› for 🚫‹$USER_HOME› and 🚫‹~~› for 🚫‹$ISABELLE_HOME›.
┉ Since jEdit happens to support environment variables within file
specifications as well, it is natural to use similar notation within the
editor, e.g.\ in the file-browser. This does not work in full generality,
though, due to the bias of jEdit towards platform-specific notation and of
Isabelle towards POSIX. Moreover, the Isabelle settings environment is not
accessible when starting Isabelle/jEdit via the desktop application wrapper,
in contrast to @{tool jedit} run from the command line
(\secref{sec:command-line}).
Isabelle/jEdit imitates important system settings within the Java process
environment, in order to allow easy access to these important places from
the editor: ▩‹$ISABELLE_HOME›, ▩‹$ISABELLE_HOME_USER›, ▩‹$JEDIT_HOME›, ▩‹$JEDIT_SETTINGS›. The file browser of jEdit also includes ∗‹Favorites› for
these locations.
┉ Path specifications in prover input or output usually include formal
markup that turns it into a hyperlink (see also \secref{sec:tooltips-hyperlinks}). This allows to open the corresponding
file in the text editor, independently of the path notation. If the path
refers to a directory, it is opened in the jEdit file browser.
Formally checked paths in prover input are subject to completion
(\secref{sec:completion}): partial specifications are resolved via directory
content and possible completions are offered in a popup. ›
subsection‹PIDE resources via virtual file-systems›
text‹
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 ∗‹Favorites› menu. Environment variables like ▩‹$ISABELLE_HOME› are discussedin\secref{sec:local-files}.Virtualfile-systemsaremore special:theideaistopresentstructuredinformationlikeadirectory tree.ThefollowingURLsareofferedinthe\<^emph>\<open>Favorites\<close>menu,orby correspondingjEditactions.
text\<open> Documenttextisinternallystructuredinparagraphsandnestedlists,using notationthatissimilartoMarkdown\<^footnote>\<open>\<^url>\<open>https://commonmark.org\<close>\<close>. There are specialcontrolsymbolsforitemsofdifferentkindsoflists,corresponding to\<^verbatim>\<open>itemize\<close>,\<^verbatim>\<open>enumerate\<close>,\<^verbatim>\<open>description\<close>in{\LaTeX}.Thisisillustrated infor\<^verbatim>\<open>itemize\<close>in\figref{fig:markdown-document}.
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.