eclipse-cdt / cdt

Eclipse CDT™ C/C++ Development Tools
http://eclipse.org/cdt
Eclipse Public License 2.0
295 stars 192 forks source link

`TERM=xterm` might not be a good choice for the terminal #737

Open segevfiner opened 4 months ago

segevfiner commented 4 months ago

Describe the bug With TERM=xterm, my terminal is trying to use escape sequences that don't seem to be properly supported by TM Terminal which causes terminal display to be messed up, TERM=xterm implies full support for the escape sequences supported by xterm, but TM Terminal doesn't seem to implement all of them properly.

https://github.com/eclipse-cdt/cdt/blob/98e86ff23aa0c20229a2635675e61c10d5556950/terminal/plugins/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/utils/Env.java#L67

To Reproduce Steps to reproduce the behavior:

  1. Use Zsh with the starship prompt theme, and zsh-syntax-highlight and zsh-autosuggestions
  2. Open a terminal in Eclipse

Expected behavior A clear and concise description of what you expected to happen.

Screenshots If applicable, add screenshots to help explain your problem.

Version Information (please complete the following information):

Additional context P.S. On macOS terminals are supposed to open as a login shell as macOS doesn't run the profile scripts at login.

jonahgraham commented 3 months ago

TERM=xterm implies full support

That is accurate, I was not around during the development when this decision was made, but I think it was done this way because doing something like TERM=eclipsetm would have meant termcap reporting that no escaping is supported. For what I assume the same reason, other programs like VSCode, xfce4-terminal and many others also advertise themselves as xterm or even xterm-256color (TM Terminal probably can change to xterm-256color since I implemented full color support a while ago).

While there are likely to continue to be some holes in full support, this can be best resolved by TM Terminal implementing missing xterm functionality.

Can you create a minimal reproducer (e.g. an echo with escapes) that fails to render properly?

segevfiner commented 3 months ago

There are other values then TERM though that might work until the terminal catches up. I can try and grab you the relevant parts of my shell rc so you can check what unsupported escapes it happens to use.

segevfiner commented 3 months ago

Here is a trimmed version of my .zshrc:

source /opt/homebrew/share/antigen/antigen.zsh

export LESS="-FR --mouse"

antigen use oh-my-zsh

(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)

antigen bundle git
antigen bundle fzf
antigen bundle docker
antigen bundle zsh-users/zsh-completions
antigen bundle zsh-users/zsh-autosuggestions
antigen bundle zsh-users/zsh-syntax-highlighting

eval "$(starship init zsh)"

ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets)

antigen apply
jonahgraham commented 3 months ago

Thanks - I don't have easy access to mac so I can't try that. Can you provide a screenshot or similar that shows the problem. Ideally an escape sequence that renders incorrectly (like color=121 ; printf "\e[38;5;%sm %3s \e[0m" $color $color)

If you can enable tracing of the VT100Backend processing it may show some escape sequences that fail to be processed as not understood. To do this:

  1. Create a file (e.g. /tmp/options) with the following contents:
org.eclipse.tm.terminal.control/debug/log = true
org.eclipse.tm.terminal.control/debug/log/VT100Backend = true
  1. Start eclipse with additional command line -debug /tmp/options
  2. Do your terminal operations that cause a problem.

The stderr for Eclipse will now show all the VT100Backend processing that is happening. Hopefully in that output it will be possible to see where the VT100Backend either didn't understand the escape sequences or where it misinterpreted them.

Excepted output will look something like this (startup parts edited down for brevity):

$ eclipse -debug /tmp/options
Start VM: /path/to/jre/bin/java
...
-debug /tmp/options
...
Debug options:
    file:/tmp/options loaded
...
setCursorColumn(0)
processNewline()
setStyle(Style(foreground=FOREGROUND, background=BACKGROUND))
setCursorColumn(0)
processNewline()
setStyle(Style(foreground=GREEN, background=BACKGROUND))
appendString("jonah@ditto ")
setStyle(Style(foreground=BLACK, background=BACKGROUND, bold))
appendString("/scratch/eclipse/src/cdt/workspace")
setStyle(Style(foreground=FOREGROUND, background=BACKGROUND))
appendString(" ")
setStyle(Style(foreground=MAGENTA, background=BACKGROUND))
appendString("()")
setStyle(Style(foreground=FOREGROUND, background=BACKGROUND))
setCursorColumn(0)
processNewline()
segevfiner commented 3 months ago

That should work in Linux as well if you just update the path to antigen, I removed the other macOS specific stuff.

jonahgraham commented 3 months ago

I don't use zsh (as a result not antigen either)

segevfiner commented 3 months ago

You can install them and remove them later on ? (Though you might find an even slightly configured Zsh can be quite more convenient then plain Bash 😛) But I'll try and produce the log when I have the time.

segevfiner commented 1 month ago

Here is a log from me just trying to type stuff, the prompt appears, disappears, and all sorts of random glitches while using this:

Log ``` ❯ /Applications/Eclipse.app/Contents/MacOS/eclipse -debug ${TMPDIR}options 2024-06-10 13:54:37.211 eclipse[61389:15231417] WARNING: Secure coding is not enabled for restorable state! Enable secure coding by implementing NSApplicationDelegate.applicationSupportsSecureRestorableState: and returning YES. Start VM: -Dorg.eclipse.ecf.provider.filetransfer.excludeContributors=org.eclipse.ecf.provider.filetransfer.httpclientjava -Dosgi.requiredJavaVersion=17 -Dosgi.instance.area.default=@user.home/eclipse-workspace -Dosgi.dataAreaRequiresExplicitInit=true -Dorg.eclipse.swt.graphics.Resource.reportNonDisposed=true -Declipse.e4.inject.javax.warning=false -Dsun.java.command=Eclipse -Xms256m -Xmx2048m -XX:+UseG1GC -XX:+UseStringDeduplication --add-modules=ALL-SYSTEM -Djava.security.manager=allow -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts -Xdock:icon=../Resources/Eclipse.icns -Djava.class.path=/Applications/Eclipse.app/Contents/MacOS//../Eclipse/plugins/org.eclipse.equinox.launcher_1.6.700.v20240213-1244.jar -os macosx -ws cocoa -arch aarch64 -showsplash /Applications/Eclipse.app/Contents/MacOS//../Eclipse/plugins/org.eclipse.epp.package.common_4.31.0.20240307-1200/splash.bmp -launcher /Applications/Eclipse.app/Contents/MacOS/eclipse -name Eclipse --launcher.library /Applications/Eclipse.app/Contents/MacOS//../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.aarch64_1.2.900.v20240129-1338/eclipse_11900.so -startup /Applications/Eclipse.app/Contents/MacOS//../Eclipse/plugins/org.eclipse.equinox.launcher_1.6.700.v20240213-1244.jar --launcher.appendVmargs -product org.eclipse.epp.package.rcp.product -debug /var/folders/2s/h5gc8qpj1x94_gm3jvs27pgw0000gn/T/options -vm /Applications/Eclipse.app/Contents/MacOS//../Eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.macosx.aarch64_17.0.10.v20240120-1143/jre/lib/libjli.dylib -vmargs -Dorg.eclipse.ecf.provider.filetransfer.excludeContributors=org.eclipse.ecf.provider.filetransfer.httpclientjava -Dosgi.requiredJavaVersion=17 -Dosgi.instance.area.default=@user.home/eclipse-workspace -Dosgi.dataAreaRequiresExplicitInit=true -Dorg.eclipse.swt.graphics.Resource.reportNonDisposed=true -Declipse.e4.inject.javax.warning=false -Dsun.java.command=Eclipse -Xms256m -Xmx2048m -XX:+UseG1GC -XX:+UseStringDeduplication --add-modules=ALL-SYSTEM -Djava.security.manager=allow -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts -Xdock:icon=../Resources/Eclipse.icns -Djava.class.path=/Applications/Eclipse.app/Contents/MacOS//../Eclipse/plugins/org.eclipse.equinox.launcher_1.6.700.v20240213-1244.jar Install location: file:/Applications/Eclipse.app/Contents/Eclipse/ Configuration file: file:/Applications/Eclipse.app/Contents/Eclipse/configuration/config.ini loaded Configuration location: file:/Applications/Eclipse.app/Contents/Eclipse/configuration/ Framework located: file:/Applications/Eclipse.app/Contents/Eclipse/plugins/org.eclipse.osgi_3.19.0.v20240213-1246.jar Loading extension: reference:file:org.eclipse.osgi.compatibility.state_1.2.1000.v20240213-1057.jar eclipse.properties not found Framework classpath: file:/Applications/Eclipse.app/Contents/Eclipse/plugins/org.eclipse.osgi_3.19.0.v20240213-1246.jar file:/Applications/Eclipse.app/Contents/Eclipse/plugins/ file:/Applications/Eclipse.app/Contents/Eclipse/plugins/org.eclipse.osgi.compatibility.state_1.2.1000.v20240213-1057.jar Splash location: /Applications/Eclipse.app/Contents/MacOS//../Eclipse/plugins/org.eclipse.epp.package.common_4.31.0.20240307-1200/splash.bmp Debug options: file:/var/folders/2s/h5gc8qpj1x94_gm3jvs27pgw0000gn/T/options loaded Time to load bundles: 306 Jun 10, 2024 1:54:38 PM org.apache.aries.spifly.BaseActivator log INFO: Registered provider ch.qos.logback.classic.spi.LogbackServiceProvider of service org.slf4j.spi.SLF4JServiceProvider in bundle ch.qos.logback.classic 13:54:39.383 [Start Level: Equinox Container: b26c45c0-2fb9-4918-8dc5-e99f9f10622d] DEBUG org.eclipse.jgit.internal.util.ShutdownHook -- register org.eclipse.jgit.util.FS$FileStoreAttributes$$Lambda$176/0x000000080024b270@7ef687c3 with shutdown hook 13:54:39.383 [Start Level: Equinox Container: b26c45c0-2fb9-4918-8dc5-e99f9f10622d] DEBUG org.eclipse.jgit.internal.util.ShutdownHook -- register org.eclipse.jgit.util.FS$FileStoreAttributes$$Lambda$176/0x000000080024b270@7ef687c3 with shutdown hook Starting application: 1916 Application started in : 8771ms setDefaultStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setDimensions(5,80) setDimensions(4,80) setDimensions(12,165) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setScrollRegion(-1,-1) setInsertMode(false) setVT100LineWrapping(true) setDimensions(12,165) setDimensions(12,165) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold, reverse)) appendString("%") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursorColumn(0) appendString(" ") setCursorColumn(0) eraseLineToEnd() appendString("e") setCursor(0, 0) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(0, 0) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString("xec zsh") setCursor(0, 7) setCursor(0, 6) setCursor(0, 5) setCursor(0, 4) setCursor(0, 3) setCursor(0, 2) setCursor(0, 1) setCursor(0, 0) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("c") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursor(0, 7) setCursor(0, 6) setCursor(0, 5) setCursor(0, 4) setCursor(0, 3) setCursor(0, 2) setCursorColumn(0) setCursorColumn(0) setCursor(-1, 0) setCursor(-1, 0) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) eraseToEndOfScreen() setCursorColumn(0) processNewline() setStyle(Style(foreground=CYAN, background=BACKGROUND, bold)) appendString("~") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" on ") setStyle(Style(foreground=BLUE, background=BACKGROUND, bold)) appendString("☁️ (us-central1)") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursorColumn(0) processNewline() setStyle(Style(foreground=GREEN, background=BACKGROUND, bold)) appendString("❯") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") appendString("ec") setCursor(2, 3) setCursor(2, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("c") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString("ho 'set -x\necho bla' | sh") setCursor(2, 4) setCursor(2, 3) setCursor(2, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("c") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("h") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 4) setCursor(2, 3) setCursor(2, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("e") setStyle(Style(foreground=RED, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("c") setStyle(Style(foreground=RED, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("h") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 4) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("h") setStyle(Style(foreground=RED, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("o") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 5) setCursor(2, 4) setCursor(2, 3) setCursor(2, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("c") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("h") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 5) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString(" ") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 6) setCursor(2, 5) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") appendString("H ") setCursor(2, 8) appendString("e") setCursor(2, 8) appendString(" ") setCursor(2, 8) setCursor(2, 7) appendString(" ") setCursor(2, 7) appendString("'set -x\necho bla' | sh") setCursor(2, 7) setCursor(2, 8) setCursor(2, 7) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("'") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 7) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursor(2, 7) appendString("'set -x\necho bla' | sh") setCursor(2, 7) appendString("" ") setCursor(2, 8) setCursor(2, 7) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString(""") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 7) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString(""") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("H") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 8) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("H") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 9) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("e") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("l") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 10) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("l") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("l") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 11) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("l") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 12) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString(" ") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 13) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString(" ") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("W") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 14) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("W") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 15) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("r") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 16) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("r") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("l") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 17) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("l") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("d") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 18) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("d") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("!") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 19) setStyle(Style(foreground=BLUE, background=BACKGROUND)) appendString("!") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 19) setStyle(Style(foreground=BLUE, background=BACKGROUND)) appendString("!") setStyle(Style(foreground=BLUE, background=BACKGROUND)) appendString(""") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(2, 20) setCursor(2, 19) setStyle(Style(foreground=BLUE, background=BACKGROUND)) appendString("!") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString(""") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursorColumn(0) setCursorColumn(0) processNewline() setCursorColumn(0) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) eraseToEndOfScreen() setStyle(Style(foreground=BLACK, background=BACKGROUND, bold)) appendString("∙") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") eraseLineToEnd() setCursorColumn(0) setCursorColumn(0) processNewline() setCursorColumn(0) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) eraseToEndOfScreen() setStyle(Style(foreground=BLACK, background=BACKGROUND, bold)) appendString("∙") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") eraseLineToEnd() appendString("/Applications/Eclipse.app/Contents/MacOS/eclipse -debug ${TMPDIR}options") setCursor(4, 2) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("/") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("A") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("p") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("p") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("l") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("i") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("c") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("a") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("t") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("i") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("n") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("s") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("/") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("E") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("c") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("l") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("i") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("p") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("s") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("e") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString(".") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("a") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("p") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("p") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("/") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("C") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("n") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("t") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("e") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("n") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("t") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("s") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("/") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("M") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("a") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("c") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("O") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("S") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("/") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("e") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("c") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("l") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("i") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("p") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("s") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("e") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString(" ") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("-") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("d") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("e") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("b") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("u") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("g") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString(" ") setStyle(Style(foreground=CYAN, background=BACKGROUND)) appendString("$") setStyle(Style(foreground=CYAN, background=BACKGROUND, bold)) setStyle(Style(foreground=BLUE, background=BACKGROUND, bold)) appendString("{") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=CYAN, background=BACKGROUND)) appendString("T") setStyle(Style(foreground=CYAN, background=BACKGROUND)) appendString("M") setStyle(Style(foreground=CYAN, background=BACKGROUND)) appendString("P") setStyle(Style(foreground=CYAN, background=BACKGROUND)) appendString("D") setStyle(Style(foreground=CYAN, background=BACKGROUND)) appendString("I") setStyle(Style(foreground=CYAN, background=BACKGROUND)) appendString("R") setStyle(Style(foreground=CYAN, background=BACKGROUND, bold)) setStyle(Style(foreground=BLUE, background=BACKGROUND, bold)) appendString("}") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("p") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("t") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("i") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("n") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("s") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(4, 73) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("s") setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString(""") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(4, 74) setCursor(4, 73) setStyle(Style(foreground=YELLOW, background=BACKGROUND)) appendString("s") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursor(4, 74) setCursorColumn(0) setCursorColumn(0) processNewline() setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold, reverse)) appendString("%") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursorColumn(0) appendString(" ") setCursorColumn(0) eraseLineToEnd() setCursorColumn(0) setCursorColumn(0) processNewline() setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold, reverse)) appendString("%") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursorColumn(0) appendString(" ") setCursorColumn(0) eraseLineToEnd() setCursorColumn(0) setCursorColumn(0) processNewline() setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold, reverse)) appendString("%") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursorColumn(0) appendString(" ") setCursorColumn(0) eraseLineToEnd() appendString("e") setCursorColumn(0) setCursorColumn(0) setCursor(6, 0) setCursor(5, 0) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) eraseToEndOfScreen() setCursorColumn(0) processNewline() setStyle(Style(foreground=CYAN, background=BACKGROUND, bold)) appendString("~") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" on ") setStyle(Style(foreground=BLUE, background=BACKGROUND, bold)) appendString("☁️ (us-central1)") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursorColumn(0) processNewline() setStyle(Style(foreground=GREEN, background=BACKGROUND, bold)) appendString("❯") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") appendString("e") setCursor(7, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(7, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString("cho "Hello World") setCursorColumn(0) setCursorColumn(0) processNewline() eraseLineToEnd() setCursor(7, 0) setCursor(7, 3) setCursor(7, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("c") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(8, 4) setCursorColumn(0) eraseLineToEnd() setCursor(7, 0) setCursor(7, 4) setCursor(7, 3) setCursor(7, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("c") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, underline)) appendString("h") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursorColumn(0) setCursorColumn(0) setCursor(6, 0) setCursor(5, 0) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) eraseToEndOfScreen() setCursorColumn(0) processNewline() setStyle(Style(foreground=CYAN, background=BACKGROUND, bold)) appendString("~") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" on ") setStyle(Style(foreground=BLUE, background=BACKGROUND, bold)) appendString("☁️ (us-central1)") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursorColumn(0) processNewline() setStyle(Style(foreground=GREEN, background=BACKGROUND, bold)) appendString("❯") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") appendString("echo "Hello World") setCursorColumn(0) setCursorColumn(0) processNewline() eraseLineToEnd() setCursor(7, 0) setCursor(7, 5) setCursor(7, 4) setCursor(7, 3) setCursor(7, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("e") setStyle(Style(foreground=RED, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("c") setStyle(Style(foreground=RED, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("h") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(7, 4) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("h") setStyle(Style(foreground=RED, background=BACKGROUND, bold)) setStyle(Style(foreground=RED, background=BACKGROUND, bold)) appendString("o") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(7, 5) setCursor(7, 4) setCursor(7, 3) setCursor(7, 2) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("e") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("c") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("h") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setStyle(Style(foreground=GREEN, background=BACKGROUND)) appendString("o") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) setCursor(8, 6) setCursorColumn(0) setCursorColumn(0) processNewline() setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold, reverse)) appendString("%") setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND, bold)) setStyle(Style(foreground=FOREGROUND, background=BACKGROUND)) appendString(" ") setCursorColumn(0) appendString(" ") setCursorColumn(0) eraseLineToEnd() ```