彩色输出打破了使用readline的换行

时间:2012-01-10 16:23:47

标签: ruby readline

我正在使用Ruby中的readline为一些输出着色,但是我没有运气让换行正常工作。例如:

"\e[01;32mThis prompt is green and bold\e[00m > "

期望的结果是:

This prompt is green and bold > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

我实际得到的是:

aaaaaaaaaaa is green and bold > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

如果我删除了颜色代码,换行正常。我知道用bash,如果颜色代码被错误地终止,就会发生这种情况,但是我已经尝试了所有我能想到的东西,包括一些不同的宝石,行为是一样的。它也出现在具有不同版本Readline的多个系统上。此特定项目使用rb-readline而不是C readline

3 个答案:

答案 0 :(得分:20)

好的,sunkencity得到了复选标记,因为我最终使用了他的大部分解决方案,但我必须按如下方式对其进行修改:

# encoding: utf-8
class String
    def console_red;          colorize(self, "\001\e[1m\e[31m\002");  end
    def console_dark_red;     colorize(self, "\001\e[31m\002");       end
    def console_green;        colorize(self, "\001\e[1m\e[32m\002");  end
    def console_dark_green;   colorize(self, "\001\e[32m\002");       end
    def console_yellow;       colorize(self, "\001\e[1m\e[33m\002");  end
    def console_dark_yellow;  colorize(self, "\001\e[33m\002");       end
    def console_blue;         colorize(self, "\001\e[1m\e[34m\002");  end
    def console_dark_blue;    colorize(self, "\001\e[34m\002");       end
    def console_purple;       colorize(self, "\001\e[1m\e[35m\002");  end

    def console_def;          colorize(self, "\001\e[1m\002");  end
    def console_bold;         colorize(self, "\001\e[1m\002");  end
    def console_blink;        colorize(self, "\001\e[5m\002");  end

    def colorize(text, color_code)  "#{color_code}#{text}\001\e[0m\002" end
end

每个序列都需要包装在\ 001 .. \ 002中,以便Readline知道忽略非打印字符。

答案 1 :(得分:6)

当我需要为控制台着色字符串时,我总是抛出这个字符串扩展名。您的代码中的问题似乎是终结符,应该只有一个零“\ e [0m”。

# encoding: utf-8
class String
    def console_red;          colorize(self, "\e[1m\e[31m");  end
    def console_dark_red;     colorize(self, "\e[31m");       end
    def console_green;        colorize(self, "\e[1m\e[32m");  end
    def console_dark_green;   colorize(self, "\e[32m");       end
    def console_yellow;       colorize(self, "\e[1m\e[33m");  end
    def console_dark_yellow;  colorize(self, "\e[33m");       end
    def console_blue;         colorize(self, "\e[1m\e[34m");  end
    def console_dark_blue;    colorize(self, "\e[34m");       end
    def console_purple;       colorize(self, "\e[1m\e[35m");  end

    def console_def;          colorize(self, "\e[1m");  end
    def console_bold;         colorize(self, "\e[1m");  end
    def console_blink;        colorize(self, "\e[5m");  end

    def colorize(text, color_code)  "#{color_code}#{text}\e[0m" end
end

puts "foo\nbar".console_dark_red

答案 2 :(得分:4)

这个问题不是特定于ruby的 - 它也发生在bash中。如果你放入一个bash shell

PS1="\e[01;32mThis prompt is green and bold\e[00m > "

您将看到与上述相同的结果。但是如果你加入

PS1="\[\e[01;32m\]This prompt is green and bold\[\e[00m\] > "

你会得到你想要的结果。