Releases: directvt/vtm
Releases · directvt/vtm
v2026.03.19
v2026.03.07
v2026.03.06
Known Issues
- Powershell text background is not completely fixed.
UPDATE: I re-uploaded Windows builds that fixed 97795fc the black text on a black background in powershell.
Workaround (microsoft/terminal#15452, PowerShell/PSReadLine#3702):Set-PSReadLineOption -Colors @{ ContinuationPrompt = "`e[39m" Default = "`e[39m" Member = "`e[39m" Number = "`e[39m" Type = "`e[39m" }
Changes
- Built-in terminal:
- Fix powershell text background.
- Remove the default translucency of non-scrolling regions (top/bottom/left/right).
v2026.03.05
Changes
- Built-in terminal:
- Fix line input mode when preprocessing is disabled (allow Ctrl+Z to be read by ReadFile). xlink: microsoft/terminal#19940
- Fix palette loading from settings ('/config/terminal/colors/color*')
- Fix OSC 10/11 request (default fg/bg).
- Drop '/config/terminal/colors/bground' from settings.xml (in favor of '/config/terminal/colors/default').
- Fix OSC 104 (reset palette record).
v2026.03.04
v2026.03.03
Changes
- Built-in terminal:
- Implement color blending in linear RGB space with correction of color intensity deviations and applying dynamic contrast.
settings.xml
~/.config/vtm/settings.xml:<config> <terminal> <menu> <item*/> <item label=" Clear " script=TerminalClearScrollback|OnLeftClick/> <item label=" \e[38:2::0:255:0mPrint Test\e[m " tooltip=" Click to print a test page "> <script=OnLeftClick> terminal.LineWrapMode(0) terminal.Print("\\n\\nBlending Test\\n\\n") local function print_color_row(start_code) terminal.Print(" ") for i = 0, 7 do local code = start_code + i terminal.Print("\\x1b["..code.."m \\x1b[m") end end print_color_row(40) terminal.Print("\\n") print_color_row(100) terminal.Print("\\n\\n") local function colored_text(r1, g1, b1, a1, r2, g2, b2, a2) local text = " Some Text Fragment " local len = #text local result = " " for i = 1, len do local ratio = (len > 1) and ((i - 1) / (len - 1)) or 0 local r = math.floor(r1 + (r2 - r1) * ratio) local g = math.floor(g1 + (g2 - g1) * ratio) local b = math.floor(b1 + (b2 - b1) * ratio) local a = math.floor(a1 + (a2 - a1) * ratio) local char = text:sub(i, i) result = result .. string.format("\\x1b[48:2:%d:%d:%d:%dm%s", r, g, b, a, char) end local tail = 64 for i = 1, tail do local ratio = (i - 1) / (tail - 1) local a = math.floor(a2 * (1 - ratio)) result = result .. string.format("\\x1b[48:2:%d:%d:%d:%dm ", r2, g2, b2, a) end result = result.."\\x1b[m\\n" return result end local alpha = 64 terminal.Print(colored_text(255, 255, 0, alpha, 255, 0, 0, alpha), '\\n') terminal.Print(colored_text(255, 0, 255, alpha, 0, 0, 255, alpha), '\\n') terminal.Print(colored_text(0, 255, 255, alpha, 0, 255, 0, alpha), '\\n') terminal.Print(colored_text(128, 128, 128, alpha, 255, 255, 255, alpha), '\\n') alpha = 128 terminal.Print(colored_text(255, 255, 0, alpha, 255, 0, 0, alpha), '\\n') terminal.Print(colored_text(255, 0, 255, alpha, 0, 0, 255, alpha), '\\n') terminal.Print(colored_text(0, 255, 255, alpha, 0, 255, 0, alpha), '\\n') terminal.Print(colored_text(128, 128, 128, alpha, 255, 255, 255, alpha), '\\n') alpha = 254 --terminal.Print(colored_text(255, 255, 0, alpha, 255, 0, 0, alpha), '\\n') --terminal.Print(colored_text(255, 0, 255, alpha, 0, 0, 255, alpha), '\\n') --terminal.Print(colored_text(0, 255, 255, alpha, 0, 255, 0, alpha), '\\n') --terminal.Print(colored_text(128, 128, 128, alpha, 255, 255, 255, alpha), '\\n') terminal.LineWrapMode(1) </script> </item> <item=Green/> <item=Red/> <item=Blue/> <item=GreenLt/> <item=RedLt/> <item=BlueLt/> <item=WhiteLt/> <item=Yellow/> <item=Magenta/> <item=Cyan/> <item=YellowLt/> <item=MagentaLt/> <item=CyanLt/> <item=CGA/> <item=Ubuntu24/> <item=CampbellPowershell/> <item=OneHalfLight/> <item=OneHalfDark/> <item=SolarizedLight/> <item=SolarizedDark/> <item=TangoLight/> <item=TangoDark/> <item=VSCodeLightModern/> <item=VSCodeDarkModern/> <item=Dimidium/> <item=Ottosson/> <item=Campbell/> <item=Vintage/> <item=DarkPlus/> <item=IBM5153/> </menu> </terminal> </config> <Dimidium label=" Dimidium "> <script=OnLeftClick> terminal.Print("\\x1b]10;rgb:BA/B7/B6\\x07") terminal.Print("\\x1b]11;rgb:14/14/14\\x07") terminal.Print("\\x1b]12;rgb:37/E5/7B\\x07") terminal.Print("\\x1b]4;0;rgb:00/00/00;1;rgb:CF/49/4C;2;rgb:60/B4/42;3;rgb:DB/9C/11;4;rgb:05/75/D8;5;rgb:AF/5E/D2;6;rgb:1D/B6/BB;7;rgb:BA/B7/B6;8;rgb:81/7E/7E;9;rgb:FF/64/3B;10;rgb:37/E5/7B;11;rgb:FC/CD/1A;12;rgb:68/8D/FD;13;rgb:ED/6F/E9;14;rgb:32/E0/FB;15;rgb:DE/E3/E4\\x07") </script> </Dimidium> <Ottosson label=" Ottosson "> <script=OnLeftClick> terminal.Print("\\x1b]10;rgb:BE/BE/BE\\x07") terminal.Print("\\x1b]11;rgb:00/00/00\\x07") terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07") terminal.Print("\\x1b]4;0;rgb:00/00/00;1;rgb:BE/2C/21;2;rgb:3F/AE/3A;3;rgb:BE/9A/4A;4;rgb:20/4D/BE;5;rgb:BB/54/BE;6;rgb:00/A7/B2;7;rgb:BE/BE/BE;8;rgb:80/80/80;9;rgb:FF/3E/30;10;rgb:58/EA/51;11;rgb:FF/C9/44;12;rgb:2F/6A/FF;13;rgb:FC/74/FF;14;rgb:00/E1/F0;15;rgb:FF/FF/FF\\x07") </script> </Ottosson> <Campbell label=" Campbell "> <script=OnLeftClick> terminal.Print("\\x1b]10;rgb:CC/CC/CC\\x07") terminal.Print("\\x1b]11;rgb:0C/0C/0C\\x07") terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07") terminal.Print("\\x1b]4;0;rgb:0C/0C/0C;1;rgb:C5/0F/1F;2;rgb:13/A1/0E;3;rgb:C1/9C/00;4;rgb:00/37/DA;5;rgb:88/17/98;6;rgb:3A/96/DD;7;rgb:CC/CC/CC;8;rgb:76/76/76;9;rgb:E7/48/56;10;rgb:16/C6/0C;11;rgb:F9/F1/A5;12;rgb:3B/78/FF;13;rgb:B4/00/9E;14;rgb:61/D6/D6;15;rgb:F2/F2/F2\\x07") </script> </Campbell> <CampbellPowershell label=" Campbell Powershell "> <script=OnLeftClick> terminal.Print("\\x1b]10;rgb:CC/CC/CC\\x07") terminal.Print("\\x1b]11;rgb:01/24/56\\x07") terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07") terminal.Print("\\x1b]4;0;rgb:0C/0C/0C;1;rgb:C5/0F/1F;2;rgb:13/A1/0E;3;rgb:C1/9C/00;4;rgb:00/37/DA;5;rgb:88/17/98;6;rgb:3A/96/DD;7;rgb:CC/CC/CC;8;rgb:76/76/76;9;rgb:E7/48/56;10;rgb:16/C6/0C;11;rgb:F9/F1/A5;12;rgb:3B/78/FF;13;rgb:B4/00/9E;14;rgb:61/D6/D6;15;rgb:F2/F2/F2\\x07") </script> </CampbellPowershell> <Vintage label=" Vintage "> <script=OnLeftClick> terminal.Print("\\x1b]10;rgb:C0/C0/C0\\x07") terminal.Print("\\x1b]11;rgb:00/00/00\\x07") terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07") terminal.Print("\\x1b]4;0;rgb:00/00/00;1;rgb:80/00/00;2;rgb:00/80/00;3;rgb:80/80/00;4;rgb:00/00/80;5;rgb:80/00/80;6;rgb:00/80/80;7;rgb:C0/C0/C0;8;rgb:80/80/80;9;rgb:FF/00/00;10;rgb:00/FF/00;11;rgb:FF/FF/00;12;rgb:00/00/FF;13;rgb:FF/00/FF;14;rgb:00/FF/FF;15;rgb:FF/FF/FF\\x07") </script> </Vintage> <OneHalfDark label=" One Half Dark "> <script=OnLeftClick> terminal.Print("\\x1b]10;rgb:DC/DF/E4\\x07") terminal.Print("\\x1b]11;rgb:28/2C/34\\x07") terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07") terminal.Print("\\x1b]4;0;rgb:28/2C/34;1;rgb:E0/6C/75;2;rgb:98/C3/79;3;rgb:E5/C0/7B;4;rgb:61/AF/EF;5;rgb:C6/78/DD;6;rgb:56/B6/C2;7;rgb:DC/DF/E4;8;rgb:5A/63/74;9;rgb:E0/6C/75;10;rgb:98/C3/79;11;rgb:E5/C0/7B;12;rgb:61/AF/EF;13;rgb:C6/78/DD;14;rgb:56/B6/C2;15;rgb:DC/DF/E4\\x07") </script> </OneHalfDark> <OneHalfLight label=" One Half Light "> <script=OnLeftClick> terminal.Print("\\x1b]10;rgb:38/3A/42\\x07") terminal.Print("\\x1b]11;rgb:FA/FA/FA\\x07") terminal.Print("\\x1b]12;rgb:4F/52/5D\\x07") terminal.Print("\\x1b]4;0;rgb:38/3A/42;1;rgb:E4/56/49;2;rgb:50/A1/4F;3;rgb:C1/83/01;4;rgb:01/84/BC;5;rgb:A6/26/A4;6;rgb:09/97/B3;7;rgb:FA/FA/FA;8;rgb:4F/52/5D;9;rgb:DF/6C/75;10;rgb:98/C3/79;11;rgb:E4/C0/7A;12;rgb:61/AF/EF;13;rgb:C5/77/DD;14;rgb:56/B5/C1;15;rgb:FF/FF/FF\\x07") </script> </OneHalfLight> <SolarizedDark label=" Solarized Dark "> <script=OnLeftClick> terminal.Print("\\x1b]10;rgb:83/94/96\\x07") terminal.Print("\\x1b]11;rgb:00/2B/36\\x07") terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07") terminal.Print("\\x1b]4;0;rgb:00/2B/36;1;rgb:DC/32/2F;2;rgb:85/99/00;3;rgb:B5/89/00;4;rgb:26/8B/D2;5;rgb:D3/36/82;6;rgb:2A/A1/98;7;rgb:EE/E8/D5;8;rgb:07/36/42;9;rgb:CB/4B/16;10;rgb:58/6E/75;11;rgb:65/7B/83;12;rgb:83/94/96;13;rgb:6C/71/C4;14;rgb:93/A1/A1;15;rgb:FD/F6/E3\\x07") </sc...
v2026.02.28
v2026.02.27
Changes
- Implement new transparency support logic for the built-in terminal:
- Store an alpha channel for colors:
- Foreground of each scrollback cell (SGR 38:2::R:G:B:A, A=255 by default)
- Background of each scrollback cell (SGR 48:2::R:G:B:A, A=255 by default)
- Inherit the foreground alpha for underline colors (set by SGR 58:2::R:G:B).
- Handle the terminal window rendering by:
- Blending the semi-transparent background color of the scrollback rows with the global background color (set by OSC 11).
- Blending the semi-transparent foreground (and underline) color of the scrollback rows with the final background color calculated in the previous step.
- Store an alpha channel for colors:
An example of using color brushes that are independent of the global background:
printf "\e[m
\e[35b\n \e[48:2::0:0:255:128m Some Text Fragment \e[m
\e[35b\n \e[48:2::0:255:0:128m Some Text Fragment \e[m
\e[35b\n \e[48:2::255:0:0:128m Some Text Fragment \e[m
\e[35b\n \e[48:2::0:255:255:128m Some Text Fragment \e[m
\e[35b\n \e[48:2::255:255:0:128m Some Text Fragment \e[m
\e[35b\n \e[48:2::255:0:255:128m Some Text Fragment \e[m
\e[36b\n"
v2026.02.20
Changes
- Fix 256-color palette change via OSC 4.
- Introduce an interactive session token. #877
| ObjectID/ClassID | Role | Methods | Method description |
|---|---|---|---|
terminal |
vtm.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\\. |
Terminal control using Lua scripts via APC
The built-in terminal is capable of executing Lua scripts received via APC (Application Program Command) vt-sequences. The format of the vt-sequence is as follows:
ESC _ lua: <script body> STor
ESC _ lua:FFFFFFFFFFFFFFFF: <script body> STwhere:
ESC_: APC vt-sequence prefix.lua:: case-insensitive APC payload marker.<script body>: Lua script body.ST:ESC``\orBEL- APC sequence terminator.FFFFFFFFFFFFFFFF:: 16-hexadecimal-digit interactive session token ending with a colon. This token can be obtained using the following APC request:\e_lua:terminal.RequestInteractiveSessionToken()\a- The terminal will respond with an APC sequence containing the 16 digits of the required interactive token:\e_event=session;token=FFFFFFFFFFFFFFFF\e\\.Note: Without specifying an interactive session token, calls to functions related to interactive interaction (moving/sizing windows, mouse, keyboard, focus, etc.) will be silently ignored.
Usage examples:
Note: The global variable
terminal(in the Lua namespace) is an alias forvtm.terminal.
bash:# Print the current scrollback buffer limits printf "\e_lua: local n,m,q=terminal.ScrollbackSize(); terminal.PrintLn('size=', n, ' growstep=', m, ' maxsize=', q)\e\\" # Set the scrollback buffer limit to 10K lines printf "\e_lua: terminal.ScrollbackSize(10000)\a" # Maximize the terminal window ## 1. Get a session token: printf "\e_lua:terminal.RequestInteractiveSessionToken()\a" ## 2. Use the received token when requesting to maximize the window: printf "\e_lua:0000000000000000: vtm.applet.Maximize()\e\\"
v2026.02.16
Changes
- Improve control over locked windows. #872
- Suppress window manager closing by non-owner using the keyboard (Esc+W; or by script).

