]> git.eshelyaron.com Git - emacs.git/commitdiff
(quail-update-leim-list-file): Make it
authorKenichi Handa <handa@m17n.org>
Thu, 28 Aug 1997 10:49:48 +0000 (10:49 +0000)
committerKenichi Handa <handa@m17n.org>
Thu, 28 Aug 1997 10:49:48 +0000 (10:49 +0000)
handle multiple directories.

lisp/international/quail.el

index 3d1bbbf045249e8c8a936cf97fe016717019e3da..efffc7dbf43bf1498e3edd1d3cc2fa7bf29e8e66 100644 (file)
@@ -1694,86 +1694,119 @@ key            binding
 This is a sub-directory of LEIM directory.")
 
 ;;;###autoload
-(defun quail-update-leim-list-file (dirname)
-  "Update entries for Quail packages in LEIM list file of directory DIRNAME.
-LEIM is a directory containing Emacs input methods;
+(defun quail-update-leim-list-file (dirname &rest dirnames)
+  "Update entries for Quail packages in `LEIM' list file in directory DIRNAME.
+DIRNAME is a directory containing Emacs input methods;
 normally, it should specify the `leim' subdirectory
-of the Emacs source tree."
-  (interactive "FDirectory of LEIM: ")
-  (setq dirname (file-name-as-directory (expand-file-name dirname)))
-  (let ((quail-dir (concat dirname quail-directory-name))
-       (filename (concat dirname leim-list-file-name))
-       list-buf pkg-list pkg-buf pos)
-    (if (not (file-exists-p quail-dir))
-       nil
-      (if (not (file-readable-p quail-dir))
-         (message "Can't write to file \"%s\"" filename)
-       (if (not (file-writable-p filename))
-           (message "Can't write to file \"%s\"" filename)
-         (setq list-buf (find-file-noselect filename))
-         (setq pkg-list (directory-files quail-dir 'full ".*\\.el$" 'nosort))
-         (message "Updating %s ..." filename)
-
-         ;; At first, clean up the file.
-         (save-excursion
-           (set-buffer list-buf)
-           (goto-char 1)
-
-           ;; Insert the correct header.
-           (if (looking-at (regexp-quote leim-list-header))
-               (goto-char (match-end 0))
-             (insert leim-list-header))
-           (setq pos (point))
-           (if (not (re-search-forward leim-list-entry-regexp nil t))
-               nil
+of the Emacs source tree.
+
+It searches for Quail packages under `quail' subdirectory of DIRNAME,
+and update the file \"leim-list.el\" in DIRNAME.
 
-             ;; Remove garbages after the header.
+When called from a program, the remaining arguments are additional
+directory names to search for Quail packages under `quail' subdirectory
+of each directory."
+  (interactive "FDirectory of LEIM: ")
+  (setq dirname (expand-file-name dirname))
+  (let ((leim-list (expand-file-name leim-list-file-name dirname))
+       quail-dirs list-buf pkg-list pkg-buf pos)
+    (if (not (file-writable-p leim-list))
+       (error "Can't write to file \"%s\"" leim-list))
+    (message "Updating %s ..." leim-list)
+    (setq list-buf (find-file-noselect leim-list))
+
+    ;; At first, clean up the file.
+    (save-excursion
+      (set-buffer list-buf)
+      (goto-char 1)
+
+      ;; Insert the correct header.
+      (if (looking-at (regexp-quote leim-list-header))
+         (goto-char (match-end 0))
+       (insert leim-list-header))
+      (setq pos (point))
+      (if (not (re-search-forward leim-list-entry-regexp nil t))
+         nil
+
+       ;; Remove garbages after the header.
+       (goto-char (match-beginning 0))
+       (if (< pos (point))
+           (delete-region pos (point)))
+
+       ;; Remove all entries for Quail.
+       (while (re-search-forward leim-list-entry-regexp nil 'move)
+         (goto-char (match-beginning 0))
+         (setq pos (point))
+         (condition-case nil
+             (let ((form (read list-buf)))
+               (when (equal (nth 3 form) ''quail-use-package)
+                 (if (eolp) (forward-line 1))
+                 (delete-region pos (point))))
+           (error
+            ;; Delete the remaining contents because it seems that
+            ;; this file is broken.
+            (message "Garbages in %s deleted" leim-list)
+            (delete-region pos (point-max)))))))
+
+    ;; Search for `quail' subdirector under each DIRNAMES.
+    (setq dirnames (cons dirname dirnames))
+    (let ((l dirnames))
+      (while l
+       (setcar l (expand-file-name (car l)))
+       (setq dirname (expand-file-name quail-directory-name (car l)))
+       (if (file-readable-p dirname)
+           (setq quail-dirs (cons dirname quail-dirs))
+         (message "%s doesn't has `%s' subdirectory, just ignored"
+                  (car l) quail-directory-name)
+         (setq quail-dirs (cons nil quail-dirs)))
+       (setq l (cdr l)))
+      (setq quail-dirs (nreverse quail-dirs)))
+
+    ;; Insert input method registering forms.
+    (while quail-dirs
+      (setq dirname (car quail-dirs))
+      (when dirname
+       (setq pkg-list (directory-files dirname 'full "\\.el$" 'nosort))
+       (while pkg-list
+         (message "Checking %s ..." (car pkg-list))
+         (with-temp-buffer
+           (insert-file-contents (car pkg-list))
+           (goto-char (point-min))
+           (while (search-forward "(quail-define-package" nil t)
              (goto-char (match-beginning 0))
-             (if (< pos (point))
-                 (delete-region pos (point)))
-
-             ;; Remove all entries for Quail.
-             (while (re-search-forward leim-list-entry-regexp nil 'move)
-               (goto-char (match-beginning 0))
-               (setq pos (point))
-               (let ((form (read list-buf)))
-                 (if (equal (nth 3 form) ''quail-use-package)
-                     (progn
-                       (if (eolp) (forward-line 1))
-                       (delete-region pos (point))))))))
-
-         ;; Insert entries for Quail.
-         (while pkg-list
-           (message "Checking %s ..." (car pkg-list))
-           (with-temp-buffer
-             (insert-file-contents (car pkg-list))
-             (goto-char (point-min))
-             (while (search-forward "(quail-define-package" nil t)
-               (goto-char (match-beginning 0))
-               (let ((form (read (current-buffer))))
-                 (save-excursion
-                   (set-buffer list-buf)
-                   (insert (format "(register-input-method
+             (condition-case nil
+                 (let ((form (read (current-buffer))))
+                   (save-excursion
+                     (set-buffer list-buf)
+                     (insert
+                      (format "(register-input-method
  %S %S '%s
  %S %S
  %S)\n"
-                                   (nth 1 form)        ; PACKAGE-NAME
-                                   (nth 2 form)        ; LANGUAGE
-                                   'quail-use-package  ; ACTIVATE-FUNC
-                                   (nth 3 form)        ; PACKAGE-TITLE
-                                   (progn    ; PACKAGE-DESCRIPTION (one line)
-                                     (string-match ".*" (nth 5 form))
-                                     (match-string 0 (nth 5 form)))
-                                   (file-relative-name ; PACKAGE-FILENAME
-                                    (file-name-sans-extension (car pkg-list))
-                                    dirname)))))))
-           (setq pkg-list (cdr pkg-list)))
-         (save-excursion
-           (set-buffer list-buf)
-           (setq buffer-file-coding-system 'iso-2022-7bit)
-           (save-buffer 0))
-         (kill-buffer list-buf)
-         (message "Updating %s ... done" (buffer-file-name list-buf)))))))
+                              (nth 1 form) ; PACKAGE-NAME
+                              (nth 2 form) ; LANGUAGE
+                              'quail-use-package ; ACTIVATE-FUNC
+                              (nth 3 form) ; PACKAGE-TITLE
+                              (progn   ; PACKAGE-DESCRIPTION (one line)
+                                (string-match ".*" (nth 5 form))
+                                (match-string 0 (nth 5 form)))
+                              (file-relative-name ; PACKAGE-FILENAME
+                               (file-name-sans-extension (car pkg-list))
+                               (car dirnames))))))
+               (error
+                ;; Ignore the remaining contents of this file.
+                (goto-char (point-max))
+                (message "Some part of \"%s\" is broken" dirname)))))
+         (setq pkg-list (cdr pkg-list)))
+       (setq quail-dirs (cdr quail-dirs) dirnames (cdr dirnames))))
+
+    ;; At last, write out LEIM list file.
+    (save-excursion
+      (set-buffer list-buf)
+      (setq buffer-file-coding-system 'iso-2022-7bit)
+      (save-buffer 0))
+    (kill-buffer list-buf)
+    (message "Updating %s ... done" leim-list)))
 ;;
 (provide 'quail)