Text-based desktop environment settings

July 22, 2026 · View on GitHub

graph TB
    subgraph Settings loading order
    direction LR
        A1["1"] --- B1("Init hardcoded <include=.../> list")
        B1 --> C1("Take <include=.../> file list from the $VTM_CONFIG value or from the file it directly references")
        C1 --> G1("Take <include=.../> file list from the received DirectVT packet")
        G1 --> H1("Take <include=.../> file list from the --config' CLI option value or from the file it directly references")
    direction LR
        A2["2"] --- B2("Overlay settings from the resultant <include=.../> file list")
        B2 --> C2("Overlay settings from the $VTM_CONFIG value or from the file it directly references")
        C2 --> G2("Overlay settings from the received DirectVT packet")
        G2 --> H2("Overlay settings from the --config' CLI option value or from the file it directly references")
    end

TL;DR

The settings are stored in the DynamicXML file format, which looks like classical XML but with dynamic element refrencing and templating.
See /src/vtm.xml for example.

We call the text data in the settings file "plain XML data" even though our file format is not technically XML, but only visually resembles it.

There are two predefined settings source locations and this can be changed as needed:

<include="/etc/vtm/settings.xml"/>        <!-- Default system-wide settings source. The "/etc/..." path will be auto converted to the "%PROGRAMDATA%\..." on Windows. -->
<include="~/.config/vtm/settings.xml"/>   <!-- Default user-wise settings source. -->

The process of loading settings consists of the following steps:

  • Build an ordered list of the setting source files by looking for the root <include=.../> elements.
  • Overlay settings from the source files in the specified order.
  • Overlay settings from the value of the $VTM_CONFIG environment variable or from a settings file it directly references.
  • Overlay settings from the DirectVT config payload received from the parent process.
  • Overlay settings from the specified --config <...> CLI option value or from a settings file it directly references.

The file list is built in the following order from the following sources:

  • The settings file list from the hardcoded configuration containing a list of two files:
    <include*/>  <!-- Clear previously defined sources. Start a new list. -->
    <include="/etc/vtm/settings.xml"/>        <!-- Default system-wide settings source. The "/etc/..." path will be auto converted to the "%PROGRAMDATA%\..." on Windows. -->
    <include="~/.config/vtm/settings.xml"/>   <!-- Default user-wise settings source. -->
    ...
    
  • The settings file list from the $VTM_CONFIG environment variable value or from a settings file it directly references.
    • A case with a plain XML-data:
      • $VTM_CONFIG=<include*/><include='/path/to/override_defaults.xml'/>... - Clear the current file list and begin a new file list containing a single file '/path/to/override_defaults.xml'.
      • $VTM_CONFIG=<include='/path/to/first.xml'/><include='/path/to/second.xml'/>... - Append the current file list with the files '/path/to/first.xml' and '/path/to/second.xml'.
    • A case with a file reference:
      • $VTM_CONFIG='/path/to/override_defaults.xml' - Take the file list from the '/path/to/override_defaults.xml'.
  • The settings file list from the DirectVT config received from the parent process.
  • The settings file list from the specified --config <...> CLI option value or from a settings file it directly references.
    • A case with a plain XML-data:
      • ./vtm --config "<include*/><include='/path/to/override_defaults.xml'/>..." - Clear the current file list and begin a new file list containing a single file '/path/to/override_defaults.xml/'.
    • A case with a file reference:
      • ./vtm --config "/path/to/override_defaults.xml" - Take the file list from the '/path/to/override_defaults.xml'.

DynamicXML

DynamicXML is a configuration language based on the XML 1.1 syntax, but with substantial extensions that introduce dynamic features, templating mechanisms, and data merging logic. It is designed as a flexible and powerful format for human-written, highly efficient configuration files, allowing for data reuse, variable substitution, and a form of in-document dry principle (Don't Repeat Yourself).

Differences from Classical XML 1.1

  1. Core Syntax and Structure

    AspectDifference
    EncodingDocuments use UTF-8 encoding only.
    Allowed CharactersAny Unicode characters are permitted, including the U+0000 (null) character, which is prohibited in XML 1.1.
    EntitiesThere is no support for named XML character entities (&amp;, &lt;, etc.).
    Root ElementsThe presence of multiple root elements within a single document is allowed.
    WhitespaceNo spaces are allowed between the opening angle bracket (<) and the element name.
    SemanticsThere is no distinction between an XML-attribute and an XML-element. All attributes are treated as sub-elements.
    The notations <... name="value" />, <...><name>"value"</name></...>, and <...><name="value" /></...> all have identical meanings.
  2. Value Processing and Types

    AspectDifference
    Data TypesEach element has its own string value. All values are stored as strings. The consuming application decides on its end how to interpret them (e.g., as a number or a boolean).
    Nested ElementsEach element, in addition to its own string value, directly owns the nested elements.
    Required QuotingAll string values, except those that begin with a decimal digit, -, or #, must be enclosed in single or double quotes.
    Value FragmentationAn element's value can be fragmented and combined both after the equals sign and between the opening and closing tags.
    Whitespace HandlingContent between tags can be quoted (strict boundaries) or raw (trailing whitespace immediately before a nested or closing tag is removed).
    EscapingSpecial literals for control characters and Unicode sequences are supported (e.g., \t, \n, \e, \u{...}).

    The following literals within values have special meaning and will be expanded:

    • \a ASCII 0x07 BEL
    • \t ASCII 0x09 TAB
    • \n ASCII 0x0A LF
    • \r ASCII 0x0D CR
    • \e ASCII 0x1B ESC
    • \\ ASCII 0x5C Backslash
    • \u{XX...} or \uXX... Unicode codepoint, where XX... is the hexadecimal value.

    Note on Comments: Within an element, between the opening and closing tags, XML comments <!-- ... --> may separate value fragments or references. They are ignored during resolution and do not affect the final concatenated value.

  3. Dynamic Features: References and Templates

    AspectDifference
    Element ReferencesElements can reference the values or entire structures of other elements using relative or absolute paths. Any unquoted non-numeric value is treated as a reference.
    Inline ExpressionsPrefixing any valid element reference with a dollar sign ($) turns it into an Inline Script Expression. Instead of returning the raw text of the target element, the application evaluates its content via the host scripting engine at runtime.
    Namespacing/ScopingEach element forms its own namespace (scope).
    Value ConcatenationAn element's content may consist of several substrings and/or references combined using the vertical bar (|) operator. For quoted substrings, the vertical bar operator may be omitted.
    InheritanceAssigning references to elements makes the scopes of these elements inherited and directly accessible.
    Runtime ResolutionAll values are resolved not at the tree construction stage, but at runtime, upon application request. The application can change values within the tree during operation, thereby affecting all dependent values.
    Resolving OrderReference resolution works by recursively iterating through inherited scopes in the order they are assigned, then traversing the current scope and all surrounding parent scopes until the first element name match is found.
    Recursion and CyclesRecursive references are resolved starting from the element scope. Circular references are silently ignored.
    TemplatesThe structures of elements containing references are templates. Template instantiation is performed from inheritance sources and surrounding elements.
    Compact SyntaxA shorthand for nesting is supported: <node0/node1/thing name="value"/> is equivalent to the full tag hierarchy.
  4. Data Merging (Overlaying)

    DynamicXML files support an "overlaying" mechanism where values in an overlaid document can update values in a base document.

    Same-named ElementsUpdate Rules
    Single ElementThe values of single elements of the original structure will be updated to the values of the overlaid structure.
    List of ElementsA list of elements with the same name within a scope may start with an empty element with an asterisk postfix (<item*/>...<item .../>...<item .../>), meaning that this list will always overwrite the existing one during overlaying.
    Updating an existing list will pre-clear it if its first element is not marked with an asterisk.

Possible Structural Designs

To illustrate possible structural designs, consider the following hierarchy of elements:

  • <document> - Top-level element
    • <thing> - Second level element
      • <name> - Third level element

The following forms of element declaration are equivalent:

  • Using classical XML syntax:
    <document>
        <thing name="a">text1</thing>
        <thing name="b">text2</thing>
    </document>
    
  • Assigning a content value to an element directly using the equal sign:
    <document>
        <thing="text1" name="a"/>
        <thing="text2" name="b"/>
    </document>
    
  • Assigning a value to an element using quoted literals between the opening and closing tags:
    <document>
        <thing name="a">
            "text1"
        </thing>
        <thing name="b">
            "text2"
        </thing>
    </document>
    
  • Assigning values to sub-elements directly using the equal sign:
    <document>
        <thing>
            "text1"
            <name="a"/>
        </thing>
        <thing>
            <name="b"/>
            "text2"
        </thing>
    </document>
    
  • Fragmenting the assigned value strings:
    <document>
        <thing="t">
            "ext"
            <name>
                "a"
            </name>
            "1"
        </thing>
        <thing>
            <name>
                "b"
            </name>
            "text"
            "2"
        </thing>
    </document>
    
  • Referencing the string value from the independent element:
    <document>
        <basename="a"/>
        <thing name=basename>text1</thing>
        <thing name="b">text2</thing>
    </document>
    
  • Referencing the string value and existing sub-elements from the independent element:
    <document>
        <basething="text1" name="a"/>
        <thing=basething/>
        <thing name="b">text2</thing>
    </document>
    
  • Referencing the string value fragment and sub-elements from the independent element:
    <document>
        <basething="1" name="a"/>
        <thing="text" | basething/>
        <thing name="b">text2</thing>
    </document>
    
  • Referencing the string value fragment and sub-elements from the independent element:
    <document>
        <basething="text" name="a"/>
        <thing=basething | "1"/>
        <thing name="b">text2</thing>
    </document>
    
  • Referencing element from outer scope:
    <basething name="a"/>
    <document>
        <thing=basething | "text1"/>
        <thing name="b">text2</thing>
    </document>
    
  • Referencing the string value fragments between opening and closing tags:
    <basething="xt" name="a"/>
    <document>
        <thing> "te" | basething | "1" </thing>
        <thing name="b">text2</thing>
    </document>
    
  • Parameterized templating:
    <ThingTemplate = "text" | NumberRef>
        <name = LetterRef/>
    </ThingTemplate>
    <document>
        <thing=ThingTemplate NumberRef="1" LetterRef="a"/>
        <thing=ThingTemplate NumberRef="2" LetterRef="b"/>
    </document>
    
  • Parameterized templating from an external namespace:
    <Namespace>
        <ThingTemplate = "text" | NumberRef>
            <name = LetterRef/>
        </ThingTemplate>
    </Namespace>
    <document=Namespace>
        <thing=ThingTemplate NumberRef="1" LetterRef="a"/>
        <thing=ThingTemplate NumberRef="2" LetterRef="b"/>
    </document>
    

VTM Configuration Overview

Lua Scripting Integration

Within element values, an unquoted reference prefixed with a dollar sign (e.g., ... Expression='return "value"' element=$Expression ...) is treated as a dynamic Lua statement or function body. When resolved at runtime, vtm evaluates this Lua code within a persistent Lua state. The expression must execute a return statement.

Configuration Structure

<!-- Global namespace - Unresolved literals will try to be resolved from here. -->
<include= ... />  <!-- Ordered list of references to settings files used to form the resultant configuration. -->
...
<!-- Set of global variables. -->
<global_variable_name = variable_value/>  <!-- Globally visible variable. -->
...
<config>  <!-- Global configuration. -->
    ...
    <Counter="N = (N or 0) + 1; return 'ID_' .. N"/>
    <Element1=global_variable_name/>   <!-- Element1 references the value of /global_variable_name (three levels of indirection allowed). -->
    <Element2=/config/Element1/>       <!-- Element2 references the value of /config/Element1. -->
    <Element3="/config/Element1"/>     <!-- Element3 contains the string value "/config/Element1". -->
    <Element4=$Counter/>               <!-- Element4 is evaluated by the inline script stored in Counter. -->
    <Element5=$/config/Counter/>       <!-- Element5 is evaluated by the inline script stored in /config/Counter. -->
    ...
    <desktop>  <!-- Desktop settings. -->
        <taskbar ... >  <!-- Taskbar menu settings. -->
            ...  <!-- Taskbar settings. -->
            <item ... >  <!-- Taskbar menu item declaration. -->
                ...  <!-- Item settings. -->
            </item>
            ...  <!-- Set of taskbar menu items. -->
        </taskbar>
        ...  <!-- Desktop settings. -->
    </desktop>
    <terminal ... >  <!-- Built-in terminal configuration section. -->
        ...
    </terminal>
    <events>  <!-- The required key/mouse combination sequence can be generated on the Info page, accessible by clicking on the label in the lower right corner of the vtm desktop. -->
        <gate>  <!-- Native GUI window layer event bindings. -->
            <script="script body" on="Key+Chord" on="Another+Key+Chord" on="SomeMouseEvent" on="SomeGenericEvent"/>
            <script="script body">
                <on="Key+Chord"/>
                <on="SomeGenericEvent" source="GenericEventSourceId"/>
            </script>
            <script>
                <on="Key+Chord1"/>
                <on="Key+Chord2"/>
                raw text script body;
                raw text script body;
                ...
            </script>
            ...
        </gate>
        <desktop>  <!-- Desktop layer event bindings. -->
            <script="script body" on="Key+Chord"/>
            ...
        </desktop>
        <applet>  <!-- Application/window layer event bindings. -->
            <script="script body" on="Key+Chord"/>
            ...
        </applet>
        <terminal>  <!-- Application specific layer event bindings. -->
            <script="script body" on="Key+Chord"/>
            ...
        </terminal>
        <tile>  <!-- Application specific layer event bindings. -->
            <script="script body" on="Key+Chord"/>
            ...
            <grip> <!-- Pane's grip event bindings. -->
                <script="script body" on="Key+Chord"/>
                ...
            </grip>
        </tile>
        <defapp>  <!-- Default application event bindings (e.g., Info-Page). -->
            <script="script body" on="Key+Chord"/>
            ...
        </defapp>
    </events>
</config>

Value literals attribute=literal

All value literals containing spaces must be enclosed in double or single quotes.

Value typeFormat
RGBAHex: #rrggbbaa | Hex: 0xaarrggbb | Decimal: r,g,b,a | 256-color index: i
booleantrue | false | yes | no | 1 | 0 | on | off
stringUTF-8 text string
2D pointinteger <any_delimeter> integer
Durationinteger followed by
- ...ms for milliseconds
- ...us for microseconds
- ...ns for nanoseconds
- ...s for seconds
- ...min for minutes
- ...h for hours
- ...d for days
- ...w for weeks

Taskbar menu item configuration <config/desktop/taskbar/item ... />

AttributeDescriptionValue typeDefault value
idItem idstring
splitterNon-active menu itempresenceNot present
hiddenItem visibility on taskbarbooleanno
labelItem label textstring=id
tooltipItem tooltip textstringempty
titleApp window titlestringempty
footerApp window footerstringempty
wincoorApp window coordinates2D point
winsizeApp window size2D point
winformApp window stateundefined | normal | maximized | minimized
typeDesktop window typestringvtty
envEnvironment variable in "var=val" formatstring
cwdCurrent working directorystring
cmdDesktop window constructor argumentsstringempty
cfgConfiguration patch for dtvt-apps in XML-formatstringempty
configConfiguration patch for dtvt-appsxml-nodeempty

The menu item of DirectVT Gateway type (type="dtvt") can be additionally configured using a <config> subsection or a cfg="xml-text-data" attribute. The <config> subsection will be ignored if the cfg attribute contains a non-empty value.

The content of the cfg attribute (or <config> subsection) is passed to the dtvt-application on launch.

Desktop window type <config/desktop/taskbar/item type="..."/>

Window type
(case insensitive)
Parameter cmd=Description
vtty (default)A CUI application command line with argumentsRun a CUI application inside the Teletype Console dtvt-bridge. Usage example type="vtty" cmd="cui_app [cui_app_args...]". It is the same as type="dtvt" cmd="vtm -r vtty cui_app [cui_app_args...]".
termA CUI application command line with argumentsRun a CUI application inside the Terminal Console dtvt-bridge. Usage example type="term" cmd="cui_app [cui_app_args...]". It is the same as type="dtvt" cmd="vtm -r term cui_app [cui_app_args...]".
dtvtA DirectVT-aware application command line with argumentsRun a DirectVT-aware application inside the DirectVT Gateway. Usage example type="dtvt" cmd="dtvt_app [dtvt_app_args...]".
dttyA DirectVT-aware application command line with argumentsRun a DirectVT-aware application inside the DirectVT Gateway with TTY which has additional controlling terminal. Usage example type="dtty" cmd="dtvt_app [cui_app_args...]".
tile[ [ v[n:m:w] | h[n:m:w] ] ( id1 | nested_block , id2 | nested_block )]Run tiling window manager with layout specified in cmd. Usage example type="tile" cmd="v(h1:1(Term, Term),Term)".
n:m - Ratio between panes (default n:m=1:1).
w - Resizing grip width (default w=1).
sitecmd=@ or emptyThe attribute title="view_title" is used to set region name/title. Setting the value of the cmd attribute to @ adds numbering to the title.

The following item declarations are identical:

<item ... cmd="mc"/>
<item ... type="vtty" cmd="mc"/>
<item ... type="dtvt" cmd="vtm -r vtty mc"/>

Lua Scripting

  • Lua scripting support is designed to provide the same dynamic behavior as JavaScript on modern web pages, offering universal UI access through global objects.
  • Scripts run within a sandbox environment that is unique to each individual process and persists for the lifetime of that process.
  • The sandbox is restricted and does not have access to standard libraries such as luaopen_package, luaopen_io, luaopen_os, or luaopen_debug.
  • Scripts have universal access to the UI through global objects.

General syntax

The syntax for defining event bindings is:

<dom_element1>
    <script="script body" prerun="prerun script body" on="EventID1" ... on="preview:EventId2" ...>
        <on="EventID"/>
        <on="EventID" source="OptionalEventSourceObjectID"/>
        ...
        raw text script body
        ...
    </script>
</dom_element1>
<dom_element2 id="AdditionalIDfor_dom_element2">
    <script="script body" on="EventID"/>
</dom_element2>
TagBelongs toValueDescription
<dom_element>ObjectIDVisual tree object id.
id<dom_element>UTF-8 stringAdditional id for the visual tree object.
script<dom_element>UTF-8 stringA Lua script that will be executed when the events specified by the on tags occur.
prerunscriptUTF-8 stringA Lua script that will be executed during pre-polling prior the non-preview keyboard events specified in the on tags occur. This is mostly used to indicate that the event is not expected on the source object.
onscriptEventIDSpecific event id text string.
sourceonObjectIDVisual tree object id.

The preview: prefix of the EventID is an indication that event processing should be performed in reverse order - from the container to the nested objects. By default, the visual tree traversal order is from the nested objects to the container.

Note: Using an empty string in the script="" attribute, while specifying a non-empty event value in the on="EventID" tag, will reset all existing subscriptions for that specific EventID.

Keyboard events

Syntax:

<... on="KeyboardSpecificEvent" ...>
  or
<... on="preview:KeyboardSpecificEvent" ...>

The following keyboard-specific event delimiters/joiners are available to form a key-chord:

JoinerMeaning
+The subsequent key is in pressed state.
-The subsequent key is in released state. This joiner is allowed for the last key only.
|The separator to combine multiple key chords in a key chord list (vertical bar surrounded by at least one space on either side).

Key combinations can be of the following types:

TypeExampleDescription
GenericCtrl+AA generic key combination without distinction between left/right/numpad.
LiteralAlt+'a'A generic key combination without distinction between left/right/numpad, except for the last key represented as a single-quoted character/string generated by the key.
SpecificLeftShift+RightShiftA key combination with explicitly specified physical keys.
Scancodes0x3B+0x3CA key combination represented solely by scan codes of physical keys in hexadecimal format.

Notes:

  • Generic, literal and specific key sequences can be mixed in any order within a key chord list.
  • The required key combination sequence can be generated on the Info page, by clicking the label in the lower right corner of the vtm desktop.
  • "Literal" key combinations automatically filter out keyboard shift modifiers such as Shift/AltGr/Level5Shift.

Mouse events

Syntax:

<... on="MouseSpecificEvent" ...>
  or
<... on="preview:MouseSpecificEvent" ...>

The following formats are available for mouse-specific events:

  • Named
    <Mouse | Left | Right | LeftRight | Middle><Down | Up | [Double | Multi]Click | <Double | Multi>Press | Drag<Start | Pull | Stop | Cancel>>
  • Generic
    <Mouse><Down | Up | [Double | Multi]Click | <Double | Multi>Press | Drag<Start | Pull | Stop | Cancel>><bbb...>
    where <bbb...> is a set of 8 bits to represent mouse buttons (decimal or binary):
    Decimal <bbb...>Binary <bbb...>Corresponding mouse button(s)
    00Any button
    11Left
    201Right
    3001Middle
    40001Button4
    500001Button5
    6000001Button6
    70000001Button7
    800000001Button8
    n/a11Left+Right
    n/a111Left+Middle+Right
    n/a011Middle+Right
    n/a10000001Left+Button8
  011  Middle+Right
  ││└──────── middle is pressed
  │└───────── right is pressed
  └────────── left is not pressed
  10000001  Left+Button8
  │      └─── button8 is pressed
  └────────── left is pressed

Note: In binary <bbb...> format the trailing zeros can be omitted.

The following mouse events are tracked:

EventIDDescription
MouseDown<bbb...>Button<bbb...> pressed down.
MouseUp<bbb...>Button<bbb...> released.
MouseClick<bbb...>Press and release button<bbb...> without movement.
MouseDoublePress<bbb...>Double press by button<bbb...>.
MouseMultiPress<bbb...>Multi press by button<bbb...>.
MouseDoubleClick<bbb...>Double click by button<bbb...>.
MouseMultiClick<bbb...>Multi click by button<bbb...>.
MouseDragStart<bbb...>Drag start with button<bbb...> pressed.
MouseDragPull<bbb...>Drag pull with button<bbb...> pressed.
MouseDragStop<bbb...>Drag stop with button<bbb...> pressed.
MouseDragCancel<bbb...>Drag cancel with button<bbb...> pressed.
MouseHoverMouse hover.
MouseEnterMouse enter.
MouseLeaveMouse leave.
MouseMoveMouse move by fp2d delta.
MouseWheelWheel by fp2d delta.
MouseAnyAny mouse event.

Matching between Named and Generic formats:

Named formatGeneric formatInternal representationNotes
MouseAny0x00'00Any mouse event.
MouseDownMouseDown00x01'00Any mouse button down.
MouseUpMouseUp00x02'00Any mouse button up.
LeftClickMouseClick10x03'01Left click.
LeftRightClickMouseClick110x03'03Left + Right click.
MouseClickMouseClick00x03'00Any click.
MouseDoubleClickMouseDoubleClick00x04'00The mouse button is pressed and released twice.
MouseDoublePressMouseDoublePress00x05'00The mouse button is pressed twice and remains pressed.
MouseMultiClickMouseMultiClick00x06'00The mouse button is pressed and released several times.
MouseMultiPressMouseMultiPress00x07'00The mouse button is pressed several times and remains pressed.
MouseDragStartMouseDragStart00x08'00The mouse started moving with the button just pressed.
MouseDragPullMouseDragPull00x09'00The mouse continues to move with the button pressed.
MouseDragStopMouseDragStop00x0A'00The mouse button is released after moving while it was pressed.
MouseDragCancelMouseDragCancel00x0B'00Mouse movement with the button pressed was cancelled due to another button being pressed or canceled by the system.
MouseHover0x0C'00The mouse cursor moved to hover directly over the object.
MouseEnter0x0D'00The mouse cursor has moved inside the geometric boundaries of the object.
MouseLeave0x0E'00The mouse cursor has moved outside the geometric boundaries of the object.
MouseMove0x0F'00The mouse cursor has moved within the geometric boundaries of the object.
MouseWheel0x10'00The mouse wheel is scrolled by 2D step (to distinguish between horizontal and vertical scrolling).

Generic events

Syntax:

<... on="EventTier: Generic::Event::ID" ...>

The following generic event tiers are available for use:

EventTierDescription
general:Events that fire globally without being tied to any objects.
preview:Events typically provide previews of object property values for an upcoming release: event.
release:Events typically notify the set values of an object's properties.
request:Events typically request values of properties of an object.
anycast:Events firing on a subset of all nested objects on some branch of the visual tree.

The list of available generic event identifiers can be retrieved using the vtm.desktop.EventList() script command in the vtm --monitor environment monitoring mode or the Log Monitor command line applet.

Event sources

Visual tree objects can subscribe to events of any other environment objects using the source="..." subtag of the on="..." tag. In addition to the list of standard object names, it is possible to register custom object names.

//todo At the moment, this is only available for window menu items <menu><item id="CustomObjectId"/></menu>.

Standard object names

ObjectID/ClassIDRoleMethodsMethod description
vtmScripting context holderParentheses operator(): vtm()Retrieve event parameters.
Dot index: vtm.ObjectId/vtm.ClassIdRetrieve object refernce by ObjectId/ClassId.
keysKeyboard key propertiesvtm.keys[string key_name] -> key_recordGet keyboard key properties.
Available properties:
keycode(int): ALL (Abstract Latin Layout) specific key code
generic(string): Generic key name (no distinction between left/right/numpad)
virtcod(int): Virtual key code
scancod(int): Scancode
extflag(bool): Extended flag (abstract)
is_editkey(bool): Involvement in text editing
is_functional(bool): Functional or not
gateUser viewportvtm.gate.Disconnect()Disconnect user from the desktop.
vtm.gate.DebugOverlay(bool state)Set debug overlay.
vtm.gate.IncreaseCellHeight(int n)Increase/decrease cell height for GUI mode.
vtm.gate.RollFonts(int n)Roll by step n the list of fonts specified in the configuration.
vtm.gate.WheelAccumReset()Reset floating point step accumulator for mouse wheel.
vtm.gate.CellHeightReset()Resets the cell height to the value specified in the settings.
vtm.gate.AntialiasingMode() -> intToggle anti-aliasing mode.
vtm.gate.SetOverlay(int index, string s)Set user's console visual overlay. Remove the overlay for index index if s is empty. The overlay will be rendered behind everything (background) if index < 0.
vtm.gate.Deface()Trigger to redraw.
vtm.gate.GetViewport() -> int x, y, w, hGet user's console coodinates x, y (relative to the desktop, left-top corner) and size w, h (width and height).
windowContainer for appletn/aThe desktop container window can only be an event source.
appletRunning appletvtm.applet.Warp(int l, int r, int t, int b)Request to deform the applet window. The parameters specify four deltas for the left, right, top and bottom sides of the applet window.
vtm.applet.ZOrder() -> intRequest the current z-order state of the applet window.
vtm.applet.ZOrder(int n) -> intSet the current z-order state for the applet window. -1: backmost; 0: normal; 1: topmost.
vtm.applet.Close()Close applet window.
vtm.applet.Minimize()Minimize applet window.
vtm.applet.Maximize()Maximize applet window.
vtm.applet.Fullscreen()Fullscreen applet window.
vtm.applet.Restore()Restore applet window.
vtm.applet.GetArea() -> int x, y, w, hGet applet window area: coordinates x, y (relative to the desktop, left-top corner) and size w, h (width and height).
vtm.applet.GetTitlesHeight() -> int h, fGet the height of the applet window's header and footer: h is the header, f is the footer.
vtm.applet.LockAccess() -> intGet current applet's access lock state.
vtm.applet.LockAccess(int n)Set applet's access lock state: n==1 locked, n==0 unlocked.
gearUser mouse and keyboardvtm.gear.IsKeyRepeated() -> boolReturns true if the keyboard event is a key-repeat generated event.
vtm.gear.SetHandled()Set that the event is processed, and stop further processing.
vtm.gear.Interrupt()Interrupt the key event processing.
vtm.gear.RepeatWhilePressed(ref ObjectId)Capture the mouse by ObjectId and trigger the mouse button pressed event to repeat while pressed.
vtm.gear.Focus(ref ObjectId) -> boolSet input focus to the object. Returns true if focus is already set.
vtm.gear.Bypass() -> boolIndicates that the keyboard event being processed is not expected by this object. Used by the prerun function inside script to bypass tier::keybdrelease events. Always return true.
vtm.gear.GetCoord() -> float x, yGet mouse pointer 32-bit floating point coordinates.
desktopDesktop environmentvtm.desktop.Cleanup(bool b)Clean up temporary internal structures of the desktop environment and optionally report the state of registry objects.
vtm.desktop.EventList()Print all available generic event IDs.
vtm.desktop.Shutdown()Close all windows and shutdown the desktop.
vtm.desktop.Disconnect()Disconnect the current desktop user.
vtm.desktop.Run({ lua_table })Run the specified applet.
vtm.desktop.FocusNextWindow(int n)Set focus to the next (n=1) or previous (n=-1) desktop window.
vtm.desktop.SetOverlay(int index, string s)Set desktop visual overlay for all users. Remove overlay for index index if s is empty. The overlay will be rendered behind everything (background) if index < 0.
vtm.desktop.Deface()Trigger to redraw.
taskbarDesktop taskbarvtm.taskbar.ActivateItem()Activate the focused UI element on the taskbar.
vtm.taskbar.FocusNextItem(int n, int min_w, int max_w = intmax)Move to the next(n>0)/prev(n<0) focusable element with min_w <= weight <= max_w, skipping (std::abs(n)-1) elements with min_w <= weight <= max_w and all elements with weight < min_w.
vtm.taskbar.FocusTop()Set focus to the first (top) focusable UI element among the elements on the taskbar.
vtm.taskbar.FocusEnd()Set focus to the last (bottom) focusable UI element among the elements on the taskbar.
vtm.taskbar.ChangeWidthByStep(int n)Change the taskbar width by step n.
vtm.taskbar.GetFocusedWeight() -> int wGet the weight of the focused taskbar element.
vtm.taskbar.GetHeight() -> int h1, h2Get taskbar height (h1) and line height (h2).
tileTiling window managervtm.tile.FocusNextPaneOrGrip(int n)Set focus to the next (n=1) or previous (n=-1) tile's pane or pane splitter.
vtm.tile.FocusNextPane(int n)Set focus to the next (n=1) or previous (n=-1) tile's pane.
vtm.tile.FocusNextGrip(int n)Set focus to the next (n=1) or previous (n=-1) pane splitter.
vtm.tile.RunApplication()Run the default applet inside the selected empty panes.
vtm.tile.SelectAllPanes()Select all tile's panes.
vtm.tile.SplitPane(int axis)Split the selected panes. If axis > 0: split vertically, otherwise split horizontally.
vtm.tile.RotateSplit()Toggle pane splitter orientation.
vtm.tile.SwapPanes()Cyclically swap selected panes.
vtm.tile.EqualizeSplitRatio()Equalize split ratio.
vtm.tile.SetTitle()Set the window manager title.
vtm.tile.ClosePane()Close selected panes.
gripPane splittervtm.grip.MoveGrip(int x, int y)Move the splitter by the 2D step specified by the pair { x, y }.
vtm.grip.ResizeGrip(int n)Set splitter width to n.
vtm.grip.FocusNextGrip(int n)Set focus to the next (n=1) or previous (n=-1) tile's splitter.
terminalvtm.terminal.RequestInteractiveSessionToken()Request an interactive session token. The token will be sent to the requesting app via APC in the following format: \e_event=session;token=b4514088589a99e3\e\\.
vtm.terminal.KeyEvent({ ... })Generates a terminal key event using the specified parameters.
- keystat=...,: Pressed state. 1 - Pressed, 0 - Released.
- ctlstat=...,: Keyboard modifiers bit-field.
- virtcod=...,: Key virtual code.
- scancod=...,: Key scan code.
- keycode=...,: Physical key code.
- extflag=...,: Extended key flag.
- shifted="...",: Text cluster generated by the Shift+key.
- unshift="...",: Text cluster generated by the key without any Shift key pressed.
- cluster="...",: Text cluster actually generated by the key.
vtm.terminal.ForwardKeys()Send the last keyboard event to the terminal.
vtm.terminal.ExclusiveKeyboardMode(int n)Set/reset exclusive keyboard mode for the terminal.
vtm.terminal.FindNextMatch(int n)Highlight next/previous(n>0/n<0) match of selected text fragment. Clipboard content is used if no active selection.
vtm.terminal.ScrollViewportByPage(int x, int y)Scroll the terminal viewport page by page in the direction specified by the 2D point { x, y }.
vtm.terminal.ScrollViewportByCell(int x, int y)Scroll the terminal viewport cell by cell in the direction specified by the 2D point { x, y }.
vtm.terminal.ScrollViewportToTop()Scroll the terminal viewport to the scrollback top.
vtm.terminal.ScrollViewportToEnd()Scroll the terminal viewport to the scrollback bottom.
vtm.terminal.SendKey(string s)Send the text string s as terminal input.
vtm.terminal.Print(auto args, ...)Print the specified args to the terminal scrollback buffer.
vtm.terminal.PrintLn(auto args, ...)Print the specified args and move the text cursor to the next line.
vtm.terminal.CopyViewport()Copy terminal viewport to the clipboard.
vtm.terminal.CopySelection()Copy selected lines or the current line to the clipboard.
vtm.terminal.PasteClipboard()Paste from clipboard.
vtm.terminal.ClearClipboard()Reset clipboard.
vtm.terminal.ClipboardFormat(int n)Set the terminal text selection copy format.
n=0: Disabled
n=1: Plain text
n=2: ANSI
n=3: RTF
n=4: HTML
n=5: Sensitive plain text.
vtm.terminal.ClipboardFormat() -> intGet the current terminal text selection copy format.
vtm.terminal.SelectionForm(int n)Set selection form. n=0: linear form; n=1: boxed form.
vtm.terminal.SelectionForm() -> intGet the current selection form.
vtm.terminal.ClearSelection()Deselect a selection.
vtm.terminal.OneShotSelection()One-shot toggle to copy text while mouse tracking is active. Keep selection if Ctrl key is pressed.
vtm.terminal.UndoReadline()(Win32 Cooked/ENABLE_LINE_INPUT mode only) Discard the last input.
vtm.terminal.RedoReadline()(Win32 Cooked/ENABLE_LINE_INPUT mode only) Discard the last Undo command.
vtm.terminal.CwdSync(int n)Set the current working directory sync mode.
vtm.terminal.CwdSync() -> intGet the current working directory sync mode.
vtm.terminal.LineWrapMode(int n)Set the current line wrapping mode. Applied to the active selection if it is.
n=0: line wrapping is off
n=1: line wrapping is on.
vtm.terminal.LineWrapMode() -> intGet the current line wrapping mode.
vtm.terminal.LineAlignMode(int n)Set the current line aligning mode. Applied to the active selection if it is.
n=0: left
n=1: right
n=2: center.
vtm.terminal.LineAlignMode() -> intGet the current line aligning mode.
vtm.terminal.LogMode(int n)Set the current terminal logging mode on/off.
vtm.terminal.LogMode() -> intGet the current terminal logging mode state.
vtm.terminal.AltbufMode(bool m)Enable/disable the alternate buffer mode (DECSET/DECRST 1049).
vtm.terminal.AltbufMode() -> boolReturns true if the alternate buffer is active.
vtm.terminal.ClearScrollback()Clear the terminal scrollback buffer.
vtm.terminal.ScrollbackSize() -> int n, m, qGet the current scrollback buffer parameters (three integer values):
n Initial buffer size
m Grow step
q Grow limit.
vtm.terminal.ScrollbackSize(int n, int m, int q)Set scrollback buffer parameters:
n Initial buffer size
m Grow step
q Grow limit.
vtm.terminal.SetBackground()Set the default SGR attributes for the scrollback buffer using the current state of the SGR attributes.
vtm.terminal.ScrollbackPadding() -> int nGet scrollback buffer left and right side padding.
vtm.terminal.ScrollbackPadding(int n)Set scrollback buffer left and right side padding to n cells from 0 to 255.
vtm.terminal.TabLength() -> int nGet tab length in cells.
vtm.terminal.TabLength(int n)Set tab length to n cells from 1 to 256. Default is 8.
vtm.terminal.RightToLeft() -> int mGet text right-to-left mode.
vtm.terminal.RightToLeft(int m)Set text right-to-left mode.
vtm.terminal.ResetAttributes()Reset scrollback buffer attributes (SGR attributes, line wrapping, scrollback buffer padding, line alignment, cursor form, selection copy format).
vtm.terminal.EventReporting(string args, ...)Enable event reporting for the specified sources:
"keyboard" Keyboard events
"mouse" Mouse events
"focus" Focus events
"format" Line format events
"clipboard" Clipboard events
"window" Window size and selection events
"system" System signals
"" Switch event reporting off.
vtm.terminal.EventReporting()Get a list of active event sources.
vtm.terminal.CodePage(int n)Set input/output code page (it only makes sense on Windows).
vtm.terminal.CodePage() -> int nGet current input/output code page (it only makes sense on Windows).
vtm.terminal.Restart()Restart the current terminal session.
vtm.terminal.Quit()Close terminal.

Note: The global variable terminal (in the Lua namespace) is an alias for vtm.terminal.

Examples

Key bindings:

ConfigurationInterpretation
<script=ScriptReference on="KeyChord"/>Append existing bindings using an indirect reference (the ScriptReference variable without quotes).
<script="..." on="KeyChord"/>Append existing bindings with the directly specified Lua script body.
<script="..." on="KeyChord | AnotherChord"/>Append existing bindings for KeyChord | AnotherChord.
<script="..."><on="KeyChord" source="ObjectID"/></script>Binding to an event source using a specific ObjectID.
<script="" on="KeyChord"/>Remove all existing bindings for the specified key combination KeyChord.
<script="..." on="KeyChord" prerun="if (something) vtm.gear.Bypass() end"/>Bypass the KeyChord event if something. Works only with non-preview KeyChords.
<script="..." on="" />Do nothing.

EventId's:

EventIdDescription
on="MouseEnter"Mouse enter.
on="MouseLeave"Mouse leave.
on="MouseMove"Mouse move.
on="MouseWheel"Mouse wheeling by fp2d step (hz/vt).
on="MouseDown1"The left button is pressed down.
on="MouseUp1"The left button is released.
on="preview:MouseDown01"The right button is pressed down (preview phase).
on="MouseClick"Any button click.
on="MouseClick1"Left button click.
on="LeftClick"Left button click.
on="MouseClick01"Right button click.
on="MouseClick2"Right button click.
on="MouseClick3"Middle button click.
on="MouseClick11"Left+Right button click.
on="MouseDoublePress1"Double click (and hold pressed) by the left button.
on="MouseDoubleClick1"Double click (and release) by the left button.
on="MouseDragStart11"Drag start with Left and Right mouse buttons pressed.
on="MouseDragPull11"Dragging with Left and Right mouse buttons pressed.
on="MouseDragStop11"Release Left and Right mouse buttons after dragging.
on="MouseDragCancel11"The current dragging was interrupted for some reason, such as pressing additional mouse buttons.
on="Enter"The Enter key was pressed.
on="preview:Enter"The Enter key was pressed (detected in a preview phase).
on="Ctrl+B"The Ctrl+B key combination was pressed.
on="-Ctrl"The Ctrl key was released.
on="Esc-F10"The Esc-F10 key combination was released.
on="general: e2::timer::any"Timer event, related to the current frame rate, usually about 60 times per second.

Receiving the DirectVT Configuration Payload

The value of the cfg menu item attribute (or the entire <config> subsection) is passed to the child dtvt-aware process upon launch. The child process receives these operational parameters via an inter-process communication channel.

  • settings.xml:
    <config>
      ...
      <desktop>
        <taskbar>
          ...
          <item ... title="DirectVT-aware Application" type="dtvt" ... cfg="plain xml data as alternative to <config> subsection" cmd="dtvt_app...">
            <config> <!-- item's `<config>` subsection in case of 'cfg=' is not specified -->
              ...
            </config>
          </item>
          ...
        </taskbar>
      </desktop>
      ...
    </config>
    

UI Localization

The vtm user interface can be localized into any language by providing translations for existing UI templates and assigning the required language ID to the root <Ns=.../> element to ensure patch inheritance.

Vtm UI has the following built-in localizations:

  • en-US US English
  • pt-BR Brazilian Portuguese
  • ru-RU Russian

For example:

  • To activate the pt-BR interface with fallback to en-US for the desktop:
    Add the following record to your ~/.config/vtm/settings.xml:

    <Ns=en-US|pt-BR/>  <!-- Brazilian Portuguese with fallback to US English -->
    <!-- the rest of your configuration...
       <config>
       ...
       </config>
    -->
    
  • To activate the ru-RU interface for the built-in terminal:

    vtm --config "<Ns=en-US|ru-RU/>" --run term
    

To create your own translation for vtm, copy the subsection <Ns><en-US>...</en-US></Ns> to, say, <Ns><it-IT>...</it-IT></Ns>, and translate the quoted string values. Then you need to update the reference for the literal lookup from <Ns=en-US> to <Ns=en-US|it-IT>. As a result, you will get a configuration like this:

...
<Ns=en-US|it-IT>  <!-- Set localization to "it-IT" with fallback to "en-US". -->
    <en-US>
        <Taskbar>
            <Apps label="apps"/>
        </Taskbar>
        ...
    </en-US>
    <it-IT>
        <Taskbar>
            <Apps label="programmi"/>
        </Taskbar>
        ...
    </it-IT>
<Ns>
...

Configuration example

Minimal configuration

~/.config/vtm/settings.xml:

<config>
    <desktop>
        <taskbar selected="Term" item*>  <!-- Use asterisk to remove previous/existing items from the list. -->
            <item id="Term"/>  <!-- id=Term title="Term" type="vtty" cmd="os_default_shell" -->
        </taskbar>
    </desktop>
</config>

Typical configuration

Notes

  • Hardcoded settings can be found in the source file /src/vtm.xml.
  • The $0 tag will be expanded to the fully qualified current module filename at runtime.
<include*/>  <!-- Ordered list of <include="/path/to/settings.xml"/>. Clear previously defined include paths to start a new list. Settings are loaded and overlaid in the specified order. -->
<include="/etc/vtm/settings.xml"/>        <!-- System-wide default settings. The "/etc/..." path is automatically mapped to "%PROGRAMDATA%\..." on Windows. -->
<include="~/.config/vtm/settings.xml"/>   <!-- User-specific default settings. -->

<!-- Application configuration. -->
<config=/Colors | /Scripting | /Macro>  <!-- Include additional namespaces: "/Colors", "/Scripting", and "/Macro". -->
    <gui>  <!-- GUI-specific settings (currently win32 platform only). -->
        <antialiasing=on/>    <!-- Glyph antialiasing. Note: Multi-layered color glyphs (e.g., emojis) are always antialiased. -->
        <cellheight=21/>      <!-- Text cell height in physical pixels. Note: Cell width is determined by the primary font (the first in the list). -->
        <gridsize=""/>        <!-- Initial window grid size as "width,height" in text cells. If empty or "0,0", the OS window manager determines the size. -->
        <wincoor=""/>         <!-- Initial window coordinates "x,y" (top-left corner in physical pixels). If empty, the OS window manager determines the position. -->
        <winstate="normal"/>  <!-- Initial window state: "normal" | "maximized" | "minimized". -->
        <blinkrate=400ms/>    <!-- Cursor/text blink rate (SGR 5/6). Set to zero to disable blinking. -->
        <quality=80/>         <!-- 1-100: JPEG compression quality for raster graphics preview. -->
        <fonts>  <!-- Ordered font fallback list. Other available system fonts will be loaded dynamically. -->
            <font*/>  <!-- Clear previously defined fonts to start a new list. -->
            <font="Cascadia Mono"/>  <!-- Primary font: the first in the list. Its metrics define the cell geometry and set the default axis values for all subsequent fonts in the fallback list. -->
            <font="Courier New"/>
            <font="NSimSun"/>
            <font="Noto Sans Devanagari"/>
            <!-- You can specify base axis values for each of the four font styles supported by the primary font:
                'regular', 'bold', 'italic', and 'bold_italic'. -->
            <!-- If no values are provided, the primary font family defaults will be used. -->
            <!-- To view the list of available system fonts and their supported axes, use the 'vtm \-\-fontlist' command. -->
            <regular     wdth="100"        wght="350"        ital="0"          />
            <italic      wdth=regular/wdth wght=regular/wght ital="1"          />
            <bold        wdth=regular/wdth wght="700"        ital=regular/ital />
            <bold_italic wdth=regular/wdth wght=bold/wght    ital=italic/ital  />
            <!-- [wdth]: 50-200 (percentage). Typical values: 75% for 'Condensed', 100% for 'Normal', 150% for 'Extended'. -->
            <!-- [wght]: 1-1000 (weight units). Typical values: 400 for 'Regular', 700 for 'Bold', 900 for 'Black'. -->
            <!-- [ital]: 0-1 (boolean). Switch between Roman (0, upright) and true italic letterforms (1). -->
            <!-- [slnt]: -90 to +90 (degrees). Vertical tilt angle. -->
            <!-- [GRAD]: Grade: Modifies the optical weight without changing glyph width. -->
            <!-- [SOFT]: Softness: Adjusts corner rounding. -->
            <!-- [SERF]: Serif Shape: Modifies the shape or size of serifs. -->
            <!-- [... ]: ... -->
        </fonts>
    </gui>
    <cursor>
        <style="bar"/>  <!-- Cursor shape: "bar" | "block" | "underline" ( |  █  _ ). -->
        <blink=400ms/>  <!-- Cursor blink interval. Set to zero for a steady cursor. -->
        <show=true/>
        <color fgc=DefaultColor bgc=DefaultColor/>  <!-- Cursor colors. By default, the cursor background color (bgc) is automatically set to black or white based on the brightness of the underlying text. -->
    </cursor>
    <tooltips>  <!-- Tooltips (currently not implemented in GUI mode). -->
        <timeout=400ms/>
        <enabled=true/>
        <color fgc=pureblack bgc=purewhite/>
    </tooltips>
    <debug>
        <logs=false/>     <!-- Enable logging. Use the "Logs" app or vtm monitor mode (vtm -m) to view the output. -->
        <overlay=false/>  <!-- Enable debug overlay. -->
        <regions=false/>  <!-- Highlight UI object boundaries for debugging. -->
    </debug>
    <clipboard>
        <preview enabled=false size=80,25>  <!-- Clipboard preview (currently not implemented in GUI mode). -->
            <color fgc=whitelt bgc=bluedk/>
            <alpha=0xFF/>  <!-- Preview transparency (alpha). Only applies to ANSI, Rich, and HTML clipboard formats. -->
            <timeout=3s/>  <!-- Preview display duration. Set to zero to keep visible. -->
            <shadow=3  />  <!-- Preview shadow intensity (0-5). -->
        </preview>
        <format="html"/>  <!-- Default clipboard format for captures: "text" | "ansi" | "rich" | "html" | "protected". -->
    </clipboard>
    <colors>  <!-- Along with fgc, bgc, and txt, other SGR attributes (boolean) are supported: itc (italic), bld (bold), und (underline), inv (reverse), ovr (overline), and blk (blink). -->
        <window   fgc=whitelt   bgc= #404040          />  <!-- Background color for unfocused windows. -->
        <focus    fgc=purewhite bgc= #3A528E          />  <!-- Background color for focused windows. -->
        <brighter fgc=purewhite bgc=purewhite alpha=60/>  <!-- Highlights (used for brightening UI elements). -->
        <shadower               bgc= #202020B4        />  <!-- Shadows (used for dimming UI elements). -->
        <warning  fgc=whitelt   bgc=yellowdk          />  <!-- Warning state color. -->
        <danger   fgc=whitelt   bgc=purered           />  <!-- Danger/Error state color. -->
        <action   fgc=whitelt   bgc=greenlt           />  <!-- Success/Action state color. -->
    </colors>
    <timings>
        <fps=60/>  <!-- Frame rate limit (FPS). Maximum frequency for UI rendering updates. -->
        <kinetic>  <!-- Kinetic scrolling parameters. -->
            <spd       = 10  />  <!-- Initial speed (delta R). -->
            <pls       = 167 />  <!-- Initial speed (delta T). -->
            <ccl       = 120 />  <!-- Duration in milliseconds. -->
            <spd_accel = 1   />  <!-- Speed acceleration. -->
            <ccl_accel = 30  />  <!-- Additional duration (ms) for accelerated movement. -->
            <spd_max   = 100 />  <!-- Maximum speed limit. -->
            <ccl_max   = 1000/>  <!-- Maximum duration limit (ms). -->
        </kinetic>
        <switching     = 200ms/>  <!-- Transition duration for UI state changes. -->
        <deceleration  = 2s   />  <!-- Deceleration duration for moving UI elements. -->
        <leave_timeout = 1s   />  <!-- Interaction timeout (e.g., how long a scrollbar remains active after the mouse leaves). -->
        <repeat_delay  = 500ms/>  <!-- Key/button repeat delay. -->
        <repeat_rate   = 30ms />  <!-- Key/button repeat rate. -->
        <dblclick      = 500ms/>  <!-- Double-click speed threshold. -->
        <wheelrate     = 3    />  <!-- Lines per mouse wheel step (Unix-like platforms only). -->
    </timings>
    <desktop>  <!-- Desktop client settings. -->
        <viewport coor=0,0/>  <!-- Initial viewport position for the first connected user. During runtime, this value is temporarily updated with the last disconnected user's coordinates to restore their session view on reconnection. -->
        <windowmax=3000x2000/>  <!-- Maximum grid size (width x height) in text cells. -->
        <macstyle=false/>  <!-- Window control button placement. "0/no/false": right side (Windows-style); "1/yes/true": left side (macOS-style). -->
        <taskbar wide=false selected="Term">  <!-- Taskbar menu. "wide": toggle between wide or compact layout; "selected": ID of the initially selected menu item. -->
            <item*/>  <!-- Clear all previously defined items to start a new list. -->
            <item splitter  label=/Ns/Taskbar/Apps/label tooltip=/Ns/Taskbar/Apps/tooltip/>
            <item id="Term" label=/Ns/Taskbar/Terminal/label type="dtvt" title=/Ns/Taskbar/Terminal/title cmd="\$0 -r term"            tooltip=/Ns/Taskbar/Terminal/tooltip/>
            <item id="Tile" label=/Ns/Taskbar/Tile/label     type="tile" title=/Ns/Taskbar/Tile/title     cmd="h1:1(Term, Term)"      tooltip=/Ns/Taskbar/Tile/tooltip/>
            <item id="Site" label=/Ns/Taskbar/Site/label     type="site" title=/Ns/Taskbar/Site/title     cmd="@" winform="maximized" tooltip=/Ns/Taskbar/Site/tooltip/>  <!-- cmd="@" is a directive for auto-numbering instances. -->
            <item id="Logs" label=/Ns/Taskbar/Logs/label     type="dtvt" title=/Ns/Taskbar/Logs/title     cmd="\$0 -q -r term \$0 -m"   tooltip=/Ns/Taskbar/Logs/tooltip>
                <config>
                    <terminal>
                        <scrollback>
                            <size=50000/>
                            <wrap=false/>
                        </scrollback>
                        <menu item*>
                            <autohide=/Menu/Defaults/autohide/>
                            <slim=/Menu/Defaults/slim/>
                            <item=/Menu/Buttons/AlwaysOnTop/>
                            <item=/Menu/Buttons/LockAccess/>
                            <item=/Menu/Buttons/FindPrev/>
                            <item=/Menu/Buttons/FindNext/>
                            <item=/Menu/Buttons/NoWrapMode/>
                            <item=/Menu/Buttons/ClipboardFormat/>
                            <item=/Menu/Buttons/ClearScrollback/>
                        </menu>
                    </terminal>
                </config>
            </item>
            <autorun run*>  <!-- List of menu items to launch automatically: -->
                <!--  <run*/>             -->
                <!--  <run id="Term" winsize=80,25  wincoor=92,31 winform="minimized" />  -->  <!-- Note: Autorun only supports the "minimized" value for winform. -->
                <!--  <run id="Term" winsize=80,25  wincoor=8,31 />                       -->
                <!--  <run id="Term" winsize=164,25 wincoor=8,4 focused />                -->
            </autorun>
            <width>  <!-- Taskbar width settings. -->
                <folded=18/>
                <expanded=41/>
            </width>
            <timeout=250ms/>  <!-- Taskbar collapse delay after the mouse leaves. -->
            <colors>
                <bground  fgc=whitedk bgc= #202020C0 />  <!-- Set alpha to FF (e.g., #202020FF) to disable acrylic/transparency effects in the taskbar. -->
                <focused  fgc=puregreen              />  <!-- Focused item color. -->
                <selected fgc=whitelt                />  <!-- Selected item color. -->
                <active   fgc=whitelt                />  <!-- Color of running application items. -->
                <inactive fgc=blacklt bgc=Transparent/>  <!-- Color of blocked/unavailable items (e.g., when an app is maximized by another user). -->
            </colors>
        </taskbar>
        <panel>  <!-- Desktop info panel. -->
            <env=""/>    <!-- Environment variables block. -->
            <cmd=""/>    <!-- Command-line to execute on activation. -->
            <cwd=""/>    <!-- Working directory. -->
            <height=1/>  <!-- Reserved space at the top of the desktop. -->
        </panel>
        <background>  <!-- Desktop background settings. -->
            <color fgc=whitedk bgc= #00007fFF/>  <!-- Background color. -->
            <tile=""/>                           <!-- Optional: Truecolor ANSI-art for the background. -->
        </background>
    </desktop>
    <terminal>  <!-- Base settings for the built-in terminal. These can be partially overridden via the menu item's "config" argument. -->
        <sendinput=""/>  <!-- Text to send to the terminal on startup. E.g., sendinput="echo \"test\"\n". -->
        <cwdsync=" cd $P\n"/>  <!-- Command for syncing the working directory. When "Sync" is active, $P (case-sensitive) is replaced with the path from the OSC 9;9 notification. Prefixed with a space to exclude it from the shell history. -->
        <scrollback>
            <size=100000   />   <!-- Initial scrollback buffer size (in lines). -->
            <growstep=0    />   <!-- Scrollback buffer growth step. If set to zero, the buffer behaves as a ring buffer. -->
            <growlimit=0   />   <!-- Scrollback buffer growth limit. Once reached, the buffer acts as a ring buffer. If zero, the limit equals the initial size. -->
            <maxline=65535 />   <!-- Maximum line length. Lines exceeding this limit will be split. -->
            <wrap=true     />   <!-- Enable or disable line wrapping. -->
            <reset onkey=true onoutput=false/>  <!-- Conditions to reset the scrollback viewport position to the bottom. -->
            <altscroll=true/>   <!-- Enable alternate scroll mode (e.g., for mouse wheel support in man/vim). -->
            <oversize=0    />   <!-- Horizontal scrollback padding (left and right). -->
        </scrollback>
        <colors>  <!-- Terminal color palette. -->
            <color0  = pureblack  />
            <color1  = reddk      />
            <color2  = greendk    />
            <color3  = yellowdk   />
            <color4  = bluedk     />
            <color5  = magentadk  />
            <color6  = cyandk     />
            <color7  = whitedk    />
            <color8  = blacklt    />
            <color9  = redlt      />
            <color10 = greenlt    />
            <color11 = yellowlt   />
            <color12 = bluelt     />
            <color13 = magentalt  />
            <color14 = cyanlt     />
            <color15 = whitelt    />
            <default fgc=whitedk bgc=pureblack/>  <!-- Default terminal colors (SGR 39/49, set by OSC 10/11). -->
            <match fx="color" fgc=whitelt bgc= #007F00/>  <!-- Appearance of selected text matches. Available shaders (fx): "xlight", "color", "invert", "reverse". -->
            <selection>
                <text      fx="color" inv=true bgc=whitelt fgc=bluelt/>  <!-- Selection highlighting for plaintext clipboard mode. -->
                <protected fx="color" inv=true bgc=whitelt fgc=bluelt/>  <!-- Notes: -->
                <ansi      fx="color" inv=true bgc=whitelt fgc=bluelt/>  <!--   - inv=true ensures that the embedded image becomes translucent (see AnyPlex Protocol). -->
                <rich      fx="color" inv=true bgc=whitelt fgc=bluelt/>  <!--   - bgc and fgc attributes only apply when fx="color".            -->
                <html      fx="color" inv=true bgc=whitelt fgc=bluelt/>
                <none      fx="color" inv=true bgc=whitedk fgc=blacklt/>  <!-- Appearance of an inactive selection. -->
            </selection>
            <names=/X11ColorNames>  <!-- Color name mappings for OSC 4, 10-12. -->
                <!--  <name="New Dark Orange" rgb= #FF8C00 /> -->
            </names>
        </colors>
        <border=0/>  <!-- Terminal window left and right padding (border width). -->
        <tablen=8/>  <!-- Tab stop length. -->
        <menu item*>
            <autohide=/Menu/Defaults/autohide/>
            <slim=/Menu/Defaults/slim/>
            <item=/Menu/Buttons/AlwaysOnTop/>
            <item=/Menu/Buttons/LockAccess/>
            <item=/Menu/Buttons/FindPrev/>
            <item=/Menu/Buttons/FindNext/>
            <item=/Menu/Buttons/ExclusiveKeyboard/>
            <item=/Menu/Buttons/NoWrapMode/>
            <item=/Menu/Buttons/ClipboardFormat/>
            <item=/Menu/Buttons/StdioLog/>
            <item=/Menu/Buttons/ClearScrollback/>
            <item=/Menu/Buttons/Restart/>
        </menu>
        <selection>
            <mode=/Terminal/selection/mode/>  <!-- Default clipboard copy format: "text", "ansi", "rich", "html", "protected", or "none". -->
            <rect=/Terminal/selection/rect/>  <!-- Preferred selection form: true (Rectangular/Block), false (Linear). -->
        </selection>
        <atexit="auto"/>  <!-- Action to take after the last console process terminates:
                                "auto":    Stay open and prompt if the exit code is non-zero (default).
                                "ask":     Always stay open and prompt.
                                "close":   Always close the window.
                                "restart": Automatically restart the session.
                                "retry":   Restart the session only if the exit code is non-zero. -->
    </terminal>
    <tile>
        <menu item*>
            <autohide=/Menu/Defaults/autohide/>
            <slim=/Menu/Defaults/slim/>
            <item=/Menu/Buttons/AlwaysOnTop/>
            <item=/Menu/Buttons/LockAccess/>
            <item label="   +   " tooltip=/Ns/Tile/RunApplication/tooltip     script=OnLeftClick|TileRunApplication    />
            <item label="  :::  " tooltip=/Ns/Tile/SelectAllPanes/tooltip     script=OnLeftClick|TileSelectAllPanes    />
            <item label="   │   " tooltip=/Ns/Tile/SplitHorizontally/tooltip  script=OnLeftClick|TileSplitHorizontally />
            <item label="  ──  "  tooltip=/Ns/Tile/SplitVertically/tooltip    script=OnLeftClick|TileSplitVertically   />
            <item label="  ┌┘  "  tooltip=/Ns/Tile/SplitOrientation/tooltip   script=OnLeftClick|TileSplitOrientation  />
            <item label="  <->  " tooltip=/Ns/Tile/SwapPanes/tooltip          script=OnLeftClick|TileSwapPanes         />
            <item label="  >|<  " tooltip=/Ns/Tile/EqualizeSplitRatio/tooltip script=OnLeftClick|TileEqualizeSplitRatio/>
            <item label='  "…"  ' tooltip=/Ns/Tile/SetManagerTitle/tooltip    script=OnLeftClick|TileSetManagerTitle   />
            <item label="  ×  "   tooltip=/Ns/Tile/ClosePane/tooltip          script=OnLeftClick|TileClosePane         />
            <!-- <item label="  <  "   tooltip=" Focus the previous pane or the split grip " script=OnLeftClick|TileFocusPrev    /> -->
            <!-- <item label="  >  "   tooltip=" Focus the next pane or the split grip "     script=OnLeftClick|TileFocusNext    /> -->
            <!-- <item label="  <-  "  tooltip=" Focus the previous pane "                   script=OnLeftClick|TileFocusPrevPane/> -->
            <!-- <item label="  ->  "  tooltip=" Focus the next pane "                       script=OnLeftClick|TileFocusNextPane/> -->
        </menu>
    </tile>
    <defapp>
        <menu=/Menu/Defaults>
        </menu>
    </defapp>
    <events>  <!-- Key combination sequences can be generated on the "Info" page, accessible by clicking the label in the lower-right corner of the vtm desktop. -->
        <gate script*>  <!-- "User gate" / "standalone app" bindings. Use 'script*' to clear all previous bindings and start a new list. -->
            <script=IncreaseCellHeight     on="CapsLock+UpArrow"                 />
            <script=DecreaseCellHeight     on="CapsLock+DownArrow"               />
            <script=ResetCellHeight        on="Esc+0"                            />
            <script=ToggleAntialiasingMode on="Ctrl+CapsLock"                    />
            <script=RollFontsBackward      on="Ctrl+Shift+F11"                   />
            <script=RollFontsForward       on="Ctrl+Shift+F12"                   />
            <script=ResetWheelAccumulator  on="preview:-Ctrl"                    />
            <script=ToggleDebugOverlay     on="Space-Backspace | Backspace-Space"/>
        </gate>
        <desktop script*>  <!-- Desktop-level bindings. -->
            <script=FocusTaskbar    on="Esc+F1"       />
            <script=FocusPrevWindow on="Ctrl+PageUp"  />
            <script=FocusNextWindow on="Ctrl+PageDown"/>
            <script=Disconnect      on="Shift+F7"     />
            <script=TryToQuit       on="preview:F10"  />
            <script=RunApplication  on="Alt+Shift+N"  />
            <script=RunInfoPage     on="Esc+I"        />
        </desktop>
        <taskbar=desktop script*>  <!-- Taskbar bindings ("=desktop": includes desktop-level bindings). -->
            <script=FocusTaskbar          on="-Esc | -Alt"/>
            <script=FocusLeftTaskbarItem  on="LeftArrow"/>
            <script=FocusRightTaskbarItem on="RightArrow"/>
            <script=FocusPrevTaskbarItem  on="UpArrow"/>
            <script=FocusNextTaskbarItem  on="DownArrow"/>
            <script=FocusPrevTaskbarPage  on="PageUp"/>
            <script=FocusNextTaskbarPage  on="PageDown"/>
            <script=FocusPrevTaskbarGroup on="Shift+Tab"/>
            <script=FocusNextTaskbarGroup on="Tab"/>
            <script=FocusTaskbarTop       on="Home"/>
            <script=FocusTaskbarEnd       on="End"/>
            <script=DecreaseTaskbarWidth  on="Ctrl+LeftArrow"/>
            <script=IncreaseTaskbarWidth  on="Ctrl+RightArrow"/>
            <script=ActivateTaskbarItem   on="Space | Enter"/>
        </taskbar>
        <window script*>  <!-- Desktop window bindings. A "window" is a resizable/movable container for applets and serves as an event source for window-specific actions. -->
        </window>
        <applet script*>  <!-- Applet bindings. Applets can be hosted by a window, a window manager (aka "tile"), or run as standalone applications (OS-level processes). -->
            <script=AlwaysOnTopApplet     on="Esc+T"                                              />
            <script=CloseApplet           on="Esc+W"                                              />
            <script=MinimizeApplet        on="Esc+M"                                              />
            <script=RestoreApplet         on="Esc+F10"                                            />
            <script=MaximizeApplet        on="Esc+F11"                                            />
            <script=FullscreenApplet      on="Esc+F12"                                            />
            <script=MoveAppletLeft        on="Esc+LeftArrow"                                      />
            <script=MoveAppletRight       on="Esc+RightArrow"                                     />
            <script=MoveAppletUp          on="Esc+UpArrow"                                        />
            <script=MoveAppletDown        on="Esc+DownArrow"                                      />
            <script=MoveAppletTopLeft     on="Esc+LeftArrow+UpArrow    | Esc+UpArrow+LeftArrow"   />
            <script=MoveAppletBottomLeft  on="Esc+LeftArrow+DownArrow  | Esc+DownArrow+LeftArrow" />
            <script=MoveAppletTopRight    on="Esc+RightArrow+UpArrow   | Esc+UpArrow+RightArrow"  />
            <script=MoveAppletBottomRight on="Esc+RightArrow+DownArrow | Esc+DownArrow+RightArrow"/>
            <script=IncreaseAppletWidth   on="Esc+LeftArrow+RightArrow"                           />
            <script=DecreaseAppletWidth   on="Esc+RightArrow+LeftArrow"                           />
            <script=IncreaseAppletHeight  on="Esc+UpArrow+DownArrow"                              />
            <script=DecreaseAppletHeight  on="Esc+DownArrow+UpArrow"                              />
        </applet>
        <tile script*>
            <script=TileFocusPrev          on="Ctrl+PageUp"    />
            <script=TileFocusNext          on="Ctrl+PageDown"  />
            <script=TileFocusPrevPane      on=""               />
            <script=TileFocusNextPane      on=""               />
            <script=TileRunApplication     on="Alt+Shift+N"    />
            <script=TileSelectAllPanes     on="Alt+Shift+A"    />
            <script=TileSplitHorizontally  on="Alt+'|'"        />
            <script=TileSplitVertically    on="Alt+Shift+Minus"/>
            <script=TileSplitOrientation   on="Alt+Shift+R"    />
            <script=TileSwapPanes          on="Alt+Shift+S"    />
            <script=TileEqualizeSplitRatio on="Alt+Shift+E"    />
            <script=TileSetManagerTitle    on="Alt+Shift+F2"   />
            <script=TileClosePane          on="Alt+Shift+W"    />
            <grip script*>
                <script=TileMoveGripLeft      on="LeftArrow"             />
                <script=TileMoveGripRight     on="RightArrow"            />
                <script=TileMoveGripUp        on="UpArrow"               />
                <script=TileMoveGripDown      on="DownArrow"             />
                <script=TileDecreaseGripWidth on="'-'"                   />
                <script=TileIncreaseGripWidth on="'+' | '=' | NumpadPlus"/>
                <script=TileFocusPrevGrip     on="Shift+Tab"             />
                <script=TileFocusNextGrip     on="Tab"                   />
            </grip>
        </tile>
        <terminal script*>  <!-- Terminal-specific bindings. -->
            <script=ExclusiveKeyboardMode on="preview: Ctrl-Alt | Alt-Ctrl"/>
            <script="vtm.gear.SetHandled()" on="Esc"/> <!-- Do nothing. The Esc key is used as a modifier. Press/release events are sent only if the key is released without being combined with any other keys. -->
            <script                         on="-Esc">  -- Clear selection (if any) and send Esc press/release events.
                vtm.terminal.ClearSelection()
                local EscCode=vtm.keys["Esc"].keycode;
                -- log("EscCode=", EscCode);
                vtm.terminal.KeyEvent({ virtcod=0x1b, scancod=1, keystat=1, cluster='\\u{1b}', keycode=EscCode, shifted='\\u{1b}', unshift='\\u{1b}' },
                                      { virtcod=0x1b, scancod=1, keystat=0, cluster='\\u{1b}', keycode=EscCode, shifted='\\u{1b}', unshift='\\u{1b}' })
            </script>
            <script=IgnoreAltbuf | TerminalFindNext                   on="Alt+RightArrow"       />
            <script=IgnoreAltbuf | TerminalFindPrev                   on="Alt+LeftArrow"        />
            <script=IgnoreAltbuf | TerminalScrollViewportOnePageUp    on="Shift+Ctrl+PageUp"    />
            <script=IgnoreAltbuf | TerminalScrollViewportOnePageDown  on="Shift+Ctrl+PageDown"  />
            <script=IgnoreAltbuf | TerminalScrollViewportOnePageLeft  on="Shift+Alt+LeftArrow"  />
            <script=IgnoreAltbuf | TerminalScrollViewportOnePageRight on="Shift+Alt+RightArrow" />
            <script=IgnoreAltbuf | TerminalScrollViewportOneLineUp    on="Shift+Ctrl+UpArrow"   />
            <script=IgnoreAltbuf | TerminalScrollViewportOneLineDown  on="Shift+Ctrl+DownArrow" />
            <script=IgnoreAltbuf | TerminalScrollViewportOneCellLeft  on="Shift+Ctrl+LeftArrow" />
            <script=IgnoreAltbuf | TerminalScrollViewportOneCellRight on="Shift+Ctrl+RightArrow"/>
            <script=IgnoreAltbuf | TerminalScrollViewportToTop        on="Shift+Ctrl+Home"      />
            <script=IgnoreAltbuf | TerminalScrollViewportToEnd        on="Shift+Ctrl+End"       />
            <script=TerminalSendKey                    on=""                     />
            <script=TerminalReset                      on=""                     />
            <script=TerminalClearScrollback            on=""                     />
            <script=TerminalCopyViewport               on=""                     />
            <script=TerminalCopySelection              on="preview:Ctrl+Insert"  />
            <script=TerminalClipboardPaste             on="preview:Shift+Insert" />
            <script=TerminalClipboardWipe              on=""                     />
            <script=TerminalClipboardFormat            on=""                     />
            <script=TerminalSelectionForm              on=""                     />
            <script=TerminalSelectionOneShot           on=""                     />
            <script=TerminalUndo                       on=""                     />
            <script=TerminalRedo                       on=""                     />
            <script=TerminalCwdSync                    on=""                     />
            <script=TerminalWrapMode                   on=""                     />
            <script=TerminalAlignMode                  on=""                     />
            <script=TerminalStdioLog                   on=""                     />
            <script=TerminalRestart                    on=""                     />
        </terminal>
        <defapp script*>  <!-- Default application bindings (e.g., for the Info page). -->
            <script="vtm.defapp.ShowClosingPreview(faux);"                                            on="Any"         /> <!-- "Any" preview is always triggered after all other previews. Non-preview "Any" is triggered before all other keys. -->
            <script="if (not vtm.gear.IsKeyRepeated()) then vtm.defapp.ShowClosingPreview(true); end" on="Esc"         /> <!-- Pre-close action (highlights the close button). -->
            <script="if (vtm.defapp.ShowClosingPreview()) then vtm.defapp.Close() end"                on="preview:-Esc"/> <!-- Closes the window on Esc release. -->
            <script="if (vtm.defapp.ShowClosingPreview()) then local focus_count=vtm(); vtm.defapp.ShowClosingPreview(focus_count~=0) end" on="release:e2::form::state::focus::count" /> <!-- Cancel closing preview if focus is lost. -->
            <script="vtm.defapp.ScrollViewportByPage( 0, 1)"                                          on="PageUp"      />
            <script="vtm.defapp.ScrollViewportByPage( 0,-1)"                                          on="PageDown"    />
            <script="vtm.defapp.ScrollViewportByStep( 0, 3)"                                          on="UpArrow"     />
            <script="vtm.defapp.ScrollViewportByStep( 0,-3)"                                          on="DownArrow"   />
            <script="vtm.defapp.ScrollViewportByStep( 3, 0)"                                          on="LeftArrow"   />
            <script="vtm.defapp.ScrollViewportByStep(-3, 0)"                                          on="RightArrow"  />
            <script="if (not vtm.gear.IsKeyRepeated()) then vtm.defapp.ScrollViewportToTop() end"     on="Home"        />
            <script="if (not vtm.gear.IsKeyRepeated()) then vtm.defapp.ScrollViewportToEnd() end"     on="End"         />
        </defapp>
    </events>
</config>

<Macro>
    <true  = 1 />
    <yes   = 1 />
    <on    = 1 />
    <false = 0 />
    <no    = 0 />
    <off   = 0 />
</Macro>

<Menu=/Scripting>
    <Defaults>
        <autohide=false/>  <!-- Automatically hide window menu items when the mouse leaves. -->
        <slim=true/>       <!-- Set the window menu height: one cell (slim=true) or three cells (slim=false). -->
    </Defaults>
    <Buttons>
        <AlwaysOnTop script=OnLeftClick|AlwaysOnTopApplet> <!-- The default event source is the parent object (source="item", i.e., vtm.item). -->
            <script>  <!-- Runtime binding to update the menu item's label and tooltip. -->
                <on="release: e2::form::upon::started" source="applet"/>
                <on="release: e2::form::prop::zorder"  source="applet"/>
                local is_topmost=vtm.applet.ZOrder()
                vtm.item.Label(  is_topmost==1 and vtm.config["/Ns/AlwaysOnTop/on/label"  ] or vtm.config["/Ns/AlwaysOnTop/off/label"  ])
                vtm.item.Tooltip(is_topmost==1 and vtm.config["/Ns/AlwaysOnTop/on/tooltip"] or vtm.config["/Ns/AlwaysOnTop/off/tooltip"])
                vtm.item.Deface()
            </script>
        </AlwaysOnTop>
        <LockAccess script=OnLeftClick|LockAppletAccess>
            <script>
                <on="release: e2::form::upon::started"    source="applet"/>
                <on="release: e2::form::prop::accesslock" source="applet"/>
                local m=vtm.applet.LockAccess()
                vtm.item.Label(  m==1 and vtm.config["/Ns/LockAccess/on/label"  ] or vtm.config["/Ns/LockAccess/off/label"  ])
                vtm.item.Tooltip(m==1 and vtm.config["/Ns/LockAccess/on/tooltip"] or vtm.config["/Ns/LockAccess/off/tooltip"])
                vtm.item.Deface()
            </script>
        </LockAccess>
        <FindPrev label="  <  " script=OnLeftClick|TerminalFindPrev tooltip=/Ns/FindPrev/tooltip/>
        <FindNext label="  >  " script=OnLeftClick|TerminalFindNext tooltip=/Ns/FindNext/tooltip/>
        <ExclusiveKeyboard script=OnLeftClick|ExclusiveKeyboardMode>
            <script>
                <on="release: e2::form::upon::started"  source="applet"/>
                <on="release: terminal::events::rawkbd" source="terminal"/>
                local m=vtm.terminal.ExclusiveKeyboardMode()
                vtm.item.Label(  m==1 and vtm.config["/Ns/ExclusiveKeyboard/on/label"  ] or vtm.config["/Ns/ExclusiveKeyboard/off/label"  ])
                vtm.item.Tooltip(m==1 and vtm.config["/Ns/ExclusiveKeyboard/on/tooltip"] or vtm.config["/Ns/ExclusiveKeyboard/off/tooltip"])
                vtm.item.Deface()
            </script>
        </ExclusiveKeyboard>
        <NoWrapMode script=OnLeftClick|TerminalWrapMode>
            <script>
                <on="release: e2::form::upon::started"          source="applet"/>
                <on="release: terminal::events::layout::wrapln" source="terminal"/>
                local m=vtm.terminal.LineWrapMode()
                vtm.item.Label(  m~=1 and vtm.config["/Ns/NoWrapMode/on/label"  ] or vtm.config["/Ns/NoWrapMode/off/label"  ])
                vtm.item.Tooltip(m~=1 and vtm.config["/Ns/NoWrapMode/on/tooltip"] or vtm.config["/Ns/NoWrapMode/off/tooltip"])
                vtm.item.Deface()
            </script>
        </NoWrapMode>
        <ClipboardFormat tooltip=/Ns/ClipboardFormat/tooltip script=OnLeftClick|TerminalClipboardFormat>
            <script>
                <on="release: e2::form::upon::started"  source="applet"/>
                <on="release: terminal::events::selmod" source="terminal"/>
                local m=vtm.terminal.ClipboardFormat()
                vtm.item.Label(m==1 and vtm.config["/Ns/ClipboardFormat/textonly/label"]
                            or m==2 and vtm.config["/Ns/ClipboardFormat/ansitext/label"]
                            or m==3 and vtm.config["/Ns/ClipboardFormat/richtext/label"]
                            or m==4 and vtm.config["/Ns/ClipboardFormat/htmltext/label"]
                            or m==5 and vtm.config["/Ns/ClipboardFormat/safetext/label"]
                            or          vtm.config["/Ns/ClipboardFormat/disabled/label"])
                vtm.item.Deface()
            </script>
        </ClipboardFormat>
        <StdioLog script=OnLeftClick|TerminalStdioLog>
            <script>
                <on="release: e2::form::upon::started"  source="applet"/>
                <on="release: terminal::events::io_log" source="terminal"/>
                local m=vtm.terminal.LogMode()
                vtm.item.Label(  m==1 and vtm.config["/Ns/StdioLog/on/label"  ] or vtm.config["/Ns/StdioLog/off/label"  ])
                vtm.item.Tooltip(m==1 and vtm.config["/Ns/StdioLog/on/tooltip"] or vtm.config["/Ns/StdioLog/off/tooltip"])
                vtm.item.Deface()
            </script>
        </StdioLog>
        <ClearScrollback=/Ns/ClearScrollback script=OnLeftClick|TerminalClearScrollback/>
        <Restart        =/Ns/Restart         script=OnLeftClick|TerminalRestart/>
    </Buttons>
</Menu>

<Ns=en-US>  <!-- Localization settings. Example: set to 'Ns=en-US|en-GB' to use "en-GB" with fallback to "en-US". -->
    <en-US>
        <TextbasedDesktopEnvironment="  Text-based Desktop Environment  "/>
        <Info label="Info" title=label tooltip=" Info ">
            <KeybdTest="Keyboard Test"/>
            <KeybdMode="Exclusive keyboard mode:"/>
            <KeybdToggle on=" on █" off="█off "/>
            <pressed="pressed"/>
            <released="released"/>
            <pressanykeys="<Press any keys>"/>
            <Generic="Generic"/>
            <Literal="Literal"/>
            <Specific="Specific"/>
            <Scancodes="Scancodes"/>
            <copied="<copied>"/>
            <Status>
                "%%"
                "\nStatus"
                "\n"
                "\n     Owner: %user@host%"
                "\n   Session: %pipe%"
                "\n     Users: %count%"
                "\n  Monitors: %count%"
                "\n    Uptime: %uptime%"
            </Status>
            <System>
                "%%"
                "\nSystem"
                "\n"
                "\n        OS: %os%"
                "\n       CPU: %arch%"
                "\n   Process: %binary%"
                "\n       PID: %pid%"
                "\n  Elevated: %level%"
            </System>
            <Yes="Yes"/>
            <No="No"/>
            <Uptime d="d" h="h" m="m" s="s"/>
            <SF="Supported Features">
                <SubcellSize="Subcell Size"/>
                <Latin="Latin"/>
                <CJK="CJK"/>
                <Thai="Thai"/>
                <Georgian="Georgian"/>
                <Devanagari="Devanagari"/>
                <Arabic="Arabic"/>
                <Hebrew="Hebrew"/>
                <Emoji="Emoji"/>
                <BoxDrawing="Box Drawing"/>
                <LargeTypePieces="Large Type Pieces"/>
                <Style="Underline Styles">
                    <SingleOverline="Single Overline"/>
                    <DoubleUnderline="Double Underline"/>
                    <SingleUnderline="Single Underline"/>
                    <DashedUnderline="Dashed Underline"/>
                    <DottedUnderline="Dotted Underline"/>
                    <WavyUnderline="Wavy Underline"/>
                    <WhiteSingleUnderline="White Single Underline"/>
                    <WhiteWavyUnderline="White Wavy Underline"/>
                    <RedSingleUnderline="Red Single Underline"/>
                    <RedWavyUnderline="Red Wavy Underline"/>
                </Style>
                <FontStyle="Font Styles">
                    <Normal="Normal"/>
                    <Blinking="Blinking"/>
                    <Bold="Bold"/>
                    <Italic="Italic"/>
                </FontStyle>
                <CharacterWidth="Character Widths"/>
                <VariationSelectors="Variation Selectors"/>
                <LongestWord="The longest word in Hindi"/>
                <RotationFlipandMirror="Rotation, Flip, and Mirror"/>
                <CharacterMatrix="Character Matrix"/>
                <CharacterHalves="Character Halves"/>
                <TuiShadows="UI Shadows"/>
                <TuiShadowsInner="Inner shadow"/>
                <TuiShadowsOuter="Outer shadow"/>
                <sRGBBlending="sRGB Gamma-Corrected Blending"/>
                <PressCtrlCaps="Press Ctrl+CapsLock to toggle antialiasing and check the results."/>
            </SF>
        </Info>
        <AlwaysOnTop>
            <on label="\e[2:247;38:2:0:255:0m▀\e[2:239m \e[m"
                tooltip="\e[1m"" Always on top: On                   ""\e[m\n"
                               "  Keep this window above all others. "/>
            <off label="  "
                tooltip="\e[1m"" Always on top: Off                           ""\e[m\n"
                               "  The window can be covered by other windows. "/>
        </AlwaysOnTop>
        <LockAccess>
            <on label="\e[2:247m🔒\u{D0136}\e[2:239m🔒\u{D0137}\e[m"
                tooltip="\e[1m"" Window access lock: On                                                    ""\e[m\n"
                               "  Only users with focus at the time of locking can control this window.    ""\n"
                               "  Released automatically when the last owner disconnects from the desktop. "/>
            <off label="  "
                tooltip="\e[1m"" Window access lock: Off                                              ""\e[m\n"
                               "  Turn it on to restrict window control to currently focused user(s). ""\n"
                               "  Locked windows may prevent the desktop from shutting down.          "/>
        </LockAccess>
        <ClearScrollback label="  Clear  "   tooltip=" Clear scrollback buffer "/>
        <Restart         label="  Restart  " tooltip=" Restart current terminal session "/>
        <Taskbar>
            <taskbar_tooltip>
                "\e[1m"" Desktop Taskbar                     ""\e[m\n"
                       "   RightDrag to scroll menu up/down  ""\n"
                       "   LeftDrag to move desktop viewport "
            </taskbar_tooltip>
            <Apps label="apps">
                <tooltip>
                    "\e[1m"" Default applications group                      ""\e[m\n"
                           " Can be configured in ~/.config/vtm/settings.xml "
                </tooltip>
                <deftooltip>
                    " Application:                               ""\n"
                    "   LeftClick to launch application instance ""\n"
                    "   RightClick to set as default             ""\n"
                    "   LeftDrag to move desktop viewport        "
                </deftooltip>
                <toggletooltip>
                    " Window list disclosure toggle                  ""\n"
                    "   LeftClick to expand/collapse the window list ""\n"
                    "   MouseWheel to switch to list-closing mode    "
                </toggletooltip>
                <groupclosetooltip=" Close all open windows in this group "/>
                <Close tooltip=" Close application window "/>
                <App>
                   <tooltip>
                        " Running application          ""\n"
                        "   LeftClick to activate      ""\n"
                        "   DoubleLeftClick to fly to  "
                   </tooltip>
                </App>
            </Apps>
            <tooltip_footer>
                "   LeftClick to launch instance ""\n"
                "   RightClick to set as default "
            </tooltip_footer>
            <Terminal    label="Terminal Emulator" title="Terminal"       tooltip="\e[1m Terminal Console               \e[m\n"|tooltip_footer/>
            <Tile        label="Window Manager"    title="Window Manager" tooltip="\e[1m Tiling Window Manager          \e[m\n"|tooltip_footer/>
            <Site        label="Viewport Marker"   title="Site "          tooltip="\e[1m Desktop Viewport Marker        \e[m\n"|tooltip_footer/>
            <Logs        label="Log Monitor"       title="Log Monitor"    tooltip="\e[1m Log Monitor                    \e[m\n"|tooltip_footer/>
            <Grips    tooltip=" LeftDrag to adjust taskbar width "/>
            <UserList tooltip=" Active connections ">
                <Admins label="admins"/>
                <Users  label="users"/>
                <User   tooltip=" Connected user "/>
                <Toggle tooltip=" Show/hide user list "/>
            </UserList>
            <Disconnect  label="× Disconnect" tooltip=" Disconnect from the current session "/>
            <Shutdown    label="× Shutdown"   tooltip="\e[1m"" Disconnect all users and shut down                          ""\e[m\n"
                                                             "  Locked windows may prevent the desktop from shutting down. "/>
        </Taskbar>
        <Tile>
            <RunApplication>
                <tooltip>
                    " Launch application instances in active empty slots.         ""\n"
                    " RightClick on the taskbar menu item to set the application. "
                </tooltip>
            </RunApplication>
            <SelectAllPanes     tooltip=" Select all panes "                              />
            <SplitHorizontally  tooltip=" Split active panes horizontally "               />
            <SplitVertically    tooltip=" Split active panes vertically "                 />
            <SplitOrientation   tooltip=" Change split orientation "                      />
            <SwapPanes          tooltip=" Swap two or more panes "                        />
            <EqualizeSplitRatio tooltip=" Equalize split ratio "                          />
            <SetManagerTitle    tooltip=" Set tiling window manager title from clipboard "/>
            <ClosePane          tooltip=" Close active application "                      />
        </Tile>
        <FindPrev>
            <tooltip>
                "\e[1m"" Previous match                           ""\e[m\n"
                       "  Click to jump to the previous match.    ""\n"
                       "  Matches clipboard data if no selection. "
            </tooltip>
        </FindPrev>
        <FindNext>
            <tooltip>
                "\e[1m"" Next match                               ""\e[m\n"
                       "  Click to jump to the next match.        ""\n"
                       "  Matches clipboard data if no selection. "
            </tooltip>
        </FindNext>
        <ExclusiveKeyboard>
            <on label="\e[2:247m \e[2:231;38:2:0:255:0m Exclusive \e[2:239m \e[m"
                tooltip="\e[1m"" Exclusive keyboard mode: On            ""\e[m\n"
                               "  Keystrokes are passed through to the  ""\n"
                               "  application \e[1mwithout\e[m local processing. "/>
            <off label="  Exclusive  "
                tooltip="\e[1m"" Exclusive keyboard mode: Off          ""\e[m\n"
                               "  Keystrokes are passed through to the ""\n"
                               "  application \e[1mwith\e[m local processing.   "/>
        </ExclusiveKeyboard>
        <NoWrapMode>
            <on label="\e[2:247m \e[2:231;38:2:0:255:0mNoWrap\e[2:239m \e[m"
                tooltip="\e[1m"" No-wrap mode: On                        ""\e[m\n"
                               "  Text lines extend beyond the viewport. "/>
            <off label=" NoWrap "
                tooltip="\e[1m"" No-wrap mode: Off                      ""\e[m\n"
                               "  Text lines are wrapped to a new line. "/>
        </NoWrapMode>
        <ClipboardFormat tooltip=" Clipboard format ">
                <textonly label=  "\e[38:2:0:255:0m  Plaintext  \e[m"/>
                <ansitext label="\e[38:2:255:255:0m  ANSI-text  \e[m"/>
                <htmltext label="\e[38:2:0:255:255m  HTML-code  \e[m"/>
                <safetext label="\e[38:2:0:255:255m  Protected  \e[m"/>
                <disabled label=                  "  Clipboard  "/>
                <richtext>
                    <label>
                        "\e[38:2:109:231:237m  ""R"
                        "\e[38:2:109:237:186m"  "T"
                        "\e[38:2:60:255:60m"    "F"
                        "\e[38:2:189:255:53m"   "-"
                        "\e[38:2:255:255:49m"   "s"
                        "\e[38:2:255:189:79m"   "t"
                        "\e[38:2:255:114:94m"   "y"
                        "\e[38:2:255:60:157m"   "l"
                        "\e[38:2:255:49:214m"   "e""  \e[m"
                    </label>
                </richtext>
        </ClipboardFormat>
        <StdioLog>
            <on label="\e[2:247m \e[2:231;38:2:0:255:0m Log \e[2:239m \e[m"
                tooltip="\e[1m"" Console logging: On            ""\e[m\n"
                               "  Open Logs to view the output. "/>
            <off label="  Log  "
                tooltip="\e[1m"" Console logging: Off     ""\e[m\n"
                               "  Logging is not enabled. "/>
        </StdioLog>
        <MinimizeWindow tooltip=" Minimize "/>
        <MaximizeWindow tooltip=" Maximize "/>
        <CloseWindow    tooltip=" Close "/>
    </en-US>
    <en-GB>
        <Taskbar>
            <Apps label="applets"/>
        </Taskbar>
    </en-GB>

    <ru-RU>
        <TextbasedDesktopEnvironment="  Текстовая среда рабочего стола  "/>
        <Info label="Информация" title=label tooltip=" Информация ">
            <KeybdTest="Тест клавиатуры"/>
            <KeybdMode="Монопольный режим клавиатуры:"/>
            <KeybdToggle on=" вкл █" off="█откл "/>
            <pressed="нажато:"/>
            <released="отпущено:"/>
            <pressanykeys="<Нажмите любые клавиши>"/>
            <Generic="Обобщенный"/>
            <Literal="Цифробуквы"/>
            <Specific="Точный"/>
            <Scancodes="Скан-коды"/>
            <copied="<скопировано>"/>
            <Status>
                "%%"
                "\nСтатус"
                "\n"
                "\n              Пользователь: %user@host%"
                "\n      Идентификатор сеанса: %pipe%"
                "\n  Подключено пользователей: %count%"
                "\n   Подключено мониторингов: %count%"
                "\n              Время работы: %uptime%"
            </Status>
            <System>
                "%%"
                "\nСистема"
                "\n"
                "\n                      ОС: %os%"
                "\n                     ЦПУ: %arch%"
                "\n           Файл процесса: %binary%"
                "\n  Идентификатор процесса: %pid%"
                "\n           Администратор: %level%"
            </System>
            <Yes="Да"/>
            <No="Нет"/>
            <Uptime d="д" h="ч" m="м" s="с"/>
            <SF="Возможности">
                <SubcellSize="Текст внутри ячейки (Subcell Size)"/>
                <Latin="Латиница"/>
                <CJK="Иероглифы (CJK)"/>
                <Thai="Тайское письмо"/>
                <Georgian="Грузинское письмо"/>
                <Devanagari="Деванагари"/>
                <Arabic="Арабская вязь"/>
                <Hebrew="Иврит"/>
                <Emoji="Эмодзи"/>
                <BoxDrawing="Псевдографика"/>
                <LargeTypePieces="Составная типографика (Large Type Pieces)"/>
                <Style="Стили подчеркивания">
                    <SingleOverline="Надчеркивание"/>
                    <DoubleUnderline="Двойное подчеркивание"/>
                    <SingleUnderline="Одинарное подчеркивание"/>
                    <DashedUnderline="Штриховое подчеркивание"/>
                    <DottedUnderline="Пунктирное подчеркивание"/>
                    <WavyUnderline="Волнистое подчеркивание"/>
                    <WhiteSingleUnderline="Белое подчеркивание"/>
                    <WhiteWavyUnderline="Белое волнистое подчеркивание"/>
                    <RedSingleUnderline="Красное подчеркивание"/>
                    <RedWavyUnderline="Красное волнистое подчеркивание"/>
                </Style>
                <FontStyle="Стили шрифта">
                    <Normal="Обычный"/>
                    <Blinking="Мигающий"/>
                    <Bold="Жирный"/>
                    <Italic="Курсив"/>
                </FontStyle>
                <CharacterWidth="Символы произвольной ширины"/>
                <VariationSelectors="Вариативные селекторы (Variation Selectors)"/>
                <LongestWord="Самое длинное слово на хинди"/>
                <RotationFlipandMirror="Вращение, переворот и отражение"/>
                <CharacterMatrix="Матрица символов"/>
                <CharacterHalves="Половинки символов"/>
                <TuiShadows="Тени интерфейса (TUI Shadows)"/>
                <TuiShadowsInner="Внутренняя тень"/>
                <TuiShadowsOuter="Внешняя тень"/>
                <sRGBBlending="Смешивание sRGB с гамма-коррекцией"/>
                <PressCtrlCaps="Для проверки результата переключите режим антиалиасинга нажатием Ctrl+CapsLock."/>
            </SF>
        </Info>
        <AlwaysOnTop>
            <on  tooltip=" Поверх всех окон: вкл. "/>
            <off tooltip=" Поверх всех окон: выкл. "/>
        </AlwaysOnTop>
        <LockAccess>
            <on label="\e[2:247m🔒\u{D0136}\e[2:239m🔒\u{D0137}\e[m"
                tooltip="\e[1m"" Доступ к окну ограничен                                    ""\e[m\n"
                               "  Данным окном могут управлять только текущие владельцы.    ""\n"
                               "  При отключении от рабочего стола, владелец теряет доступ. "/>
            <off label="  "
                tooltip="\e[1m"" Доступ к окну не ограничен                                             ""\e[m\n"
                               "  Включение заблокирует окно для непричастных пользователей.            ""\n"
                               "  Окна с ограниченным доступом могут препятствовать выключению сервера. "/>
        </LockAccess>
        <ClearScrollback label="  Очистить  " tooltip=" Очистить буфер прокрутки (скроллбэк) "/>
        <Restart         label="  Рестарт  "  tooltip=" Перезапустить текущую сессию терминала "/>
        <Taskbar>
            <taskbar_tooltip>
                "\e[1m"" Панель задач                             ""\e[m\n"
                       "   RightDrag — прокрутка списка задач.    ""\n"
                       "   LeftDrag — перемещение рабочего стола. "
            </taskbar_tooltip>
            <Apps label="программы">
                <tooltip>
                    "\e[1m"" Группа приложений по умолчанию                    ""\e[m\n"
                           " Список настраивается в ~/.config/vtm/settings.xml "
                </tooltip>
                <deftooltip>
                    " Приложение:                                         ""\n"
                    "   LeftClick запускает экземпляр приложения.         ""\n"
                    "   RightClick устанавливает приложение по умолчанию. ""\n"
                    "   LeftDrag перемещает рабочий стол.                 "
                </deftooltip>
                <toggletooltip>
                    " Переключатель списка окон                               ""\n"
                    "   LeftClick разворачивает/сворачивает список окон.      ""\n"
                    "   Колесо мыши переключает кнопку в режим закрытия окон. "
                </toggletooltip>
                <groupclosetooltip=" Закрыть все открытые окна в этой группе "/>
                <Close tooltip=" Закрыть окно приложения "/>
                <App>
                   <tooltip>
                        " Активное приложение                      ""\n"
                        "   LeftClick — установить фокус           ""\n"
                        "   DoubleLeftClick — переместиться к окну "
                   </tooltip>
                </App>
            </Apps>
            <tooltip_footer>
                "   LeftClick — запустить приложение              ""\n"
                "   RightClick — сделать приложением по умолчанию "
            </tooltip_footer>
            <Terminal label="Терминал"               title=label                       tooltip="\e[1m Эмулятор терминала                              \e[m\n"|tooltip_footer/>
            <Tile     label="Тайловый менеджер"      title="Тайловый оконный менеджер" tooltip="\e[1m Тайловый оконный менеджер                       \e[m\n"|tooltip_footer/>
            <Site     label="Маркер рабочей области" title=label                       tooltip="\e[1m Маркер рабочей области                          \e[m\n"|tooltip_footer/>
            <Logs     label="Монитор сообщений"      title=label                       tooltip="\e[1m Монитор системных сообщений                     \e[m\n"|tooltip_footer/>
            <Grips    tooltip=" Тяните левой кнопкой мыши для изменения ширины панели задач "/>
            <UserList tooltip=" Список активных подключений ">
                <Admins label="администраторы"/>
                <Users  label="пользователи"/>
                <User   tooltip=" Подключенный пользователь "/>
                <Toggle tooltip=" Показать/скрыть список пользователей "/>
            </UserList>
            <Disconnect  label="× Отключить"        tooltip=" Отключиться от текущей сессии (оставить её работать) "/>
            <Shutdown    label="× Завершить работу" tooltip="\e[1m"" Отключить всех пользователей и выключить сервер рабочего стола         ""\e[m\n"
                                                                   "  Окна с ограниченным доступом могут препятствовать выключению сервера. "/>
        </Taskbar>
        <Tile>
            <RunApplication>
                <tooltip>
                    " Запустить приложение по умолчанию в свободных слотах       ""\n"
                    " Приложение выбирается с помощью RightClick на панели задач "
                </tooltip>
            </RunApplication>
            <SelectAllPanes     tooltip=" Установить фокус на все слоты (активировать) "    />
            <SplitHorizontally  tooltip=" Разделить активные слоты горизонтально "          />
            <SplitVertically    tooltip=" Разделить активные слоты вертикально "            />
            <SplitOrientation   tooltip=" Изменить ориентацию разделения (на 90°) "         />
            <SwapPanes          tooltip=" Поменять слоты местами по кругу "                 />
            <EqualizeSplitRatio tooltip=" Выровнять пропорции разделения слотов "           />
            <SetManagerTitle    tooltip=" Установить заголовок менеджера из буфера обмена " />
            <ClosePane          tooltip=" Закрыть приложения в активных слотах "            />
        </Tile>
        <FindPrev>
            <tooltip>
                "\e[1m"" Предыдущее совпадение                                        ""\e[m\n"
                       "  Переход к предыдущему совпадению по клику.                  ""\n"
                       "  Если текст не выделен, используется поиск из буфера обмена. "
            </tooltip>
        </FindPrev>
        <FindNext>
            <tooltip>
                "\e[1m"" Следующее совпадение                                         ""\e[m\n"
                       "  Переход к следующему совпадению по клику.                   ""\n"
                       "  Если текст не выделен, используется поиск из буфера обмена. "
            </tooltip>
        </FindNext>
        <ExclusiveKeyboard>
            <tooltip_body>
                "\e[1m"" Переключатель монопольного режима клавиатуры "|state|" \e[m\n"
                       "  Данный режим позволяет направлять нажатия клавиш    ""\n"
                       "  напрямую приложению, без локальной обработки.       "
            </tooltip_body>
            <on  label="\e[2:247m \e[2:231;38:2:0:255:0m Монопольно \e[2:239m \e[m" state="    ВКЛ" tooltip=tooltip_body/>
            <off label=                               "  Монопольно  "              state="   ВЫКЛ" tooltip=tooltip_body/>
        </ExclusiveKeyboard>
        <NoWrapMode>
            <on  label="\e[2:247m \e[2:231;38:2:0:255:0mРазвернуть\e[2:239m \e[m" tooltip=" \e[1mАвтоперенос строк текста\e[m  \n         Автоперенос: ВЫКЛ "/>
            <off label=                               " Развернуть "              tooltip=" \e[1mАвтоперенос строк текста\e[m  \n         Автоперенос:  ВКЛ "/>
        </NoWrapMode>
        <ClipboardFormat tooltip=" Формат буфера обмена ">
            <textonly label=  "\e[38:2:0:255:0m  Только текст  \e[m"/>
            <ansitext label="\e[38:2:255:255:0m  ANSI-графика  \e[m"/>
            <htmltext label="\e[38:2:0:255:255m  HTML-сниппет  \e[m"/>
            <safetext label="\e[38:2:0:255:255m  Скрытый блок  \e[m"/>
            <disabled label=                  "  Без выделения "/>
            <richtext>
                <label>
                    "\e[38:2:109:231:237m  ""R"
                    "\e[38:2:109:237:186m"  "T"
                    "\e[38:2:60:255:60m"    "F"
                    "\e[38:2:189:255:53m"   "-"
                    "\e[38:2:255:255:49m"   "р"
                    "\e[38:2:255:189:79m"   "а"
                    "\e[38:2:255:189:79m"   "з"
                    "\e[38:2:255:114:94m"   "м"
                    "\e[38:2:255:114:94m"   "е"
                    "\e[38:2:255:60:157m"   "т"
                    "\e[38:2:255:60:157m"   "к"
                    "\e[38:2:255:49:214m"   "а""  \e[m"
                </label>
            </richtext>
        </ClipboardFormat>
        <StdioLog>
            <on  label="\e[2:247m \e[2:231;38:2:0:255:0m Лог \e[2:239m \e[m"
                tooltip="\e[1m"" Журналирование консоли: ВКЛ                ""\e[m\n"
                               "  Откройте Монитор сообщений для просмотра. "/>
            <off label="  Лог  "
                tooltip="\e[1m"" Журналирование консоли: ВЫКЛ       ""\e[m\n"
                               "  Журналирование консоли отключено. "/>
        </StdioLog>
        <MinimizeWindow tooltip=" Свернуть "/>
        <MaximizeWindow tooltip=" Развернуть "/>
        <CloseWindow    tooltip=" Закрыть "/>
    </ru-RU>
</Ns>

<Colors>
    <DefaultColor = 0x00ffffff />
    <Transparent  = 0x00000000 />
    <blackdk      = #101010 />
    <reddk        = #c40f1f />
    <greendk      = #12a10e />
    <yellowdk     = #c09c00 />
    <bluedk       = #0037db />
    <magentadk    = #871798 />
    <cyandk       = #3b96dd />
    <whitedk      = #bbbbbb />
    <blacklt      = #757575 />
    <redlt        = #e64856 />
    <greenlt      = #15c60c />
    <yellowlt     = #f8f1a5 />
    <bluelt       = #3a78ff />
    <magentalt    = #b3009e />
    <cyanlt       = #60d6d6 />
    <whitelt      = #f3f3f3 />
    <pureblack    = #000000 />
    <purewhite    = #ffffff />
    <purered      = #ff0000 />
    <puregreen    = #00ff00 />
    <pureblue     = #0000ff />
    <puremagenta  = #ff00ff />
    <purecyan     = #00ffff />
    <pureyellow   = #ffff00 />
</Colors>

<X11ColorNames name*>  <!-- Source: https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart -->
    <name = "Black"               rgb = #000000 />
    <name = "Brown"               rgb = #A52A2A />
    <name = "Firebrick"           rgb = #B22222 />
    <name = "Web Maroon"          rgb = #800000 />
    <name = "Dark Red"            rgb = #8B0000 />
    <name = "Saddle brown"        rgb = #8B4513 />
    <name = "Dark Olive Green"    rgb = #556B2F />
    <name = "Forest Green"        rgb = #228B22 />
    <name = "Web Green"           rgb = #008000 />
    <name = "Dark Green"          rgb = #006400 />
    <name = "Dark Slate Gray"     rgb = #2F4F4F />
    <name = "Midnight Blue"       rgb = #191970 />
    <name = "Navy Blue"           rgb = #000080 />
    <name = "Dark Blue"           rgb = #00008B />
    <name = "Medium Blue"         rgb = #0000CD />
    <name = "Indigo"              rgb = #4B0082 />
    <name = "Indian Red"          rgb = #CD5C5C />
    <name = "Red"                 rgb = #FF0000 />
    <name = "Orange Red"          rgb = #FF4500 />
    <name = "Sienna"              rgb = #A0522D />
    <name = "Chocolate"           rgb = #D2691E />
    <name = "Peru"                rgb = #CD853F />
    <name = "Dark Orange"         rgb = #FF8C00 />
    <name = "Orange"              rgb = #FFA500 />
    <name = "Dark Goldenrod"      rgb = #B8860B />
    <name = "Goldenrod"           rgb = #DAA520 />
    <name = "Olive"               rgb = #808000 />
    <name = "Dim Gray"            rgb = #696969 />
    <name = "Web Gray"            rgb = #808080 />
    <name = "Olive Drab"          rgb = #6B8E23 />
    <name = "Yellow Green"        rgb = #9ACD32 />
    <name = "Chartreuse"          rgb = #7FFF00 />
    <name = "Lawn Green"          rgb = #7CFC00 />
    <name = "Green"               rgb = #00FF00 />
    <name = "Lime"                rgb = #00FF00 />
    <name = "Lime Green"          rgb = #32CD32 />
    <name = "Sea Green"           rgb = #2E8B57 />
    <name = "Medium Sea Green"    rgb = #3CB371 />
    <name = "Spring Green"        rgb = #00FF7F />
    <name = "Medium Spring Green" rgb = #00FA9A />
    <name = "Dark Turquoise"      rgb = #00CED1 />
    <name = "Light Sea Green"     rgb = #20B2AA />
    <name = "Teal"                rgb = #008080 />
    <name = "Dark Cyan"           rgb = #008B8B />
    <name = "Steel Blue"          rgb = #4682B4 />
    <name = "Cadet Blue"          rgb = #5F9EA0 />
    <name = "Slate Gray"          rgb = #708090 />
    <name = "Light Slate Gray"    rgb = #778899 />
    <name = "Royal Blue"          rgb = #4169E1 />
    <name = "Blue"                rgb = #0000FF />
    <name = "Slate Blue"          rgb = #6A5ACD />
    <name = "Blue Violet"         rgb = #8A2BE2 />
    <name = "Dark Orchid"         rgb = #9932CC />
    <name = "Dark Violet"         rgb = #9400D3 />
    <name = "Rebecca Purple"      rgb = #663399 />
    <name = "Dark Slate Blue"     rgb = #483D8B />
    <name = "Web Purple"          rgb = #800080 />
    <name = "Dark Magenta"        rgb = #8B008B />
    <name = "Medium Violet Red"   rgb = #C71585 />
    <name = "Deep Pink"           rgb = #FF1493 />
    <name = "Maroon"              rgb = #B03060 />
    <name = "Crimson"             rgb = #DC143C />
    <name = "Rosy Brown"          rgb = #BC8F8F />
    <name = "Light Coral"         rgb = #F08080 />
    <name = "Salmon"              rgb = #FA8072 />
    <name = "Tomato"              rgb = #FF6347 />
    <name = "Coral"               rgb = #FF7F50 />
    <name = "Dark Salmon"         rgb = #E9967A />
    <name = "Light Salmon"        rgb = #FFA07A />
    <name = "Sandy Brown"         rgb = #F4A460 />
    <name = "Burlywood"           rgb = #DEB887 />
    <name = "Tan"                 rgb = #D2B48C />
    <name = "Dark Khaki"          rgb = #BDB76B />
    <name = "Gold"                rgb = #FFD700 />
    <name = "Yellow"              rgb = #FFFF00 />
    <name = "Green Yellow"        rgb = #ADFF2F />
    <name = "Dark Gray"           rgb = #A9A9A9 />
    <name = "Gray"                rgb = #BEBEBE />
    <name = "Silver"              rgb = #C0C0C0 />
    <name = "Dark Sea Green"      rgb = #8FBC8F />
    <name = "Pale Green"          rgb = #98FB98 />
    <name = "Light Green"         rgb = #90EE90 />
    <name = "Aquamarine"          rgb = #7FFFD4 />
    <name = "Medium Aquamarine"   rgb = #66CDAA />
    <name = "Turquoise"           rgb = #40E0D0 />
    <name = "Medium Turquoise"    rgb = #48D1CC />
    <name = "Aqua"                rgb = #00FFFF />
    <name = "Cyan"                rgb = #00FFFF />
    <name = "Sky Blue"            rgb = #87CEEB />
    <name = "Light Steel Blue"    rgb = #B0C4DE />
    <name = "Light Sky Blue"      rgb = #87CEFA />
    <name = "Deep Sky Blue"       rgb = #00BFFF />
    <name = "Dodger Blue"         rgb = #1E90FF />
    <name = "Cornflower Blue"     rgb = #6495ED />
    <name = "Medium Slate Blue"   rgb = #7B68EE />
    <name = "Medium Purple"       rgb = #9370DB />
    <name = "Purple"              rgb = #A020F0 />
    <name = "Medium Orchid"       rgb = #BA55D3 />
    <name = "Fuchsia"             rgb = #FF00FF />
    <name = "Magenta"             rgb = #FF00FF />
    <name = "Orchid"              rgb = #DA70D6 />
    <name = "Hot Pink"            rgb = #FF69B4 />
    <name = "Pale Violet Red"     rgb = #DB7093 />
    <name = "Snow"                rgb = #FFFAFA />
    <name = "Seashell"            rgb = #FFF5EE />
    <name = "Misty Rose"          rgb = #FFE4E1 />
    <name = "Peach Puff"          rgb = #FFDAB9 />
    <name = "Linen"               rgb = #FAF0E6 />
    <name = "Bisque"              rgb = #FFE4C4 />
    <name = "Antique White"       rgb = #FAEBD7 />
    <name = "Navajo White"        rgb = #FFDEAD />
    <name = "Blanched Almond"     rgb = #FFEBCD />
    <name = "Papaya Whip"         rgb = #FFEFD5 />
    <name = "Moccasin"            rgb = #FFE4B5 />
    <name = "Wheat"               rgb = #F5DEB3 />
    <name = "Old Lace"            rgb = #FDF5E6 />
    <name = "Floral White"        rgb = #FFFAF0 />
    <name = "Cornsilk"            rgb = #FFF8DC />
    <name = "Lemon Chiffon"       rgb = #FFFACD />
    <name = "Khaki"               rgb = #F0E68C />
    <name = "Pale Goldenrod"      rgb = #EEE8AA />
    <name = "Ivory"               rgb = #FFFFF0 />
    <name = "Beige"               rgb = #F5F5DC />
    <name = "Light Yellow"        rgb = #FFFFE0 />
    <name = "Light Goldenrod"     rgb = #FAFAD2 />
    <name = "Light Gray"          rgb = #D3D3D3 />
    <name = "Gainsboro"           rgb = #DCDCDC />
    <name = "White Smoke"         rgb = #F5F5F5 />
    <name = "Honeydew"            rgb = #F0FFF0 />
    <name = "Mint Cream"          rgb = #F5FFFA />
    <name = "Azure"               rgb = #F0FFFF />
    <name = "Light Cyan"          rgb = #E0FFFF />
    <name = "Pale Turquoise"      rgb = #AFEEEE />
    <name = "Powder Blue"         rgb = #B0E0E6 />
    <name = "Light Blue"          rgb = #ADD8E6 />
    <name = "Alice Blue"          rgb = #F0F8FF />
    <name = "Ghost White"         rgb = #F8F8FF />
    <name = "Lavender"            rgb = #E6E6FA />
    <name = "Thistle"             rgb = #D8BFD8 />
    <name = "Plum"                rgb = #DDA0DD />
    <name = "Violet"              rgb = #EE82EE />
    <name = "Pink"                rgb = #FFC0CB />
    <name = "Light Pink"          rgb = #FFB6C1 />
    <name = "Lavender Blush"      rgb = #FFF0F5 />
    <name = "White"               rgb = #FFFFFF />
</X11ColorNames>

<Terminal>
    <selection>
        <mode="text"/>  <!-- Clipboard copy format: "text", "ansi", "rich", "html", "protected", "none". -->
        <rect=false/>   <!-- Preferred selection form: true (Rectangular), false (Linear). -->
    </selection>
</Terminal>

<Scripting>
    <OnLeftClick on="LeftClick"/>
    <!-- vtm.* scripting context:
        - .gate: ...
          - .gear: ...
        - .applet (standalone app): ...
        or
        - .taskbar: ...
          - .desktop: ...
            - .window: ...
              - .applet: ...
                - .tile: ...
                  - .grip: ...
                - .terminal: ...  -->
    <TryToQuit             ="vtm.desktop.Shutdown('try');"/>      <!-- Shut down the desktop server if no applications are running. -->
    <RunApplication        ="vtm.desktop.Run();"/>                <!-- Launch the default application. -->
    <RunInfoPage           ="vtm.desktop.Run({ title='Info-page', hidden=true, label='Info', type='info' });"/>  <!-- Open the Info page. -->
    <FocusPrevWindow       ="vtm.desktop.FocusNextWindow(-1);"/>  <!-- Switch focus to the previous window. -->
    <FocusNextWindow       ="vtm.desktop.FocusNextWindow( 1);"/>  <!-- Switch focus to the next window. -->
    <FocusTaskbar          ="if (vtm.gear.Focus(vtm.taskbar)) then vtm.gear.Focus(vtm.desktop); end; vtm.gear.Interrupt();"/>  <!-- Focus the taskbar or return focus to the desktop. -->

    <AlwaysOnTopApplet     ="vtm.applet.ZOrder(vtm.applet.ZOrder()==1 and 0 or 1);"/>  <!-- Toggle window Z-order attribute. -1: backmost; 0: normal; 1: topmost. -->
    <LockAppletAccess>
        local accesslock=vtm.applet.LockAccess();
        if (accesslock==0) then  -- Set focus before accesslock activation.
            vtm.gear.Focus(vtm.applet);
        end;
        vtm.applet.LockAccess(accesslock==1 and 0 or 1);
    </LockAppletAccess>
    <CloseApplet           ="vtm.applet.Close();"/>            <!-- Close the window. -->
    <MinimizeApplet        ="vtm.applet.Minimize();"/>         <!-- Minimize the window. -->
    <MaximizeApplet        ="vtm.applet.Maximize();"/>         <!-- Maximize the window within the desktop area (does not cover the taskbar). -->
    <FullscreenApplet      ="vtm.applet.Fullscreen();"/>       <!-- Expand the window to full screen (covers the taskbar). -->
    <RestoreApplet         ="vtm.applet.Restore();"/>          <!-- Restore a maximized or fullscreen window. -->
    <MoveAppletLeft        ="vtm.applet.Warp( 1,-1, 0, 0);"/>  <!-- Move the window to the left. Warp(l, r, t, b): The parameters specify deltas for the left, right, top, and bottom sides. -->
    <MoveAppletRight       ="vtm.applet.Warp(-1, 1, 0, 0);"/>  <!-- Move the window to the right. -->
    <MoveAppletUp          ="vtm.applet.Warp( 0, 0, 1,-1);"/>  <!-- Move the window up. -->
    <MoveAppletDown        ="vtm.applet.Warp( 0, 0,-1, 1);"/>  <!-- Move the window down. -->
    <MoveAppletTopLeft     ="vtm.applet.Warp( 2,-2, 1,-1);"/>  <!-- Move the window to the top-left. -->
    <MoveAppletBottomLeft  ="vtm.applet.Warp( 2,-2,-1, 1);"/>  <!-- Move the window to the bottom-left. -->
    <MoveAppletTopRight    ="vtm.applet.Warp(-2, 2, 1,-1);"/>  <!-- Move the window to the top-right. -->
    <MoveAppletBottomRight ="vtm.applet.Warp(-2, 2,-1, 1);"/>  <!-- Move the window to the bottom-right. -->
    <IncreaseAppletWidth   ="vtm.applet.Warp( 0, 1, 0, 0);"/>  <!-- Increase window width. -->
    <DecreaseAppletWidth   ="vtm.applet.Warp( 0,-1, 0, 0);"/>  <!-- Decrease window width. -->
    <IncreaseAppletHeight  ="vtm.applet.Warp( 0, 0, 0, 1);"/>  <!-- Increase window height. -->
    <DecreaseAppletHeight  ="vtm.applet.Warp( 0, 0, 0,-1);"/>  <!-- Decrease window height. -->

    <TileFocusPrev         ="vtm.tile.FocusNextPaneOrGrip(-1);"/>  <!-- Focus the previous pane or split grip. -->
    <TileFocusNext         ="vtm.tile.FocusNextPaneOrGrip( 1);"/>  <!-- Focus the next pane or split grip. -->
    <TileFocusPrevPane     ="vtm.tile.FocusNextPane(-1);"/>        <!-- Focus the previous pane. -->
    <TileFocusNextPane     ="vtm.tile.FocusNextPane( 1);"/>        <!-- Focus the next pane. -->
    <TileRunApplication    ="vtm.tile.RunApplication();"/>         <!-- Launch application instances in active empty slots. The app to run can be set via RightClick on the taskbar. -->
    <TileSelectAllPanes    ="vtm.tile.SelectAllPanes();"/>         <!-- Select all panes. -->
    <TileSplitHorizontally ="vtm.tile.SplitPane(0);"/>             <!-- Split active panes horizontally. -->
    <TileSplitVertically   ="vtm.tile.SplitPane(1);"/>             <!-- Split active panes vertically. -->
    <TileSplitOrientation  ="vtm.tile.RotateSplit();"/>            <!-- Change split orientation. -->
    <TileSwapPanes         ="vtm.tile.SwapPanes();"/>              <!-- Swap two or more panes. -->
    <TileEqualizeSplitRatio="vtm.tile.EqualizeSplitRatio();"/>     <!-- Equalize the split ratio. -->
    <TileSetManagerTitle   ="vtm.tile.SetTitle();"/>               <!-- Set the tiling window manager title using clipboard data. -->
    <TileClosePane         ="vtm.tile.ClosePane();"/>              <!-- Close the active application. -->
    <TileMoveGripLeft      ="vtm.grip.MoveGrip(-1, 0);"/>          <!-- Move the split grip to the left. -->
    <TileMoveGripRight     ="vtm.grip.MoveGrip( 1, 0);"/>          <!-- Move the split grip to the right. -->
    <TileMoveGripUp        ="vtm.grip.MoveGrip( 0,-1);"/>          <!-- Move the split grip up. -->
    <TileMoveGripDown      ="vtm.grip.MoveGrip( 0, 1);"/>          <!-- Move the split grip down. -->
    <TileDecreaseGripWidth ="vtm.grip.ResizeGrip(-1);"/>           <!-- Decrease the split grip width. -->
    <TileIncreaseGripWidth ="vtm.grip.ResizeGrip( 1);"/>           <!-- Increase the split grip width. -->
    <TileFocusPrevGrip     ="vtm.grip.FocusNextGrip(-1);"/>        <!-- Focus the previous split grip. -->
    <TileFocusNextGrip     ="vtm.grip.FocusNextGrip( 1);"/>        <!-- Focus the next split grip. -->

    <Disconnect            ="vtm.gate.Disconnect();"/>             <!-- Disconnect from the current session. -->
    <ToggleDebugOverlay    ="vtm.gate.DebugOverlay();"/>           <!-- Toggle the debug overlay. -->
    <IncreaseCellHeight    ="vtm.gate.IncreaseCellHeight( 1);"/>   <!-- Increase the text cell height by one pixel. -->
    <DecreaseCellHeight    ="vtm.gate.IncreaseCellHeight(-1);"/>   <!-- Decrease the text cell height by one pixel. -->
    <ResetWheelAccumulator ="vtm.gate.WheelAccumReset();"/>        <!-- Reset the wheel accumulator. -->
    <ResetCellHeight       ="if (not vtm.gear.IsKeyRepeated()) then vtm.gate.CellHeightReset() end;"/>   <!-- Reset the text cell height. -->
    <ToggleAntialiasingMode="if (not vtm.gear.IsKeyRepeated()) then vtm.gate.AntialiasingMode() end;"/>  <!-- Toggle the text antialiasing mode. -->
    <RollFontsBackward     ="if (not vtm.gear.IsKeyRepeated()) then vtm.gate.RollFonts(-1) end;"/>       <!-- Cycle through the font list backward. -->
    <RollFontsForward      ="if (not vtm.gear.IsKeyRepeated()) then vtm.gate.RollFonts( 1) end;"/>       <!-- Cycle through the font list forward. -->

    <ExclusiveKeyboardMode             ="vtm.terminal.ExclusiveKeyboardMode(vtm.terminal.ExclusiveKeyboardMode()==1 and 0 or 1);"/>  <!-- Toggle exclusive keyboard mode by pressing and releasing Ctrl-Alt or Alt-Ctrl (reversed release order). -->
    <TerminalFindPrev                  ="vtm.terminal.FindNextMatch(-1);"/>            <!-- Highlight the previous match of the selected text. Clipboard content is used if there is no active selection. -->
    <TerminalFindNext                  ="vtm.terminal.FindNextMatch( 1);"/>            <!-- Highlight the next match of the selected text. Clipboard content is used if there is no active selection. -->
    <TerminalScrollViewportOnePageUp   ="vtm.terminal.ScrollViewportByPage( 0, 1);"/>  <!-- Scroll the viewport one page up. -->
    <TerminalScrollViewportOnePageDown ="vtm.terminal.ScrollViewportByPage( 0,-1);"/>  <!-- Scroll the viewport one page down. -->
    <TerminalScrollViewportOnePageLeft ="vtm.terminal.ScrollViewportByPage( 1, 0);"/>  <!-- Scroll the viewport one page to the left. -->
    <TerminalScrollViewportOnePageRight="vtm.terminal.ScrollViewportByPage(-1, 0);"/>  <!-- Scroll the viewport one page to the right. -->
    <TerminalScrollViewportOneLineUp   ="vtm.terminal.ScrollViewportByCell( 0, 1);"/>  <!-- Scroll the viewport one line up. -->
    <TerminalScrollViewportOneLineDown ="vtm.terminal.ScrollViewportByCell( 0,-1);"/>  <!-- Scroll the viewport one line down. -->
    <TerminalScrollViewportOneCellLeft ="vtm.terminal.ScrollViewportByCell( 1, 0);"/>  <!-- Scroll the viewport one cell to the left. -->
    <TerminalScrollViewportOneCellRight="vtm.terminal.ScrollViewportByCell(-1, 0);"/>  <!-- Scroll the viewport one cell to the right. -->
    <TerminalScrollViewportToTop       ="if (not vtm.gear.IsKeyRepeated()) then vtm.terminal.ScrollViewportToTop() end;"/>  <!-- Scroll the viewport to the top of the scrollback buffer. -->
    <TerminalScrollViewportToEnd       ="if (not vtm.gear.IsKeyRepeated()) then vtm.terminal.ScrollViewportToEnd() end;"/>  <!-- Scroll the viewport to the bottom of the scrollback buffer. -->
    <TerminalSendKey                   ="vtm.terminal.SendKey('test\\r');"/>           <!-- Simulate keypresses using the specified string. -->
    <TerminalOutput                    ="vtm.terminal.Print('Hello!\\n');"/>           <!-- Output a string directly to the terminal scrollback. -->
    <TerminalReset                     ="vtm.terminal.Print('\\x1b[!p');"/>            <!-- Clear the scrollback and reset SGR attributes. -->
    <TerminalClearScrollback           ="vtm.terminal.ClearScrollback();"/>            <!-- Clear the scrollback buffer above the current line. -->
    <TerminalCopyViewport              ="vtm.terminal.CopyViewport();"/>               <!-- Copy the viewport content to the clipboard. -->
    <TerminalCopySelection             ="vtm.terminal.CopySelection();"/>              <!-- Copy the selection to the clipboard. -->
    <TerminalClipboardPaste            ="vtm.terminal.PasteClipboard();"/>             <!-- Paste from the clipboard. -->
    <TerminalClipboardWipe             ="vtm.terminal.ClearClipboard();"/>             <!-- Clear the clipboard. -->
    <TerminalClipboardFormat           ="vtm.terminal.ClipboardFormat((vtm.terminal.ClipboardFormat() + 1) % 6);"/>  <!-- Toggle the clipboard copy format. 0: Disabled; 1: Plaintext; 2: ANSI; 3: RTF; 4: HTML; 5: Protected. -->
    <TerminalSelectionForm             ="vtm.terminal.SelectionForm(vtm.terminal.SelectionForm()==1 and 0 or 1);"/>  <!-- Toggle between linear and rectangular selection modes. 0: Linear; 1: Rectangular (Block). -->
    <TerminalSelectionCancel           ="vtm.terminal.ClearSelection();"/>             <!-- Clear the current selection. -->
    <TerminalSelectionOneShot          ="vtm.terminal.OneShotSelection();"/>           <!-- One-shot toggle to copy text while mouse tracking is active. Selection is preserved if the 'Ctrl' key is held. -->
    <TerminalUndo                      ="vtm.terminal.UndoReadline();"/>               <!-- (Win32 Cooked mode only) Discard the last input. -->
    <TerminalRedo                      ="vtm.terminal.RedoReadline();"/>               <!-- (Win32 Cooked mode only) Revert the last Undo command. -->
    <TerminalCwdSync                   ="vtm.terminal.CwdSync(vtm.terminal.CwdSync()==1 and 0 or 1);"/>            <!-- Toggle the current working directory (CWD) synchronization. -->
    <TerminalWrapMode                  ="vtm.terminal.LineWrapMode(vtm.terminal.LineWrapMode()==1 and 0 or 1);"/>  <!-- Toggle line wrapping. Applied to the active selection if it exists. 0: Off; 1: On. -->
    <TerminalAlignMode                 ="vtm.terminal.LineAlignMode((vtm.terminal.LineAlignMode() + 1) % 3);"/>    <!-- Toggle line alignment. Applied to the active selection if it exists. 0: Left; 1: Right; 2: Center. -->
    <TerminalStdioLog                  ="vtm.terminal.LogMode(vtm.terminal.LogMode()==1 and 0 or 1);"/>            <!-- Toggle stdin/stdout logging. -->
    <TerminalRestart                   ="vtm.terminal.Restart();"/>                    <!-- Terminate running console applications and restart the current session. -->
    <IgnoreAltbuf                      ="if (vtm.terminal.AltbufMode()) then vtm.terminal.ForwardKeys(); return; end;"/>  <!-- Forward the last key event to the terminal if the alternate buffer is active. -->

    <!-- Taskbar focus layout:
            Splitter (not focusable)
            AppGroup (weight=100)  CollapseButton (10) CloseAllButton (10)
                RunningApp (50)  CloseButton (10)
            ...
            AppGroup (100)
            UserListHeader (not focusable)  UserListCollapseButton (100)
                UserLabel (50)
                ...
                UserLabel (50)
            DisconnectButton (100)  ShutdownButton (10)

        Keyboard focus switching logic:
            DownArrow   Move to the next focusable element with a weight >= 50.
            UpArrow     Move to the previous focusable element with a weight >= 50.
            RightArrow  Move to the next focusable element with a weight >= 10.
            LeftArrow   Move to the previous focusable element with a weight >= CURRENT weight.
            Tab         Move to the next focusable element with a weight >= 100.
            Shift+Tab   Move to the previous focusable element with a weight >= 100.
            PageDown    Move to the next focusable element, skipping N elements with weight >= 50 (N = taskbar_height / (2 * line_height)).
            PageUp      Move to the previous focusable element, skipping N elements with weight >= 50 (N = taskbar_height / (2 * line_height)).
            Home        Move to the first (top) focusable element with a weight >= 100.
            End         Move to the last (bottom) focusable element with a weight >= 100.

        vtm.taskbar.FocusNextItem(si32 n, si32 min_w, si32 max_w = si32max):
            Move focus to the next (n > 0) or previous (n < 0) focusable element where min_w <= weight <= max_w.
            Skips (std::abs(n)-1) elements meeting the weight criteria, and all elements with weight < min_w.
    -->
    <FocusLeftTaskbarItem  ="local w=vtm.taskbar.GetFocusedWeight(); vtm.taskbar.FocusNextItem(-1, w);"/>
    <FocusRightTaskbarItem ="vtm.taskbar.FocusNextItem( 1, 10, 10);"/>
    <FocusPrevTaskbarItem  ="vtm.taskbar.FocusNextItem(-1, 50);"/>
    <FocusNextTaskbarItem  ="vtm.taskbar.FocusNextItem( 1, 50);"/>
    <FocusPrevTaskbarPage  ="local h1,h2=vtm.taskbar.GetHeight(); vtm.taskbar.FocusNextItem(-h1/(2*h2), 50);"/>
    <FocusNextTaskbarPage  ="local h1,h2=vtm.taskbar.GetHeight(); vtm.taskbar.FocusNextItem( h1/(2*h2), 50);"/>
    <FocusPrevTaskbarGroup ="vtm.taskbar.FocusNextItem(-1, 100);"/>
    <FocusNextTaskbarGroup ="vtm.taskbar.FocusNextItem( 1, 100);"/>
    <FocusTaskbarTop       ="vtm.taskbar.FocusTop();"/>
    <FocusTaskbarEnd       ="vtm.taskbar.FocusEnd();"/>
    <DecreaseTaskbarWidth  ="vtm.taskbar.ChangeWidthByStep(-1);"/>
    <IncreaseTaskbarWidth  ="vtm.taskbar.ChangeWidthByStep(1);"/>
    <ActivateTaskbarItem   ="vtm.taskbar.ActivateItem();"/>
</Scripting>