diff lisp/mule/mule-cmds.el @ 207:e45d5e7c476e r20-4b2

Import from CVS: tag r20-4b2
author cvs
date Mon, 13 Aug 2007 10:03:52 +0200
parents 850242ba4a81
children 41ff10fd062f
line wrap: on
line diff
--- a/lisp/mule/mule-cmds.el	Mon Aug 13 10:02:48 2007 +0200
+++ b/lisp/mule/mule-cmds.el	Mon Aug 13 10:03:52 2007 +0200
@@ -29,19 +29,18 @@
 
 (defvar mule-keymap (make-sparse-keymap "MULE")
   "Keymap for MULE (Multilingual environment) specific commands.")
-(fset 'mule-prefix mule-keymap)
 
 ;; Keep "C-x C-m ..." for mule specific commands.
-(define-key ctl-x-map "\C-m" 'mule-prefix)
+(define-key ctl-x-map "\C-m" mule-keymap)
 
 (define-key mule-keymap "f" 'set-buffer-file-coding-system)
 (define-key mule-keymap "F" 'set-default-buffer-file-coding-system) ; XEmacs
 (define-key mule-keymap "t" 'set-terminal-coding-system)
 (define-key mule-keymap "k" 'set-keyboard-coding-system)
-(define-key mule-keymap "p" 'set-current-process-coding-system)
-(define-key mule-keymap "P" 'set-default-process-coding-system) ; XEmacs
+(define-key mule-keymap "p" 'set-buffer-process-coding-system)
 (define-key mule-keymap "\C-\\" 'select-input-method)
-(define-key mule-keymap "c" 'list-coding-system-briefly) ; XEmacs
+(define-key mule-keymap "c" 'universal-coding-system-argument)
+;;(define-key mule-keymap "c" 'list-coding-system-briefly) ; XEmacs
 (define-key mule-keymap "C" 'list-coding-system)	 ; XEmacs
 (define-key mule-keymap "r" 'toggle-display-direction)	 ; XEmacs
 (define-key mule-keymap "l" 'set-language-environment)
@@ -50,7 +49,7 @@
 (define-key help-map "L" 'describe-language-environment)
 (define-key help-map "\C-\\" 'describe-input-method)
 (define-key help-map "I" 'describe-input-method)
-(define-key help-map "C" 'describe-current-coding-system)
+(define-key help-map "C" 'describe-coding-system)
 (define-key help-map "h" 'view-hello-file)
 
 ;; Menu for XEmacs were moved to x11/x-menubar.el.
@@ -71,13 +70,72 @@
   (let ((coding-system-for-read 'iso-2022-7))
     (find-file-read-only (expand-file-name "HELLO" data-directory))))
 
+(defun universal-coding-system-argument ()
+  "Execute an I/O command using the specified coding system."
+  (interactive)
+  (let* ((coding-system
+	  (read-coding-system "Coding system for following command: "))
+	 (keyseq (read-key-sequence
+		  (format "Command to execute with %s:" coding-system)))
+	 (cmd (key-binding keyseq)))
+    (let ((coding-system-for-read coding-system)
+	  (coding-system-for-write coding-system))
+      (message "")
+      (call-interactively cmd))))
+
+(defun set-default-coding-systems (coding-system)
+  "Set default value of various coding systems to CODING-SYSTEM.
+The follwing coding systems are set:
+  o coding system of a newly created buffer
+  o default coding system for terminal output
+  o default coding system for keyboard input
+  o default coding system for subprocess I/O"
+  (check-coding-system coding-system)
+  ;;(setq-default buffer-file-coding-system coding-system)
+  (set-default-buffer-file-coding-system coding-system)
+  ;;(setq default-terminal-coding-system coding-system)
+  (setq terminal-coding-system coding-system)
+  ;;(setq default-keyboard-coding-system coding-system)
+  (setq keyboard-coding-system coding-system)
+  ;;(setq default-process-coding-system (cons coding-system coding-system))
+  (add-hook 'comint-exec-hook
+	    (lambda ()
+	      (let ((proc (get-buffer-process (current-buffer))))
+		(set-process-input-coding-system  proc coding-system)
+		(set-process-output-coding-system proc coding-system)
+		)))
+  (setq file-name-coding-system coding-system)
+  )
+
+(defun prefer-coding-system (coding-system)
+  "Add CODING-SYSTEM at the front of the priority list for automatic detection.
+This also sets the following coding systems to CODING-SYSTEM:
+  o coding system of a newly created buffer
+  o default coding system for terminal output
+  o default coding system for keyboard input
+  o default coding system for subprocess I/O"
+  (interactive "zPrefer coding system: ")
+  (if (not (and coding-system (coding-system-p coding-system)))
+      (error "Invalid coding system `%s'" coding-system))
+  (let ((coding-category (coding-system-category coding-system))
+	(parent (coding-system-parent coding-system)))
+    (if (not coding-category)
+	;; CODING-SYSTEM is no-conversion or undecided.
+	(error "Can't prefer the coding system `%s'" coding-system))
+    (set coding-category (or parent coding-system))
+    (if (not (eq coding-category (car coding-category-list)))
+	;; We must change the order.
+	(setq coding-category-list
+	      (cons coding-category
+		    (delq coding-category coding-category-list))))
+    (if (and parent (interactive-p))
+	(message "Highest priority is set to %s (parent of %s)"
+		 parent coding-system))
+    (set-default-coding-systems (or parent coding-system))))
+
 
 ;;; Language support staffs.
 
-(defvar primary-language "English"
-  "Name of a user's primary language.
-Emacs provide various language supports based on this variable.")
-
 (defvar language-info-alist nil
   "Alist of language names vs the corresponding information of various kind.
 Each element looks like:
@@ -141,23 +199,43 @@
 	  (setcdr lang-slot (cons key-slot (cdr lang-slot)))))
     ;; Setup menu.
     (cond ((eq key 'documentation)
-           ;; (define-key-after mule-describe-language-support-map
+           ;; (define-key-after
+           ;;   (if (consp info)
+           ;;       (prog1 (symbol-value (cdr info))
+           ;;         (setq info (car info)))
+           ;;     describe-language-environment-map)
            ;;   (vector (intern language-name))
-           ;;   (cons language-name info)
+           ;;   (cons language-name 'describe-specified-language-support)
            ;;   t)
+	   (if (consp info)
+	       (setq info (car info)))
 	   (eval-after-load "x-menubar"
-	     `(add-menu-button '("Mule" "Describe Language Support")
-			       (vector ,language-name ',info t)))
+	     `(add-menu-button
+	       '("Mule" "Describe Language Support")
+	       (vector ,language-name
+		       '(describe-language-environment ,language-name)
+		       t)))
 	   )
 	  ((eq key 'setup-function)
-	   ;; (define-key-after mule-set-language-environment-map
+           ;; (define-key-after
+           ;;   (if (consp info)
+           ;;       (prog1 (symbol-value (cdr info))
+           ;;         (setq info (car info)))
+           ;;     setup-language-environment-map)
            ;;   (vector (intern language-name))
-           ;;   (cons language-name info)
+           ;;   (cons language-name 'setup-specified-language-environment)
            ;;   t)
+	   (if (consp info)
+	       (setq info (car info)))
 	   (eval-after-load "x-menubar"
-	     `(add-menu-button '("Mule" "Set Language Environment")
-			       (vector ,language-name ',info t)))
+	     `(add-menu-button
+	       '("Mule" "Set Language Environment")
+	       (vector ,language-name
+		       '(set-language-environment ,language-name)
+		       t)))
            ))
+
+    (setcdr key-slot info)
     ))
 
 (defun set-language-info-alist (language-name alist)
@@ -178,7 +256,7 @@
 	 (name (completing-read prompt
 				language-info-alist
 				(function (lambda (elm) (assq key elm)))
-				t nil nil default)))
+				t nil default)))
     (if (and (> (length name) 0)
 	     (get-language-info name key))
 	name)))
@@ -311,11 +389,8 @@
 		       ))
     (if (> (length input-method) 0)
 	input-method
-      ;; If we have a default, use it, otherwise check inhibit-null
-      (if default
-	  default
-	(if inhibit-null
-	    (error "No valid input method is specified"))))))
+      (if inhibit-null
+	  (error "No valid input method is specified")))))
 
 (defun activate-input-method (input-method)
   "Turn INPUT-METHOD on.
@@ -373,8 +448,6 @@
 
 When there's no input method to turn on, turn on what read from minibuffer."
   (interactive "P")
-  (if (eq arg 1)
-      (setq arg nil))
   (let* ((default (or (car input-method-history) default-input-method)))
     (if (and current-input-method (not arg))
 	(inactivate-input-method)
@@ -428,7 +501,9 @@
   (if (and input-method (symbolp input-method))
       (setq input-method (symbol-name input-method)))
   (let ((current-input-method input-method))
-    (read-string prompt initial-input nil nil t)))
+    ;; FSFmacs
+    ;; (read-string prompt initial-input nil nil t)))
+    (read-string prompt initial-input nil)))
 
 ;; Variables to control behavior of input methods.  All input methods
 ;; should react to these variables.
@@ -479,80 +554,109 @@
 But, if this flag is non-nil, the input method is never back on.")
 
 
-;;; Language specific setup functions.
-;; (defun set-language-environment (language-name)
-;;   "Setup a user's environment for LANGUAGE-NAME.
-;; 
-;; To setup, a fucntion returned by:
-;;   (get-language-info LANGUAGE-NAME 'setup-function)
-;; is called."
-;;   (interactive (list (read-language-name 'setup-function "Language: ")))
-;;   (let (func)
-;;     (if (or (null language-name)
-;;             (null (setq func
-;;                         (get-language-info language-name 'setup-function))))
-;;         (error "No way to setup environment for the specified language"))
-;;     (funcall func)))
+(defun setup-specified-language-environment ()
+  "Set up multi-lingual environment convenient for the specified language."
+  (interactive)
+  (let (language-name)
+    (if (and (symbolp last-command-event)
+	     (or (not (eq last-command-event 'Default))
+		 (setq last-command-event 'English))
+	     (setq language-name (symbol-name last-command-event)))
+	(set-language-environment language-name)
+      (error "Bogus calling sequence"))))
+
+(defvar current-language-environment "English"
+  "The last language environment specified with `set-language-environment'.")
+
+(defun set-language-environment (language-name)
+  "Set up multi-lingual environment for using LANGUAGE-NAME.
+This sets the coding system priority and the default input method
+and sometimes other things."
+  (interactive (list (read-language-name 'setup-function
+					 "Set language environment: ")))
+  (if language-name
+      (if (symbolp language-name)
+	  (setq language-name (symbol-name language-name)))
+    (setq language-name "English"))
+  (if (null (get-language-info language-name 'setup-function))
+      (error "Language environment not defined: %S" language-name))
+  (funcall (get-language-info language-name 'setup-function))
+  (setq current-language-environment language-name)
+  (force-mode-line-update t))
 
 ;; Print all arguments with `princ', then print "\n".
 (defsubst princ-list (&rest args)
   (while args (princ (car args)) (setq args (cdr args)))
   (princ "\n"))
 
-(defun describe-language-support (language-name)
-  "Describe how Emacs supports LANGUAGE-NAME.
+;; Print a language specific information such as input methods,
+;; charsets, and coding systems.  This function is intended to be
+;; called from the menu:
+;;   [menu-bar mule describe-language-environment LANGUAGE]
+;; and should not run it by `M-x describe-current-input-method-function'.
+(defun describe-specified-language-support ()
+  "Describe how Emacs supports the specified language environment."
+  (interactive)
+  (let (language-name)
+    (if (not (and (symbolp last-command-event)
+		  (setq language-name (symbol-name last-command-event))))
+	(error "Bogus calling sequence"))
+    (describe-language-environment language-name)))
 
-For that, a function returned by:
-  (get-language-info LANGUAGE-NAME 'describe-function)
-is called."
-  (interactive (list (read-language-name 'documentation "Language: ")))
-  (let (func)
-    (if (or (null language-name)
-	    (null (setq func
-			(get-language-info language-name 'describe-function))))
-	(error "No documentation for the specified language"))
-    (funcall func)))
-
-;; Print LANGUAGE-NAME specific information such as input methods,
-;; charsets, and coding systems.  This function is intended to be
-;; called from various describe-LANGUAGE-support functions defined in
-;; lisp/language/LANGUAGE.el.
-(defun describe-language-support-internal (language-name)
-  (with-output-to-temp-buffer "*Help*"
-    (let ((doc (get-language-info language-name 'documentation)))
+(defun describe-language-environment (language-name)
+  "Describe how Emacs supports language environment LANGUAGE-NAME."
+  (interactive
+   (list (read-language-name
+	  'documentation
+	  "Describe language environment (default, current choise): ")))
+  (if (null language-name)
+      (setq language-name current-language-environment))
+  (if (or (null language-name)
+	  (null (get-language-info language-name 'documentation)))
+      (error "No documentation for the specified language"))
+  (if (symbolp language-name)
+      (setq language-name (symbol-name language-name)))
+  (let ((doc (get-language-info language-name 'documentation)))
+    (with-output-to-temp-buffer "*Help*"
       (if (stringp doc)
-	  (princ-list doc)))
-    (princ "-----------------------------------------------------------\n")
-    (princ-list "List of items specific to "
-		language-name
-		" support")
-    (princ "-----------------------------------------------------------\n")
-    (let ((str (get-language-info language-name 'sample-text)))
-      (if (stringp str)
-	  (progn
-	    (princ "<sample text>\n")
-	    (princ-list "  " str))))
-    (princ "<input methods>\n")
-    (let ((l (get-language-info language-name 'input-method)))
-      (while l
-	(princ-list "  " (car (car l)))
-	(setq l (cdr l))))
-    (princ "<character sets>\n")
-    (let ((l (get-language-info language-name 'charset)))
-      (if (null l)
-	  (princ-list "  nothing specific to " language-name)
-	(while l
-	  (princ-list "  " (car l) ": "
-		      (charset-description (car l)))
-	  (setq l (cdr l)))))
-    (princ "<coding systems>\n")
-    (let ((l (get-language-info language-name 'coding-system)))
-      (if (null l)
-	  (princ-list "  nothing specific to " language-name)
-	(while l
-	  (princ-list "  " (car l) ":\n\t"
-		      (coding-system-docstring (car l)))
-	  (setq l (cdr l)))))))
+  	  (progn
+	    (princ-list doc)
+	    (terpri)))
+      (let ((str (get-language-info language-name 'sample-text)))
+	(if (stringp str)
+	    (progn
+	      (princ "Sample text:\n")
+	      (princ-list "  " str)
+	      (terpri))))
+      (princ "Input methods:\n")
+      (let ((l input-method-alist))
+  	(while l
+	  (if (string= language-name (nth 1 (car l)))
+	      (princ-list "  " (car (car l))
+			  (format " (`%s' in mode line)" (nth 3 (car l)))))
+	  (setq l (cdr l))))
+      (terpri)
+      (princ "Character sets:\n")
+      (let ((l (get-language-info language-name 'charset)))
+	(if (null l)
+	    (princ-list "  nothing specific to " language-name)
+	  (while l
+	    (princ-list "  " (car l) ": "
+			(charset-description (car l)))
+	    (setq l (cdr l)))))
+      (terpri)
+      (princ "Coding systems:\n")
+      (let ((l (get-language-info language-name 'coding-system)))
+	(if (null l)
+	    (princ-list "  nothing specific to " language-name)
+	  (while l
+	    (princ ; (format "  %s (`%c' in mode line):\n\t%s\n"
+	     ;; In XEmacs, `coding-system-mnemonic' returns string.
+	     (format "  %s (`%s' in mode line):\n\t%s\n"
+		     (car l)
+		     (coding-system-mnemonic (car l))
+		     (coding-system-doc-string (car l))))
+	    (setq l (cdr l))))))))
 
 ;;; Charset property
 
@@ -568,29 +672,30 @@
 ;;   (set-charset-plist charset
 ;;                      (plist-put (charset-plist charset) propname value)))
 
-;;; Character code property
-;; (put 'char-code-property-table 'char-table-extra-slots 0)
-
-;; (defvar char-code-property-table
-;;   (make-char-table 'char-code-property-table)
-;;   "Char-table containing a property list of each character code.
+(defvar char-code-property-table
+  (make-char-table 'generic)
+  "Char-table containing a property list of each character code.
 ;; 
-;; See also the documentation of `get-char-code-property' and
-;; `put-char-code-property'")
+See also the documentation of `get-char-code-property' and
+`put-char-code-property'")
+;;   (let ((plist (aref char-code-property-table char)))
+(defun get-char-code-property (char propname)
+  "Return the value of CHAR's PROPNAME property in `char-code-property-table'."
+  (let ((plist (get-char-table char char-code-property-table)))
+    (if (listp plist)
+	(car (cdr (memq propname plist))))))
 
-;; (defun get-char-code-property (char propname)
-;;   "Return the value of CHAR's PROPNAME property in `char-code-property-table'."
-;;   (let ((plist (aref char-code-property-table char)))
-;;     (if (listp plist)
-;;         (car (cdr (memq propname plist))))))
-
-;; (defun put-char-code-property (char propname value)
-;;   "Store CHAR's PROPNAME property with VALUE in `char-code-property-table'.
-;; It can be retrieved with `(get-char-code-property CHAR PROPNAME)'."
-;;   (let ((plist (aref char-code-property-table char)))
-;;     (if plist
-;;         (let ((slot (memq propname plist)))
-;;           (if slot
+(defun put-char-code-property (char propname value)
+  "Store CHAR's PROPNAME property with VALUE in `char-code-property-table'.
+It can be retrieved with `(get-char-code-property CHAR PROPNAME)'."
+  (let ((plist (get-char-table char char-code-property-table)))
+    (if plist
+	(let ((slot (memq propname plist)))
+	  (if slot
+	      (setcar (cdr slot) value)
+	    (nconc plist (list propname value))))
+      (put-char-table char (list propname value) char-code-property-table)
+      )))
 ;;               (setcar (cdr slot) value)
 ;;             (nconc plist (list propname value))))
 ;;       (aset char-code-property-table char (list propname value)))))