summaryrefslogtreecommitdiff
path: root/lisp/international
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/international')
-rw-r--r--lisp/international/encoded-kb.el113
-rw-r--r--lisp/international/mule-cmds.el106
-rw-r--r--lisp/international/mule.el37
3 files changed, 133 insertions, 123 deletions
diff --git a/lisp/international/encoded-kb.el b/lisp/international/encoded-kb.el
index 3acb1cfd648..9220970f5bd 100644
--- a/lisp/international/encoded-kb.el
+++ b/lisp/international/encoded-kb.el
@@ -173,7 +173,7 @@ The following key sequence may cause multilingual text insertion."
(setq str (format "%s%c" str (read-char-exclusive))))
(vector (aref result 0))))
-(defun encoded-kbd-setup-keymap (coding)
+(defun encoded-kbd-setup-keymap (keymap coding)
;; At first, reset the keymap.
(define-key encoded-kbd-mode-map "\e" nil)
;; Then setup the keymap according to the keyboard coding system.
@@ -181,7 +181,7 @@ The following key sequence may cause multilingual text insertion."
((eq (coding-system-type coding) 1) ; SJIS
(let ((i 128))
(while (< i 256)
- (define-key key-translation-map
+ (define-key keymap
(vector i) 'encoded-kbd-self-insert-sjis)
(setq i (1+ i))))
8)
@@ -189,7 +189,7 @@ The following key sequence may cause multilingual text insertion."
((eq (coding-system-type coding) 3) ; Big5
(let ((i 161))
(while (< i 255)
- (define-key key-translation-map
+ (define-key keymap
(vector i) 'encoded-kbd-self-insert-big5)
(setq i (1+ i))))
8)
@@ -215,20 +215,20 @@ The following key sequence may cause multilingual text insertion."
(aset encoded-kbd-iso2022-invocations 1 1))
(when use-designation
(define-key encoded-kbd-mode-map "\e" 'encoded-kbd-iso2022-esc-prefix)
- (define-key key-translation-map "\e" 'encoded-kbd-iso2022-esc-prefix))
+ (define-key keymap "\e" 'encoded-kbd-iso2022-esc-prefix))
(when (or (aref flags 2) (aref flags 3))
- (define-key key-translation-map
+ (define-key keymap
[?\216] 'encoded-kbd-iso2022-single-shift)
- (define-key key-translation-map
+ (define-key keymap
[?\217] 'encoded-kbd-iso2022-single-shift))
(or (eq (aref flags 0) 'ascii)
(dotimes (i 96)
- (define-key key-translation-map
+ (define-key keymap
(vector (+ 32 i)) 'encoded-kbd-self-insert-iso2022-7bit)))
(if (aref flags 7)
t
(dotimes (i 96)
- (define-key key-translation-map
+ (define-key keymap
(vector (+ 160 i)) 'encoded-kbd-self-insert-iso2022-8bit))
8))))
@@ -243,7 +243,7 @@ The following key sequence may cause multilingual text insertion."
(setq from (setq to elt)))
(while (<= from to)
(if (>= from 128)
- (define-key key-translation-map
+ (define-key keymap
(vector from) 'encoded-kbd-self-insert-ccl))
(setq from (1+ from))))
8))
@@ -251,59 +251,50 @@ The following key sequence may cause multilingual text insertion."
(t
nil)))
-;; key-translation-map at the time Encoded-kbd mode is turned on is
-;; saved here.
-(defvar saved-key-translation-map nil)
-
-;; Input mode at the time Encoded-kbd mode is turned on is saved here.
-(defvar saved-input-mode nil)
-
-(put 'encoded-kbd-mode 'permanent-local t)
;;;###autoload
-(define-minor-mode encoded-kbd-mode
- "Toggle Encoded-kbd minor mode.
-With arg, turn Encoded-kbd mode on if and only if arg is positive.
-
-You should not turn this mode on manually, instead use the command
-\\[set-keyboard-coding-system] which turns on or off this mode
-automatically.
-
-In Encoded-kbd mode, a text sent from keyboard is accepted
-as a multilingual text encoded in a coding system set by
-\\[set-keyboard-coding-system]."
- :global t :group 'keyboard :group 'mule
-
- (if encoded-kbd-mode
- ;; We are turning on Encoded-kbd mode.
- (let ((coding (keyboard-coding-system))
- result)
- (or saved-key-translation-map
- (if (keymapp key-translation-map)
- (setq saved-key-translation-map
- (copy-keymap key-translation-map))
- (setq key-translation-map (make-sparse-keymap))))
- (or saved-input-mode
- (setq saved-input-mode
- (current-input-mode)))
- (setq result (and coding (encoded-kbd-setup-keymap coding)))
- (if result
- (if (eq result 8)
- (set-input-mode
- (nth 0 saved-input-mode)
- (nth 1 saved-input-mode)
- 'use-8th-bit
- (nth 3 saved-input-mode)))
- (setq encoded-kbd-mode nil
- saved-key-translation-map nil
- saved-input-mode nil)
- (error "Unsupported coding system in Encoded-kbd mode: %S"
- coding)))
-
- ;; We are turning off Encoded-kbd mode.
- (setq key-translation-map saved-key-translation-map
- saved-key-translation-map nil)
- (apply 'set-input-mode saved-input-mode)
- (setq saved-input-mode nil)))
+(defun encoded-kbd-setup-display (display)
+ "Set up a `key-translation-map' for `keyboard-coding-system' on DISPLAY.
+
+DISPLAY may be a display id, a frame, or nil for the selected frame's display."
+ (let ((frame (if (framep display) display (car (frames-on-display-list display)))))
+ (when frame
+ (with-selected-frame frame
+ ;; Remove any previous encoded-kb keymap from key-translation-map.
+ (let ((m (terminal-local-value 'local-key-translation-map frame)))
+ (if (equal (keymap-prompt m) "encoded-kb")
+ (set-terminal-local-value 'local-key-translation-map frame (keymap-parent m))
+ (while (keymap-parent m)
+ (if (equal (keymap-prompt (keymap-parent m)) "encoded-kb")
+ (set-keymap-parent m (keymap-parent (keymap-parent m))))
+ (setq m (keymap-parent m)))))
+
+ (if (keyboard-coding-system)
+ ;; We are turning on Encoded-kbd mode.
+ (let ((coding (keyboard-coding-system))
+ (keymap (make-sparse-keymap "encoded-kb"))
+ (cim (current-input-mode))
+ result)
+ (set-keymap-parent keymap (terminal-local-value 'local-key-translation-map frame))
+ (set-terminal-local-value 'local-key-translation-map frame keymap)
+ (unless (terminal-parameter nil 'encoded-kbd-saved-input-mode)
+ (set-terminal-parameter nil 'encoded-kbd-saved-input-mode cim))
+ (setq result (and coding (encoded-kbd-setup-keymap keymap coding)))
+ (if result
+ (when (and (eq result 8)
+ (memq (nth 2 cim) '(t nil)))
+ (set-input-mode
+ (nth 0 cim)
+ (nth 1 cim)
+ 'use-8th-bit
+ (nth 3 cim)))
+ (set-terminal-local-value nil 'encoded-kbd-saved-input-mode nil)
+ (error "Unsupported coding system in Encoded-kbd mode: %S"
+ coding)))
+ ;; We are turning off Encoded-kbd mode.
+ (unless (equal (current-input-mode)
+ (terminal-parameter nil 'encoded-kbd-saved-input-mode))
+ (apply 'set-input-mode (terminal-parameter nil 'encoded-kbd-saved-input-mode)))
+ (set-terminal-parameter nil 'saved-input-mode nil))))))
(provide 'encoded-kb)
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index c79349f3e57..336ec40325d 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -148,7 +148,7 @@
t)
(define-key-after set-coding-system-map [set-terminal-coding-system]
'(menu-item "For Terminal" set-terminal-coding-system
- :enable (null (memq window-system '(x w32 mac)))
+ :enable (null (memq initial-window-system '(x w32 mac)))
:help "How to encode terminal output")
t)
(define-key-after set-coding-system-map [separator-3]
@@ -1786,7 +1786,7 @@ The default status is as follows:
(reset-language-environment)
-(defun set-display-table-and-terminal-coding-system (language-name &optional coding-system)
+(defun set-display-table-and-terminal-coding-system (language-name &optional coding-system display)
"Set up the display table and terminal coding system for LANGUAGE-NAME."
(let ((coding (get-language-info language-name 'unibyte-display)))
(if coding
@@ -1800,7 +1800,7 @@ The default status is as follows:
(dotimes (i 128)
(aset standard-display-table (+ i 128) nil))))
(or (eq window-system 'pc)
- (set-terminal-coding-system (or coding-system coding)))))
+ (set-terminal-coding-system (or coding-system coding) display))))
(defun set-language-environment (language-name)
"Set up multi-lingual environment for using LANGUAGE-NAME.
@@ -2394,7 +2394,7 @@ is returned. Thus, for instance, if charset \"ISO8859-2\",
;; too, for setting things such as calendar holidays, ps-print paper
;; size, spelling dictionary.
-(defun set-locale-environment (&optional locale-name)
+(defun set-locale-environment (&optional locale-name display)
"Set up multi-lingual environment for using LOCALE-NAME.
This sets the language environment, the coding system priority,
the default input method and sometimes other things.
@@ -2415,6 +2415,11 @@ directory named `/usr/share/locale' or `/usr/lib/locale'. LOCALE-NAME
will be translated according to the table specified by
`locale-translation-file-name'.
+If DISPLAY is non-nil, only set the keyboard coding system and
+the terminal coding system for the given display, and don't touch
+session-global parameters like the language environment. DISPLAY
+may be a display id or a frame.
+
See also `locale-charset-language-names', `locale-language-names',
`locale-preferred-coding-systems' and `locale-coding-system'."
(interactive "sSet environment for locale: ")
@@ -2443,7 +2448,7 @@ See also `locale-charset-language-names', `locale-language-names',
(let ((vars '("LC_ALL" "LC_CTYPE" "LANG")))
(while (and vars
(= 0 (length locale))) ; nil or empty string
- (setq locale (getenv (pop vars))))))
+ (setq locale (server-getenv (pop vars))))))
(unless locale
;; The two tests are kept separate so the byte-compiler sees
@@ -2506,28 +2511,34 @@ See also `locale-charset-language-names', `locale-language-names',
;; Set up for this character set. This is now the right way
;; to do it for both unibyte and multibyte modes.
- (set-language-environment language-name)
+ (unless display
+ (set-language-environment language-name))
;; If default-enable-multibyte-characters is nil,
;; we are using single-byte characters,
;; so the display table and terminal coding system are irrelevant.
(when default-enable-multibyte-characters
(set-display-table-and-terminal-coding-system
- language-name coding-system))
+ language-name coding-system display))
;; Set the `keyboard-coding-system' if appropriate (tty
;; only). At least X and MS Windows can generate
;; multilingual input.
- (unless window-system
- (let ((kcs (or coding-system
- (car (get-language-info language-name
- 'coding-system)))))
- (if kcs (set-keyboard-coding-system kcs))))
-
- (setq locale-coding-system
- (car (get-language-info language-name 'coding-priority))))
-
- (when (and coding-system
+ ;; XXX This was disabled unless `window-system', but that
+ ;; leads to buggy behaviour when a tty frame is opened
+ ;; later. Setting the keyboard coding system has no adverse
+ ;; effect on X, so let's do it anyway. -- Lorentey
+ (let ((kcs (or coding-system
+ (car (get-language-info language-name
+ 'coding-system)))))
+ (if kcs (set-keyboard-coding-system kcs display)))
+
+ (unless display
+ (setq locale-coding-system
+ (car (get-language-info language-name 'coding-priority)))))
+
+ (when (and (not display)
+ coding-system
(not (coding-system-equal coding-system
locale-coding-system)))
(prefer-coding-system coding-system)
@@ -2539,9 +2550,9 @@ See also `locale-charset-language-names', `locale-language-names',
(when (boundp 'w32-ansi-code-page)
(let ((code-page-coding (intern (format "cp%d" w32-ansi-code-page))))
(when (coding-system-p code-page-coding)
- (setq locale-coding-system code-page-coding)
- (set-keyboard-coding-system code-page-coding)
- (set-terminal-coding-system code-page-coding))))
+ (unless display (setq locale-coding-system code-page-coding))
+ (set-keyboard-coding-system code-page-coding display)
+ (set-terminal-coding-system code-page-coding display))))
(when (eq system-type 'darwin)
;; On Darwin, file names are always encoded in utf-8, no matter
@@ -2550,38 +2561,39 @@ See also `locale-charset-language-names', `locale-language-names',
;; Mac OS X's Terminal.app by default uses utf-8 regardless of
;; the locale.
(when (and (null window-system)
- (equal (getenv "TERM_PROGRAM") "Apple_Terminal"))
+ (equal (server-getenv "TERM_PROGRAM") "Apple_Terminal"))
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)))
;; Default to A4 paper if we're not in a C, POSIX or US locale.
;; (See comments in Flocale_info.)
- (let ((locale locale)
- (paper (locale-info 'paper)))
- (if paper
- ;; This will always be null at the time of writing.
- (cond
- ((equal paper '(216 279))
- (setq ps-paper-type 'letter))
- ((equal paper '(210 297))
- (setq ps-paper-type 'a4)))
- (let ((vars '("LC_ALL" "LC_PAPER" "LANG")))
- (while (and vars (= 0 (length locale)))
- (setq locale (getenv (pop vars)))))
- (when locale
- ;; As of glibc 2.2.5, these are the only US Letter locales,
- ;; and the rest are A4.
- (setq ps-paper-type
- (or (locale-name-match locale '(("c$" . letter)
- ("posix$" . letter)
- (".._us" . letter)
- (".._pr" . letter)
- (".._ca" . letter)
- ("enu$" . letter) ; Windows
- ("esu$" . letter)
- ("enc$" . letter)
- ("frc$" . letter)))
- 'a4))))))
+ (unless display
+ (let ((locale locale)
+ (paper (locale-info 'paper)))
+ (if paper
+ ;; This will always be null at the time of writing.
+ (cond
+ ((equal paper '(216 279))
+ (setq ps-paper-type 'letter))
+ ((equal paper '(210 297))
+ (setq ps-paper-type 'a4)))
+ (let ((vars '("LC_ALL" "LC_PAPER" "LANG")))
+ (while (and vars (= 0 (length locale)))
+ (setq locale (server-getenv (pop vars)))))
+ (when locale
+ ;; As of glibc 2.2.5, these are the only US Letter locales,
+ ;; and the rest are A4.
+ (setq ps-paper-type
+ (or (locale-name-match locale '(("c$" . letter)
+ ("posix$" . letter)
+ (".._us" . letter)
+ (".._pr" . letter)
+ (".._ca" . letter)
+ ("enu$" . letter) ; Windows
+ ("esu$" . letter)
+ ("enc$" . letter)
+ ("frc$" . letter)))
+ 'a4)))))))
nil)
;;; Charset property
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index 80c4fd590fe..aea8e094714 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -1207,13 +1207,17 @@ see) to CODING-SYSTEM."
This is normally set according to the selected language environment.
See also the command `set-terminal-coding-system'.")
-(defun set-terminal-coding-system (coding-system)
- "Set coding system of your terminal to CODING-SYSTEM.
-All text output to the terminal will be encoded
+(defun set-terminal-coding-system (coding-system &optional display)
+ "Set coding system of terminal output to CODING-SYSTEM.
+All text output to DISPLAY will be encoded
with the specified coding system.
+
For a list of possible values of CODING-SYSTEM, use \\[list-coding-systems].
The default is determined by the selected language environment
-or by the previous use of this command."
+or by the previous use of this command.
+
+DISPLAY may be a display id, a frame, or nil for the selected frame's display.
+The setting has no effect on graphical displays."
(interactive
(list (let ((default (if (and (not (terminal-coding-system))
default-terminal-coding-system)
@@ -1227,7 +1231,7 @@ or by the previous use of this command."
(setq coding-system default-terminal-coding-system))
(if coding-system
(setq default-terminal-coding-system coding-system))
- (set-terminal-coding-system-internal coding-system)
+ (set-terminal-coding-system-internal coding-system display)
(redraw-frame (selected-frame)))
(defvar default-keyboard-coding-system nil
@@ -1235,14 +1239,17 @@ or by the previous use of this command."
This is normally set according to the selected language environment.
See also the command `set-keyboard-coding-system'.")
-(defun set-keyboard-coding-system (coding-system)
- "Set coding system for keyboard input to CODING-SYSTEM.
-In addition, this command enables Encoded-kbd minor mode.
-\(If CODING-SYSTEM is nil, Encoded-kbd mode is turned off -- see
-`encoded-kbd-mode'.)
+(defun set-keyboard-coding-system (coding-system &optional display)
+ "Set coding system for keyboard input on DISPLAY to CODING-SYSTEM.
+In addition, this command calls `encoded-kbd-setup-display' to set up the
+translation of keyboard input events to the specified coding system.
+
For a list of possible values of CODING-SYSTEM, use \\[list-coding-systems].
The default is determined by the selected language environment
-or by the previous use of this command."
+or by the previous use of this command.
+
+DISPLAY may be a display id, a frame, or nil for the selected frame's display.
+The setting has no effect on graphical displays."
(interactive
(list (let ((default (if (and (not (keyboard-coding-system))
default-keyboard-coding-system)
@@ -1259,9 +1266,9 @@ or by the previous use of this command."
(if (and coding-system
(coding-system-get coding-system 'ascii-incompatible))
(error "%s is not ASCII-compatible" coding-system))
- (set-keyboard-coding-system-internal coding-system)
+ (set-keyboard-coding-system-internal coding-system display)
(setq keyboard-coding-system coding-system)
- (encoded-kbd-mode (if coding-system 1 0)))
+ (encoded-kbd-setup-display display))
(defcustom keyboard-coding-system nil
"Specify coding system for keyboard input.
@@ -1277,8 +1284,8 @@ use either \\[customize] or \\[set-keyboard-coding-system]."
:link '(info-link "(emacs)Specify Coding")
:link '(info-link "(emacs)Single-Byte Character Support")
:set (lambda (symbol value)
- ;; Don't load encoded-kbd-mode unnecessarily.
- (if (or value (boundp 'encoded-kbd-mode))
+ ;; Don't load encoded-kb unnecessarily.
+ (if (or value (boundp 'encoded-kbd-setup-display))
(set-keyboard-coding-system value)
(set-default 'keyboard-coding-system nil))) ; must initialize
:version "22.1"