Annotation of GNUtools/emacs/lisp/texinfmt.el, revision 1.1

1.1     ! root        1: ;; Convert texinfo files to info files.
        !             2: ;; Copyright (C) 1985, 1986, 1988 Free Software Foundation, Inc.
        !             3: 
        !             4: ;; This file is part of GNU Emacs.
        !             5: 
        !             6: ;; GNU Emacs is free software; you can redistribute it and/or modify
        !             7: ;; it under the terms of the GNU General Public License as published by
        !             8: ;; the Free Software Foundation; either version 1, or (at your option)
        !             9: ;; any later version.
        !            10: 
        !            11: ;; GNU Emacs is distributed in the hope that it will be useful,
        !            12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: ;; GNU General Public License for more details.
        !            15: 
        !            16: ;; You should have received a copy of the GNU General Public License
        !            17: ;; along with GNU Emacs; see the file COPYING.  If not, write to
        !            18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
        !            19: 
        !            20: 
        !            21: (defvar texinfo-format-syntax-table nil)
        !            22: 
        !            23: (defvar texinfo-vindex)
        !            24: (defvar texinfo-findex)
        !            25: (defvar texinfo-cindex)
        !            26: (defvar texinfo-pindex)
        !            27: (defvar texinfo-tindex)
        !            28: (defvar texinfo-kindex)
        !            29: (defvar texinfo-last-node)
        !            30: (defvar texinfo-node-names)
        !            31: 
        !            32: (if texinfo-format-syntax-table
        !            33:     nil
        !            34:   (setq texinfo-format-syntax-table (make-syntax-table))
        !            35:   (modify-syntax-entry ?\" " " texinfo-format-syntax-table)
        !            36:   (modify-syntax-entry ?\\ " " texinfo-format-syntax-table)
        !            37:   (modify-syntax-entry ?@ "\\" texinfo-format-syntax-table)
        !            38:   (modify-syntax-entry ?\^q "\\" texinfo-format-syntax-table)
        !            39:   (modify-syntax-entry ?\[ "." texinfo-format-syntax-table)
        !            40:   (modify-syntax-entry ?\] "." texinfo-format-syntax-table)
        !            41:   (modify-syntax-entry ?\( "." texinfo-format-syntax-table)
        !            42:   (modify-syntax-entry ?\) "." texinfo-format-syntax-table)
        !            43:   (modify-syntax-entry ?{ "(}" texinfo-format-syntax-table)
        !            44:   (modify-syntax-entry ?} "){" texinfo-format-syntax-table)
        !            45:   (modify-syntax-entry ?\' "." texinfo-format-syntax-table))
        !            46: 
        !            47: (defun texinfo-format-buffer (&optional notagify)
        !            48:   "Process the current buffer as texinfo code, into an Info file.
        !            49: The Info file output is generated in a buffer visiting the Info file
        !            50: names specified in the @setfilename command.
        !            51: 
        !            52: Non-nil argument (prefix, if interactive) means don't make tag table
        !            53: and don't split the file if large.  You can use Info-tagify and
        !            54: Info-split to do these manually."
        !            55:   (interactive "P")
        !            56:   (let ((lastmessage "Formatting Info file..."))
        !            57:     (message lastmessage)
        !            58:     (texinfo-format-buffer-1)
        !            59:     (if notagify
        !            60:        nil
        !            61:       (if (> (buffer-size) 30000)
        !            62:          (progn
        !            63:            (message (setq lastmessage "Making tags table for Info file..."))
        !            64:            (Info-tagify)))
        !            65:       (if (> (buffer-size) 100000)
        !            66:          (progn
        !            67:            (message (setq lastmessage "Splitting Info file..."))
        !            68:            (Info-split))))
        !            69:     (message (concat lastmessage
        !            70:                     (if (interactive-p) "done.  Now save it." "done.")))))
        !            71: 
        !            72: (defun texinfo-format-buffer-1 ()
        !            73:   (let (texinfo-format-filename
        !            74:        texinfo-example-start
        !            75:        texinfo-command-start
        !            76:        texinfo-command-end
        !            77:        texinfo-command-name
        !            78:        texinfo-last-node
        !            79:        texinfo-vindex
        !            80:        texinfo-findex
        !            81:        texinfo-cindex
        !            82:        texinfo-pindex
        !            83:        texinfo-tindex
        !            84:        texinfo-kindex
        !            85:        texinfo-stack
        !            86:        texinfo-node-names
        !            87:        outfile
        !            88:        (fill-column fill-column)
        !            89:        (input-buffer (current-buffer))
        !            90:        (input-directory default-directory))
        !            91:     (save-excursion
        !            92:       (goto-char (point-min))
        !            93:       (search-forward "@setfilename")
        !            94:       (setq texinfo-command-end (point))
        !            95:       (setq outfile (texinfo-parse-line-arg)))
        !            96:     (find-file outfile)
        !            97:     (texinfo-mode)
        !            98:     (set-syntax-table texinfo-format-syntax-table)
        !            99:     (erase-buffer)
        !           100:     (insert-buffer-substring input-buffer)
        !           101:     (goto-char (point-min))
        !           102:     (search-forward "@setfilename")
        !           103:     (beginning-of-line)
        !           104:     (delete-region (point-min) (point))
        !           105:     ;; Remove @bye at end of file, if it is there.
        !           106:     (goto-char (point-max))
        !           107:     (if (search-backward "@bye" nil t)
        !           108:        (delete-region (point) (point-max)))
        !           109:     ;; Make sure buffer ends in a newline.
        !           110:     (or (= (preceding-char) ?\n)
        !           111:        (insert "\n"))
        !           112:     ;; Scan the whole buffer, converting to Info format.
        !           113:     (texinfo-format-scan)
        !           114:     ;; Return data for indices.
        !           115:     (goto-char (point-min))
        !           116:     (list outfile
        !           117:          texinfo-vindex texinfo-findex texinfo-cindex
        !           118:          texinfo-pindex texinfo-tindex texinfo-kindex)))
        !           119: 
        !           120: (defvar texinfo-region-buffer-name "*Info Region*"
        !           121:   "*Name of the temporary buffer used by \\[texinfo-format-region].")
        !           122: 
        !           123: (defun texinfo-format-region (region-beginning region-ending)
        !           124:   "Convert the the current region of the Texinfo file to Info format.
        !           125: This lets you see what that part of the file will look like in Info.
        !           126: The command is bound to \\[texinfo-format-region].  The text that is
        !           127: converted to Info is stored in a temporary buffer."
        !           128:   (interactive "r")
        !           129:   (message "Converting region to Info format...")
        !           130:   (let (texinfo-command-start
        !           131:        texinfo-command-end
        !           132:        texinfo-command-name
        !           133:        texinfo-vindex
        !           134:        texinfo-findex
        !           135:        texinfo-cindex
        !           136:        texinfo-pindex
        !           137:        texinfo-tindex
        !           138:        texinfo-kindex
        !           139:        texinfo-stack
        !           140:        texinfo-format-filename
        !           141:        texinfo-example-start
        !           142:        texinfo-last-node
        !           143:        texinfo-node-names
        !           144:        (fill-column fill-column)
        !           145:        (input-buffer (current-buffer))
        !           146:        (input-directory default-directory)
        !           147:        filename-beginning
        !           148:        filename-ending)
        !           149: 
        !           150: ;;; Find a buffer to use.
        !           151: 
        !           152:     (switch-to-buffer (get-buffer-create texinfo-region-buffer-name))
        !           153: 
        !           154:     ;; Insert the region into the buffer.
        !           155:     (erase-buffer)
        !           156: 
        !           157:     (save-excursion
        !           158:       (set-buffer input-buffer)
        !           159:       (save-excursion
        !           160:        (save-restriction
        !           161:          (widen)
        !           162:          (goto-char (point-min))
        !           163:          ;; Initialize the buffer with the filename
        !           164:          ;; or else explain that a filename is needed.
        !           165:          (or (search-forward "@setfilename"
        !           166:                              (save-excursion (forward-line 100) (point)) t)
        !           167:              (error "The texinfo file needs a line saying: @setfilename <name>"))
        !           168:          (beginning-of-line)
        !           169:          (setq filename-beginning (point))
        !           170:          (forward-line 1)
        !           171:          (setq filename-ending (point)))))
        !           172: 
        !           173:     ;; Insert the @setfilename line into the buffer.
        !           174:     (insert-buffer-substring input-buffer
        !           175:                             (min filename-beginning region-beginning)  
        !           176:                             filename-ending)
        !           177:     
        !           178:     ;; Insert the region into the buffer.
        !           179:     (insert-buffer-substring input-buffer
        !           180:                             (max region-beginning filename-ending)
        !           181:                             region-ending)
        !           182: 
        !           183:     (texinfo-mode)
        !           184: 
        !           185:     ;; Install a syntax table useful for scanning command operands.
        !           186:     (set-syntax-table texinfo-format-syntax-table)
        !           187:     
        !           188:     ;; If the region includes the effective end of the data,
        !           189:     ;; discard everything after that.
        !           190:     (goto-char (point-max))
        !           191:     (if (re-search-backward "^@bye" nil t)
        !           192:        (delete-region (point) (point-max)))
        !           193:     ;; Make sure buffer ends in a newline.
        !           194:     (or (= (preceding-char) ?\n)
        !           195:        (insert "\n"))
        !           196: 
        !           197:     ;; Now convert for real.
        !           198:     (goto-char (point-min))
        !           199:     (texinfo-format-scan)
        !           200:     (goto-char (point-min)))
        !           201: 
        !           202:   (message "Done."))
        !           203: 
        !           204: ;; Perform those texinfo-to-info conversions that apply to the whole input
        !           205: ;; uniformly.
        !           206: (defun texinfo-format-scan ()
        !           207:   ;; Convert left and right quotes to typewriter font quotes.
        !           208:   (goto-char (point-min))
        !           209:   (while (search-forward "``" nil t)
        !           210:     (replace-match "\""))
        !           211:   (goto-char (point-min))
        !           212:   (while (search-forward "''" nil t)
        !           213:     (replace-match "\""))
        !           214:   ;; Scan for @-commands.
        !           215:   (goto-char (point-min))
        !           216:   (while (search-forward "@" nil t)
        !           217:     (if (looking-at "[@{}'` *]")
        !           218:        ;; Handle a few special @-followed-by-one-char commands.
        !           219:        (if (= (following-char) ?*)
        !           220:            ;; @* has no effect, since we are not filling.
        !           221:            (delete-region (1- (point)) (1+ (point)))
        !           222:          ;; The other characters are simply quoted.  Delete the @.
        !           223:          (delete-char -1)
        !           224:          (forward-char 1))
        !           225:       ;; @ is followed by a command-word; find the end of the word.
        !           226:       (setq texinfo-command-start (1- (point)))
        !           227:       (if (= (char-syntax (following-char)) ?w)
        !           228:          (forward-word 1)
        !           229:        (forward-char 1))
        !           230:       (setq texinfo-command-end (point))
        !           231:       ;; Call the handler for this command.
        !           232:       (setq texinfo-command-name
        !           233:            (intern (buffer-substring (1+ texinfo-command-start)
        !           234:                                      texinfo-command-end)))
        !           235:       (let ((cmd (get texinfo-command-name 'texinfo-format)))
        !           236:        (if cmd (funcall cmd)
        !           237:          (texinfo-unsupported)))))
        !           238:   (cond (texinfo-stack
        !           239:         (goto-char (nth 2 (car texinfo-stack)))
        !           240:         (error "Unterminated @%s" (car (car texinfo-stack))))))
        !           241: 
        !           242: (put 'begin 'texinfo-format 'texinfo-format-begin)
        !           243: (defun texinfo-format-begin ()
        !           244:   (texinfo-format-begin-end 'texinfo-format))
        !           245: 
        !           246: (put 'end 'texinfo-format 'texinfo-format-end)
        !           247: (defun texinfo-format-end ()
        !           248:   (texinfo-format-begin-end 'texinfo-end))
        !           249: 
        !           250: (defun texinfo-format-begin-end (prop)
        !           251:   (setq texinfo-command-name (intern (texinfo-parse-line-arg)))
        !           252:   (setq cmd (get texinfo-command-name prop))
        !           253:   (if cmd (funcall cmd)
        !           254:     (texinfo-unsupported)))
        !           255: 
        !           256: (defun texinfo-parse-line-arg ()
        !           257:   (goto-char texinfo-command-end)
        !           258:   (let ((start (point)))
        !           259:     (cond ((looking-at " ")
        !           260:           (skip-chars-forward " ")
        !           261:           (setq start (point))
        !           262:           (end-of-line)
        !           263:           (setq texinfo-command-end (1+ (point))))
        !           264:          ((looking-at "{")
        !           265:           (setq start (1+ (point)))
        !           266:           (forward-list 1)
        !           267:           (setq texinfo-command-end (point))
        !           268:           (forward-char -1))
        !           269:          (t
        !           270:           (error "Invalid texinfo command arg format")))
        !           271:     (prog1 (buffer-substring start (point))
        !           272:           (if (eolp) (forward-char 1)))))
        !           273: 
        !           274: (defun texinfo-parse-expanded-arg ()
        !           275:   (goto-char texinfo-command-end)
        !           276:   (let ((start (point))
        !           277:        marker)
        !           278:     (cond ((looking-at " ")
        !           279:           (skip-chars-forward " ")
        !           280:           (setq start (point))
        !           281:           (end-of-line)
        !           282:           (setq texinfo-command-end (1+ (point))))
        !           283:          ((looking-at "{")
        !           284:           (setq start (1+ (point)))
        !           285:           (forward-list 1)
        !           286:           (setq texinfo-command-end (point))
        !           287:           (forward-char -1))
        !           288:          (t
        !           289:           (error "Invalid texinfo command arg format")))
        !           290:     (setq marker (move-marker (make-marker) texinfo-command-end))
        !           291:     (texinfo-format-expand-region start (point))
        !           292:     (setq texinfo-command-end (marker-position marker))
        !           293:     (move-marker marker nil)
        !           294:     (prog1 (buffer-substring start (point))
        !           295:           (if (eolp) (forward-char 1)))))
        !           296: 
        !           297: (defun texinfo-format-expand-region (start end)
        !           298:   (save-restriction
        !           299:     (narrow-to-region start end)
        !           300:     (let (texinfo-command-start
        !           301:          texinfo-command-end
        !           302:          texinfo-command-name
        !           303:          texinfo-stack)
        !           304:       (texinfo-format-scan))
        !           305:     (goto-char (point-max))))
        !           306: 
        !           307: (defun texinfo-parse-arg-discard ()
        !           308:   (prog1 (texinfo-parse-line-arg)
        !           309:         (texinfo-discard-command)))
        !           310: 
        !           311: (defun texinfo-discard-command ()
        !           312:   (delete-region texinfo-command-start texinfo-command-end))
        !           313: 
        !           314: (defun texinfo-format-parse-line-args ()
        !           315:   (let ((start (1- (point)))
        !           316:        next beg end
        !           317:        args)
        !           318:     (skip-chars-forward " ")
        !           319:     (while (not (eolp))
        !           320:       (setq beg (point))
        !           321:       (re-search-forward "[\n,]")
        !           322:       (setq next (point))
        !           323:       (if (bolp) (setq next (1- next)))
        !           324:       (forward-char -1)
        !           325:       (skip-chars-backward " ")
        !           326:       (setq end (point))
        !           327:       (setq args (cons (if (> end beg) (buffer-substring beg end))
        !           328:                       args))
        !           329:       (goto-char next)
        !           330:       (skip-chars-forward " "))
        !           331:     (if (eolp) (forward-char 1))
        !           332:     (setq texinfo-command-end (point))
        !           333:     (nreverse args)))
        !           334: 
        !           335: (defun texinfo-format-parse-args ()
        !           336:   (let ((start (1- (point)))
        !           337:        next beg end
        !           338:        args)
        !           339:     (search-forward "{")
        !           340:     (while (/= (preceding-char) ?\})
        !           341:       (skip-chars-forward " \t\n")
        !           342:       (setq beg (point))
        !           343:       (re-search-forward "[},]")
        !           344:       (setq next (point))
        !           345:       (forward-char -1)
        !           346:       (skip-chars-backward " \t\n")
        !           347:       (setq end (point))
        !           348:       (cond ((< beg end)
        !           349:             (goto-char beg)
        !           350:             (while (search-forward "\n" end t)
        !           351:               (replace-match " "))))
        !           352:       (setq args (cons (if (> end beg) (buffer-substring beg end))
        !           353:                       args))
        !           354:       (goto-char next))
        !           355:     (if (eolp) (forward-char 1))
        !           356:     (setq texinfo-command-end (point))
        !           357:     (nreverse args)))
        !           358: 
        !           359: (defun texinfo-format-parse-defun-args ()
        !           360:   (goto-char texinfo-command-end)
        !           361:   (let ((start (point)))
        !           362:     (end-of-line)
        !           363:     (setq texinfo-command-end (1+ (point)))
        !           364:     (let ((marker (move-marker (make-marker) texinfo-command-end)))
        !           365:       (texinfo-format-expand-region start (point))
        !           366:       (setq texinfo-command-end (marker-position marker))
        !           367:       (move-marker marker nil))
        !           368:     (goto-char start)
        !           369:     (let ((args '())
        !           370:          beg end)
        !           371:       (skip-chars-forward " ")
        !           372:       (while (not (eolp))
        !           373:        (cond ((looking-at "{")
        !           374:               (setq beg (1+ (point)))
        !           375:               (forward-list 1)
        !           376:               (setq end (1- (point))))
        !           377:              (t
        !           378:               (setq beg (point))
        !           379:               (re-search-forward "[\n ]")
        !           380:               (forward-char -1)
        !           381:               (setq end (point))))
        !           382:        (setq args (cons (buffer-substring beg end) args))
        !           383:        (skip-chars-forward " "))
        !           384:       (forward-char 1)
        !           385:       (nreverse args))))
        !           386: 
        !           387: (put 'setfilename 'texinfo-format 'texinfo-format-setfilename)
        !           388: (defun texinfo-format-setfilename ()
        !           389:   (let ((arg (texinfo-parse-arg-discard)))
        !           390:     (setq texinfo-format-filename
        !           391:          (file-name-nondirectory (expand-file-name arg)))
        !           392:     (insert "Info file: "
        !           393:            texinfo-format-filename ",    -*-Text-*-\n"
        !           394:            "produced by texinfo-format-buffer\nfrom "
        !           395:            (if (buffer-file-name input-buffer)
        !           396:                (concat "file: "
        !           397:                        (file-name-sans-versions
        !           398:                         (file-name-nondirectory
        !           399:                          (buffer-file-name input-buffer))))
        !           400:              (concat "buffer " (buffer-name input-buffer)))
        !           401:            "\n\n")))
        !           402: 
        !           403: (put 'node 'texinfo-format 'texinfo-format-node)
        !           404: (defun texinfo-format-node ()
        !           405:   (let* ((args (texinfo-format-parse-line-args))
        !           406:         (name (nth 0 args))
        !           407:         (next (nth 1 args))
        !           408:         (prev (nth 2 args))
        !           409:         (up (nth 3 args)))
        !           410:     (texinfo-discard-command)
        !           411:     (setq texinfo-last-node name)
        !           412:     (let ((tem (downcase name)))
        !           413:       (if (assoc tem texinfo-node-names)
        !           414:          (error "Duplicate node name: %s" name)
        !           415:        (setq texinfo-node-names (cons tem texinfo-node-names))))
        !           416:     (or (bolp)
        !           417:        (insert ?\n))
        !           418:     (insert "\^_\nFile: " texinfo-format-filename
        !           419:            "  Node: " name)
        !           420:     (if prev
        !           421:        (insert ", Prev: " prev))
        !           422:     (if up
        !           423:        (insert ", Up: " up))
        !           424:     (if next
        !           425:        (insert ", Next: " next))
        !           426:     (insert ?\n)))
        !           427: 
        !           428: (put 'menu 'texinfo-format 'texinfo-format-menu)
        !           429: (defun texinfo-format-menu ()
        !           430:   (texinfo-discard-line)
        !           431:   (insert "* Menu:\n\n"))
        !           432: 
        !           433: (put 'menu 'texinfo-end 'texinfo-discard-command)
        !           434: (defun texinfo-discard-line ()
        !           435:   (goto-char texinfo-command-end)
        !           436:   (skip-chars-forward " \t")
        !           437:   (or (eolp)
        !           438:       (error "Extraneous text at end of command line."))
        !           439:   (goto-char texinfo-command-start)
        !           440:   (or (bolp)
        !           441:       (error "Extraneous text at beginning of command line."))
        !           442:   (delete-region (point) (progn (forward-line 1) (point))))
        !           443: 
        !           444: ; @xref {NODE, FNAME, NAME, FILE, DOCUMENT}
        !           445: ; -> *Note FNAME: (FILE)NODE
        !           446: ;   If FILE is missing,
        !           447: ;    *Note FNAME: NODE
        !           448: ;   If FNAME is empty and NAME is present
        !           449: ;    *Note NAME: Node
        !           450: ;   If both NAME and FNAME are missing
        !           451: ;    *Note NODE::
        !           452: ;   texinfo ignores the DOCUMENT argument.
        !           453: ; -> See section <xref to NODE> [NAME, else NODE], page <xref to NODE>
        !           454: ;   If FILE is specified, (FILE)NODE is used for xrefs.
        !           455: ;   If fifth argument DOCUMENT is specified, produces
        !           456: ;    See section <xref to NODE> [NAME, else NODE], page <xref to NODE>
        !           457: ;    of DOCUMENT
        !           458: (put 'xref 'texinfo-format 'texinfo-format-xref)
        !           459: (defun texinfo-format-xref ()
        !           460:   (let ((args (texinfo-format-parse-args)))
        !           461:     (texinfo-discard-command)
        !           462:     (insert "*Note ")
        !           463:     (let ((fname (or (nth 1 args) (nth 2 args))))
        !           464:       (if (null (or fname (nth 3 args)))
        !           465:          (insert (car args) "::")
        !           466:        (insert (or fname (car args)) ": ")
        !           467:        (if (nth 3 args)
        !           468:            (insert "(" (nth 3 args) ")"))
        !           469:        (insert (car args))))))
        !           470: 
        !           471: (put 'pxref 'texinfo-format 'texinfo-format-pxref)
        !           472: (defun texinfo-format-pxref ()
        !           473:   (texinfo-format-xref)
        !           474:   (or (save-excursion
        !           475:        (forward-char -2)
        !           476:        (looking-at "::"))
        !           477:       (insert ".")))
        !           478: 
        !           479: ;@inforef{NODE, FNAME, FILE}
        !           480: ;Like @xref{NODE, FNAME,,FILE} in texinfo.
        !           481: ;In Tex, generates "See Info file FILE, node NODE"
        !           482: (put 'inforef 'texinfo-format 'texinfo-format-inforef)
        !           483: (defun texinfo-format-inforef ()
        !           484:   (let ((args (texinfo-format-parse-args)))
        !           485:     (texinfo-discard-command)
        !           486:     (insert "*Note " (nth 1 args) ": (" (nth 2 args) ")" (car args))))
        !           487: 
        !           488: (put 'chapheading 'texinfo-format 'texinfo-format-chapter)
        !           489: (put 'ichapter 'texinfo-format 'texinfo-format-chapter)
        !           490: (put 'chapter 'texinfo-format 'texinfo-format-chapter)
        !           491: (put 'iappendix 'texinfo-format 'texinfo-format-chapter)
        !           492: (put 'appendix 'texinfo-format 'texinfo-format-chapter)
        !           493: (put 'iunnumbered 'texinfo-format 'texinfo-format-chapter)
        !           494: (put 'unnumbered 'texinfo-format 'texinfo-format-chapter)
        !           495: (defun texinfo-format-chapter ()
        !           496:   (texinfo-format-chapter-1 ?*))
        !           497: 
        !           498: (put 'heading 'texinfo-format 'texinfo-format-section)
        !           499: (put 'isection 'texinfo-format 'texinfo-format-section)
        !           500: (put 'section 'texinfo-format 'texinfo-format-section)
        !           501: (put 'iappendixsection 'texinfo-format 'texinfo-format-section)
        !           502: (put 'appendixsection 'texinfo-format 'texinfo-format-section)
        !           503: (put 'iappendixsec 'texinfo-format 'texinfo-format-section)
        !           504: (put 'appendixsec 'texinfo-format 'texinfo-format-section)
        !           505: (put 'iunnumberedsec 'texinfo-format 'texinfo-format-section)
        !           506: (put 'unnumberedsec 'texinfo-format 'texinfo-format-section)
        !           507: (defun texinfo-format-section ()
        !           508:   (texinfo-format-chapter-1 ?=))
        !           509: 
        !           510: (put 'subheading 'texinfo-format 'texinfo-format-subsection)
        !           511: (put 'isubsection 'texinfo-format 'texinfo-format-subsection)
        !           512: (put 'subsection 'texinfo-format 'texinfo-format-subsection)
        !           513: (put 'iappendixsubsec 'texinfo-format 'texinfo-format-subsection)
        !           514: (put 'appendixsubsec 'texinfo-format 'texinfo-format-subsection)
        !           515: (put 'iunnumberedsubsec 'texinfo-format 'texinfo-format-subsection)
        !           516: (put 'unnumberedsubsec 'texinfo-format 'texinfo-format-subsection)
        !           517: (defun texinfo-format-subsection ()
        !           518:   (texinfo-format-chapter-1 ?-))
        !           519: 
        !           520: (put 'subsubheading 'texinfo-format 'texinfo-format-subsubsection)
        !           521: (put 'isubsubsection 'texinfo-format 'texinfo-format-subsubsection)
        !           522: (put 'subsubsection 'texinfo-format 'texinfo-format-subsubsection)
        !           523: (put 'iappendixsubsubsec 'texinfo-format 'texinfo-format-subsubsection)
        !           524: (put 'appendixsubsubsec 'texinfo-format 'texinfo-format-subsubsection)
        !           525: (put 'iunnumberedsubsubsec 'texinfo-format 'texinfo-format-subsubsection)
        !           526: (put 'unnumberedsubsubsec 'texinfo-format 'texinfo-format-subsubsection)
        !           527: (defun texinfo-format-subsubsection ()
        !           528:   (texinfo-format-chapter-1 ?.))
        !           529: 
        !           530: (defun texinfo-format-chapter-1 (belowchar)
        !           531:   (let ((arg (texinfo-parse-arg-discard)))
        !           532:     (insert ?\n arg ?\n "@SectionPAD " belowchar ?\n)
        !           533:     (forward-line -2)))
        !           534: 
        !           535: (put 'SectionPAD 'texinfo-format 'texinfo-format-sectionpad)
        !           536: (defun texinfo-format-sectionpad ()
        !           537:   (let ((str (texinfo-parse-arg-discard)))
        !           538:     (forward-char -1)
        !           539:     (let ((column (current-column)))
        !           540:       (forward-char 1)
        !           541:       (while (> column 0)
        !           542:        (insert str)
        !           543:        (setq column (1- column))))
        !           544:     (insert ?\n)))
        !           545: 
        !           546: (put '\. 'texinfo-format 'texinfo-format-\.)
        !           547: (defun texinfo-format-\. ()
        !           548:   (texinfo-discard-command)
        !           549:   (insert "."))
        !           550: 
        !           551: (put '\: 'texinfo-format 'texinfo-format-\:)
        !           552: (defun texinfo-format-\: ()
        !           553:   (texinfo-discard-command))
        !           554: 
        !           555: (put 'center 'texinfo-format 'texinfo-format-center)
        !           556: (defun texinfo-format-center ()
        !           557:   (texinfo-discard-command)
        !           558:   (let ((indent-tabs-mode nil))
        !           559:     (center-line)))
        !           560: 
        !           561: ;; @itemize pushes (itemize "COMMANDS" STARTPOS) on texinfo-stack.
        !           562: ;; @enumerate pushes (enumerate 0 STARTPOS).
        !           563: ;; @item dispatches to the texinfo-item prop of the first elt of the list.
        !           564: ;; For itemize, this puts in and rescans the COMMANDS.
        !           565: ;; For enumerate, this increments the number and puts it in.
        !           566: ;; In either case, it puts a Backspace at the front of the line
        !           567: ;; which marks it not to be indented later.
        !           568: ;; All other lines get indented by 5 when the @end is reached.
        !           569: 
        !           570: (defun texinfo-push-stack (check arg)
        !           571:   (setq texinfo-stack
        !           572:        (cons (list check arg texinfo-command-start)
        !           573:              texinfo-stack)))
        !           574: 
        !           575: (defun texinfo-pop-stack (check)
        !           576:   (if (null texinfo-stack)
        !           577:       (error "Unmatched @end %s" check))
        !           578:   (if (not (eq (car (car texinfo-stack)) check))
        !           579:       (error "@end %s matches @%s"
        !           580:             check (car (car texinfo-stack))))
        !           581:   (prog1 (cdr (car texinfo-stack))
        !           582:         (setq texinfo-stack (cdr texinfo-stack))))
        !           583: 
        !           584: (put 'itemize 'texinfo-format 'texinfo-itemize)
        !           585: (defun texinfo-itemize ()
        !           586:   (texinfo-push-stack 'itemize (texinfo-parse-arg-discard))
        !           587:   (setq fill-column (- fill-column 5)))
        !           588: 
        !           589: (put 'itemize 'texinfo-end 'texinfo-end-itemize)
        !           590: (defun texinfo-end-itemize ()
        !           591:   (setq fill-column (+ fill-column 5))
        !           592:   (texinfo-discard-command)
        !           593:   (let ((stacktop
        !           594:         (texinfo-pop-stack 'itemize)))
        !           595:     (texinfo-do-itemize (nth 1 stacktop))))
        !           596: 
        !           597: (put 'enumerate 'texinfo-format 'texinfo-enumerate)
        !           598: (defun texinfo-enumerate ()
        !           599:   (texinfo-push-stack 'enumerate 0)
        !           600:   (setq fill-column (- fill-column 5))
        !           601:   (texinfo-discard-line))
        !           602: 
        !           603: (put 'enumerate 'texinfo-end 'texinfo-end-enumerate)
        !           604: (defun texinfo-end-enumerate ()
        !           605:   (setq fill-column (+ fill-column 5))
        !           606:   (texinfo-discard-command)
        !           607:   (let ((stacktop
        !           608:         (texinfo-pop-stack 'enumerate)))
        !           609:     (texinfo-do-itemize (nth 1 stacktop))))
        !           610: 
        !           611: (put 'table 'texinfo-format 'texinfo-table)
        !           612: (defun texinfo-table ()
        !           613:   (texinfo-push-stack 'table (texinfo-parse-arg-discard))
        !           614:   (setq fill-column (- fill-column 5)))
        !           615: 
        !           616: (put 'ftable 'texinfo-format 'texinfo-ftable)
        !           617: (defun texinfo-ftable ()
        !           618:   (texinfo-push-stack 'table "@code")
        !           619:   (setq fill-column (- fill-column 5))
        !           620:   (texinfo-discard-line))
        !           621: 
        !           622: (put 'description 'texinfo-format 'texinfo-description)
        !           623: (defun texinfo-description ()
        !           624:   (texinfo-push-stack 'table "@asis")
        !           625:   (setq fill-column (- fill-column 5))
        !           626:   (texinfo-discard-line))
        !           627: 
        !           628: (put 'table 'texinfo-end 'texinfo-end-table)
        !           629: (put 'ftable 'texinfo-end 'texinfo-end-table)
        !           630: (put 'description 'texinfo-end 'texinfo-end-table)
        !           631: (defun texinfo-end-table ()
        !           632:   (setq fill-column (+ fill-column 5))
        !           633:   (texinfo-discard-command)
        !           634:   (let ((stacktop
        !           635:         (texinfo-pop-stack 'table)))
        !           636:     (texinfo-do-itemize (nth 1 stacktop))))
        !           637: 
        !           638: ;; At the @end, indent all the lines within the construct
        !           639: ;; except those marked with backspace.  FROM says where
        !           640: ;; construct started.
        !           641: (defun texinfo-do-itemize (from)
        !           642:   (save-excursion
        !           643:    (while (progn (forward-line -1)
        !           644:                 (>= (point) from))
        !           645:      (if (= (following-char) ?\b)
        !           646:         (save-excursion
        !           647:           (delete-char 1)
        !           648:           (end-of-line)
        !           649:           (delete-char 6))
        !           650:        (if (not (looking-at "[ \t]*$"))
        !           651:           (save-excursion (insert "     ")))))))
        !           652: 
        !           653: (put 'item 'texinfo-format 'texinfo-item)
        !           654: (put 'itemx 'texinfo-format 'texinfo-item)
        !           655: (defun texinfo-item ()
        !           656:   (funcall (get (car (car texinfo-stack)) 'texinfo-item)))
        !           657: 
        !           658: (put 'itemize 'texinfo-item 'texinfo-itemize-item)
        !           659: (defun texinfo-itemize-item ()
        !           660:   (texinfo-discard-line)
        !           661:   (insert "\b   " (nth 1 (car texinfo-stack)) " \n")
        !           662:   (forward-line -1))
        !           663: 
        !           664: (put 'enumerate 'texinfo-item 'texinfo-enumerate-item)
        !           665: (defun texinfo-enumerate-item ()
        !           666:   (texinfo-discard-line)
        !           667:   (let ((next (1+ (car (cdr (car texinfo-stack))))))
        !           668:     (setcar (cdr (car texinfo-stack)) next)
        !           669:     (insert ?\b (format "%3d. " next) ?\n))
        !           670:   (forward-line -1))
        !           671: 
        !           672: (put 'table 'texinfo-item 'texinfo-table-item)
        !           673: (defun texinfo-table-item ()
        !           674:   (let ((arg (texinfo-parse-arg-discard))
        !           675:        (itemfont (car (cdr (car texinfo-stack)))))
        !           676:     (insert ?\b itemfont ?\{ arg "}\n     \n"))
        !           677:   (forward-line -2))
        !           678: 
        !           679: (put 'ifinfo 'texinfo-format 'texinfo-discard-line)
        !           680: (put 'ifinfo 'texinfo-end 'texinfo-discard-command)
        !           681: 
        !           682: (put 'iftex 'texinfo-format 'texinfo-format-iftex)
        !           683: (defun texinfo-format-iftex ()
        !           684:   (delete-region texinfo-command-start
        !           685:                 (progn (re-search-forward "@end iftex\n")
        !           686:                        (point))))
        !           687: 
        !           688: (put 'tex 'texinfo-format 'texinfo-format-tex)
        !           689: (defun texinfo-format-tex ()
        !           690:   (delete-region texinfo-command-start
        !           691:                 (progn (re-search-forward "@end tex\n")
        !           692:                        (point))))
        !           693: 
        !           694: (put 'titlepage 'texinfo-format 'texinfo-format-titlepage)
        !           695: (defun texinfo-format-titlepage ()
        !           696:   (delete-region texinfo-command-start
        !           697:                 (progn (search-forward "@end titlepage\n")
        !           698:                        (point))))
        !           699: 
        !           700: (put 'endtitlepage 'texinfo-format 'texinfo-discard-line)
        !           701: 
        !           702: (put 'ignore 'texinfo-format 'texinfo-format-ignore)
        !           703: (defun texinfo-format-ignore ()
        !           704:   (delete-region texinfo-command-start
        !           705:                 (progn (search-forward "@end ignore\n")
        !           706:                        (point))))
        !           707: 
        !           708: (put 'endignore 'texinfo-format 'texinfo-discard-line)
        !           709: 
        !           710: (put 'var 'texinfo-format 'texinfo-format-var)
        !           711: (defun texinfo-format-var ()
        !           712:   (insert (upcase (texinfo-parse-arg-discard)))
        !           713:   (goto-char texinfo-command-start))
        !           714: 
        !           715: (put 'asis 'texinfo-format 'texinfo-format-noop)
        !           716: (put 'b 'texinfo-format 'texinfo-format-noop)
        !           717: (put 't 'texinfo-format 'texinfo-format-noop)
        !           718: (put 'i 'texinfo-format 'texinfo-format-noop)
        !           719: (put 'r 'texinfo-format 'texinfo-format-noop)
        !           720: (put 'key 'texinfo-format 'texinfo-format-noop)
        !           721: (put 'w 'texinfo-format 'texinfo-format-noop)
        !           722: (defun texinfo-format-noop ()
        !           723:   (insert (texinfo-parse-arg-discard))
        !           724:   (goto-char texinfo-command-start))
        !           725: 
        !           726: (put 'code 'texinfo-format 'texinfo-format-code)
        !           727: (put 'samp 'texinfo-format 'texinfo-format-code)
        !           728: (put 'file 'texinfo-format 'texinfo-format-code)
        !           729: (put 'kbd 'texinfo-format 'texinfo-format-code)
        !           730: (put 'cite 'texinfo-format 'texinfo-format-code)
        !           731: (defun texinfo-format-code ()
        !           732:   (insert "`" (texinfo-parse-arg-discard) "'")
        !           733:   (goto-char texinfo-command-start))
        !           734: 
        !           735: (put 'emph 'texinfo-format 'texinfo-format-emph)
        !           736: (put 'strong 'texinfo-format 'texinfo-format-emph)
        !           737: (defun texinfo-format-emph ()
        !           738:   (insert "*" (texinfo-parse-arg-discard) "*")
        !           739:   (goto-char texinfo-command-start))
        !           740: 
        !           741: (put 'defn 'texinfo-format 'texinfo-format-defn)
        !           742: (put 'dfn 'texinfo-format 'texinfo-format-defn)
        !           743: (defun texinfo-format-defn ()
        !           744:   (insert "\"" (texinfo-parse-arg-discard) "\"")
        !           745:   (goto-char texinfo-command-start))
        !           746: 
        !           747: (put 'bullet 'texinfo-format 'texinfo-format-bullet)
        !           748: (defun texinfo-format-bullet ()
        !           749:   (texinfo-discard-command)
        !           750:   (insert "*"))
        !           751: 
        !           752: (put 'smallexample 'texinfo-format 'texinfo-format-example)
        !           753: (put 'example 'texinfo-format 'texinfo-format-example)
        !           754: (put 'quotation 'texinfo-format 'texinfo-format-example)
        !           755: (put 'lisp 'texinfo-format 'texinfo-format-example)
        !           756: (put 'display 'texinfo-format 'texinfo-format-example)
        !           757: (put 'format 'texinfo-format 'texinfo-format-example)
        !           758: (put 'flushleft 'texinfo-format 'texinfo-format-example)
        !           759: (defun texinfo-format-example ()
        !           760:   (texinfo-push-stack 'example nil)
        !           761:   (setq fill-column (- fill-column 5))
        !           762:   (texinfo-discard-line))
        !           763: 
        !           764: (put 'smallexample 'texinfo-end 'texinfo-end-example)
        !           765: (put 'example 'texinfo-end 'texinfo-end-example)
        !           766: (put 'quotation 'texinfo-end 'texinfo-end-example)
        !           767: (put 'lisp 'texinfo-end 'texinfo-end-example)
        !           768: (put 'display 'texinfo-end 'texinfo-end-example)
        !           769: (put 'format 'texinfo-end 'texinfo-end-example)
        !           770: (put 'flushleft 'texinfo-end 'texinfo-end-example)
        !           771: (defun texinfo-end-example ()
        !           772:   (setq fill-column (+ fill-column 5))
        !           773:   (texinfo-discard-command)
        !           774:   (let ((stacktop
        !           775:         (texinfo-pop-stack 'example)))
        !           776:     (texinfo-do-itemize (nth 1 stacktop))))
        !           777: 
        !           778: (put 'exdent 'texinfo-format 'texinfo-format-exdent)
        !           779: (defun texinfo-format-exdent ()
        !           780:   (texinfo-discard-command)
        !           781:   (delete-region (point)
        !           782:                 (progn
        !           783:                  (skip-chars-forward " ")
        !           784:                  (point)))
        !           785:   (insert ?\b)
        !           786:   ;; Cancel out the deletion that texinfo-do-itemize
        !           787:   ;; is going to do at the end of this line.
        !           788:   (save-excursion
        !           789:     (end-of-line)
        !           790:     (insert "\n     ")))
        !           791: 
        !           792: (put 'ctrl 'texinfo-format 'texinfo-format-ctrl)
        !           793: (defun texinfo-format-ctrl ()
        !           794:   (let ((str (texinfo-parse-arg-discard)))
        !           795:     (insert (logand 31 (aref str 0)))))
        !           796: 
        !           797: (put 'TeX 'texinfo-format 'texinfo-format-TeX)
        !           798: (defun texinfo-format-TeX ()
        !           799:   (texinfo-parse-arg-discard)
        !           800:   (insert "TeX"))
        !           801: 
        !           802: (put 'copyright 'texinfo-format 'texinfo-format-copyright)
        !           803: (defun texinfo-format-copyright ()
        !           804:   (texinfo-parse-arg-discard)
        !           805:   (insert "(C)"))
        !           806: 
        !           807: (put 'minus 'texinfo-format 'texinfo-format-minus)
        !           808: (defun texinfo-format-minus ()
        !           809:   (texinfo-parse-arg-discard)
        !           810:   (insert "-"))
        !           811: 
        !           812: (put 'dots 'texinfo-format 'texinfo-format-dots)
        !           813: (defun texinfo-format-dots ()
        !           814:   (texinfo-parse-arg-discard)
        !           815:   (insert "..."))
        !           816: 
        !           817: (put 'refill 'texinfo-format 'texinfo-format-refill)
        !           818: (defun texinfo-format-refill ()
        !           819:   (texinfo-discard-command)
        !           820:   (fill-paragraph nil))
        !           821: 
        !           822: (put 'sp 'texinfo-format 'texinfo-format-sp)
        !           823: (defun texinfo-format-sp ()
        !           824:   (texinfo-discard-command)
        !           825:   (insert "\n"))
        !           826: 
        !           827: ;; Index generation
        !           828: 
        !           829: (put 'vindex 'texinfo-format 'texinfo-format-vindex)
        !           830: (defun texinfo-format-vindex ()
        !           831:   (texinfo-index 'texinfo-vindex))
        !           832: 
        !           833: (put 'cindex 'texinfo-format 'texinfo-format-cindex)
        !           834: (defun texinfo-format-cindex ()
        !           835:   (texinfo-index 'texinfo-cindex))
        !           836: 
        !           837: (put 'findex 'texinfo-format 'texinfo-format-findex)
        !           838: (defun texinfo-format-findex ()
        !           839:   (texinfo-index 'texinfo-findex))
        !           840: 
        !           841: (put 'pindex 'texinfo-format 'texinfo-format-pindex)
        !           842: (defun texinfo-format-pindex ()
        !           843:   (texinfo-index 'texinfo-pindex))
        !           844: 
        !           845: (put 'tindex 'texinfo-format 'texinfo-format-tindex)
        !           846: (defun texinfo-format-tindex ()
        !           847:   (texinfo-index 'texinfo-tindex))
        !           848: 
        !           849: (put 'kindex 'texinfo-format 'texinfo-format-kindex)
        !           850: (defun texinfo-format-kindex ()
        !           851:   (texinfo-index 'texinfo-kindex))
        !           852: 
        !           853: (defun texinfo-index (indexvar)
        !           854:   (let ((arg (texinfo-parse-expanded-arg)))
        !           855:     (texinfo-discard-command)
        !           856:     (set indexvar
        !           857:         (cons (list arg texinfo-last-node)
        !           858:               (symbol-value indexvar)))))
        !           859: 
        !           860: (defconst texinfo-indexvar-alist
        !           861:   '(("cp" . texinfo-cindex)
        !           862:     ("fn" . texinfo-findex)
        !           863:     ("vr" . texinfo-vindex)
        !           864:     ("tp" . texinfo-tindex)
        !           865:     ("pg" . texinfo-pindex)
        !           866:     ("ky" . texinfo-kindex)))
        !           867: 
        !           868: (put 'printindex 'texinfo-format 'texinfo-format-printindex)
        !           869: (defun texinfo-format-printindex ()
        !           870:   (let ((indexelts (symbol-value
        !           871:                    (cdr (assoc (texinfo-parse-arg-discard)
        !           872:                                texinfo-indexvar-alist))))
        !           873:        opoint)
        !           874:     (insert "\n* Menu:\n\n")
        !           875:     (setq opoint (point))
        !           876:     (texinfo-print-index nil indexelts)
        !           877:     (if (eq system-type 'vax-vms) 
        !           878:        (texinfo-sort-region opoint (point))
        !           879:       (shell-command-on-region opoint (point) "sort -fd" 1))))
        !           880: 
        !           881: (defun texinfo-print-index (file indexelts)
        !           882:   (while indexelts
        !           883:     (if (stringp (car (car indexelts)))
        !           884:        (insert "* " (car (car indexelts))
        !           885:                ": " (if file (concat "(" file ")") "")
        !           886:                (nth 1 (car indexelts)) ".\n")
        !           887:       ;; index entries from @include'd file
        !           888:       (texinfo-print-index (nth 1 (car indexelts))
        !           889:                           (nth 2 (car indexelts))))
        !           890:     (setq indexelts (cdr indexelts))))
        !           891: 
        !           892: 
        !           893: ;;;; Lisp Definitions
        !           894: 
        !           895: (defun texinfo-format-defun ()
        !           896:   (texinfo-push-stack 'defun nil)
        !           897:   (setq fill-column (- fill-column 5))
        !           898:   (texinfo-format-defun-1 t))
        !           899: 
        !           900: (defun texinfo-format-defunx ()
        !           901:   (texinfo-format-defun-1 nil))
        !           902: 
        !           903: (defun texinfo-format-defun-1 (first-p)
        !           904:   (let ((args (texinfo-format-parse-defun-args))
        !           905:        (type (get texinfo-command-name 'texinfo-defun-type)))
        !           906:     (texinfo-discard-command)
        !           907:     (if (eq type 'arg)
        !           908:        (progn (setq type (car args))
        !           909:               (setq args (cdr args))))
        !           910:     (let ((formatter (get texinfo-command-name 'texinfo-defun-format-type)))
        !           911:       (if formatter
        !           912:          (setq type (funcall formatter type args))))
        !           913:     ;; Delete extra newline inserted after previous header line.
        !           914:     (if (not first-p)
        !           915:        (delete-char -1))
        !           916:     (insert "* " type ": " (car args))
        !           917:     (let ((args (cdr args)))
        !           918:       (while args
        !           919:        (insert " "
        !           920:                (if (= ?& (aref (car args) 0))
        !           921:                    (car args)
        !           922:                  (upcase (car args))))
        !           923:        (setq args (cdr args))))
        !           924:     ;; Insert extra newline so that paragraph filling does not mess
        !           925:     ;; with header line.
        !           926:     (insert "\n\n")
        !           927:     (rplaca (cdr (cdr (car texinfo-stack))) (point))
        !           928:     (let ((indexvar (get texinfo-command-name 'texinfo-defun-index))
        !           929:          (formatter (get texinfo-command-name 'texinfo-defun-format-index)))
        !           930:       (set indexvar
        !           931:           (cons (list (if formatter (funcall formatter type args) (car args))
        !           932:                       texinfo-last-node)
        !           933:                 (symbol-value indexvar))))))
        !           934: 
        !           935: (defun texinfo-end-defun ()
        !           936:   (setq fill-column (+ fill-column 5))
        !           937:   (texinfo-discard-command)
        !           938:   (let ((start (nth 1 (texinfo-pop-stack 'defun))))
        !           939:     (texinfo-do-itemize start)
        !           940:     ;; Delete extra newline inserted after header.
        !           941:     (save-excursion
        !           942:       (goto-char start)
        !           943:       (delete-char -1))))
        !           944: 
        !           945: (put 'deffn 'texinfo-format 'texinfo-format-defun)
        !           946: (put 'deffnx 'texinfo-format 'texinfo-format-defunx)
        !           947: (put 'deffn 'texinfo-end 'texinfo-end-defun)
        !           948: (put 'deffn 'texinfo-defun-type 'arg)
        !           949: (put 'deffnx 'texinfo-defun-type 'arg)
        !           950: (put 'deffn 'texinfo-defun-index 'texinfo-findex)
        !           951: (put 'deffnx 'texinfo-defun-index 'texinfo-findex)
        !           952: 
        !           953: (put 'defun 'texinfo-format 'texinfo-format-defun)
        !           954: (put 'defunx 'texinfo-format 'texinfo-format-defunx)
        !           955: (put 'defun 'texinfo-end 'texinfo-end-defun)
        !           956: (put 'defun 'texinfo-defun-type "Function")
        !           957: (put 'defunx 'texinfo-defun-type "Function")
        !           958: (put 'defun 'texinfo-defun-index 'texinfo-findex)
        !           959: (put 'defunx 'texinfo-defun-index 'texinfo-findex)
        !           960: 
        !           961: (put 'defmac 'texinfo-format 'texinfo-format-defun)
        !           962: (put 'defmacx 'texinfo-format 'texinfo-format-defunx)
        !           963: (put 'defmac 'texinfo-end 'texinfo-end-defun)
        !           964: (put 'defmac 'texinfo-defun-type "Macro")
        !           965: (put 'defmacx 'texinfo-defun-type "Macro")
        !           966: (put 'defmac 'texinfo-defun-index 'texinfo-findex)
        !           967: (put 'defmacx 'texinfo-defun-index 'texinfo-findex)
        !           968: 
        !           969: (put 'defspec 'texinfo-format 'texinfo-format-defun)
        !           970: (put 'defspecx 'texinfo-format 'texinfo-format-defunx)
        !           971: (put 'defspec 'texinfo-end 'texinfo-end-defun)
        !           972: (put 'defspec 'texinfo-defun-type "Special form")
        !           973: (put 'defspecx 'texinfo-defun-type "Special form")
        !           974: (put 'defspec 'texinfo-defun-index 'texinfo-findex)
        !           975: (put 'defspecx 'texinfo-defun-index 'texinfo-findex)
        !           976: 
        !           977: (put 'defvr 'texinfo-format 'texinfo-format-defun)
        !           978: (put 'defvrx 'texinfo-format 'texinfo-format-defunx)
        !           979: (put 'defvr 'texinfo-end 'texinfo-end-defun)
        !           980: (put 'defvr 'texinfo-defun-type 'arg)
        !           981: (put 'defvrx 'texinfo-defun-type 'arg)
        !           982: (put 'defvr 'texinfo-defun-index 'texinfo-vindex)
        !           983: (put 'defvrx 'texinfo-defun-index 'texinfo-vindex)
        !           984: 
        !           985: (put 'defvar 'texinfo-format 'texinfo-format-defun)
        !           986: (put 'defvarx 'texinfo-format 'texinfo-format-defunx)
        !           987: (put 'defvar 'texinfo-end 'texinfo-end-defun)
        !           988: (put 'defvar 'texinfo-defun-type "Variable")
        !           989: (put 'defvarx 'texinfo-defun-type "Variable")
        !           990: (put 'defvar 'texinfo-defun-index 'texinfo-vindex)
        !           991: (put 'defvarx 'texinfo-defun-index 'texinfo-vindex)
        !           992: 
        !           993: (put 'defopt 'texinfo-format 'texinfo-format-defun)
        !           994: (put 'defoptx 'texinfo-format 'texinfo-format-defunx)
        !           995: (put 'defopt 'texinfo-end 'texinfo-end-defun)
        !           996: (put 'defopt 'texinfo-defun-type "User Option")
        !           997: (put 'defoptx 'texinfo-defun-type "User Option")
        !           998: (put 'defopt 'texinfo-defun-index 'texinfo-vindex)
        !           999: (put 'defoptx 'texinfo-defun-index 'texinfo-vindex)
        !          1000: 
        !          1001: (put 'deftp 'texinfo-format 'texinfo-format-defun)
        !          1002: (put 'deftpx 'texinfo-format 'texinfo-format-defunx)
        !          1003: (put 'deftp 'texinfo-end 'texinfo-end-defun)
        !          1004: (put 'deftp 'texinfo-defun-type 'arg)
        !          1005: (put 'deftpx 'texinfo-defun-type 'arg)
        !          1006: (put 'deftp 'texinfo-defun-index 'texinfo-tindex)
        !          1007: (put 'deftpx 'texinfo-defun-index 'texinfo-tindex)
        !          1008: 
        !          1009: ;;; Object-oriented stuff is a little hairier.
        !          1010: 
        !          1011: (put 'defop 'texinfo-format 'texinfo-format-defun)
        !          1012: (put 'defopx 'texinfo-format 'texinfo-format-defunx)
        !          1013: (put 'defop 'texinfo-end 'texinfo-end-defun)
        !          1014: (put 'defop 'texinfo-defun-type 'arg)
        !          1015: (put 'defopx 'texinfo-defun-type 'arg)
        !          1016: (put 'defop 'texinfo-defun-format-type 'texinfo-format-defop-type)
        !          1017: (put 'defopx 'texinfo-defun-format-type 'texinfo-format-defop-type)
        !          1018: (put 'defop 'texinfo-defun-index 'texinfo-findex)
        !          1019: (put 'defopx 'texinfo-defun-index 'texinfo-findex)
        !          1020: (put 'defop 'texinfo-defun-format-index 'texinfo-format-defop-index)
        !          1021: (put 'defopx 'texinfo-defun-format-index 'texinfo-format-defop-index)
        !          1022: 
        !          1023: (put 'defmethod 'texinfo-format 'texinfo-format-defun)
        !          1024: (put 'defmethodx 'texinfo-format 'texinfo-format-defunx)
        !          1025: (put 'defmethod 'texinfo-end 'texinfo-end-defun)
        !          1026: (put 'defmethod 'texinfo-defun-type "Operation")
        !          1027: (put 'defmethodx 'texinfo-defun-type "Operation")
        !          1028: (put 'defmethod 'texinfo-defun-format-type 'texinfo-format-defop-type)
        !          1029: (put 'defmethodx 'texinfo-defun-format-type 'texinfo-format-defop-type)
        !          1030: (put 'defmethod 'texinfo-defun-index 'texinfo-findex)
        !          1031: (put 'defmethodx 'texinfo-defun-index 'texinfo-findex)
        !          1032: (put 'defmethod 'texinfo-defun-format-index 'texinfo-format-defop-index)
        !          1033: (put 'defmethodx 'texinfo-defun-format-index 'texinfo-format-defop-index)
        !          1034: 
        !          1035: (defun texinfo-format-defop-type (type args)
        !          1036:   (format "%s on %s" type (car args)))
        !          1037: 
        !          1038: (defun texinfo-format-defop-index (type args)
        !          1039:   (format "%s on %s" (car (cdr args)) (car args)))
        !          1040: 
        !          1041: (put 'defcv 'texinfo-format 'texinfo-format-defun)
        !          1042: (put 'defcvx 'texinfo-format 'texinfo-format-defunx)
        !          1043: (put 'defcv 'texinfo-end 'texinfo-end-defun)
        !          1044: (put 'defcv 'texinfo-defun-type 'arg)
        !          1045: (put 'defcvx 'texinfo-defun-type 'arg)
        !          1046: (put 'defcv 'texinfo-defun-format-type 'texinfo-format-defcv-type)
        !          1047: (put 'defcvx 'texinfo-defun-format-type 'texinfo-format-defcv-type)
        !          1048: (put 'defcv 'texinfo-defun-index 'texinfo-vindex)
        !          1049: (put 'defcvx 'texinfo-defun-index 'texinfo-vindex)
        !          1050: (put 'defcv 'texinfo-defun-format-index 'texinfo-format-defcv-index)
        !          1051: (put 'defcvx 'texinfo-defun-format-index 'texinfo-format-defcv-index)
        !          1052: 
        !          1053: (put 'defivar 'texinfo-format 'texinfo-format-defun)
        !          1054: (put 'defivarx 'texinfo-format 'texinfo-format-defunx)
        !          1055: (put 'defivar 'texinfo-end 'texinfo-end-defun)
        !          1056: (put 'defivar 'texinfo-defun-type "Instance variable")
        !          1057: (put 'defivarx 'texinfo-defun-type "Instance variable")
        !          1058: (put 'defivar 'texinfo-defun-format-type 'texinfo-format-defcv-type)
        !          1059: (put 'defivarx 'texinfo-defun-format-type 'texinfo-format-defcv-type)
        !          1060: (put 'defivar 'texinfo-defun-index 'texinfo-vindex)
        !          1061: (put 'defivarx 'texinfo-defun-index 'texinfo-vindex)
        !          1062: (put 'defivar 'texinfo-defun-format-index 'texinfo-format-defcv-index)
        !          1063: (put 'defivarx 'texinfo-defun-format-index 'texinfo-format-defcv-index)
        !          1064: 
        !          1065: (defun texinfo-format-defcv-type (type args)
        !          1066:   (format "%s of %s" type (car args)))
        !          1067: 
        !          1068: (defun texinfo-format-defcv-index (type args)
        !          1069:   (format "%s of %s" (car (cdr args)) (car args)))
        !          1070: 
        !          1071: ;; process included files
        !          1072: (put 'include 'texinfo-format 'texinfo-format-include)
        !          1073: (defun texinfo-format-include ()
        !          1074:   (let ((filename (texinfo-parse-arg-discard))
        !          1075:        (default-directory input-directory)
        !          1076:        subindex)
        !          1077:     (setq subindex
        !          1078:          (save-excursion
        !          1079:            (progn (find-file
        !          1080:                    (cond ((file-readable-p (concat filename ".texinfo"))
        !          1081:                           (concat filename ".texinfo"))
        !          1082:                          ((file-readable-p (concat filename ".tex"))
        !          1083:                           (concat filename ".tex"))
        !          1084:                          ((file-readable-p filename)
        !          1085:                           filename)
        !          1086:                          (t (error "@include'd file %s not found"
        !          1087:                                    filename))))
        !          1088:                   (texinfo-format-buffer-1))))
        !          1089:     (texinfo-subindex 'texinfo-vindex (car subindex) (nth 1 subindex))
        !          1090:     (texinfo-subindex 'texinfo-findex (car subindex) (nth 2 subindex))
        !          1091:     (texinfo-subindex 'texinfo-cindex (car subindex) (nth 3 subindex))
        !          1092:     (texinfo-subindex 'texinfo-pindex (car subindex) (nth 4 subindex))
        !          1093:     (texinfo-subindex 'texinfo-tindex (car subindex) (nth 5 subindex))
        !          1094:     (texinfo-subindex 'texinfo-kindex (car subindex) (nth 6 subindex))))
        !          1095: 
        !          1096: (defun texinfo-subindex (indexvar file content)
        !          1097:   (set indexvar (cons (list 'recurse file content)
        !          1098:                      (symbol-value indexvar))))
        !          1099: 
        !          1100: 
        !          1101: ;; Lots of bolio constructs do nothing in texinfo.
        !          1102: 
        !          1103: (put 'need 'texinfo-format 'texinfo-discard-line-with-args)
        !          1104: (put 'page 'texinfo-format 'texinfo-discard-line-with-args)
        !          1105: (put 'c 'texinfo-format 'texinfo-discard-line-with-args)
        !          1106: (put 'comment 'texinfo-format 'texinfo-discard-line-with-args)
        !          1107: (put 'setchapternewpage 'texinfo-format 'texinfo-discard-line-with-args)
        !          1108: (put 'contents 'texinfo-format 'texinfo-discard-line-with-args)
        !          1109: (put 'summarycontents 'texinfo-format 'texinfo-discard-line-with-args)
        !          1110: (put 'nopara 'texinfo-format 'texinfo-discard-line-with-args)
        !          1111: (put 'noindent 'texinfo-format 'texinfo-discard-line-with-args)
        !          1112: (put 'setx 'texinfo-format 'texinfo-discard-line-with-args)
        !          1113: (put 'setq 'texinfo-format 'texinfo-discard-line-with-args)
        !          1114: (put 'settitle 'texinfo-format 'texinfo-discard-line-with-args)
        !          1115: (put 'defindex 'texinfo-format 'texinfo-discard-line-with-args)
        !          1116: (put 'synindex 'texinfo-format 'texinfo-discard-line-with-args)
        !          1117: (put 'hsize 'texinfo-format 'texinfo-discard-line-with-args)
        !          1118: (put 'parindent 'texinfo-format 'texinfo-discard-line-with-args)
        !          1119: (put 'lispnarrowing 'texinfo-format 'texinfo-discard-line-with-args)
        !          1120: (put 'itemindent 'texinfo-format 'texinfo-discard-line-with-args)
        !          1121: (put 'headings 'texinfo-format 'texinfo-discard-line-with-args)
        !          1122: (put 'group 'texinfo-format 'texinfo-discard-line-with-args)
        !          1123: (put 'group 'texinfo-end 'texinfo-discard-line-with-args)
        !          1124: (put 'bye 'texinfo-format 'texinfo-discard-line)
        !          1125: (put 'smallbook 'texinfo-format 'texinfo-discard-line)
        !          1126: 
        !          1127: (defun texinfo-discard-line-with-args ()
        !          1128:   (goto-char texinfo-command-start)
        !          1129:   (delete-region (point) (progn (forward-line 1) (point))))
        !          1130: 
        !          1131: ;; Sort an index which is in the current buffer between START and END.
        !          1132: ;; Used on VMS, where the `sort' utility is not available.
        !          1133: (defun texinfo-sort-region (start end)
        !          1134:   (require 'sort)
        !          1135:   (save-restriction
        !          1136:     (narrow-to-region start end)
        !          1137:     (sort-subr nil 'forward-line 'end-of-line 'texinfo-sort-startkeyfun)))
        !          1138: 
        !          1139: ;; Subroutine for sorting an index.
        !          1140: ;; At start of a line, return a string to sort the line under.
        !          1141: (defun texinfo-sort-startkeyfun ()
        !          1142:   (let ((line
        !          1143:         (buffer-substring (point) (save-excursion (end-of-line) (point)))))
        !          1144:     ;; Canonicalize whitespace and eliminate funny chars.
        !          1145:     (while (string-match "[ \t][ \t]+\\|[^a-z0-9 ]+" line)
        !          1146:       (setq line (concat (substring line 0 (match-beginning 0))
        !          1147:                         " "
        !          1148:                         (substring line (match-end 0) (length line)))))
        !          1149:     line))
        !          1150: 
        !          1151: ;; Some cannot be handled
        !          1152: 
        !          1153: (defun texinfo-unsupported ()
        !          1154:   (error "%s is not handled by texinfo"
        !          1155:         (buffer-substring texinfo-command-start texinfo-command-end)))
        !          1156: 
        !          1157: (defun batch-texinfo-format ()
        !          1158:   "Runs  texinfo-format-buffer  on the files remaining on the command line.
        !          1159: Must be used only with -batch, and kills emacs on completion.
        !          1160: Each file will be processed even if an error occurred previously.
        !          1161: For example, invoke
        !          1162:   \"emacs -batch -funcall batch-texinfo-format $docs/ ~/*.texinfo\"."
        !          1163:   (if (not noninteractive)
        !          1164:       (error "batch-texinfo-format may only be used -batch."))
        !          1165:   (let ((version-control t)
        !          1166:        (auto-save-default nil)
        !          1167:        (find-file-run-dired nil)
        !          1168:        (kept-old-versions 259259)
        !          1169:        (kept-new-versions 259259))
        !          1170:     (let ((error 0)
        !          1171:          file
        !          1172:          (files ()))
        !          1173:       (while command-line-args-left
        !          1174:        (setq file (expand-file-name (car command-line-args-left)))
        !          1175:        (cond ((not (file-exists-p file))
        !          1176:               (message ">> %s does not exist!" file)
        !          1177:               (setq error 1
        !          1178:                     command-line-args-left (cdr command-line-args-left)))
        !          1179:              ((file-directory-p file)
        !          1180:               (setq command-line-args-left
        !          1181:                     (nconc (directory-files file)
        !          1182:                            (cdr command-line-args-left))))
        !          1183:              (t
        !          1184:               (setq files (cons file files)
        !          1185:                     command-line-args-left (cdr command-line-args-left)))))
        !          1186:       (while files
        !          1187:        (setq file (car files)
        !          1188:              files (cdr files))
        !          1189:        (condition-case err
        !          1190:            (progn
        !          1191:              (if buffer-file-name (kill-buffer (current-buffer)))
        !          1192:              (find-file file)
        !          1193:              (buffer-flush-undo (current-buffer))
        !          1194:              (set-buffer-modified-p nil)
        !          1195:              (texinfo-mode)
        !          1196:              (message "texinfo formatting %s..." file)
        !          1197:              (texinfo-format-buffer nil)
        !          1198:              (if (buffer-modified-p)
        !          1199:                  (progn (message "Saving modified %s" (buffer-file-name))
        !          1200:                         (save-buffer))))
        !          1201:          (error
        !          1202:           (message ">> Error: %s" (prin1-to-string err))
        !          1203:           (message ">>  point at")
        !          1204:           (let ((s (buffer-substring (point)
        !          1205:                                      (min (+ (point) 100)
        !          1206:                                           (point-max))))
        !          1207:                 (tem 0))
        !          1208:             (while (setq tem (string-match "\n+" s tem))
        !          1209:               (setq s (concat (substring s 0 (match-beginning 0))
        !          1210:                               "\n>>  "
        !          1211:                               (substring s (match-end 0)))
        !          1212:                     tem (1+ tem)))
        !          1213:             (message ">>  %s" s))
        !          1214:           (setq error 1))))
        !          1215:       (kill-emacs error))))

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.