2

我开始学习长生不老药,并成功使iex具有ansi颜色。问题是在 vscode 的终端中,输出看起来像垃圾:

$ iex
Interactive Elixir (1.8.1) - press Ctrl+C to exit (type h() ENTER for help)
?[G?[36miex>?[0m?[0m
  • 视窗 10 专业版
  • vscode 1.36.1
  • cmder (conemu 161206)
  • 灵丹妙药1.8.1

当我从 cmder 运行 git-for-windows 的 bash 时,它运行良好,颜色也很好。

当我在 vscode 中运行与集成终端相同的 bash 时,会打印 ansi 代码而不是颜色。

我对 nodejs 或其他任何东西都没有任何问题,只有与长生不老药相关的东西崩溃了。

这对两者都是一样的,我不知道它是否仍然重要:

$ elixir -e "IO.inspect :io.columns"
{:error, :enotsup}

有谁知道 vscode 的不同之处在于使同一件事以不同的方式工作吗?

4

1 回答 1

2

并非所有Windows 控制台都支持Thise ansi 转义码,尤其是 VSCode 中的嵌入式 CMD(详见issue 1173)。 即使在 VSCode 完成的 git bash 会话中,该 bash 会话仍将在 CMD 之上运行,而不是像 cmder/ConEmu 这样的混合终端,能够通过挂钩 Windows API来解释 ANSI X3.64 / xterm 256 颜色。Microsoft/WSL

如此处所示,有一个选项可以-elixir ansi_enabled falseelixir不输出颜色转义码。 尝试在应用程序中设置它,就像做这个例子的反面一样。
:elixir

Application.put_env(:elixir, :ansi_enabled, false)

另一种方法是使用基于 ConEmu/cmder 的 VSCode 控制台,例如ipatalas.vscode-conemu

https://raw.githubusercontent.com/ipatalas/vscode-conemu/master/images/titlebar.png

在那种控制台中,ANSI 颜色转义码应该可以正常显示。


OP indriq在评论中确认:

  • 不想禁用颜色
  • 使用ansicon,再次注入程序:

ANSICON 将一个 DLL 注入到一个进程中,挂钩它的函数。
三种方法之一用于注入 DLL。

  • LoadLibraryviaCreateRemoteThread一个正在运行的进程。
  • LdrLoadDllviaCreateRemoteThread用于 64 位 .NET AnyCPU 进程。
  • 否则,将 DLL 直接添加到导入表中。

您可以在此处使用 VSCode 进行设置

{
    ...

    "terminal.integrated.shell.windows": "C:\\Program Files\\ANSICON\\x64\\ansicon.exe",
    "terminal.integrated.shellArgs.windows": [
        "C:\\Program Files\\Git\\bin\\sh.exe",
        "--login",
        "-i"
    ]
}
于 2019-07-13T14:44:49.377 回答