;;; xterm.el --- define function key sequences and standard colors for xterm
-;; Copyright (C) 1995, 2002, 2003, 2004, 2005,
-;; 2006 Free Software Foundation, Inc.
+;; Copyright (C) 1995, 2001, 2002, 2003, 2004, 2005,
+;; 2006, 2007 Free Software Foundation, Inc.
;; Author: FSF
;; Keywords: terminals
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; MODIFIER-FUNCTION_KEY, where modifier is S-, C, A-, C-S-. The
;; code here subsitutes the corresponding defintions in
;; function-key-map. This substitution is needed because if a key
- ;; definition if found in function-key-map, there are no further
+ ;; definition is found in function-key-map, there are no further
;; lookups in other keymaps.
(substitute-key-definition [f13] [S-f1] function-key-map)
(substitute-key-definition [f14] [S-f2] function-key-map)
(define-key map "\eO2Q" [S-f2])
(define-key map "\eO2R" [S-f3])
(define-key map "\eO2S" [S-f4])
+ (define-key map "\e[1;2P" [S-f1])
+ (define-key map "\e[1;2Q" [S-f2])
+ (define-key map "\e[1;2R" [S-f3])
+ (define-key map "\e[1;2S" [S-f4])
(define-key map "\e[15;2~" [S-f5])
(define-key map "\e[17;2~" [S-f6])
(define-key map "\e[18;2~" [S-f7])
(define-key map "\e[4~" [select])
(define-key map "\e[29~" [print])
-
- ;; These keys are available in xterm starting from version 214
- ;; 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;44~" [?\C-,])
- (define-key map "\e[27;5;46~" [?\C-.])
- (define-key map "\e[27;5;47~" [?\C-/])
- (define-key map "\e[27;5;92~" [?\C-\\])
-
- (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 "\eOj" [kp-multiply])
+ (define-key map "\eOk" [kp-add])
+ (define-key map "\eOl" [kp-separator])
+ (define-key map "\eOm" [kp-subtract])
+ (define-key map "\eOo" [kp-divide])
+ (define-key map "\eOp" [kp-0])
+ (define-key map "\eOq" [kp-1])
+ (define-key map "\eOr" [kp-2])
+ (define-key map "\eOs" [kp-3])
+ (define-key map "\eOt" [kp-4])
+ (define-key map "\eOu" [kp-5])
+ (define-key map "\eOv" [kp-6])
+ (define-key map "\eOw" [kp-7])
+ (define-key map "\eOx" [kp-8])
+ (define-key map "\eOy" [kp-9])
+
+ ;; 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])
+ ;; 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])
;; Other versions of xterm might emit these.
(define-key map "\e[A" [up])
;; Do it!
(xterm-register-default-colors)
;; This recomputes all the default faces given the colors we've just set up.
- (tty-set-up-initial-frame-faces)))
+ (tty-set-up-initial-frame-faces)
+
+ ;; Try to turn on the modifyOtherKeys feature on modern xterms.
+ ;; When it is turned on much more key bindings work: things like
+ ;; C-. C-, etc.
+ ;; To do that we need to find out if the current terminal supports
+ ;; modifyOtherKeys. At this time only xterm does.
+ (let ((coding-system-for-read 'binary)
+ (chr nil)
+ (str nil))
+ ;; Try to find out the type of terminal by sending a "Secondary
+ ;; Device Attributes (DA)" query.
+ (send-string-to-terminal "\e[>0c")
+
+ ;; The reply should be of the form: \e [ > NUMBER1 ; NUMBER2 ; NUMBER3 c
+ (when (equal (read-event nil nil 0.1) ?\e)
+ (when (equal (read-event nil nil 0.1) ?\[)
+ (while (not (equal (setq chr (read-event nil nil 0.1)) ?c))
+ (setq str (concat str (string chr))))
+ (when (string-match ">0;\\([0-9]+\\);0" str)
+ ;; NUMBER2 is the xterm version number, look for something
+ ;; greater than 216, the version when modifyOtherKeys was
+ ;; introduced.
+ (when (>= (string-to-number
+ (substring str (match-beginning 1) (match-end 1))) 216)
+ ;; Make sure that the modifyOtherKeys state is restored when
+ ;; suspending, resuming and exiting.
+ (add-hook 'suspend-hook 'xterm-turn-off-modify-other-keys)
+ (add-hook 'suspend-resume-hook 'xterm-turn-on-modify-other-keys)
+ (add-hook 'kill-emacs-hook 'xterm-turn-off-modify-other-keys)
+ (xterm-turn-on-modify-other-keys))))))))
;; Set up colors, for those versions of xterm that support it.
(defvar xterm-standard-colors
;; right colors, so clear them.
(clear-face-cache)))
+(defun xterm-turn-on-modify-other-keys ()
+ "Turn on the modifyOtherKeys feature of xterm."
+ (send-string-to-terminal "\e[>4;1m"))
+
+(defun xterm-turn-off-modify-other-keys ()
+ "Turn off the modifyOtherKeys feature of xterm."
+ (send-string-to-terminal "\e[>4m"))
+
;; arch-tag: 12e7ebdd-1e6c-4b25-b0f9-35ace25e855a
;;; xterm.el ends here