ajalt / mordant

Multiplatform text styling for Kotlin command-line applications
https://ajalt.github.io/mordant/
Apache License 2.0
963 stars 35 forks source link

ProgressBar deletes previous text in IntelliJ Terminal (Jedi) #76

Closed zinoviy23 closed 1 year ago

zinoviy23 commented 1 year ago

Version: mordant-jvm:2.0.0-beta8 OS: MacOS 13.0.1

I've noticed, that my application with progress bar works fine in iTerm, but works strangely in IntelliJ Terminal (I've checked on IntelliJ IDEA 2022.3 RC). Even it works fine in IntelliJ Terminal but inside docker container with -tty.

I think the problem is in the detection of ij terminal:

val ij = isIntellijConsole() // intellij console is interactive, even through System.console == null

However, for me, ij terminal has System.console != null.

So, when I unset env variables from com.github.ajalt.mordant.terminal.TerminalDetection#hasIdeaEnvvar my program starts working as expected.

I've created small reproduce project: https://github.com/zinoviy23/terminal-kotlin-test There is a small script run.sh. When it executed in ij terminal like ./run.sh, progress bar deletes previous lines. But without ij terminal environment variables it works fine: ./run.sh -e.

ajalt commented 1 year ago

I tested in both 2022.3 RC and in 2022.2.4, and the progress bar worked correctly in both cases. System.console == null in both versions for me. Is it possible you are using a different terminal somehow?

zinoviy23 commented 1 year ago

I don't know😕 I am using zsh with oh-my-zsh. I've added env printing to my example, for me it prints:

Console = java.io.Console@617faa95
crClearsLine = true
----------------env---------------------
PATH = /Users/aleksandr.izmailov/.sdkman/candidates/maven/current/bin:/Users/aleksandr.izmailov/bin:/usr/local/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin
SDKMAN_VERSION = 5.16.0
MANPATH = /opt/homebrew/share/man::
JAVA_OPTS = -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
TERM = xterm-256color
HOMEBREW_PREFIX = /opt/homebrew
_P9K_TTY = /dev/ttys004
COMMAND_MODE = unix2003
__INTELLIJ_COMMAND_HISTFILE__ = /Users/aleksandr.izmailov/Library/Caches/JetBrains/IdeaIC2022.2/terminal/history/terminal-playground-history
MAVEN_HOME = /Users/aleksandr.izmailov/.sdkman/candidates/maven/current
P9K_TTY = old
SDKMAN_DIR = /Users/aleksandr.izmailov/.sdkman
LOGNAME = aleksandr.izmailov
HOMEBREW_REPOSITORY = /opt/homebrew
XPC_SERVICE_NAME = 0
PWD = /Users/aleksandr.izmailov/IdeaProjects/terminal-playground
TOOLBOX_VERSION = 1.27.0.13477
INFOPATH = /opt/homebrew/share/info:
SDKMAN_CANDIDATES_DIR = /Users/aleksandr.izmailov/.sdkman/candidates
__CFBundleIdentifier = com.jetbrains.intellij.ce
SHELL = /bin/zsh
JAVA_MAIN_CLASS_4121 = MainKt
PAGER = less
LSCOLORS = Gxfxcxdxbxegedabagacad
SDKMAN_CANDIDATES_API = https://api.sdkman.io/2
SECURITYSESSIONID = 186ae
HOMEBREW_CELLAR = /opt/homebrew/Cellar
SDKMAN_PLATFORM = darwinarm64
USER = aleksandr.izmailov
ZSH = /Users/aleksandr.izmailov/.oh-my-zsh
P9K_SSH = 0
LaunchInstanceID = 797014AF-19BC-42BB-9AA1-26DD1F3046F0
TERMINAL_EMULATOR = JetBrains-JediTerm
LOGIN_SHELL = 1
TMPDIR = /var/folders/c5/zjl972hj13bcmkwsn9w05ysm0000gn/T/
SSH_AUTH_SOCK = /private/tmp/com.apple.launchd.gYTsUEH4k8/Listeners
XPC_FLAGS = 0x0
TERM_SESSION_ID = 9ed703b0-2a2d-445e-8811-4aaef03048cf
__CF_USER_TEXT_ENCODING = 0x1F5:0x0:0x0
LESS = -R
LC_CTYPE = UTF-8
SHLVL = 2
HOME = /Users/aleksandr.izmailov

I've recorded how it looks for me: Working example (without env variables): TerminalExample And execution in ij with IJ Terminal variables. TerminalWrongClear

ajalt commented 1 year ago

Thanks for the info and recordings, that's helpful.

Can you repeat the test but by running a task from the ide rather than the terminal? (i.e. click the â–¶ gutter icon next to fun main in your example repo) I'm curious if the behavior and environment variables are the same in both cases.

zinoviy23 commented 1 year ago

Running Kotlin main produces the next environment output in the Run Toolwindow

Console = null
crClearsLine = true
----------------env---------------------
PATH = /Users/aleksandr.izmailov/.sdkman/candidates/maven/current/bin:/Users/aleksandr.izmailov/bin:/usr/local/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin
SDKMAN_VERSION = 5.16.0
MANPATH = /opt/homebrew/share/man::
HOMEBREW_PREFIX = /opt/homebrew
COMMAND_MODE = unix2003
MAVEN_HOME = /Users/aleksandr.izmailov/.sdkman/candidates/maven/current
SDKMAN_DIR = /Users/aleksandr.izmailov/.sdkman
LOGNAME = aleksandr.izmailov
HOMEBREW_REPOSITORY = /opt/homebrew
PWD = /Users/aleksandr.izmailov/IdeaProjects/terminal-playground
XPC_SERVICE_NAME = application.com.jetbrains.intellij.ce.99044280.99045099
INFOPATH = /opt/homebrew/share/info:
TOOLBOX_VERSION = 1.27.0.13477
SDKMAN_CANDIDATES_DIR = /Users/aleksandr.izmailov/.sdkman/candidates
__CFBundleIdentifier = com.jetbrains.intellij.ce
JAVA_MAIN_CLASS_3271 = MainKt
SHELL = /bin/zsh
PAGER = less
LSCOLORS = Gxfxcxdxbxegedabagacad
SDKMAN_CANDIDATES_API = https://api.sdkman.io/2
SDKMAN_PLATFORM = darwinarm64
HOMEBREW_CELLAR = /opt/homebrew/Cellar
OLDPWD = /
SECURITYSESSIONID = 186b3
USER = aleksandr.izmailov
ZSH = /Users/aleksandr.izmailov/.oh-my-zsh
P9K_SSH = 0
TMPDIR = /var/folders/c5/zjl972hj13bcmkwsn9w05ysm0000gn/T/
LaunchInstanceID = D49D78B9-2CF0-4006-95A2-CE7AF27B7538
SSH_AUTH_SOCK = /private/tmp/com.apple.launchd.uPVI2WdUlx/Listeners
XPC_FLAGS = 0x0
__CF_USER_TEXT_ENCODING = 0x1F5:0x0:0x0
LESS = -R
LC_CTYPE = en_NL.UTF-8
HOME = /Users/aleksandr.izmailov

And it also works fine. (As I understand it detects idea runner from here com.github.ajalt.mordant.internal.MppImplKt#runningInIdeaJavaAgent)