randy3k / Terminus

Bring a real terminal to Sublime Text
https://packagecontrol.io/packages/Terminus
MIT License
1.39k stars 82 forks source link

Weird behaviour with default terminal size and ANSI escape codes #395

Closed mataha closed 1 year ago

mataha commented 1 year ago

The following setting controls the default size in Terminus:

{
   "size": [null, null],
}

With the defaults, whenever I open a default shell (in my case Windows Command Prompt) in a panel, the second line of the header message gets eaten during preprocessing of my AutoRun scripts:

Microsoft Windows [Version 10.0.19044.2965]

>

Sure enough, with "debug": true I can see that Terminus receives ANSI CSI n A (Cursor Up) and moves the cursor one line up before erasing the contents to the end with CSI n K:

20:51:23 DEBUG Terminus:159 feed_data() receieved: <ESC>[?25l<CR><ESC>[1A<ESC>[0K<CR>

However, when both of the dimensions in the config are non-null, that doesn't happen!

{
   "size": [80, 80],
}
Microsoft Windows [Version 10.0.19044.2965]
(c) Microsoft Corporation. All rights reserved.

>

What is going on here? I don't even know where to start debugging this. I've tried looking into ensure_position() and view_size() hoping to stumble upon something, but to no avail.

mataha commented 1 year ago

For reference, here are the (relevant) contents of my AutoRun script:

for /f %%E in (
    '"echo(prompt $E| "%ComSpec%" /d 2>nul"'
) do (
    set/p="%%~E[?12l%%~E[1F%%~E[0J"
) <nul

What this does is turns off cursor blinking, then moves the cursor to the previous line in order to erase everything in display from the position of the cursor to the end of the screen (so that the rubbish left by escape sequences is cleared). It works fine when Terminus is opened in a view, defaults or not.

mataha commented 1 year ago

Fixed itself with a sprinkle of console magic.