               (insert-file-contents file))
           (message "Module %s not found" module))
         (while (re-search-forward
-                "^\\([ \t]*val\\|let\\) \\([^ (:=]*\\)" (point-max) 'move)
+                "^\\([ \t]*val\\|let\\|external\\) \\([^ (:=]*\\)" (point-max) 'move)
           (setq alist (cons (match-string 2) alist)))
         (erase-buffer)
         )

            (string-match files "^ *$"))
        (message "No info file found: %s." (mapconcat 'identity files " "))
      (message "Scanning info files %s." files)
      (set-buffer (get-buffer-create "*caml-help*"))
      (setq command
            (concat "gunzip -c -f " files
                " | grep -e '" section-regexp "'"))
      (message command)
      (or (shell-command command (current-buffer)) (error "HERE"))
      (goto-char (point-min))
      (while (re-search-forward section-regexp (point-max) t)
        (let* ((module (match-string 2))
               (section (match-string 1)))
          (message "%s %s" module section)
          (if (assoc module entries) nil
            (setq entries
                  (cons (cons module (concat "(" name ")" section))
                        entries))
            )))
      (kill-buffer (current-buffer)))
    entries))

(defun ocaml-info-default-function-old ()
  "The default way to create an info data base from the value 
of \\[Info-default-directory-list] and the base name \\[ocaml-info-name] 
of files to look for.

This uses info files produced by HeVeA."
  (let ((collect) (seen))
    (iter '(lambda (d)
             (if (member d seen) nil
               (setq collect
                     (ocaml-info-add-entries-old
                      collect d ocaml-info-name-list))
               (setq done (cons d seen))))
          Info-directory-list)
    collect))

(defun ocaml-info-add-entries (entries dir name)
  (let*
      ((module-regexp "^Node: \\([A-Z][A-Za-z_0-9]*\\)[^ ]")
       (command
        (concat
         "find " dir " -type f -regex '.*/" name
         "\\(.info\\|\\)\\([.]gz\\|\\)' -print0"
         " | xargs -0 grep '" module-regexp "'")))
    (message "Scanning info files in %s" dir)
    (message command)
    (set-buffer (get-buffer-create "*caml-help*"))
    (or (shell-command command (current-buffer)) (error "HERE"))
    (goto-char (point-min))
    (while (re-search-forward module-regexp (point-max) t)
      (let* ((module (match-string 1)))
        (if (assoc module entries) nil
          (setq entries
                (cons (cons module (concat "(" name ")" module))
                      entries))
          )))
    (kill-buffer (current-buffer))
    entries))

(defun ocaml-info-default-function ()
  "The default way to create an info data base from the value 
of \\[Info-default-directory-list] and the base name \\[ocaml-info-name] 
of files to look for.

This uses info files produced by ocamldoc."
  (let ((collect) (seen))
    (iter '(lambda (d)
             (if (member d seen) nil
               (setq collect
                     (ocaml-info-add-entries collect d ocaml-info-name-list))
               (setq done (cons d seen))))
          Info-directory-list)
    collect))

(defun ocaml-info-alist ()
  "Call by need value of variable ocaml-info-alist"

"
  (save-excursion
    (let ((module) (entry))
      (if (looking-at "[ \n]") (skip-chars-backward " ")) 
      (if (re-search-backward
           "[^A-Za-z0-9_.']\\([A-Za-z0-9_']*[.]\\)*[A-Za-z0-9_']*\\="
           (- (point) 100) t)
