如何为 System.out.println 输出着色?

如何为 Java 输出着色?

例如,在 C 语言和其他语言中,我可以使用 ANSI-escape (类似 \033[0m)来实现这一点。但是在 Java 中它不起作用。

public static void main(String[] x) {
System.out.println("\033[0m BLABLA \033[0m\n");
}
237060 次浏览

没有,但有第三方 API 可以处理

Http://www.javaworld.com/javaworld/javaqa/2002-12/02-qa-1220-console.html

编辑: 当然还有比我发布的更新的文章,不过信息还是可行的。

上面的链接是死的,改看这个问题: 如何使用 System.out.println 在控制台中打印颜色?

转义序列必须由要转换为颜色的东西来解释。Java 从命令行启动时使用的标准 CMDEXE 不支持这一点,因此 Java 不支持。

下面是 Win32控制台的解决方案。

1)从这里获取 JavaNativeAccess 库: https://github.com/twall/jna/

2)这两个 Java 类可以解决这个问题。

好好享受吧。

package com.stackoverflow.util;


import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Structure;


public class Win32 {
public static final int STD_INPUT_HANDLE = -10;
public static final int STD_OUTPUT_HANDLE = -11;
public static final int STD_ERROR_HANDLE = -12;


public static final short CONSOLE_FOREGROUND_COLOR_BLACK        = 0x00;
public static final short CONSOLE_FOREGROUND_COLOR_BLUE         = 0x01;
public static final short CONSOLE_FOREGROUND_COLOR_GREEN        = 0x02;
public static final short CONSOLE_FOREGROUND_COLOR_AQUA         = 0x03;
public static final short CONSOLE_FOREGROUND_COLOR_RED          = 0x04;
public static final short CONSOLE_FOREGROUND_COLOR_PURPLE       = 0x05;
public static final short CONSOLE_FOREGROUND_COLOR_YELLOW       = 0x06;
public static final short CONSOLE_FOREGROUND_COLOR_WHITE        = 0x07;
public static final short CONSOLE_FOREGROUND_COLOR_GRAY         = 0x08;
public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_BLUE   = 0x09;
public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_GREEN  = 0x0A;
public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_AQUA   = 0x0B;
public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_RED    = 0x0C;
public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_PURPLE = 0x0D;
public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_YELLOW = 0x0E;
public static final short CONSOLE_FOREGROUND_COLOR_BRIGHT_WHITE = 0x0F;


public static final short CONSOLE_BACKGROUND_COLOR_BLACK        = 0x00;
public static final short CONSOLE_BACKGROUND_COLOR_BLUE         = 0x10;
public static final short CONSOLE_BACKGROUND_COLOR_GREEN        = 0x20;
public static final short CONSOLE_BACKGROUND_COLOR_AQUA         = 0x30;
public static final short CONSOLE_BACKGROUND_COLOR_RED          = 0x40;
public static final short CONSOLE_BACKGROUND_COLOR_PURPLE       = 0x50;
public static final short CONSOLE_BACKGROUND_COLOR_YELLOW       = 0x60;
public static final short CONSOLE_BACKGROUND_COLOR_WHITE        = 0x70;
public static final short CONSOLE_BACKGROUND_COLOR_GRAY         = 0x80;
public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_BLUE   = 0x90;
public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_GREEN  = 0xA0;
public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_AQUA   = 0xB0;
public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_RED    = 0xC0;
public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_PURPLE = 0xD0;
public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_YELLOW = 0xE0;
public static final short CONSOLE_BACKGROUND_COLOR_BRIGHT_WHITE = 0xF0;


// typedef struct _COORD {
//    SHORT X;
//    SHORT Y;
//  } COORD, *PCOORD;
public static class COORD extends Structure {
public short X;
public short Y;
}


// typedef struct _SMALL_RECT {
//    SHORT Left;
//    SHORT Top;
//    SHORT Right;
//    SHORT Bottom;
//  } SMALL_RECT;
public static class SMALL_RECT extends Structure {
public short Left;
public short Top;
public short Right;
public short Bottom;
}


// typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
//    COORD      dwSize;
//    COORD      dwCursorPosition;
//    WORD       wAttributes;
//    SMALL_RECT srWindow;
//    COORD      dwMaximumWindowSize;
//  } CONSOLE_SCREEN_BUFFER_INFO;
public static class CONSOLE_SCREEN_BUFFER_INFO extends Structure {
public COORD dwSize;
public COORD dwCursorPosition;
public short wAttributes;
public SMALL_RECT srWindow;
public COORD dwMaximumWindowSize;
}


// Source: https://github.com/twall/jna/nonav/javadoc/index.html
public interface Kernel32 extends Library {
Kernel32 DLL = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);


// HANDLE WINAPI GetStdHandle(
//        __in  DWORD nStdHandle
//      );
public int GetStdHandle(
int nStdHandle);


// BOOL WINAPI SetConsoleTextAttribute(
//        __in  HANDLE hConsoleOutput,
//        __in  WORD wAttributes
//      );
public boolean SetConsoleTextAttribute(
int in_hConsoleOutput,
short in_wAttributes);


// BOOL WINAPI GetConsoleScreenBufferInfo(
//        __in   HANDLE hConsoleOutput,
//        __out  PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
//      );
public boolean GetConsoleScreenBufferInfo(
int in_hConsoleOutput,
CONSOLE_SCREEN_BUFFER_INFO out_lpConsoleScreenBufferInfo);


// DWORD WINAPI GetLastError(void);
public int GetLastError();
}
}
package com.stackoverflow.util;


import java.io.PrintStream;


import com.stackoverflow.util.Win32.Kernel32;


public class ConsoleUtil {
public static void main(String[] args)
throws Exception {
System.out.print("abc");
static_color_print(
System.out,
"def",
Win32.CONSOLE_BACKGROUND_COLOR_RED,
Win32.CONSOLE_FOREGROUND_COLOR_BRIGHT_WHITE);
System.out.print("def");
System.out.println();
}


private static Win32.CONSOLE_SCREEN_BUFFER_INFO _static_console_screen_buffer_info = null;


public static void static_save_settings() {
if (null == _static_console_screen_buffer_info) {
_static_console_screen_buffer_info = new Win32.CONSOLE_SCREEN_BUFFER_INFO();
}
int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
Kernel32.DLL.GetConsoleScreenBufferInfo(stdout_handle, _static_console_screen_buffer_info);
}


public static void static_restore_color()
throws Exception {
if (null == _static_console_screen_buffer_info) {
throw new Exception("Internal error: Must save settings before restore");
}
int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
Kernel32.DLL.SetConsoleTextAttribute(
stdout_handle,
_static_console_screen_buffer_info.wAttributes);
}


public static void static_set_color(Short background_color, Short foreground_color) {
int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
if (null == background_color || null == foreground_color) {
Win32.CONSOLE_SCREEN_BUFFER_INFO console_screen_buffer_info =
new Win32.CONSOLE_SCREEN_BUFFER_INFO();
Kernel32.DLL.GetConsoleScreenBufferInfo(stdout_handle, console_screen_buffer_info);
short current_bg_and_fg_color = console_screen_buffer_info.wAttributes;
if (null == background_color) {
short current_bg_color = (short) (current_bg_and_fg_color / 0x10);
background_color = new Short(current_bg_color);
}
if (null == foreground_color) {
short current_fg_color = (short) (current_bg_and_fg_color % 0x10);
foreground_color = new Short(current_fg_color);
}
}
short bg_and_fg_color =
(short) (background_color.shortValue() | foreground_color.shortValue());
Kernel32.DLL.SetConsoleTextAttribute(stdout_handle, bg_and_fg_color);
}


public static<T> void static_color_print(
PrintStream ostream,
T value,
Short background_color,
Short foreground_color)
throws Exception {
static_save_settings();
try {
static_set_color(background_color, foreground_color);
ostream.print(value);
}
finally {
static_restore_color();
}
}


public static<T> void static_color_println(
PrintStream ostream,
T value,
Short background_color,
Short foreground_color)
throws Exception {
static_save_settings();
try {
static_set_color(background_color, foreground_color);
ostream.println(value);
}
finally {
static_restore_color();
}
}
}

可以使用 JANSI库在 Windows 中呈现 ANSI 转义序列。

我创建了一个名为 JCDP(Java 彩色调试打印机)的 jar库。

对于 Linux,它使用 WhiteFang 提到的 ANSI 转义码,但是使用文字而不是更直观的代码来抽象它们。

对于 Windows 来说,它实际上包含了 JAnsi 库,但是在它上面创建了一个抽象层,保持了为 Linux 创建的直观和简单的界面。

这个库是根据 麻省理工学院执照授权的,所以尽管使用它。

看看 JCDP 的 github 存储库

最简单的方法是在 Cygwin 控制台运行你的程序(未经修改)。

第二个最简单的方法是在普通的 Windows 控制台中运行程序(也是未修改的) ,通过 tee. exe (来自 Cygwin 或 Git 发行版)管道输出程序。Exe 将识别转义码并调用适当的 WinAPI 函数。

比如:

java MyClass | tee.exe log.txt
java MyClass | tee.exe /dev/null

是的,这是100% 的可能性

Set classspath =% classspath% ; d: jansi-1.4. jar;

试试下面的代码:

import org.fusesource.jansi.AnsiConsole;
import static org.fusesource.jansi.Ansi.*;
import static org.fusesource.jansi.Ansi.Color.*;


public class Sample


{


public static void main(String[] args)
{
AnsiConsole.systemInstall();


System.out.println(ansi().fg(RED).a("Hello World").reset());
System.out.println("My Name is Raman");


AnsiConsole.systemUninstall();
}
}

注意

您可能无法为 Window 的 cmd prompt着色,但它应该可以在许多 unix (或类 Unix)终端中工作。

另外,请注意,有些终端根本不支持一些(如果有的话) ANSI 转义序列,特别是24位颜色。

用法

请参考底部的 诅咒部分以获得最佳解决方案。对于个人或简单的解决方案(尽管 是跨平台的解决方案) ,请参阅 逃逸序列部分。


DR

  • Java : System.out.println((char)27 + "[31m" + "ERROR MESSAGE IN RED");

  • Python : print(chr(27) + "[31m" + "ERROR MESSAGE IN RED")

  • Bash : printf '\x1b[31mERROR MESSAGE IN RED'
    • 这可能也适用于 Os X: printf '\e[31mERROR MESSAGE IN RED'
  • Sh : printf 'CTRL + VCTRL + [[31mERROR MESSAGE IN RED'
    • 即,按 CTRL + V,然后按 CTRL + [,以便在转义解释不可用时获得“原始”ESC字符
    • 如果操作正确,应该会看到一个 ^[。虽然它看起来像两个字符,但实际上它只是一个字符,即 ESC字符。
    • 您也可以按 CTRL + VCTRL + [Vim在任何编程或脚本语言,因为它使用字面 ESC字符
    • 另外,你可以用 ESC代替 Ctrl + [... 例如,你可以用 CTRL + VESC,但是我发现前者更容易,因为我已经按了 CTRL,而且因为 [没有那么难。

逃逸序列

逃逸序列背景

虽然这不是最好的方法,但在编程或脚本语言中最简单的方法是使用 转义序列。从这个链接:

转义序列是用于改变计算机及其附属外围设备状态的一系列字符。这些也被称为控制序列,反映了它们在设备控制中的应用。

ANSI 逃逸序列的背景

然而,它甚至比视频文本终端更容易,因为这些终端使用 返回文章页面 ANSI 转义序列译者::

ANSI 转义序列是带内信令的标准,用于控制视频文本终端上的光标位置、颜色和其他选项。某些字节序列(大多数以 Esc 和’[’开头)嵌入到文本中,终端查找并将其解释为命令,而不是字符代码。

如何使用 ANSI 转义序列

一般来说

  • 转义序列以转义字符开头; 对于 ANSI 转义序列,序列总是以 ESC开头(ASCII: 27/十六进制: 0x1B)。
  • 有关您可以做什么的列表,请参考 维基百科上的逃逸序列列表

编程语言

有些编程语言(如 Java)不会将 \e\x1b解释为 ESC字符。但是,我们知道 ASCII 字符 27 ESC字符,所以我们可以简单地将 27类型化为 char并使用它来开始转义序列。

以下是一些使用通用编程语言的方法:

  • 爪哇咖啡

    • System.out.println((char)27 + "[33mYELLOW");
    • print(chr(27) + "[34mBLUE");
      • 注意,在 python 中正确解释了 \x1b
  • 节点 JS

    • 下面将在 Web 控制台中用 JavaScript 输出 没有颜色
    • console.log(String.fromCharCode(27) + "[36mCYAN");
      • 请注意,\x1b也可以在节点中工作

在外壳提示符或脚本中

如果使用 Bash,则很容易对输出进行着色(在大多数终端中)。在 Linux、 Os X 和一些 Window 的终端中,可以通过执行以下两种操作来检查终端是否支持颜色:

  • printf '\e[31mRED'
  • printf '\x1b[31mRED'

如果你看到两者都有颜色,那就太好了!如果您只看到一种颜色,那么使用该序列。如果你没有看到任何颜色,然后仔细检查,以确保你输入的一切正确,你是在 bash 或 zsh; 如果你仍然没有看到任何颜色,那么你的终端可能不支持 ANSI 转义序列。

如果我没记错的话,linux 终端倾向于同时支持 \e\x1b转义序列,而 os x 终端倾向于只支持 \e,但我可能错了。尽管如此,如果您看到类似于下面的图像,那么您就完成了所有的工作!(注意,我正在使用 shell ,它正在给提示字符串上色; 而且,我在 Linux 中使用 Urxvt作为终端。)

ANSI Escape Sequences Coloring Text Red

“这是怎么回事?”你可能会问。基本上,printf解释接下来的字符序列(单引号中的所有内容)。当 printf遇到 \e\x1b时,它将把这些字符转换为 ESC字符(ASCII: 27)。这正是我们想要的。现在,printf发送 ESC31m,由于有一个 ESC后跟一个有效的 ANSI 转义序列,我们应该得到彩色输出(只要终端支持它)。

您还可以使用 echo -e '\e[32mGREEN'(例如) ,以颜色输出。请注意 echo “[启用]解释反斜杠转义”-e标志,如果您希望 echo适当地解释转义序列,则必须使用 -e标志。


更多关于 ANSI 逃逸序列的资料

ANSI 转义序列可以做的不仅仅是颜色输出,但是让我们从这个开始,看看颜色是如何工作的; 然后,我们将看到如何操作光标; 最后,我们将看到如何使用8位颜色和24位颜色(尽管它只有微弱的支持)。

维基百科上,它们将 ESC[称为 CSI,因此我也将这样做。

颜色

若要使用 ANSI 转义符输出颜色,请使用以下命令:

  • CSI n m
    • 转义字符ーー ^[[ESC[
    • n: 数字ーー下列数字之一:
      • 30-3739: 前景
      • 背景
    • 字面 ASCII mー终止转义序列

我将使用 bash 或 zsh 演示所有可能的颜色组合。将下面的代码放入 bash 或 zsh 中自己查看(您可能需要将 \e替换为 \x1b) :

  • for fg in {30..37} 39; do for bg in {40..47} 49; do printf "\e[${fg};${bg}m~TEST~"; done; printf "\n"; done;

结果:

various foreground/background colors using ANSI escapes

快速参考(颜色)

+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  fg  |  bg  |  color    |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  30  |  40  |  black    |
|  31  |  41  |  red      |
|  32  |  42  |  green    |
|  33  |  43  |  yellow   |
|  34  |  44  |  blue     |
|  35  |  45  |  magenta  |
|  36  |  46  |  cyan     |
|  37  |  47  |  white    |
|  39  |  49  |  default  |
+~~~~~~+~~~~~~+~~~~~~~~~~~+

选择图形显示(SGR)

SGR 只允许您更改文本。其中许多在某些终端中无法工作,因此在生产级项目中应尽量少用。但是,它们对于提高程序输出的可读性或帮助您区分不同类型的输出非常有用。

颜色实际上属于 SGR,所以语法是相同的:

  • CSI n m
    • 转义字符ーー ^[[ESC[
    • n: 数字ーー下列数字之一:
      • 重置
      • 1-9: 打开各种文本效果
      • 21-29: 关闭各种文本效果(不如 1-9支持)
      • 前景色
      • 背景颜色
      • 38:8位或24位前景色(见下面的 8/24位颜色)
      • 48:8位或24位背景颜色(见下面的 8/24位颜色)
    • 字面 ASCII mー终止转义序列

尽管对淡色(2)、斜体(3)、下划线(4)、眨眼(5、6)、反向视频(7)、隐藏(8)和划线(9)的支持非常薄弱,但有些(但很少全部)倾向于在 linux 和 os x 终端上工作。

值得注意的是,您可以使用分号分隔上述任何属性。例如,printf '\e[34;47;1;3mCRAZY TEXT\n'将在 white background上显示 CRAZY TEXTblue foreground,它将是 bolditalic

例如:

string attributes together example screenshot

在 bash 或 zshshell 中放入以下内容,查看可以执行的所有文本效果。(你可能需要用 \x1b代替 \e。)

  • for i in {1..9}; do printf "\e[${i}m~TEST~\e[0m "; done

结果:

SGR state 1 SGR state 2

您可以看到,我的终端支持 晕倒(2)、 藏起来(8)和 划掉(9)的所有文本效果 除了

快速参考(SGR 属性0-9)

+~~~~~+~~~~~~~~~~~~~~~~~~+
|  n  |  effect          |
+~~~~~+~~~~~~~~~~~~~~~~~~+
|  0  |  reset           |
|  1  |  bold            |
|  2  |  faint*          |
|  3  |  italic**        |
|  4  |  underline       |
|  5  |  slow blink      |
|  6  |  rapid blink*    |
|  7  |  inverse         |
|  8  |  conceal*        |
|  9  |  strikethrough*  |
+~~~~~+~~~~~~~~~~~~~~~~~~+


* not widely supported
** not widely supported and sometimes treated as inverse

8位 Color

虽然大多数终端支持这一点,但是它不如 0-79颜色支持。

句法:

  • CSI 38;5; n m
    • 转义字符ーー ^[[ESC[
    • 字符串,表示前景使用8位颜色
    • n: 数字ーー下列数字之一:
      • 0-255

如果你想预览所有的颜色在您的终端在一个很好的方式,我有 在 gist.github.com 上有一个不错的脚本

它看起来像这样:

8-bit color example screenshot

如果你想用8位颜色改变背景,只需用 48代替 38:

  • CSI 48;5; n m
    • 转义字符ーー ^[[ESC[
    • 字符串,表示背景使用8位颜色
    • n: 数字ーー下列数字之一:
      • 0-255

24位 Color

也被称为真彩色,24位颜色提供了一些非常酷的功能。对此的支持显然正在增长(据我所知,除了我的终端(插入愤怒的表情符号) Urxvt之外,它在大多数现代终端中都可以工作)。

Vim 实际上支持24位颜色(参见 维基百科了解如何启用24位颜色)。它非常简洁,因为它从为 gvim 定义的配色方案中提取; 例如,它使用来自 highlight guibg=#______ guifg=#______的 fg/bg 作为24位的颜色!漂亮吧?

下面是24位颜色的工作原理:

  • CSI 38;2; r ; g ; b m
    • 转义字符ーー ^[[ESC[
    • 字符串,表示前景使用24位颜色
    • rgb: 数字ーー每个数字都应该是 0-255

为了测试多种颜色的 就几个(我认为可能是 (2^8)^32^2416777216) ,您可以在 bash 或 zsh 中使用它:

  • for r in 0 127 255; do for g in 0 127 255; do for b in 0 127 255; do printf "\e[38;2;${r};${g};${b}m($r,$g,$b)\e[0m "; done; printf "\n"; done; done;

结果(这是从 < em > urxvt 不支持24位颜色开始就在 侏儒终端中的... ... 把它放在一起,urxvt 维护者... ... 实际上) :

24-bit color example screenshot

如果你想要背景的24位颜色... 你猜对了! 你只需要用 48代替 38:

  • CSI 48;2; r ; g ; b m
    • 转义字符ーー ^[[ESC[
    • 字符串,表示背景使用24位颜色
    • rgb: 数字ーー每个数字都应该是 0-255

插入原始转义序列

有时 \e\x1b不工作。例如,在 shell 中,有时两者都不工作(尽管在我的系统 现在上它工作,但我不认为它曾经工作过)。

为了避免这种情况,可以使用 CTRL + VCTRL + [CTRLVESC

这将插入一个“原始”ESC字符(ASCII: 27)。它看起来像这个 ^[,但是不要担心,它只是一个字符,而不是两个。

例如:

sh raw escape char example screenshot


诅咒

有关诅咒的完整参考资料,请参阅 诅咒(编程库)页。应该注意的是,诅咒只在 unix 和类 Unix 操作系统上有效。

带着诅咒跑起来

我不会进入太多的细节,因为搜索引擎可以显示网站的链接,可以更好地解释这一点比我可以,但我将在这里简要讨论它,并给出一个例子。

为什么在 ANSI 转义中使用诅咒?

如果你读了上面的文本,你可能会想起来,\e\x1b有时会与 printf一起工作。嗯,有时候 \e\x1b根本不能工作(这不是标准的,我从来没有使用过这样的终端,但这是可能的)。更重要的是,更复杂的转义序列(想想 Home和其他多字符键)很难为每个终端提供支持(除非你愿意花费大量时间和精力解析每个终端和 termcap,并弄清楚如何处理每个终端)。

诅咒解决了这个问题。基本上,它能够理解终端的功能,使用这些方法(如上面链接的维基百科文章所描述的) :

大多数诅咒的实现都使用一个数据库,该数据库可以描述数千个不同终端的功能。有一些实现,比如 PDCurses,它们使用专门的设备驱动程序而不是终端数据库。大多数实现使用 termfo; 有些使用 termcap。诅咒的优点是对字符细胞终端的后端可移植性和简单性。对于不需要位映射图形或多种字体的应用程序,使用诅咒的接口实现通常要比使用 X 工具包的接口实现简单和快速得多。

大多数情况下,curses 会轮询终止符,然后能够理解如何操作游标和文本属性。然后,作为程序员,您可以使用由诅咒提供的 API 来操作光标,或者更改文本颜色或其他属性(如果需要所需的功能)。

Python 示例

我发现 python 真的很容易使用,但是如果你想在不同的编程语言中使用诅咒,那么只需在 duckduckgo 或任何其他搜索引擎上搜索它。:)下面是 python 3中的一个快速示例:

import curses


def main(stdscr):
# allow curses to use default foreground/background (39/49)
curses.use_default_colors()


# Clear screen
stdscr.clear()


curses.init_pair(1, curses.COLOR_RED, -1)
curses.init_pair(2, curses.COLOR_GREEN, -1)
stdscr.addstr("ERROR: I like tacos, but I don't have any.\n", curses.color_pair(1))
stdscr.addstr("SUCCESS: I found some tacos.\n", curses.color_pair(2))


stdscr.refresh() # make sure screen is refreshed
stdscr.getkey()  # wait for user to press key


if __name__ == '__main__':
curses.wrapper(main)

结果:

enter image description here

您可能会想,这是一种更为迂回的做事方式,但它确实是一种更为跨平台的方式(真正的跨终端... ... 至少在 unix 和类 Unix 平台的世界中是如此)。对于颜色,它没有 没错重要,但是当它支持其他多序列转义序列(如 HomeEndPage UpPage Down等)时,诅咒就变得更加重要了。

例如 Tput

  • tput是一个用于操作光标和文本的命令行实用程序
  • tput附带 curses软件包。如果希望在终端中使用跨终端(ish)应用程序,那么应该使用 tput,因为它会解析终端或其他需要解析的内容,并使用一组标准化命令(如 curses) ,并返回正确的转义序列。
  • 例如:
echo "$(tput setaf 1)$(tput bold)ERROR:$(tput sgr0)$(tput setaf 1) My tacos have gone missing"
echo "$(tput setaf 2)$(tput bold)SUCCESS:$(tput sgr0)$(tput setaf 2) Oh good\! I found my tacos\!"

结果:

example with tput

更多关于 Tput 的信息

这对我很有效:

System.out.println((char)27 + "[31mThis text would show up red" + (char)27 + "[0m");

你需要结尾“[37m”返回白色(或任何你正在使用)的颜色。如果你不这样做,它可能使一切后面的“红色”。

这在日食中起作用只是为了把它变红,不知道其他地方。

System.err.println(" BLABLA ");

检查一下: 我在转义代码中使用了 ANSI 值,它可能不适用于命令提示符,但是适用于 IDE 和 Unix shell。 你也可以查看‘ Jansi’库 给你来获得对 windows 的支持。

System.out.println("\u001B[35m" + "This text is PURPLE!" + "\u001B[0m");

Println (“ Errorrrrrr”)它将在控制台上以红色打印文本。

我编写了一个名为 AnsiScape的库,它允许你以一种更结构化的方式写出彩色输出:

例如:

AnsiScape ansiScape = new AnsiScape();
String colors = ansiScape.format("{red {blueBg Red text with blue background}} {b Bold text}");
System.out.println(colors);

该库还允许您定义类似于 css 类的自己的“转义类”。

例如:

AnsiScapeContext context = new AnsiScapeContext();


// Defines a "class" for text
AnsiClass text = AnsiClass.withName("text").add(RED);
// Defines a "class" for the title used
AnsiClass title = AnsiClass.withName("title").add(BOLD, BLUE_BG, YELLOW);
// Defines a "class" to render urls
AnsiClass url = AnsiClass.withName("url").add(BLUE, UNDERLINE);


// Registering the classes to the context
context.add(text).add(title).add(url);


// Creating an AnsiScape instance with the custom context
AnsiScape ansiScape = new AnsiScape(context);


String fmt = "{title Chapter 1}\n" +
"{text So it begins:}\n" +
"- {text Option 1}\n" +
"- {text Url: {url www.someurl.xyz}}";


System.out.println(ansiScape.format(fmt));