【问题标题】:Why does Ruby's Win32Console not work for me with Ramaze?为什么 Ruby 的 Win32Console 不适用于 Ramaze?
【发布时间】:2009-04-29 08:22:37
【问题描述】:

我已经安装了 Ramaze(在 Windows XP 上),它建议我还安装 win32console 以在它运行时获得彩色日志输出。

但是,这样做之后,我得到的是转义码而不是颜色,如下所示:

W [2009-04-29 09:02:55 $5064]  WARN | : ←[33mNo explicit root folder found, assuming it is C:/Projects/Ruby/Ramaze/Conferences←[0m
D [2009-04-29 09:02:55 $5064] DEBUG | : ←[34mUsing webrick←[0m
I [2009-04-29 09:02:55 $5064]  INFO | : ←[37mWEBrick 1.3.1←[0m
I [2009-04-29 09:02:55 $5064]  INFO | : ←[37mruby 1.8.6 (2008-08-11) [i386-mswin32]←[0m
D [2009-04-29 09:02:55 $5064] DEBUG | : ←[34mTCPServer.new(0.0.0.0, 7000)←[0m
D [2009-04-29 09:02:55 $5064] DEBUG | : ←[34mRack::Handler::WEBrick is mounted on /.←[0m
I [2009-04-29 09:02:55 $5064]  INFO | : ←[37mWEBrick::HTTPServer#start: pid=5064 port=7000←[0m

即使在全新安装 Ruby/Ramaze/win32console 时也会发生这种情况

我的设置是:

  • 带有 SP#3 的 Windows XP
  • ruby 1.8.6(2008-08-11 补丁级别 287)[i386-mswin32]
  • rubygems 版本 1.3.1
  • win32console gem 版本 1.2.0

顺便说一句,以下测试程序似乎可以工作,所以我想知道这是否是我机器上的 Ramaze/win32console 问题。

#!/usr/bin/ruby
require 'rubygems'
require 'win32console'

[0, 1, 4, 5, 7].each do |attr|
  puts '----------------------------------------------------------------'
  puts "ESC[#{attr};Foreground;Background"
  30.upto(37) do |fg|
    40.upto(47) do |bg|
      print "\033[#{attr};#{fg};#{bg}m #{fg};#{bg}  "
    end
  puts "\033[0m"
  end
end

【问题讨论】:

  • Ramaze 在某些情况下似乎使用 Analogger 进行日志记录。我不确定这是否是用来登录控制台的。看起来 Ramaze 传递了一个 :colorize 特性来告诉它是否对日志输出进行着色。我没有安装这个(我现在安装了),所以这可能是一个红色(!)鲱鱼。

标签: ruby windows-xp ramaze


【解决方案1】:

也许这不是您正在寻找的答案,但我在 Windows 上使用 MSYS/MinGW 并且它的 bash 在没有 win32console gem 的情况下正确显示颜色。

【讨论】:

  • 谢谢 - 我想这是一种选择,我以后可能会尝试。不过,我想先找出根本原因(尤其是考虑到其他人似乎可以正常工作)。无论如何感谢您的建议!
【解决方案2】:

试试

require 'rubygems'
require 'win32console'
include Win32::Console::ANSI
include Term::ANSIColor

【讨论】:

    【解决方案3】:

    我认为这是由于您的代码与 Ramaze(或 Innate)中的代码之间的格式字符串不同造成的。

    "\e[#{COLOR_CODE[LEVEL_COLOR[severity]]}m#{string}\e[0m"
    

    扩展为(红色,“Hello”是字符串):

    "\e[31mHello\e[0m"
    

    \e,在 Ruby 中,被转换为 \033,所以这不应该给我们带来麻烦:

    当然,等价于\033

    "\033" == "\e" # => true
    

    主要区别在于 Ramaze 没有指定背景颜色,因为如果它与终端的默认背景对比太大,可能会导致难看的输出。但是,如果您的背景是蓝色、红色、白色或 Ramaze 用于记录的任何其他前景色,它也可能完全不可读,我认为我们应该明确定义背景,并希望这也能解决您的问题窗户问题。

    【讨论】:

    • 我实际上得到了像 ←[34m 这样的转义码,而不是任何颜色,所以它(还)不是对比度或丑陋配色方案的问题。
    【解决方案4】:

    尝试在你的 app.rb 中添加它

    require "win32console"
    require "Win32/Console/ANSI"
    

    【讨论】:

    • 我在我的应用程序和 Ramaze 的 app.rb 中尝试过这个(如果你是这个意思),但没有改进 - 仍然是转义序列。
    【解决方案5】:

    在启动 Ramaze 之前需要 win32console。

    这是因为 Ramaze 及其日志记录机制在 win32console 之前保留对 stdout 和 stderr 的引用替换它们。

    【讨论】:

    • 我在需要 ramaze 的行之前有“需要'win32console'”,但这似乎没有帮助。或者这不是你的意思?
    • 你应该安装 win32console gem 并在 ramaze 之前需要它。这应该包含 ANSI 着色并在 Windows 提示符下正确显示颜色。
    【解决方案6】:

    我刚刚尝试了How to load ANSI escape codes or get coloured file listing in WinXP cmd shell 中的建议,效果很好。

    基本上我抓到ANSICon然后跑了:

    ansicon.exe -I(那里是大写的“i”)

    从它被提取到的 x86 子文件夹中。这安装了 ANSI 颜色代码 DLL 作为之后打开的所有 cmd.exe 窗口的挂钩。哟,瞧 - cmd.exe 中的颜色

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 2021-05-03
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多