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