(ispell-word): Remove stray parenthesis.
[bpt/emacs.git] / lisp / textmodes / makeinfo.el
index b4857e0..9136cb5 100644 (file)
@@ -1,8 +1,8 @@
 ;;; makeinfo.el --- run makeinfo conveniently
 
-;; Copyright (C) 1991, 1993 Free Software Foundation, Inc.
+;; Copyright (C) 1991, 1993, 2002 Free Software Foundation, Inc.
 
-;; Author: Robert J. Chassell      
+;; Author: Robert J. Chassell
 ;; Maintainer: FSF
 ;; Keywords: docs convenience
 
@@ -47,6 +47,7 @@
 ;;; Variables used by `makeinfo'
 
 (require 'compile)
+(require 'info)
 
 (defgroup makeinfo nil
   "Run makeinfo conveniently"
@@ -60,7 +61,7 @@ The name of the file is appended to this string, separated by a space."
   :group 'makeinfo)
 
 (defcustom makeinfo-options "--fill-column=70"
-  "*String containing options for running `makeinfo'.  
+  "*String containing options for running `makeinfo'.
 Do not include `--footnote-style' or `--paragraph-indent';
 the proper way to specify those is with the Texinfo commands
 `@footnotestyle` and `@paragraphindent'."
@@ -78,6 +79,9 @@ the proper way to specify those is with the Texinfo commands
 (defvar makeinfo-output-file-name nil
   "Info file name used for text output by `makeinfo'.")
 
+(defvar makeinfo-output-node-name nil
+  "Node name to visit in output file, for `makeinfo-buffer'.")
+
 \f
 ;;; The `makeinfo' function definitions
 
@@ -87,7 +91,7 @@ the proper way to specify those is with the Texinfo commands
 This command does not offer the `next-error' feature since it would
 apply to a temporary file, not the original; use the `makeinfo-buffer'
 command to gain use of `next-error'."
-  
+
   (interactive "r")
   (let (filename-or-header
         filename-or-header-beginning
@@ -100,11 +104,11 @@ command to gain use of `next-error'."
           (concat
            (make-temp-file
             (substring (buffer-file-name)
-                       0 
-                       (or (string-match "\\.tex" (buffer-file-name)) 
+                       0
+                       (or (string-match "\\.tex" (buffer-file-name))
                            (length (buffer-file-name)))))
            ".texinfo"))
-    
+
     (save-excursion
       (save-restriction
         (widen)
@@ -112,34 +116,34 @@ command to gain use of `next-error'."
         (let ((search-end (save-excursion (forward-line 100) (point))))
           ;; Find and record the Info filename,
           ;; or else explain that a filename is needed.
-          (if (re-search-forward 
+          (if (re-search-forward
                "^@setfilename[ \t]+\\([^ \t\n]+\\)[ \t]*"
                search-end t)
-              (setq makeinfo-output-file-name 
+              (setq makeinfo-output-file-name
                     (buffer-substring (match-beginning 1) (match-end 1)))
             (error
              "The texinfo file needs a line saying: @setfilename <name>"))
 
           ;; Find header and specify its beginning and end.
           (goto-char (point-min))
-          (if (and 
-               (prog1 
+          (if (and
+               (prog1
                    (search-forward tex-start-of-header search-end t)
                  (beginning-of-line)
                  ;; Mark beginning of header.
                  (setq filename-or-header-beginning (point)))
-               (prog1 
+               (prog1
                    (search-forward tex-end-of-header nil t)
                  (beginning-of-line)
                  ;; Mark end of header
                  (setq filename-or-header-end (point))))
-              
+
               ;; Insert the header into the temporary file.
               (write-region
                (min filename-or-header-beginning region-beginning)
                filename-or-header-end
                makeinfo-temp-file nil nil)
-            
+
             ;; Else no header; insert @filename line into temporary file.
             (goto-char (point-min))
             (search-forward "@setfilename" search-end t)
@@ -151,7 +155,7 @@ command to gain use of `next-error'."
              (min filename-or-header-beginning region-beginning)
              filename-or-header-end
              makeinfo-temp-file nil nil))
-          
+
           ;; Insert the region into the file.
           (write-region
            (max region-beginning filename-or-header-end)
@@ -164,15 +168,16 @@ command to gain use of `next-error'."
              (concat makeinfo-run-command
                      " "
                      makeinfo-options
-                     " " 
+                     " "
                      makeinfo-temp-file)
              "Use `makeinfo-buffer' to gain use of the `next-error' command"
-            nil)))))))
+            nil
+             'makeinfo-compilation-sentinel-region)))))))
 
 ;;; Actually run makeinfo.  COMMAND is the command to run.
 ;;; ERROR-MESSAGE is what to say when next-error can't find another error.
 ;;; If PARSE-ERRORS is non-nil, do try to parse error messages.
-(defun makeinfo-compile (command error-message parse-errors)
+(defun makeinfo-compile (command error-message parse-errors sentinel)
   (let ((buffer
         (compile-internal command error-message nil
                           (and (not parse-errors)
@@ -181,60 +186,80 @@ command to gain use of `next-error'."
                                ;; ever find any errors.
                                (lambda (&rest ignore)
                                  (setq compilation-error-list nil))))))
-    (set-process-sentinel (get-buffer-process buffer)
-                         'makeinfo-compilation-sentinel)))
+    (set-process-sentinel (get-buffer-process buffer) sentinel)))
 
 ;; Delete makeinfo-temp-file after processing is finished,
 ;; and visit Info file.
 ;; This function is called when the compilation process changes state.
 ;; Based on `compilation-sentinel' in compile.el
-(defun makeinfo-compilation-sentinel (proc msg)
+(defun makeinfo-compilation-sentinel-region (proc msg)
+  "Sentinel for `makeinfo-compile' run from `makeinfo-region'."
   (compilation-sentinel proc msg)
-  (if (and makeinfo-temp-file (file-exists-p makeinfo-temp-file))
-      (delete-file makeinfo-temp-file))
-  ;; Always use the version on disk.
-  (let ((buffer (get-file-buffer makeinfo-output-file-name)))
-    (if buffer
-       (with-current-buffer buffer
-         (revert-buffer t t))
-      (setq buffer (find-file-noselect makeinfo-output-file-name)))
-    (if (window-dedicated-p (selected-window))
-       (switch-to-buffer-other-window buffer)
-      (switch-to-buffer buffer)))
-  (goto-char (point-min)))
+  (when (memq (process-status proc) '(signal exit))
+    (if (file-exists-p makeinfo-temp-file)
+       (delete-file makeinfo-temp-file))
+    ;; Always use the version on disk.
+    (let ((buffer (get-file-buffer makeinfo-output-file-name)))
+      (if buffer
+         (with-current-buffer buffer
+           (revert-buffer t t))
+       (setq buffer (find-file-noselect makeinfo-output-file-name)))
+      (if (window-dedicated-p (selected-window))
+         (switch-to-buffer-other-window buffer)
+       (switch-to-buffer buffer)))
+    (goto-char (point-min))))
+
+(defun makeinfo-current-node ()
+  "Return the name of the node containing point, in a texinfo file."
+  (save-excursion
+    (end-of-line)           ; in case point is at the start of an @node line
+    (if (re-search-backward "^@node\\s-+\\([^,\n]+\\)" (point-min) t)
+        (match-string 1)
+      "Top")))
 
 (defun makeinfo-buffer ()
   "Make Info file from current buffer.
 
-Use the \\[next-error] command to move to the next error 
+Use the \\[next-error] command to move to the next error
 \(if there are errors\)."
+
   (interactive)
   (cond ((null buffer-file-name)
          (error "Buffer not visiting any file"))
         ((buffer-modified-p)
          (if (y-or-n-p "Buffer modified; do you want to save it? ")
              (save-buffer))))
-  
+
   ;; Find and record the Info filename,
   ;; or else explain that a filename is needed.
   (save-excursion
     (goto-char (point-min))
     (let ((search-end (save-excursion (forward-line 100) (point))))
-      (if (re-search-forward 
+      (if (re-search-forward
            "^@setfilename[ \t]+\\([^ \t\n]+\\)[ \t]*"
            search-end t)
-          (setq makeinfo-output-file-name 
-                (buffer-substring (match-beginning 1) (match-end 1)))
+          (setq makeinfo-output-file-name
+                (expand-file-name
+                 (buffer-substring (match-beginning 1) (match-end 1))))
         (error
          "The texinfo file needs a line saying: @setfilename <name>"))))
-  
+  (setq makeinfo-output-node-name (makeinfo-current-node))
+
   (save-excursion
     (makeinfo-compile
      (concat makeinfo-run-command " " makeinfo-options
              " " buffer-file-name)
      "No more errors."
-     t)))
+     t
+     'makeinfo-compilation-sentinel-buffer)))
+
+(defun makeinfo-compilation-sentinel-buffer (proc msg)
+  "Sentinel for `makeinfo-compile' run from `makeinfo-buffer'."
+  (compilation-sentinel proc msg)
+  (when (memq (process-status proc) '(signal exit))
+    (when (file-exists-p makeinfo-output-file-name)
+      (Info-revert-find-node
+       makeinfo-output-file-name makeinfo-output-node-name))))
 
 (defun makeinfo-recenter-compilation-buffer (linenum)
   "Redisplay `*compilation*' buffer so most recent output can be seen.
@@ -257,4 +282,5 @@ line LINE of the window, or centered if LINE is nil."
 ;;; Place `provide' at end of file.
 (provide 'makeinfo)
 
+;;; arch-tag: 5f810713-3de2-4e20-8030-4bc3dd0d9604
 ;;; makeinfo.el ends here