Subject: bug#13839: xterm/mintty control sequences support when formatOtherKeys = 1

From: Stefan Monnier <[email-masked]>
Date: Thu, 28 Feb 2013 11:31:17 -0500

>> Y see, that looks fine.  If you can prepare a patch for it, I'd
>> be very happy to install it.  Or can we simply take all the
>> "\e[27;NN,MM~" and add a corresponding "\e[MM;NNu"?  If so, I can
>> write the patch myself.
> Yes, I think so.  Maybe this is the better way than checking terminal
> capacities and then deciding to enable which format.

Can you confirm that the patch below works for your formatOtherKeys=1 case?

        Stefan

=== modified file 'lisp/term/xterm.el'
--- lisp/term/xterm.el	2013-02-12 17:36:54 +0000
+++ lisp/term/xterm.el	2013-02-28 16:30:30 +0000
@@ -251,120 +251,124 @@
 
     ;; These keys are available in xterm starting from version 216
     ;; if the modifyOtherKeys resource is set to 1.
-
-    (define-key map "\e[27;5;9~"   [C-tab])
-    (define-key map "\e[27;5;13~"  [C-return])
-    (define-key map "\e[27;5;39~"  [?\C-\'])
-    (define-key map "\e[27;5;44~"  [?\C-,])
-    (define-key map "\e[27;5;45~"  [?\C--])
-    (define-key map "\e[27;5;46~"  [?\C-.])
-    (define-key map "\e[27;5;47~"  [?\C-/])
-    (define-key map "\e[27;5;48~"  [?\C-0])
-    (define-key map "\e[27;5;49~"  [?\C-1])
+    (dolist (bind '((5 9   [C-tab])
+                    (5 13  [C-return])
+                    (5 39  [?\C-\'])
+                    (5 44  [?\C-,])
+                    (5 45  [?\C--])
+                    (5 46  [?\C-.])
+                    (5 47  [?\C-/])
+                    (5 48  [?\C-0])
+                    (5 49  [?\C-1])
     ;; Not all C-DIGIT keys have a distinct binding.
-    (define-key map "\e[27;5;57~"  [?\C-9])
-    (define-key map "\e[27;5;59~"  [?\C-\;])
-    (define-key map "\e[27;5;61~"  [?\C-=])
-    (define-key map "\e[27;5;92~"  [?\C-\\])
-
-    (define-key map "\e[27;6;33~"  [?\C-!])
-    (define-key map "\e[27;6;34~"  [?\C-\"])
-    (define-key map "\e[27;6;35~"  [?\C-#])
-    (define-key map "\e[27;6;36~"  [?\C-$])
-    (define-key map "\e[27;6;37~"  [?\C-%])
-    (define-key map "\e[27;6;38~"  [?\C-&])
-    (define-key map "\e[27;6;40~"  [?\C-(])
-    (define-key map "\e[27;6;41~"  [?\C-)])
-    (define-key map "\e[27;6;42~"  [?\C-*])
-    (define-key map "\e[27;6;43~"  [?\C-+])
-    (define-key map "\e[27;6;58~"  [?\C-:])
-    (define-key map "\e[27;6;60~"  [?\C-<])
-    (define-key map "\e[27;6;62~"  [?\C->])
-    (define-key map "\e[27;6;63~"  [(control ??)])
-
-    ;; These are the strings emitted for various C-M- combinations
-    ;; for keyboards that the Meta and Alt modifiers are on the same
-    ;; key (usually labeled "Alt").
-    (define-key map "\e[27;13;9~"  [C-M-tab])
-    (define-key map "\e[27;13;13~" [C-M-return])
-
-    (define-key map "\e[27;13;39~" [?\C-\M-\'])
-    (define-key map "\e[27;13;44~" [?\C-\M-,])
-    (define-key map "\e[27;13;45~" [?\C-\M--])
-    (define-key map "\e[27;13;46~" [?\C-\M-.])
-    (define-key map "\e[27;13;47~" [?\C-\M-/])
-    (define-key map "\e[27;13;48~" [?\C-\M-0])
-    (define-key map "\e[27;13;49~" [?\C-\M-1])
-    (define-key map "\e[27;13;50~" [?\C-\M-2])
-    (define-key map "\e[27;13;51~" [?\C-\M-3])
-    (define-key map "\e[27;13;52~" [?\C-\M-4])
-    (define-key map "\e[27;13;53~" [?\C-\M-5])
-    (define-key map "\e[27;13;54~" [?\C-\M-6])
-    (define-key map "\e[27;13;55~" [?\C-\M-7])
-    (define-key map "\e[27;13;56~" [?\C-\M-8])
-    (define-key map "\e[27;13;57~" [?\C-\M-9])
-    (define-key map "\e[27;13;59~" [?\C-\M-\;])
-    (define-key map "\e[27;13;61~" [?\C-\M-=])
-    (define-key map "\e[27;13;92~" [?\C-\M-\\])
-
-    (define-key map "\e[27;14;33~"  [?\C-\M-!])
-    (define-key map "\e[27;14;34~"  [?\C-\M-\"])
-    (define-key map "\e[27;14;35~"  [?\C-\M-#])
-    (define-key map "\e[27;14;36~"  [?\C-\M-$])
-    (define-key map "\e[27;14;37~"  [?\C-\M-%])
-    (define-key map "\e[27;14;38~"  [?\C-\M-&])
-    (define-key map "\e[27;14;40~"  [?\C-\M-\(])
-    (define-key map "\e[27;14;41~"  [?\C-\M-\)])
-    (define-key map "\e[27;14;42~"  [?\C-\M-*])
-    (define-key map "\e[27;14;43~"  [?\C-\M-+])
-    (define-key map "\e[27;14;58~"  [?\C-\M-:])
-    (define-key map "\e[27;14;60~"  [?\C-\M-<])
-    (define-key map "\e[27;14;62~"  [?\C-\M->])
-    (define-key map "\e[27;14;63~"  [(control meta ??)])
-
-    (define-key map "\e[27;7;9~"  [C-M-tab])
-    (define-key map "\e[27;7;13~" [C-M-return])
-
-    (define-key map "\e[27;7;32~" [?\C-\M-\s])
-    (define-key map "\e[27;7;39~" [?\C-\M-\'])
-    (define-key map "\e[27;7;44~" [?\C-\M-,])
-    (define-key map "\e[27;7;45~" [?\C-\M--])
-    (define-key map "\e[27;7;46~" [?\C-\M-.])
-    (define-key map "\e[27;7;47~" [?\C-\M-/])
-    (define-key map "\e[27;7;48~" [?\C-\M-0])
-    (define-key map "\e[27;7;49~" [?\C-\M-1])
-    (define-key map "\e[27;7;50~" [?\C-\M-2])
-    (define-key map "\e[27;7;51~" [?\C-\M-3])
-    (define-key map "\e[27;7;52~" [?\C-\M-4])
-    (define-key map "\e[27;7;53~" [?\C-\M-5])
-    (define-key map "\e[27;7;54~" [?\C-\M-6])
-    (define-key map "\e[27;7;55~" [?\C-\M-7])
-    (define-key map "\e[27;7;56~" [?\C-\M-8])
-    (define-key map "\e[27;7;57~" [?\C-\M-9])
-    (define-key map "\e[27;7;59~" [?\C-\M-\;])
-    (define-key map "\e[27;7;61~" [?\C-\M-=])
-    (define-key map "\e[27;7;92~" [?\C-\M-\\])
-
-    (define-key map "\e[27;8;33~"  [?\C-\M-!])
-    (define-key map "\e[27;8;34~"  [?\C-\M-\"])
-    (define-key map "\e[27;8;35~"  [?\C-\M-#])
-    (define-key map "\e[27;8;36~"  [?\C-\M-$])
-    (define-key map "\e[27;8;37~"  [?\C-\M-%])
-    (define-key map "\e[27;8;38~"  [?\C-\M-&])
-    (define-key map "\e[27;8;40~"  [?\C-\M-\(])
-    (define-key map "\e[27;8;41~"  [?\C-\M-\)])
-    (define-key map "\e[27;8;42~"  [?\C-\M-*])
-    (define-key map "\e[27;8;43~"  [?\C-\M-+])
-    (define-key map "\e[27;8;58~"  [?\C-\M-:])
-    (define-key map "\e[27;8;60~"  [?\C-\M-<])
-    (define-key map "\e[27;8;62~"  [?\C-\M->])
-    (define-key map "\e[27;8;63~"  [(control meta ??)])
-
-    (define-key map "\e[27;2;9~"   [S-tab])
-    (define-key map "\e[27;2;13~"  [S-return])
-
-    (define-key map "\e[27;6;9~"   [C-S-tab])
-    (define-key map "\e[27;6;13~"  [C-S-return])
+                    (5 57  [?\C-9])
+                    (5 59  [?\C-\;])
+                    (5 61  [?\C-=])
+                    (5 92  [?\C-\\])
+
+                    (6 33  [?\C-!])
+                    (6 34  [?\C-\"])
+                    (6 35  [?\C-#])
+                    (6 36  [?\C-$])
+                    (6 37  [?\C-%])
+                    (6 38  [?\C-&])
+                    (6 40  [?\C-\(])
+                    (6 41  [?\C-\)])
+                    (6 42  [?\C-*])
+                    (6 43  [?\C-+])
+                    (6 58  [?\C-:])
+                    (6 60  [?\C-<])
+                    (6 62  [?\C->])
+                    (6 63  [(control ??)])
+
+                    ;; These are the strings emitted for various C-M-
+                    ;; combinations for keyboards whose Meta and Alt
+                    ;; modifiers are on the same key (usually labeled "Alt").
+                    (13 9  [C-M-tab])
+                    (13 13 [C-M-return])
+
+                    (13 39 [?\C-\M-\'])
+                    (13 44 [?\C-\M-,])
+                    (13 45 [?\C-\M--])
+                    (13 46 [?\C-\M-.])
+                    (13 47 [?\C-\M-/])
+                    (13 48 [?\C-\M-0])
+                    (13 49 [?\C-\M-1])
+                    (13 50 [?\C-\M-2])
+                    (13 51 [?\C-\M-3])
+                    (13 52 [?\C-\M-4])
+                    (13 53 [?\C-\M-5])
+                    (13 54 [?\C-\M-6])
+                    (13 55 [?\C-\M-7])
+                    (13 56 [?\C-\M-8])
+                    (13 57 [?\C-\M-9])
+                    (13 59 [?\C-\M-\;])
+                    (13 61 [?\C-\M-=])
+                    (13 92 [?\C-\M-\\])
+
+                    (14 33  [?\C-\M-!])
+                    (14 34  [?\C-\M-\"])
+                    (14 35  [?\C-\M-#])
+                    (14 36  [?\C-\M-$])
+                    (14 37  [?\C-\M-%])
+                    (14 38  [?\C-\M-&])
+                    (14 40  [?\C-\M-\(])
+                    (14 41  [?\C-\M-\)])
+                    (14 42  [?\C-\M-*])
+                    (14 43  [?\C-\M-+])
+                    (14 58  [?\C-\M-:])
+                    (14 60  [?\C-\M-<])
+                    (14 62  [?\C-\M->])
+                    (14 63  [(control meta ??)])
+
+                    (7 9  [C-M-tab])
+                    (7 13 [C-M-return])
+
+                    (7 32 [?\C-\M-\s])
+                    (7 39 [?\C-\M-\'])
+                    (7 44 [?\C-\M-,])
+                    (7 45 [?\C-\M--])
+                    (7 46 [?\C-\M-.])
+                    (7 47 [?\C-\M-/])
+                    (7 48 [?\C-\M-0])
+                    (7 49 [?\C-\M-1])
+                    (7 50 [?\C-\M-2])
+                    (7 51 [?\C-\M-3])
+                    (7 52 [?\C-\M-4])
+                    (7 53 [?\C-\M-5])
+                    (7 54 [?\C-\M-6])
+                    (7 55 [?\C-\M-7])
+                    (7 56 [?\C-\M-8])
+                    (7 57 [?\C-\M-9])
+                    (7 59 [?\C-\M-\;])
+                    (7 61 [?\C-\M-=])
+                    (7 92 [?\C-\M-\\])
+
+                    (8 33  [?\C-\M-!])
+                    (8 34  [?\C-\M-\"])
+                    (8 35  [?\C-\M-#])
+                    (8 36  [?\C-\M-$])
+                    (8 37  [?\C-\M-%])
+                    (8 38  [?\C-\M-&])
+                    (8 40  [?\C-\M-\(])
+                    (8 41  [?\C-\M-\)])
+                    (8 42  [?\C-\M-*])
+                    (8 43  [?\C-\M-+])
+                    (8 58  [?\C-\M-:])
+                    (8 60  [?\C-\M-<])
+                    (8 62  [?\C-\M->])
+                    (8 63  [(control meta ??)])
+
+                    (2 9   [S-tab])
+                    (2 13  [S-return])
+
+                    (6 9   [C-S-tab])
+                    (6 13  [C-S-return])))
+      (define-key map
+        (format "\e[27;%d;%d~" (nth 0 bind) (nth 1 bind)) (nth 2 bind))
+      ;; For formatOtherKeys=1, the sequence is a bit shorter (bug#13839).
+      (define-key map
+        (format "\e[%d;%du" (nth 1 bind) (nth 0 bind)) (nth 2 bind)))
 
     ;; Other versions of xterm might emit these.
     (define-key map "\e[A" [up])