【问题标题】:PhpStorm terminal : Cygwin colors does not workPhpStorm 终端:Cygwin 颜色不起作用
【发布时间】:2016-07-18 13:26:36
【问题描述】:

我有 PhpStorm 2016.2,并在 Shell 路径中添加了 Cygwin,如下所示:"C:\cygwin64\bin\env.exe" CHERE_INVOKING=1 /bin/bash.exe

它运行良好,但颜色不起作用。 例如,我有 ?[32m Name 而不是将 Name 涂成绿色。

我尝试了一些方法,例如添加插件 Grep Console 以支持 ANSI Color,但没有奏效。

使用多种 ANSI 颜色的线条真的很难?[39m ?[32m Scheme ?[39m ?[32m Host ?[39m ?[32m Path

不要犹豫,询问有关该问题的更多信息。谢谢。

附:我在 Windows 10 上。

编辑

当我在 PHPStorm 终端中执行/usr/bin/which php 时,我得到/cygdrive/d/wamp2/bin/php/php5.6.16/php。我的 WAMP 中有 php5.6.16 和 php7.0.0,我目前正在使用 php7.0.0。

编辑 2 我为 php7.0.0 添加了一个 $PATH,所以现在当我执行 /usr/bin/which php 时我有 /cygdrive/d/wamp2/bin/php/php7.0.0/php。但主要问题仍然存在。

【问题讨论】:

  • 终端通常支持 ANSI 颜色(如果我执行像 npm.cmd outdated -g 这样的命令(它有彩色输出),我在 Windows 7 上工作正常(使用 cmd))。可能是 Cygwin/bash 在这里有事情要做...
  • 感谢您的回答。当我使用 Cygwin env.exe 在 Phpstorm 终端中执行 php bin/console d:r 时,我得到 ANSI 颜色代码 ?[32m。但是当我直接在 Cygwin 中执行相同的命令时,我得到了很好的彩色显示。所以我的 Cygwin 看起来不错。这更像是 Phpstorm 错误地解释了命令返回的内容。
  • 我刚刚测试了一些有趣的东西。当我使用 Cygwin 在我的 Phpstorm 终端中执行 ls -l --color=always 时,我得到了颜色。似乎只有 symfony 命令(例如:php bin/console d:r)提供 ANSI 代码 ?[32m。但是我还是不知道bug是从哪里来的……
  • 请提供您正在使用的 Windows 10 的版本。 (Click Windows Icon -> Settings -> System -> About) version 1607/build 14393(周年更新)存在问题,这似乎导致 ANSI 控制台支持出现一些问题。
  • @WillMic 您可能需要在 Cygwin PHP 环境中安装 php-posixextension。除此之外,Cygwin 应该带有提供颜色 (ANSI) 支持的 MinTTY。当为它定义ANSICON 环境变量(检查~/.bash_rc)时,Symfony 应该着色。只有其他建议是传递--no-ansi 标志,如php bin/console --no-ansi your-commandphp composer.phar --no-ansi your-command 以禁用颜色输出。

标签: terminal cygwin wamp phpstorm symfony-console


【解决方案1】:

添加第二个答案为我的原始答案提供替代解决方案。

ANSICON 支持

先下载安装ANSICON

  • 解压windows二进制文件 (x86 或 x64 目录内容) 进入您的 $PATH (D:\wamp\bin\php\php7.0.0)
  • 可选择从 Windows 命令提示符运行 ansicon -i 允许您使用ANSICON 向 Windows 命令提示符添加 ansi 颜色支持。

接下来你需要为 PHPStorm 终端包装 ANSICON

"X:\path\to\ansicon.exe" -p "C:\cygwin64\bin\env.exe" CHERE_INVOKING=1 /bin/bash.exe

注意:如原始答案中所述,使用 -l--login 会将 /usr/bin/usr/local/bin 添加到您的 $PATH 并导致 终端使用 Cygwin PHP 安装,不需要 ANSICON。

接下来在您的~/.bashrc 文件中,您需要在文件底部添加。

export ANSICON=true

您可以通过从 Cygwin 终端运行以下命令轻松附加该行。

echo export ANSICON=true >> ~/.bashrc

这将确保 Symfony 能够找到具有不同 Windows 版本的 ANSICON 环境变量。

接下来重新启动 PHPStorm 并打开终端进行测试。

【讨论】:

  • 附带说明,似乎确实存在关于该问题的 PHP 错误:bugs.php.net/bug.php?id=72768
  • 哇!非常感谢!在 PHPStorm 终端中,当我输入 php bin/console d:r 时,我会得到颜色。但是现在当我键入composer self-update 之类的命令或使用 gulp 时出现了一个新错误:$ composer self-update/cygdrive/c/ProgramData/ComposerSetup/bi‌​n/composer: line 3: dirname: command not found/cygdrive/c/ProgramData/ComposerSetup/bi‌​n/composer: line 17: sed: command not foundCould not open input file: /composer.phar。我得到的第二个错误是,在终端中输入一两个命令后,我无法再输入,我必须打开一个新的终端选项卡才能这样做。
  • @WillMic PHPStorm 终端很麻烦,有时如果你到达底部它并不总是刷新,所以你必须拖动顶部栏,调整高度,以便它检测到终端的内部高度。至于dirname: command not found,我建议将export PATH=/usr/bin:/usr/local/bin:$PATH 添加到~/.bashrc 文件的底部,以确保您的终端环境包含它。否则,在我的原始答案中添加 --login 开关以加载完整的 Cygwin 环境(.bash_profile)。
  • 不,我知道它可能会搞砸,但事实并非如此。打开一个新标签并按住一个键,在随机数量的字符(5~40)后停止输入。有时我复制粘贴,不能按回车。自从我使用最后一个 shell 路径以来,PHPStorm 终端中存在一个真正的问题。而对于另一件事。我在 Cygwin 控制台中输入了echo export PATH=/usr/bin:/usr/local/bin:$PATH >> ~/.bashrc,我认为我做错了......我在任何 Cygwin 控制台(PHPStorm 也是)顶部收到错误消息-bash: /home/USER/.bashrc: line 200: syntax error near unexpected token « ( »
  • 手动导航到它并编辑它,C:\cygwin64\home\<username>\.bashrc 例如:"C:\cygwin64\home\fyrye\.bashrc" 删除 200 上的混乱行并手动添加。
【解决方案2】:

您需要将-l 开关添加到您的终端路径。

在添加开关之前:

完整路径应该是

"C:\cygwin64\bin\env.exe" CHERE_INVOKING=1 /bin/bash.exe -l

"C:\cygwin64\bin\env.exe" CHERE_INVOKING=1 /bin/bash.exe --login

请务必关闭当前打开的终端窗口通过单击终端对话框左上角的红色 X 并重新打开它。

现在再次运行该命令,它应该如下所示:

有关更多信息,请参阅 Cygwin 终端中的man bash


更新

根据您对 WAMP 安装的评论。您需要在 Cygwin 中安装 PHP 才能正确运行,这将允许使用 posix 函数行并为您的 PHP 环境模拟 Linux 发行版。这通常是使用 Cygwin 的原因。

您打算如何将 Cygwin 与 PHP 一起使用?

问题在于 Cygwin 正在使用 Windows PHP 可执行文件,而 Symfony 控制台组件 StreamOutput 将其检测为 PHP 的 Windows 实例,而不是 Cygwin/Linux,以便使用 posix_isatty

这里是 Symfony 控制台用于向终端呈现颜色输出的代码示例。

if ('\\' === DIRECTORY_SEPARATOR) {
    static::$defaultColors = @(
        0 >= version_compare('10.0.10586', PHP_WINDOWS_VERSION_MAJOR.'.'.PHP_WINDOWS_VERSION_MINOR.'.'.PHP_WINDOWS_VERSION_BUILD)
        || false !== getenv('ANSICON')
        || 'ON' === getenv('ConEmuANSI')
        || 'xterm' === getenv('TERM')
    );
} elseif (function_exists('posix_isatty')) {
    $h = stream_get_meta_data($this->outputStream) + array('wrapper_type' => null);
    $h = 'Output' === $h['stream_type'] && 'PHP' === $h['wrapper_type'] ? fopen('php://stdout', 'wb') : $this->outputStream;
}

【讨论】:

  • 我尝试了这两条路径,但都没有成功:我的 PhpStorm 2016.2 终端中仍然有 ?[39m ?[32m。这正常吗?
  • 不,这是不正常的,因为 Symfony 检测到支持,这可能意味着您的 cygwin 配置文件已更改。在 PHPStorm 中启动终端并运行此行。 php -r 'var_dump(DIRECTORY_SEPARATOR == "\\");' 当 cygwin 环境正确初始化时,它应该返回 false,而不是 true。如果是false,则运行php -r "var_dump(function_exists('posix_isatty'));",它应该返回true。还要确保从终端更新 composer.phar php composer.phar self-update。作为说明,我也在使用 PhpStorm 2016.2。
  • 此外,您可以检查echo $PATH 以确保/usr/bin/usr/local/bin前缀到所有其他环境路径。最后,您应该确保 MinTTY 在 /usr/bin/mintty.exe 的 Cygwin 环境中可用,或者通过运行 cygwin 安装程序并搜索 MinTTY 来安装它
  • 还要确保完全关闭终端(或 PHPStorm),而不仅仅是隐藏它,以便它重新实例化终端。用图片更新了我的答案,以说明我采取的步骤。
  • @WillMic 最后,请使用 PHPStorm 终端的 /usr/bin/which php 输出更新您的问题。我认为可能存在路径冲突并且正在运行错误的 PHP 可执行文件,例如来自 XAMP 或 WAMP 安装。
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多