Index: src/Common/SemanticError.cc
===================================================================
--- src/Common/SemanticError.cc	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
+++ src/Common/SemanticError.cc	(revision 1a69a908039a3c69a0d43b7089553d900c60df5b)
@@ -149,21 +149,27 @@
 // Helpers
 namespace ErrorHelpers {
+	Colors colors = Colors::Auto;
+
+	static inline bool with_colors() {
+		return colors == Colors::Auto ? isatty( STDERR_FILENO ) : bool(colors);
+	}
+
 	const std::string & error_str() {
-		static std::string str = isatty( STDERR_FILENO ) ? "\e[31merror:\e[39m " : "error: ";
+		static std::string str = with_colors() ? "\e[31merror:\e[39m " : "error: ";
 		return str;
 	}
 
 	const std::string & warning_str() {
-		static std::string str = isatty( STDERR_FILENO ) ? "\e[95mwarning:\e[39m " : "warning: ";
+		static std::string str = with_colors() ? "\e[95mwarning:\e[39m " : "warning: ";
 		return str;
 	}
 
 	const std::string & bold_ttycode() {
-		static std::string str = isatty( STDERR_FILENO ) ? "\e[1m" : "";
+		static std::string str = with_colors() ? "\e[1m" : "";
 		return str;
 	}
 
 	const std::string & reset_font_ttycode() {
-		static std::string str = isatty( STDERR_FILENO ) ? "\e[0m" : "";
+		static std::string str = with_colors() ? "\e[0m" : "";
 		return str;
 	}
Index: src/Common/SemanticError.h
===================================================================
--- src/Common/SemanticError.h	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
+++ src/Common/SemanticError.h	(revision 1a69a908039a3c69a0d43b7089553d900c60df5b)
@@ -97,4 +97,12 @@
 // Helpers
 namespace ErrorHelpers {
+	enum class Colors {
+		Never = false,
+		Always = true,
+		Auto,
+	};
+
+	extern Colors colors;
+
 	const std::string & error_str();
 	const std::string & warning_str();
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
+++ src/main.cc	(revision 1a69a908039a3c69a0d43b7089553d900c60df5b)
@@ -407,8 +407,10 @@
 
 
-static const char optstring[] = ":hlLmNnpP:S:tgwW:D:";
+static const char optstring[] = ":c:ghlLmNnpP:S:twW:D:";
 
 enum { PreludeDir = 128 };
 static struct option long_opts[] = {
+	{ "colors", required_argument, nullptr, 'c' },
+	{ "gdb", no_argument, nullptr, 'g' },
 	{ "help", no_argument, nullptr, 'h' },
 	{ "libcfa", no_argument, nullptr, 'l' },
@@ -422,5 +424,4 @@
 	{ "statistics", required_argument, nullptr, 'S' },
 	{ "tree", no_argument, nullptr, 't' },
-	{ "gdb", no_argument, nullptr, 'g' },
 	{ "", no_argument, nullptr, 0 },					// -w
 	{ "", no_argument, nullptr, 0 },					// -W
@@ -430,4 +431,6 @@
 
 static const char * description[] = {
+	"Use color in diagnostics. WHEN is ‘never’, ‘always’, or ‘auto’.",// -c
+	"wait for gdb to attach",									// -g
 	"print help message",								// -h
 	"generate libcfa.c",								// -l
@@ -441,5 +444,4 @@
 	"<option-list> enable profiling information:\n          counters,heap,time,all,none", // -S
 	"building cfa standard lib",									// -t
-	"wait for gdb to attach",									// -g
 	"",													// -w
 	"",													// -W
@@ -512,4 +514,13 @@
 	while ( (c = getopt_long( argc, argv, optstring, long_opts, nullptr )) != -1 ) {
 		switch ( c ) {
+		  case 'c':										// diagnostic colors
+			if ( strcmp( optarg, "always" ) == 0 ) {
+				ErrorHelpers::colors = ErrorHelpers::Colors::Always;
+			} else if ( strcmp( optarg, "never" ) == 0 ) {
+				ErrorHelpers::colors = ErrorHelpers::Colors::Never;
+			} else if ( strcmp( optarg, "auto" ) == 0 ) {
+				ErrorHelpers::colors = ErrorHelpers::Colors::Auto;
+			} // if
+			break;
 		  case 'h':										// help message
 			usage( argv );								// no return
