]> git.eshelyaron.com Git - emacs.git/commitdiff
Define describe-coding-system instead of
authorKenichi Handa <handa@m17n.org>
Wed, 18 Jun 1997 12:55:13 +0000 (12:55 +0000)
committerKenichi Handa <handa@m17n.org>
Wed, 18 Jun 1997 12:55:13 +0000 (12:55 +0000)
describe-current-coding-system in help-map and mule-menu-keymap.
In mule-menu-keymap, enable set-buffer-process-coding-system only
when the current buffer has been associated with some subprocess.
(set-language-info): Doc-string modified because input-method is
not a valid KEY argument now.
(leim-list-file-name, leim-list-header, leim-list-entry-regexp):
New variables.
(update-leim-list-file, update-all-leim-list-files): New
functions.
(current-input-method): Doc-string modified because the value is
now input method name.
(defualt-input-method, previous-input-method): Likewise.
(current-input-method-title): Doc-string modified because now each
input method does not have to set this variable.
(input-method-alist): New variable.
(register-input-method): Register input method in
input-method-alist.
(read-language-and-input-method-name): Deleted.
(read-input-method-name): New function.
(activate-input-method, select-input-method, toggle-input-method):
Modified for the above change.
(read-multilingual-string): Likewise.
(describe-current-input-method): Renamed from
describe-input-method.
(describe-input-method): New function.
(describe-language-environment): Do not put a vacant line at the
top of *Help* buffer.  Show a title string of each input method.

lisp/international/mule-cmds.el

index 5e4dfe69604e8d5feb1724360977ef374fdf5d4e..94e8ac37518f91b020e7b8eec65a8bc9c7746ded 100644 (file)
@@ -43,7 +43,7 @@
 
 (define-key help-map "\C-L" 'describe-language-environment)
 (define-key help-map "\C-\\" '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)
 
 (defvar mule-menu-keymap nil
@@ -87,8 +87,8 @@
 (define-key-after mule-menu-keymap [separator-input-method]
   '("--")
   t)
-(define-key-after mule-menu-keymap [describe-current-coding-system]
-  '("Describe coding systems" . describe-current-coding-system)
+(define-key-after mule-menu-keymap [describe-coding-system]
+  '("Describe coding systems" . describe-coding-system)
   t)
 (define-key-after mule-menu-keymap [set-various-coding-system]
   '("Set coding systems" . set-coding-system-map)
      '(null window-system))
 (put 'set-keyboard-coding-system 'menu-enable
      '(null window-system))
+;; This is meaningless when the current buffer has no process.
+(put 'set-buffer-process-coding-system 'menu-enable
+     '(get-buffer-process (current-buffer)))
 
 ;; This should be a single character key binding because users use it
 ;; very frequently while editing multilingual text.  Now we can use
@@ -202,10 +205,6 @@ tutorial: a tutorial file name written in the language.
 
 sample-text: one line short text containing characters of the language.
 
-input-method: alist of input method names for the language vs information
-      for activating them.  Use `register-input-method' (which see)
-      to add a new input method to the alist.
-
 documentation: t or a string describing how Emacs supports the language.
       If a string is specified, it is shown before any other information
       of the language by the command `describe-language-environment'.
@@ -277,34 +276,78 @@ ALIST is an alist of KEY and INFO.  See the documentation of
 \f
 ;;; Multilingual input methods.
 
+(defconst leim-list-file-name "leim-list.el"
+  "Name of LEIM list file.
+This file contains a list of libraries of Emacs input methods (LEIM)
+in the format of Lisp expression for registering each input method.
+Emacs loads this file at startup time.")
+
+(defvar leim-list-header (format "\
+;;; %s -- list of LEIM (Library of Emacs Input Method)
+;;
+;; This file contains a list of LEIM (Library of Emacs Input Method)
+;; in the same directory as this file.  Loading this file registeres
+;; the whole input methods in Emacs.
+;;
+;; Each entry is has the form:
+;;   (register-input-method
+;;    INPUT-METHOD LANGUAGE-NAME ACTIVATE-FUNC
+;;    TITLE DESCRIPTION
+;;    ARG ...)
+;; See the function `register-input-method' for the meanings of arguments.
+;;
+;; If this directory is included in load-path, Emacs automatically
+;; loads this file at startup time.
+
+"
+                                leim-list-file-name)
+  "Header to be inserted in LEIM list file.")
+
+(defvar leim-list-entry-regexp "(register-input-method"
+  "Regexp matching head of each entry in LEIM list file.
+See also the variable `leim-list-header'")
+
+(defvar update-leim-list-functions
+  '(quail-update-leim-list-file)
+  "List of functions to call to update LEIM list file.
+Each function is called with one arg, LEIM directory name.")
+
+(defun update-leim-list-file (dir)
+  "Update LEIM list file in directory DIR."
+  (let ((functions update-leim-list-functions))
+    (while functions
+      (funcall (car functions) (expand-file-name dir))
+      (setq functions (cdr functions)))))
+
+(defun update-all-leim-list-files ()
+  "Update all the LEIM list files."
+  (interactive)
+  (let ((l load-path))
+    (while l
+      (if (string-match "leim" (car l))
+         (update-leim-list-file (car l)))
+      (setq l (cdr l)))))
+
 (defvar current-input-method nil
   "The current input method for multilingual text.
-The value is a cons of language name and input method name.
 If nil, it means no input method is activated now.")
 (make-variable-buffer-local 'current-input-method)
 (put 'current-input-method 'permanent-local t)
 
 (defvar current-input-method-title nil
-  "Title string of the current input method shown in mode line.
-Every input method should set this to an appropriate value when activated.")
+  "Title string of the current input method shown in mode line.")
 (make-variable-buffer-local 'current-input-method-title)
 (put 'current-input-method-title 'permanent-local t)
 
 (defvar default-input-method nil
-  "Default input method.
+  "Default input method for multilingual text.
 The default input method is the one activated automatically by the command
-`toggle-input-method' (\\[toggle-input-method]).
-The value is a cons of language name and input method name.")
+`toggle-input-method' (\\[toggle-input-method]).")
 (make-variable-buffer-local 'default-input-method)
 (put 'default-input-method 'permanent-local t)
 
-(defvar default-input-method-title nil
-  "Title string of the default input method.")
-(make-variable-buffer-local 'default-input-method-title)
-(put 'default-input-method-title 'permanent-local t)
-
 (defvar previous-input-method nil
-  "Input method selected previously.
+  "Input method selected previously in the current buffer.
 This is the one selected before the current input method is selected.
 See also the documentation of `default-input-method'.")
 (make-variable-buffer-local 'previous-input-method)
@@ -323,66 +366,59 @@ This function is called with no argument.")
 (make-variable-buffer-local 'describe-current-input-method-function)
 (put 'describe-current-input-method-function 'permanent-local t)
 
-(defun register-input-method (language-name input-method)
-  "Register INPUT-METHOD as an input method of LANGUAGE-NAME.
-LANGUAGE-NAME is a string.
-INPUT-METHOD is a list of the form:
-       (METHOD-NAME ACTIVATE-FUNC ARG ...)
-where METHOD-NAME is the name of this method,
-ACTIVATE-FUNC is the function to call for activating this method.
-Arguments for the function are METHOD-NAME and ARGs."
-  (let ((slot (get-language-info language-name 'input-method))
-       method-slot)
-    (if (null slot)
-       (set-language-info language-name 'input-method (list input-method))
-      (setq method-slot (assoc (car input-method) slot))
-      (if method-slot
-         (setcdr method-slot (cdr input-method))
-       (set-language-info language-name 'input-method
-                          (cons input-method slot))))))
-
-(defun read-language-and-input-method-name ()
-  "Read a language name and the corresponding input method from a minibuffer.
-Return a list of those names."
-  (let* ((default-val (or previous-input-method default-input-method))
-        (language-name (read-language-name
-                        'input-method "Language: "
-                        (if default-val (cons (car default-val) 0)))))
-    (if (null language-name)
-       (error "No input method for the specified language"))
-    (if (not (string= language-name (car default-val)))
-       ;; Now the default value has no meaning.
-       (setq default-val nil))
-    (let* ((completion-ignore-case t)
-          (key-slot (cdr (assq 'input-method
-                               (assoc language-name language-info-alist))))
-          (method-name
-           (completing-read "Input method: " key-slot nil t
-                            (if default-val (cons (cdr default-val) 0)))))
-      (if (= (length method-name) 0)
-         (error "No input method specified"))
-      (list language-name
-           (car (assoc-ignore-case method-name key-slot))))))
-
-;; Actvate input method METHOD-NAME for langauge LANGUAGE-NAME.
-(defun activate-input-method (language-name method-name)
+(defvar input-method-alist nil
+  "Alist of input method names vs the corresponding information to use it.
+Each element has the form:
+       (INPUT-METHOD LANGUAGE-NAME ACTIVATE-FUNC TITLE DESCRIPTION ...)
+See the function `register-input-method' for the meanings of each elements.")
+
+(defun register-input-method (input-method language-name &rest args)
+  "Register INPUT-METHOD as an input method for LANGUAGE-NAME.
+INPUT-METHOD and LANGUAGE-NAME are strings.
+The remaining arguments are:
+       ACTIVATE-FUNC, TITLE, DESCRIPTION, and ARG ...
+ where,
+ACTIVATE-FUNC is a function to call for activating this method.
+TITLE is a string shown in mode-line while this method is active,
+DESCRIPTION is a string describing about this method,
+Arguments to ACTIVATE-FUNC are INPUT-METHOD and ARGs."
+  (let ((info (cons language-name args))
+       (slot (assoc input-method input-method-alist)))
+    (if slot
+       (setcdr slot info)
+      (setq slot (cons input-method info))
+      (setq input-method-alist (cons slot input-method-alist)))))
+
+(defun read-input-method-name (prompt &optional initial-input inhibit-null)
+  "Read a name of input method from a minibuffer prompting with PROMPT.
+If INITIAL-INPUT is non-nil, insert it in the minibuffer initially.
+  If it is (STRING . POSITION), the initial input
+  is STRING, but point is placed POSITION characters into the string.
+If INHIBIT-NULL is non-nil, null input signals an error."
+  (let* ((completion-ignore-case t)
+        (input-method (completing-read prompt input-method-alist
+                                       nil t initial-input)))
+    (if (> (length input-method) 0)
+       input-method
+      (if inhibit-null
+         (error "The specified input method is not avairable")))))
+
+;; Actvate INPUT-METHOD.
+(defun activate-input-method (input-method)
   (if (and current-input-method
-          (or (not (string= (car current-input-method) language-name))
-              (not (string= (cdr current-input-method) method-name))))
+          (not (string= current-input-method input-method)))
       (inactivate-input-method))
-  (or current-input-method
-      (let* ((key-slot (get-language-info language-name 'input-method))
-            (method-slot (cdr (assoc method-name key-slot))))
-       (if (null method-slot)
-           (error "Invalid input method `%s' for  %s"
-                  method-name language-name))
-       (apply (car method-slot) method-name (cdr method-slot))
-       (setq current-input-method (cons language-name method-name))
-       (if (not (equal default-input-method current-input-method))
-           (progn
-             (setq previous-input-method default-input-method)
-             (setq default-input-method current-input-method)
-             (setq default-input-method-title current-input-method-title))))))
+  (if current-input-method
+      nil                              ; We have nothing to do.
+    (let ((slot (assoc input-method input-method-alist)))
+      (if (null slot)
+         (error "Invalid input method `%s'" input-method))
+      (apply (nth 2 slot) input-method (nthcdr 5 slot))
+      (setq current-input-method input-method)
+      (setq current-input-method-title (nth 3 slot))
+      (if (not (string= default-input-method current-input-method))
+         (setq previous-input-method default-input-method
+               default-input-method current-input-method)))))
 
 ;; Inactivate the current input method.
 (defun inactivate-input-method ()
@@ -391,44 +427,52 @@ Return a list of those names."
          (funcall inactivate-current-input-method-function)
        (setq current-input-method nil))))
 
-(defun select-input-method (language-name method-name)
-  "Select and activate input method METHOD-NAME for inputting LANGUAGE-NAME.
+(defun select-input-method (input-method)
+  "Select and activate INPUT-METHOD.
 Both the default and local values of default-input-method are
 set to the selected input method.
-
-The information for activating METHOD-NAME is stored
-in `language-info-alist' under the key 'input-method.
-The format of the information has the form:
-       ((METHOD-NAME ACTIVATE-FUNC ARG ...) ...)
-where ACTIVATE-FUNC is a function to call for activating this method.
-Arguments for the function are METHOD-NAME and ARGs."
-  (interactive (read-language-and-input-method-name))
-  (activate-input-method language-name method-name)
-  (setq-default default-input-method default-input-method)
-  (setq-default default-input-method-title default-input-method-title))
+See also the function `register-input-method'."
+  (interactive
+   (let* ((default (or previous-input-method default-input-method))
+         (initial (if default (cons default 0))))
+     (list (read-input-method-name "Input method: " initial t))))
+  (activate-input-method input-method)
+  (setq-default default-input-method default-input-method))
 
 (defun toggle-input-method (&optional arg)
   "Turn on or off a multilingual text input method for the current buffer.
-With arg, turn on an input method specified interactively.
+With arg, read an input method from minibuffer and turn it on.
 Without arg, if some input method is currently activated, turn it off,
 else turn on default-input-method (which see).
 In the latter case, if default-input-method is nil, select an input method
 interactively."
   (interactive "P")
-  (if arg
-      (let ((input-method (read-language-and-input-method-name)))
-       (activate-input-method (car input-method) (nth 1 input-method)))
-    (if current-input-method
-       (inactivate-input-method)
-      (if default-input-method
-         (activate-input-method (car default-input-method)
-                                (cdr default-input-method))
-       (let ((input-method (read-language-and-input-method-name)))
-         (activate-input-method (car input-method) (nth 1 input-method)))))))
-
-(defun describe-input-method ()
+  (let* ((default (or previous-input-method default-input-method))
+        (initial (if default (cons default 0))))
+    (if arg
+       (activate-input-method
+        (read-input-method-name "Input method: " initial t))
+      (if current-input-method
+         (inactivate-input-method)
+       (if default-input-method
+           (activate-input-method default-input-method)
+         (activate-input-method
+          (read-input-method-name "Input method: " initial t)))))))
+
+(defun describe-input-method (input-method)
   "Describe the current input method."
-  (interactive)
+  (interactive
+   (list (read-input-method-name
+         "Describe input method (default, current choice): ")))
+  (if (null input-method)
+      (describe-current-input-method)
+    (with-output-to-temp-buffer "*Help*"
+      (let ((elt (assoc input-method input-method-alist)))
+       (princ (format "Input method: %s (`%s' in mode line) for %s\n  %s\n"
+                      input-method (nth 3 elt) (nth 1 elt) (nth 4 elt)))))))
+
+(defun describe-current-input-method ()
+  "Describe the input method currently turned on."
   (if current-input-method
       (if (and (symbolp describe-current-input-method-function)
               (fboundp describe-current-input-method-function))
@@ -436,24 +480,20 @@ interactively."
        (message "No way to describe the current input method `%s'"
                 (cdr current-input-method))
        (ding))
-    (message "No input method is activated now")
-    (ding)))
+    (error "No input method is activated now")))
 
 (defun read-multilingual-string (prompt &optional initial-input
-                                       language-name method-name)
+                                       input-method)
   "Read a multilingual string from minibuffer, prompting with string PROMPT.
 The input method selected last time is activated in minibuffer.
 If optional second arg INITIAL-INPUT is non-nil, insert it in the minibuffer
- initially
-Optional 3rd and 4th arguments LANGUAGE-NAME and METHOD-NAME specify
- the input method to be activated instead of the one selected last time."
-  (let ((default-input-method default-input-method))
-    (if (and language-name method-name)
-       (setq default-input-method (cons language-name method-name))
-      (or default-input-method
-         (let ((lang-and-input-method (read-language-and-input-method-name)))
-           (setq default-input-method (cons (car lang-and-input-method)
-                                            (nth 1 lang-and-input-method))))))
+initially.
+Optional 3rd argument INPUT-METHOD specifies the input method
+to be activated instead of the one selected last time."
+  (let ((default-input-method
+         (or input-method
+             default-input-method
+             (read-input-method-name "Input method: " nil t))))
     (let ((minibuffer-setup-hook '(toggle-input-method)))
       (read-string prompt initial-input))))
 
@@ -530,18 +570,21 @@ and sometimes other things."
   (let ((doc (get-language-info language-name 'documentation)))
     (with-output-to-temp-buffer "*Help*"
       (if (stringp doc)
-         (princ-list doc))
-      (terpri)
+         (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-list "  " str)
+             (terpri))))
       (princ "Input methods:\n")
-      (let ((l (get-language-info language-name 'input-method)))
+      (let ((l input-method-alist))
        (while l
-         (princ-list "  " (car (car 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")