summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/cwebdir/cweb.el
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/cwebdir/cweb.el')
-rw-r--r--Build/source/texk/web2c/cwebdir/cweb.el215
1 files changed, 215 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/cwebdir/cweb.el b/Build/source/texk/web2c/cwebdir/cweb.el
new file mode 100644
index 00000000000..b7cfb2ee535
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cweb.el
@@ -0,0 +1,215 @@
+;; This file contains extensions to GNU-Emacs, to wit:
+; (1) some WEB-oriented functions that are also of general use
+; (2) changes to the GNU-distributed TeX mode
+; (3) definitions of simple WEB and CWEB modes
+
+; To use: Put this in your EMACS-lisp library and say (load-library "cweb")
+; in your .emacs init file.
+
+; Contributed by Don Knuth, July 1990
+
+;; OK, here's part (1): some WEB-oriented functions whose main purpose is
+; to maintain a stack of module names that are "pending" as you are writing
+; a program. When you first think of a module that needs to be written later,
+; put it into the pending list (by typing CTL-Z instead of @> after the
+; name). Later you can say CTL-\ to retrieve a pending name (and if
+; you want to cycle through the pending names, ESC-y after CTL-\ will
+; do it, just as ESC-y works after a yank).
+; After you've said CTL-\, the current region is the name just removed from
+; the pending list. If you change your mind, you can put it back again by
+; saying ESC-\. If you had put it into the pending list by mistake, you
+; can get rid of it by using the normal CTL-W operation (kill-region).
+; The following code binds the new commands to CTL-Z, CTL-\, and ESC-\
+; in all modes. You may prefer other bindings, of course.
+; CTL-Z is normally "suspend emacs", but it is best not used when emacs
+; has its own window as it usually does nowadays; if you need the
+; old CTL-Z, you might rather bind it to CTL-X CTL-Z.
+; CTL-\ is normally undefined.
+; ESC-\ is normally "delete space", but ESC-space DEL does that easily too.
+
+(defvar pending-list nil
+ "List of strings (usually WEB module names) still pending.")
+
+(defun into-pending-list (beg end)
+ "Copy region into pending-list."
+ (interactive "r")
+ (indicate-region)
+ (setq pending-list (cons (buffer-substring beg end) pending-list)))
+
+(defun new-module-name-pending ()
+ "Insert @> to complete a module name, then put it into pending-list."
+ (interactive)
+ (insert "@>")
+ (push-mark)
+ (if (search-backward "@<" nil t)
+ (progn
+ (exchange-point-and-mark)
+ (into-pending-list (point) (mark))
+ )
+ (message "There's no @< to begin the module name!")))
+(global-set-key "\C-z" 'new-module-name-pending)
+
+(defun pop-pending-list (arg)
+ "Remove first element of pending-list and insert it as current region.
+With argument, put point at left; otherwise point will follow the insertion.
+Say \\[new-yank-pop] to replace this by another element of the list.
+Say \\[into-pending-list] to put it back in the list."
+ (interactive "*P")
+ (if (consp pending-list)
+ (progn
+ (push-mark (point))
+ (insert (car pending-list))
+ (setq pending-list (cdr pending-list))
+ (if arg
+ (exchange-point-and-mark)))
+ (message "Nothing is pending.")
+ (setq this-command nil)))
+(global-set-key "\C-\\" 'pop-pending-list)
+(global-set-key "\M-\\" 'into-pending-list)
+
+(defun new-yank-pop (arg)
+ "If previous command was \\[pop-pending-list], pop a different string;
+otherwise do an ordinary Meta-y."
+ (interactive "*p")
+ (if (eq last-command 'pop-pending-list)
+ (let (xch)
+ (setq xch (< (point) (mark)))
+ (setq pending-list (append pending-list
+ (list (buffer-substring (point) (mark)))))
+ (delete-region (point) (mark))
+ (setq this-command 'pop-pending-list)
+ (pop-pending-list xch))
+ (yank-pop arg)))
+(global-set-key "\M-y" 'new-yank-pop)
+
+(defun indicate-region ()
+ "Bounce cursor to mark and back again"
+ (let ((point-save (point)))
+ (unwind-protect
+ (progn (goto-char (mark))
+ (sit-for 0 300)) ;; wait 300 milliseconds
+ (goto-char point-save))))
+
+; I prefer to change the standard copy-region command to the following,
+; which gives me visual feedback about what I've copied to the kill ring:
+(defun indicate-and-copy-region (beg end)
+ "Indicate current region, then copy it to the kill ring."
+ (interactive "r")(indicate-region)(copy-region-as-kill beg end))
+(global-set-key "\M-w" 'indicate-and-copy-region)
+
+; Here's another convenient command, bound to the usually unused ESC-".
+(defun ditto (arg)
+ "Copy ARG characters from the line above."
+ (interactive "*p")
+ (let (ch)
+ (while (> arg 0)
+ (setq temporary-goal-column (current-column))
+ (save-excursion
+ (previous-line 1)
+ (setq ch (following-char)))
+ (insert ch)
+ (setq arg (1- arg)))))
+(global-set-key "\M-\"" 'ditto)
+
+;; OK, here's part (2): Changes to TeX mode.
+; The WEB modes below are very much like TeX mode, but some improvements were
+; desirable in TeX mode:
+; I made newline act as it does in indented-text mode, since this
+; works nicely for both TeX and WEB (Pascal or C code).
+; I made RET check for unmatched delimiters if it ends a paragraph.
+; Otherwise TeX mode remains as it was before.
+
+(setq TeX-mode-map (make-sparse-keymap))
+(define-key TeX-mode-map "\C-c\C-k" 'TeX-kill-job)
+(define-key TeX-mode-map "\C-c\C-l" 'TeX-recenter-output-buffer)
+(define-key TeX-mode-map "\C-c\C-q" 'TeX-show-print-queue)
+(define-key TeX-mode-map "\C-c\C-p" 'TeX-print)
+(define-key TeX-mode-map "\"" 'TeX-insert-quote)
+(define-key TeX-mode-map "\e}" 'up-list)
+(define-key TeX-mode-map "\e{" 'TeX-insert-braces)
+(define-key TeX-mode-map "\C-c\C-r" 'TeX-region)
+(define-key TeX-mode-map "\C-c\C-b" 'TeX-buffer)
+(define-key TeX-mode-map "\C-c\C-f" 'TeX-close-LaTeX-block)
+(define-key TeX-mode-map "\r" 'TeX-newline)
+(define-key TeX-mode-map "\t" 'indent-relative)
+(setq TeX-mode-hook '(lambda ()
+ (make-local-variable 'indent-line-function)
+ (setq indent-line-function 'indent-relative-maybe)))
+
+(defun TeX-newline (arg)
+"If previous character is newline and no ARG, check for unbalanced braces
+and/or dollar signs in previous paragraph. If ARG is \\[universal-argument],
+do a single newline; otherwise do ordinary newline."
+ (interactive "*P")
+ (if (and (eq (preceding-char) ?\n) (not arg))
+ (TeX-check-paragraph)
+ (if (listp arg)
+ (newline)
+ (newline arg))))
+
+(defun TeX-check-paragraph ()
+"Insert a newline following a newline, breaking a paragraph for TeX.
+Check for mismatched delimiters in paragraph being terminated."
+ (interactive)
+ (if (TeX-validate-paragraph
+ (save-excursion
+ (search-backward "\n\n" nil 'move)
+ (point))
+ (point))
+ (insert ?\n)
+ (insert ?\n)
+ (error "Mismatched delimiters in that paragraph?")))
+
+;; and now, part (3): WEB and CWEB modes.
+; These are like plain TeX mode except that the automatic conversion of
+; " to `` or '' is disabled. (Personally I never liked that feature anyway,
+; since it's easy to get used to typing `` and ''. In WEB modes, the
+; feature soon becomes intolerable, unless you never use string constants!)
+; Another thing distinguishing WEB mode from TeX is ESC-p and ESC-n, to
+; move to previous or next module. These keys are usually unbound, except
+; when processing email.
+
+(defun forward-module (arg)
+"Advance past next WEB module beginning; with ARG, repeat ARG times."
+ (interactive "p")
+ (move-to-module arg))
+(defun backward-module (arg)
+"Advance to previous WEB module beginning; with ARG, repeat ARG times."
+ (interactive "p")
+ (move-to-module (- arg)))
+(defun move-to-module (arg)
+ (while (> arg 0)
+ (re-search-forward "@ \\|@\\*\\|@\n")
+ (setq arg (1- arg)))
+ (while (< arg 0)
+ (re-search-backward "@ \\|@\\*\\|@\n")
+ (setq arg (1+ arg))))
+
+(defun web-mode ()
+ "Major mode like TeX mode plus \\[forward-module] and \\[backward-module]
+for relative module movement. The automatic \" feature is disabled."
+ (interactive)
+ (plain-tex-mode)
+ (local-set-key "\M-n" 'forward-module)
+ (local-set-key "\M-p" 'backward-module)
+ (local-set-key "\"" 'self-insert-command)
+ (setq mode-name "WEB")
+ (setq major-mode 'web-mode)
+ (run-hooks 'web-mode-hook))
+(setq auto-mode-alist (cons '("\\.web$" . web-mode) auto-mode-alist))
+
+(defun cweb-mode ()
+ "Major mode like TeX mode plus \\[forward-module] and \\[backward-module]
+for relative module movement. The automatic \" feature is disabled."
+ (interactive)
+ (plain-tex-mode)
+ (local-set-key "\M-n" 'forward-module)
+ (local-set-key "\M-p" 'backward-module)
+ (local-set-key "\"" 'self-insert-command)
+ (setq comment-start nil)
+ (modify-syntax-entry ?% "@")
+ (setq mode-name "CWEB")
+ (setq major-mode 'cweb-mode)
+ (run-hooks 'cweb-mode-hook))
+(setq auto-mode-alist (cons '("\\.w$" . cweb-mode) auto-mode-alist))
+(setq auto-mode-alist (cons '("\\.ch$" . cweb-mode) auto-mode-alist))