changeset 48934:48b3aae63381

(makeinfo-buffer): Display result using Info-mode. (makeinfo-compilation-sentinel-buffer, makeinfo-current-node): New functions. (makeinfo-compile): Add a sentinel parameter. (makeinfo-compilation-sentinel-region): Renamed from makeinfo-compilation-sentinel, and makeinfo-temp-file now never nil. (makeinfo-region): Use this.
author Richard M. Stallman <rms@gnu.org>
date Sun, 22 Dec 2002 22:05:16 +0000
parents 06dd01f3b917
children 6047d93c991e
files lisp/textmodes/makeinfo.el
diffstat 1 files changed, 45 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/makeinfo.el	Sun Dec 22 22:04:51 2002 +0000
+++ b/lisp/textmodes/makeinfo.el	Sun Dec 22 22:05:16 2002 +0000
@@ -1,6 +1,6 @@
 ;;; 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      
 ;; Maintainer: FSF
@@ -47,6 +47,7 @@
 ;;; Variables used by `makeinfo'
 
 (require 'compile)
+(require 'info)
 
 (defgroup makeinfo nil
   "Run makeinfo conveniently"
@@ -78,6 +79,9 @@
 (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'.")
+
 
 ;;; The `makeinfo' function definitions
 
@@ -167,12 +171,13 @@
                      " " 
                      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,27 +186,36 @@
 				;; 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.
@@ -225,16 +239,27 @@
            "^@setfilename[ \t]+\\([^ \t\n]+\\)[ \t]*"
            search-end t)
           (setq makeinfo-output-file-name 
-                (buffer-substring (match-beginning 1) (match-end 1)))
+                (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.