diff --git a/src/term.c b/src/term.c
index f662367..a6faaa3 100644
--- a/src/term.c
+++ b/src/term.c
@@ -1266,145 +1266,10 @@
 };	/* end of builtin_termcaps */
 
 #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
-# define RGB(r, g, b) ((r<<16) | (g<<8) | (b))
-struct rgbcolor_table_S {
-    char_u	*color_name;
-    guicolor_T	 color;
-};
-
-static struct rgbcolor_table_S rgb_table[] = {
-	{(char_u *)"black",	RGB(0x00, 0x00, 0x00)},
-	{(char_u *)"blue",	RGB(0x00, 0x00, 0xFF)},
-	{(char_u *)"brown",	RGB(0xA5, 0x2A, 0x2A)},
-	{(char_u *)"cyan",	RGB(0x00, 0xFF, 0xFF)},
-	{(char_u *)"darkblue",	RGB(0x00, 0x00, 0x8B)},
-	{(char_u *)"darkcyan",	RGB(0x00, 0x8B, 0x8B)},
-	{(char_u *)"darkgray",	RGB(0xA9, 0xA9, 0xA9)},
-	{(char_u *)"darkgreen",	RGB(0x00, 0x64, 0x00)},
-	{(char_u *)"darkgrey",	RGB(0xA9, 0xA9, 0xA9)},
-	{(char_u *)"darkmagenta",	RGB(0x8B, 0x00, 0x8B)},
-	{(char_u *)"darkred",	RGB(0x8B, 0x00, 0x00)},
-	{(char_u *)"darkyellow",	RGB(0x8B, 0x8B, 0x00)},	/* No X11 */
-	{(char_u *)"gray",	RGB(0xBE, 0xBE, 0xBE)},
-	{(char_u *)"gray10",	RGB(0x1A, 0x1A, 0x1A)},
-	{(char_u *)"gray20",	RGB(0x33, 0x33, 0x33)},
-	{(char_u *)"gray30",	RGB(0x4D, 0x4D, 0x4D)},
-	{(char_u *)"gray40",	RGB(0x66, 0x66, 0x66)},
-	{(char_u *)"gray50",	RGB(0x7F, 0x7F, 0x7F)},
-	{(char_u *)"gray60",	RGB(0x99, 0x99, 0x99)},
-	{(char_u *)"gray70",	RGB(0xB3, 0xB3, 0xB3)},
-	{(char_u *)"gray80",	RGB(0xCC, 0xCC, 0xCC)},
-	{(char_u *)"gray90",	RGB(0xE5, 0xE5, 0xE5)},
-	{(char_u *)"green",	RGB(0x00, 0xFF, 0x00)},
-	{(char_u *)"grey",	RGB(0xBE, 0xBE, 0xBE)},
-	{(char_u *)"grey10",	RGB(0x1A, 0x1A, 0x1A)},
-	{(char_u *)"grey20",	RGB(0x33, 0x33, 0x33)},
-	{(char_u *)"grey30",	RGB(0x4D, 0x4D, 0x4D)},
-	{(char_u *)"grey40",	RGB(0x66, 0x66, 0x66)},
-	{(char_u *)"grey50",	RGB(0x7F, 0x7F, 0x7F)},
-	{(char_u *)"grey60",	RGB(0x99, 0x99, 0x99)},
-	{(char_u *)"grey70",	RGB(0xB3, 0xB3, 0xB3)},
-	{(char_u *)"grey80",	RGB(0xCC, 0xCC, 0xCC)},
-	{(char_u *)"grey90",	RGB(0xE5, 0xE5, 0xE5)},
-	{(char_u *)"lightblue",	RGB(0xAD, 0xD8, 0xE6)},
-	{(char_u *)"lightcyan",	RGB(0xE0, 0xFF, 0xFF)},
-	{(char_u *)"lightgray",	RGB(0xD3, 0xD3, 0xD3)},
-	{(char_u *)"lightgreen",	RGB(0x90, 0xEE, 0x90)},
-	{(char_u *)"lightgrey",	RGB(0xD3, 0xD3, 0xD3)},
-	{(char_u *)"lightmagenta",	RGB(0xFF, 0x8B, 0xFF)},	/* No X11 */
-	{(char_u *)"lightred",	RGB(0xFF, 0x8B, 0x8B)},		/* No X11 */
-	{(char_u *)"lightyellow",	RGB(0xFF, 0xFF, 0xE0)},
-	{(char_u *)"magenta",	RGB(0xFF, 0x00, 0xFF)},
-	{(char_u *)"orange",	RGB(0xFF, 0xA5, 0x00)},
-	{(char_u *)"purple",	RGB(0xA0, 0x20, 0xF0)},
-	{(char_u *)"red",	RGB(0xFF, 0x00, 0x00)},
-	{(char_u *)"seagreen",	RGB(0x2E, 0x8B, 0x57)},
-	{(char_u *)"slateblue",	RGB(0x6A, 0x5A, 0xCD)},
-	{(char_u *)"violet",	RGB(0xEE, 0x82, 0xEE)},
-	{(char_u *)"white",	RGB(0xFF, 0xFF, 0xFF)},
-	{(char_u *)"yellow",	RGB(0xFF, 0xFF, 0x00)},
-};
-
-    static int
-hex_digit(int c)
-{
-    if (isdigit(c))
-	return c - '0';
-    c = TOLOWER_ASC(c);
-    if (c >= 'a' && c <= 'f')
-	return c - 'a' + 10;
-    return 0x1ffffff;
-}
-
     guicolor_T
 termtrue_mch_get_color(char_u *name)
 {
-    guicolor_T	color;
-    int		i;
-
-    if (*name == '#' && strlen((char *) name) == 7)
-    {
-	color = RGB(((hex_digit(name[1])<<4) + hex_digit(name[2])),
-	            ((hex_digit(name[3])<<4) + hex_digit(name[4])),
-	            ((hex_digit(name[5])<<4) + hex_digit(name[6])));
-	if (color > 0xffffff)
-	    return INVALCOLOR;
-	return color;
-    }
-    else
-    {
-	/* Check if the name is one of the colors we know */
-	for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++)
-	    if (STRICMP(name, rgb_table[i].color_name) == 0)
-		return rgb_table[i].color;
-    }
-
-    /*
-     * Last attempt. Look in the file "$VIM/rgb.txt".
-     */
-    {
-#define LINE_LEN 100
-	FILE	*fd;
-	char	line[LINE_LEN];
-	char_u	*fname;
-	int	r, g, b;
-
-	fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt");
-	if (fname == NULL)
-	    return INVALCOLOR;
-
-	fd = fopen((char *)fname, "rt");
-	vim_free(fname);
-	if (fd == NULL)
-	    return INVALCOLOR;
-
-	while (!feof(fd))
-	{
-	    int		len;
-	    int		pos;
-
-	    (void)fgets(line, LINE_LEN, fd);
-	    len = strlen(line);
-
-	    if (len <= 1 || line[len-1] != '\n')
-		continue;
-
-	    line[len-1] = '\0';
-
-	    i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
-	    if (i != 3)
-		continue;
-
-	    if (STRICMP(line + pos, name) == 0)
-	    {
-		fclose(fd);
-		return (guicolor_T) RGB(r, g, b);
-	    }
-	}
-	fclose(fd);
-    }
-
-    return INVALCOLOR;
+    return gui_get_color_cmn(name);
 }
 
     guicolor_T
@@ -6187,3 +6052,146 @@
     }
 }
 #endif
+
+#if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
+    static int
+hex_digit(int c)
+{
+    if (isdigit(c))
+	return c - '0';
+    c = TOLOWER_ASC(c);
+    if (c >= 'a' && c <= 'f')
+	return c - 'a' + 10;
+    return 0x1ffffff;
+}
+
+    guicolor_T
+gui_get_color_cmn(char_u *name)
+{
+#define RGB(r, g, b) ((r<<16) | (g<<8) | (b))
+#define LINE_LEN 100
+    FILE	*fd;
+    char	line[LINE_LEN];
+    char_u	*fname;
+    int		r, g, b, i;
+    guicolor_T  color;
+
+    struct rgbcolor_table_S {
+	char_u	    *color_name;
+	guicolor_T  color;
+    };
+
+    static struct rgbcolor_table_S rgb_table[] = {
+	    {(char_u *)"black",		RGB(0x00, 0x00, 0x00)},
+	    {(char_u *)"blue",		RGB(0x00, 0x00, 0xFF)},
+	    {(char_u *)"brown",		RGB(0xA5, 0x2A, 0x2A)},
+	    {(char_u *)"cyan",		RGB(0x00, 0xFF, 0xFF)},
+	    {(char_u *)"darkblue",	RGB(0x00, 0x00, 0x8B)},
+	    {(char_u *)"darkcyan",	RGB(0x00, 0x8B, 0x8B)},
+	    {(char_u *)"darkgray",	RGB(0xA9, 0xA9, 0xA9)},
+	    {(char_u *)"darkgreen",	RGB(0x00, 0x64, 0x00)},
+	    {(char_u *)"darkgrey",	RGB(0xA9, 0xA9, 0xA9)},
+	    {(char_u *)"darkmagenta",	RGB(0x8B, 0x00, 0x8B)},
+	    {(char_u *)"darkred",	RGB(0x8B, 0x00, 0x00)},
+	    {(char_u *)"darkyellow",	RGB(0x8B, 0x8B, 0x00)},	/* No X11 */
+	    {(char_u *)"gray",		RGB(0xBE, 0xBE, 0xBE)},
+	    {(char_u *)"gray10",	RGB(0x1A, 0x1A, 0x1A)},
+	    {(char_u *)"gray20",	RGB(0x33, 0x33, 0x33)},
+	    {(char_u *)"gray30",	RGB(0x4D, 0x4D, 0x4D)},
+	    {(char_u *)"gray40",	RGB(0x66, 0x66, 0x66)},
+	    {(char_u *)"gray50",	RGB(0x7F, 0x7F, 0x7F)},
+	    {(char_u *)"gray60",	RGB(0x99, 0x99, 0x99)},
+	    {(char_u *)"gray70",	RGB(0xB3, 0xB3, 0xB3)},
+	    {(char_u *)"gray80",	RGB(0xCC, 0xCC, 0xCC)},
+	    {(char_u *)"gray90",	RGB(0xE5, 0xE5, 0xE5)},
+	    {(char_u *)"green",		RGB(0x00, 0xFF, 0x00)},
+	    {(char_u *)"grey",		RGB(0xBE, 0xBE, 0xBE)},
+	    {(char_u *)"grey10",	RGB(0x1A, 0x1A, 0x1A)},
+	    {(char_u *)"grey20",	RGB(0x33, 0x33, 0x33)},
+	    {(char_u *)"grey30",	RGB(0x4D, 0x4D, 0x4D)},
+	    {(char_u *)"grey40",	RGB(0x66, 0x66, 0x66)},
+	    {(char_u *)"grey50",	RGB(0x7F, 0x7F, 0x7F)},
+	    {(char_u *)"grey60",	RGB(0x99, 0x99, 0x99)},
+	    {(char_u *)"grey70",	RGB(0xB3, 0xB3, 0xB3)},
+	    {(char_u *)"grey80",	RGB(0xCC, 0xCC, 0xCC)},
+	    {(char_u *)"grey90",	RGB(0xE5, 0xE5, 0xE5)},
+	    {(char_u *)"lightblue",	RGB(0xAD, 0xD8, 0xE6)},
+	    {(char_u *)"lightcyan",	RGB(0xE0, 0xFF, 0xFF)},
+	    {(char_u *)"lightgray",	RGB(0xD3, 0xD3, 0xD3)},
+	    {(char_u *)"lightgreen",	RGB(0x90, 0xEE, 0x90)},
+	    {(char_u *)"lightgrey",	RGB(0xD3, 0xD3, 0xD3)},
+	    {(char_u *)"lightmagenta",	RGB(0xFF, 0x8B, 0xFF)},	/* No X11 */
+	    {(char_u *)"lightred",	RGB(0xFF, 0x8B, 0x8B)},	/* No X11 */
+	    {(char_u *)"lightyellow",	RGB(0xFF, 0xFF, 0xE0)},
+	    {(char_u *)"magenta",	RGB(0xFF, 0x00, 0xFF)},
+	    {(char_u *)"orange",	RGB(0xFF, 0xA5, 0x00)},
+	    {(char_u *)"purple",	RGB(0xA0, 0x20, 0xF0)},
+	    {(char_u *)"red",		RGB(0xFF, 0x00, 0x00)},
+	    {(char_u *)"seagreen",	RGB(0x2E, 0x8B, 0x57)},
+	    {(char_u *)"slateblue",	RGB(0x6A, 0x5A, 0xCD)},
+	    {(char_u *)"violet",	RGB(0xEE, 0x82, 0xEE)},
+	    {(char_u *)"white",		RGB(0xFF, 0xFF, 0xFF)},
+	    {(char_u *)"yellow",	RGB(0xFF, 0xFF, 0x00)},
+    };
+
+
+    if (name[0] == '#' && STRLEN(name) == 7)
+    {
+	/* Name is in "#rrggbb" format */
+	color = RGB(((hex_digit(name[1]) << 4) + hex_digit(name[2])),
+		    ((hex_digit(name[3]) << 4) + hex_digit(name[4])),
+		    ((hex_digit(name[5]) << 4) + hex_digit(name[6])));
+	if (color > 0xffffff)
+	    return INVALCOLOR;
+	return color;
+    }
+
+    /* Check if the name is one of the colors we know */
+    for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++)
+	if (STRICMP(name, rgb_table[i].color_name) == 0)
+	    return rgb_table[i].color;
+
+    /*
+     * Last attempt. Look in the file "$VIM/rgb.txt".
+     */
+
+    fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt");
+    if (fname == NULL)
+	return INVALCOLOR;
+
+    fd = fopen((char *)fname, "rt");
+    vim_free(fname);
+    if (fd == NULL)
+    {
+	if (p_verbose > 1)
+	    verb_msg((char_u *)_("Cannot open $VIMRUNTIME/rgb.txt"));
+	return INVALCOLOR;
+    }
+
+    while (!feof(fd))
+    {
+	int		len;
+	int		pos;
+
+	(void)fgets(line, LINE_LEN, fd);
+	len = strlen(line);
+
+	if (len <= 1 || line[len - 1] != '\n')
+	    continue;
+
+	line[len - 1] = '\0';
+
+	i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
+	if (i != 3)
+	    continue;
+
+	if (STRICMP(line + pos, name) == 0)
+	{
+	    fclose(fd);
+	    return (guicolor_T) RGB(r, g, b);
+	}
+    }
+    fclose(fd);
+    return INVALCOLOR;
+}
+#endif
