mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-27 12:29:55 +08:00
251 lines
9.4 KiB
EmacsLisp
251 lines
9.4 KiB
EmacsLisp
|
;;; Here is a handy keybinding:
|
||
|
|
||
|
(global-set-key "\C-x\\" 'detexinfo)
|
||
|
|
||
|
;;;;;;;;;;;;;;;; detexinfo.el ;;;;;;;;;;;;;;;;
|
||
|
;;;
|
||
|
;;; Remove Texinfo commands from a Texinfo source file.
|
||
|
;;;
|
||
|
;;; Copyright (C) 1991, 1992 Free Software Foundation
|
||
|
;;; Robert J. Chassell
|
||
|
;;; bugs to bug-texinfo@prep.ai.mit.edu
|
||
|
;;;
|
||
|
;;; ==> test version <==
|
||
|
;;; Fails if Texinfo source file contains formatting errors.
|
||
|
;;;
|
||
|
;;; Version 0.05 - 3 Jun 1992
|
||
|
;;; Add to list of removed commands. Improve messages.
|
||
|
;;;
|
||
|
;;; Version 0.04 - 27 Jan 1992
|
||
|
;;; Rewrite to insert detexinfo'd text into a temporary buffer.
|
||
|
;;;
|
||
|
;;; Version 0.03 - 27 Dec 1991
|
||
|
;;; Improved messages.
|
||
|
;;;
|
||
|
;;; Version 0.02 - 13 Nov 1991
|
||
|
;;; detexinfo-remove-inline-cmd, detexinfo-syntax-table: Handle
|
||
|
;;; nested commands.
|
||
|
;;; detexinfo: Handle nested @'s, eg @samp{@}} and @samp{@@};
|
||
|
;;; replace @TeX{} with TeX.
|
||
|
;;;
|
||
|
;;; Version 0.01 - 13 Nov 1991
|
||
|
;;;
|
||
|
;;; Based on detex.el, by Bengt Martensson, 4 Oct 1987
|
||
|
;;;
|
||
|
;;;;;;;;;;;;;;;;
|
||
|
|
||
|
(defvar detexinfo-buffer-name "*detexinfo*"
|
||
|
"*Name of the temporary buffer used by \\[detexinfo].")
|
||
|
|
||
|
(defvar detexinfo-syntax-table nil)
|
||
|
|
||
|
(if detexinfo-syntax-table
|
||
|
nil
|
||
|
(setq detexinfo-syntax-table (make-syntax-table))
|
||
|
(modify-syntax-entry ?\[ "." detexinfo-syntax-table)
|
||
|
(modify-syntax-entry ?\] "." detexinfo-syntax-table)
|
||
|
(modify-syntax-entry ?\" "." detexinfo-syntax-table)
|
||
|
(modify-syntax-entry ?\\ "." detexinfo-syntax-table)
|
||
|
(modify-syntax-entry ?\( "." detexinfo-syntax-table)
|
||
|
(modify-syntax-entry ?\) "." detexinfo-syntax-table)
|
||
|
(modify-syntax-entry ?{ "(}" detexinfo-syntax-table)
|
||
|
(modify-syntax-entry ?} "){" detexinfo-syntax-table))
|
||
|
|
||
|
(defun detexinfo ()
|
||
|
"Remove Texinfo commands from current buffer, copying result to new buffer.
|
||
|
BUG: Fails if Texinfo source file contains formatting errors."
|
||
|
(interactive)
|
||
|
(let ((input-buffer (current-buffer)))
|
||
|
;; Find a buffer to use.
|
||
|
(switch-to-buffer (get-buffer-create detexinfo-buffer-name))
|
||
|
(setq major-mode 'detexinfo-mode)
|
||
|
(set-syntax-table detexinfo-syntax-table)
|
||
|
(erase-buffer)
|
||
|
(insert-buffer-substring input-buffer)
|
||
|
|
||
|
;; Replace @{ and @} with %#* and *#% temporarily, so @samp{@{} works.
|
||
|
;; What is a better way of doing this??
|
||
|
(goto-char (point-min))
|
||
|
(while (search-forward "@{" nil t) ; e.g., @samp{@{}
|
||
|
(replace-match "%#*"))
|
||
|
(goto-char (point-min))
|
||
|
(while (search-forward "@}" nil t)
|
||
|
(forward-char -3) ; e.g., @samp{@@}
|
||
|
(if (looking-at "@") ; Two @@ in a row
|
||
|
(progn
|
||
|
(delete-char 2)
|
||
|
(insert "%&%#"))
|
||
|
(forward-char 1)
|
||
|
(delete-char 2)
|
||
|
(insert "*#%")))
|
||
|
|
||
|
(goto-char (point-min))
|
||
|
;; Remove @refill, the only inline command without braces.
|
||
|
(while (search-forward "@refill" nil t)
|
||
|
(replace-match ""))
|
||
|
;; Replace @TeX{} with TeX
|
||
|
(goto-char (point-min))
|
||
|
(while (search-forward "@TeX{}" nil t) (replace-match "TeX" t t))
|
||
|
|
||
|
(detexinfo-remove-line-cmds-without-arg)
|
||
|
(detexinfo-remove-inline-cmds-without-arg)
|
||
|
(detexinfo-remove-inline-cmds-keep-arg)
|
||
|
(detexinfo-remove-line-cmds-deletable-arg)
|
||
|
(detexinfo-remove-line-cmds-maybe-delete-arg)
|
||
|
(detexinfo-remove-line-cmds-keep-arg)
|
||
|
|
||
|
;; Now replace %#*, *#%, and %&%# with {, }, and @@.
|
||
|
(goto-char (point-min))
|
||
|
(while (search-forward "%#*" nil t)
|
||
|
(replace-match "{"))
|
||
|
(goto-char (point-min))
|
||
|
(while (search-forward "*#%" nil t)
|
||
|
(replace-match "}"))
|
||
|
(goto-char (point-min))
|
||
|
(while (search-forward "%&%#" nil t)
|
||
|
(replace-match "@@"))
|
||
|
|
||
|
;; Scan for remaining two character @-commands
|
||
|
(goto-char (point-min))
|
||
|
(while (search-forward "@" nil t)
|
||
|
(cond ((looking-at "[*:]")
|
||
|
(delete-region (1- (point)) (1+ (point))))
|
||
|
((looking-at "[{}^@.'`]\"?!")
|
||
|
(delete-region (1- (point)) (point)))))
|
||
|
|
||
|
(goto-char (point-min))
|
||
|
(message "Done...removed Texinfo commands from buffer. You may save it.")))
|
||
|
|
||
|
(defun detexinfo-remove-whole-line (cmd)
|
||
|
"Delete Texinfo line command CMD at beginning of line and rest of line."
|
||
|
(goto-char (point-min))
|
||
|
(while
|
||
|
(re-search-forward
|
||
|
(concat "^@" cmd "[ \n]+") (point-max) t)
|
||
|
(goto-char (match-beginning 0))
|
||
|
(delete-region
|
||
|
(point) (save-excursion (end-of-line) (1+ (point))))))
|
||
|
|
||
|
(defun detexinfo-remove-inline-cmd (cmd)
|
||
|
"Delete Texinfo inline command CMD, eg. @point, @code."
|
||
|
(goto-char (point-min))
|
||
|
(while
|
||
|
(re-search-forward (concat "@" cmd "{") (point-max) t)
|
||
|
(save-excursion
|
||
|
(forward-char -1)
|
||
|
(forward-sexp 1)
|
||
|
(delete-char -1)) ; delete right brace
|
||
|
(delete-region (point) (match-beginning 0))))
|
||
|
|
||
|
;;;;;;;;;;;;;;;;
|
||
|
|
||
|
;;; 1. @setfilename and other line commands with args to delete
|
||
|
|
||
|
(defvar detexinfo-line-cmds-deletable-arg
|
||
|
'("enumerate" "ftable" "vtable" "itemize" "table"
|
||
|
"setfilename" "settitle" "setchapternewpage"
|
||
|
"footnotestyle" "paragraphindent"
|
||
|
"include" "need" "sp"
|
||
|
"clear" "ifclear" "ifset" "set"
|
||
|
"defcodeindex" "defindex" "syncodeindex" "synindex")
|
||
|
"List of Texinfo commands whose arguments should be deleted.")
|
||
|
|
||
|
(defun detexinfo-remove-line-cmds-deletable-arg ()
|
||
|
"Delete Texinfo line commands together with their args, eg @setfilename."
|
||
|
(message "Removing commands such as @enumerate...with their arguments...")
|
||
|
(mapcar 'detexinfo-remove-whole-line
|
||
|
detexinfo-line-cmds-deletable-arg))
|
||
|
|
||
|
;;; 2. @cindex and other cmds with args that may be deleted
|
||
|
;;; This list is here just to make it easier to revise the
|
||
|
;;; categories. In particular, you might want to keep the index entries.
|
||
|
|
||
|
(defvar detexinfo-line-cmds-maybe-delete-arg
|
||
|
'("cindex" "findex" "kindex" "pindex" "tindex" "vindex" "node"
|
||
|
"c" "comment" "end" "headings" "printindex" "vskip"
|
||
|
"evenfooting" "evenheading" "everyfooting" "everyheading"
|
||
|
"oddfooting" "oddheading")
|
||
|
"List of Texinfo commands whose arguments may possibly be deleted.")
|
||
|
|
||
|
(defun detexinfo-remove-line-cmds-maybe-delete-arg ()
|
||
|
"Delete Texinfo line commands together with their arguments, eg, @cindex."
|
||
|
(message "Removing commands such as @cindex...with their arguments...")
|
||
|
(mapcar 'detexinfo-remove-whole-line
|
||
|
detexinfo-line-cmds-maybe-delete-arg))
|
||
|
|
||
|
;;; 3. @chapter and other line cmds with args to keep.
|
||
|
|
||
|
(defvar detexinfo-line-cmds-keep-arg
|
||
|
'("top" "chapter" "section" "subsection" "subsubsection"
|
||
|
"unnumbered" "unnumberedsec" "unnumberedsubsec" "unnumberedsubsubsec"
|
||
|
"majorheading" "chapheading" "heading" "subheading" "subsubheading"
|
||
|
"appendix" "appendixsec" "appendixsubsec" "appendixsubsubsec"
|
||
|
"item" "itemx"
|
||
|
"title" "subtitle" "center" "author" "exdent"
|
||
|
"defcv" "deffn" "defivar" "defmac" "defmethod" "defop" "defopt"
|
||
|
"defspec" "deftp" "deftypefn" "deftypefun" "deftypvr"
|
||
|
"deftypevar" "defun" "defvar" "defvr")
|
||
|
"List of Texinfo line commands whose arguments should be kept.")
|
||
|
|
||
|
(defun detexinfo-remove-line-cmds-keep-arg ()
|
||
|
"Delete Texinfo line commands but keep their arguments, eg @chapter."
|
||
|
(message "Removing commands such as @chapter...but not their arguments...")
|
||
|
(mapcar 'detexinfo-remove-line-cmd-keep-arg
|
||
|
detexinfo-line-cmds-keep-arg))
|
||
|
|
||
|
(defun detexinfo-remove-line-cmd-keep-arg (cmd)
|
||
|
"Delete Texinfo line command CMD but keep its argument, eg @chapter."
|
||
|
(goto-char (point-min))
|
||
|
(while
|
||
|
(re-search-forward
|
||
|
(concat "^@" cmd "[ \n]+") (point-max) t)
|
||
|
(delete-region (match-beginning 0) (match-end 0))))
|
||
|
|
||
|
;;; 4. @bye and other line commands without args.
|
||
|
|
||
|
(defvar detexinfo-line-cmds-without-arg
|
||
|
'("bye" "contents" "display" "example" "finalout"
|
||
|
"flushleft" "flushright" "format" "group" "ifhtml" "ifinfo" "iftex"
|
||
|
"ignore" "lisp" "menu" "noindent" "page" "quotation"
|
||
|
"shortcontents" "smallbook" "smallexample" "smalllisp"
|
||
|
"summarycontents" "tex" "thischapter" "thischaptername"
|
||
|
"thisfile" "thispage" "thissection" "thistitle" "titlepage")
|
||
|
"List of Texinfo commands without arguments that should be deleted.")
|
||
|
|
||
|
(defun detexinfo-remove-line-cmds-without-arg ()
|
||
|
"Delete line Texinfo commands that lack args, eg. @example."
|
||
|
(message "Removing commands such as @example...that lack arguments...")
|
||
|
(mapcar 'detexinfo-remove-whole-line
|
||
|
detexinfo-line-cmds-without-arg))
|
||
|
|
||
|
;;; 5. @equiv and other inline cmds without args.
|
||
|
|
||
|
(defvar detexinfo-inline-cmds-without-arg
|
||
|
'("equiv" "error" "expansion" "point" "print" "result"
|
||
|
"asis" "br" "bullet" "dots" "minus" "today")
|
||
|
"List of Texinfo inline commands without arguments that should be deleted.")
|
||
|
|
||
|
(defun detexinfo-remove-inline-cmds-without-arg ()
|
||
|
"Delete Texinfo inline commands in that lack arguments."
|
||
|
(message "Removing within line commands such as @result...")
|
||
|
(mapcar 'detexinfo-remove-inline-cmd
|
||
|
detexinfo-inline-cmds-without-arg))
|
||
|
|
||
|
;;; 6. @code and other inline cmds with args to keep
|
||
|
|
||
|
(defvar detexinfo-inline-cmds-keep-arg
|
||
|
'("b" "cartouche" "cite" "code" "copyright" "ctrl" "dfn" "dmn"
|
||
|
"emph" "file" "footnote" "i" "inforef"
|
||
|
"kbd" "key" "pxref" "r" "ref" "samp" "sc" "titlefont"
|
||
|
"strong" "t" "var" "w" "xref")
|
||
|
"List of Texinfo inline commands with arguments that should be kept.")
|
||
|
|
||
|
(defun detexinfo-remove-inline-cmds-keep-arg ()
|
||
|
"Delete Texinfo inline commands but keep its arg, eg. @code."
|
||
|
(message
|
||
|
"Removing within line commands such as @code...but not their arguments...")
|
||
|
(mapcar 'detexinfo-remove-inline-cmd
|
||
|
detexinfo-inline-cmds-keep-arg))
|
||
|
|
||
|
;;;;;;;;;;;;;;;; end detexinfo.el ;;;;;;;;;;;;;;;;
|