diff --git a/src/matcher.c b/src/matcher.c
index 4c753e2..4b56838 100644
--- a/src/matcher.c
+++ b/src/matcher.c
@@ -61,6 +61,20 @@ _vte_matcher_init(struct _vte_matcher *matcher)
         do {
                 value = strchr(code, '\0') + 1;
                 _vte_matcher_add(matcher, code, strlen(code), value);
+                if (strncmp(code, _VTE_CAP_CSI, 2) == 0) {
+                        /* For each sequence starting with CSI, add a counterpart
+                         * that starts with C1 (U+009B properly encoded in the
+                         * current encoding, e.g. \xC2\x9B in UTF-8).
+                         * When matching, the bytestream is already decoded to
+                         * Unicode codepoints.  In the "code" string, each byte
+                         * is interpreted as a Unicode codepoint (in other words,
+                         * Latin-1 is assumed).  So '\x9B' is the right choice here.
+                         */
+                        char *c1 = g_strdup(code);
+                        c1[1] = '\x9B';
+                        _vte_matcher_add(matcher, c1 + 1, strlen(c1 + 1), value);
+                        g_free(c1);
+                }
                 code = strchr(value, '\0') + 1;
         } while (*code);
 
