--- gforth/gforth.el 1995/08/27 19:56:30 1.12 +++ gforth/gforth.el 1997/10/04 17:33:52 1.24 @@ -1,11 +1,12 @@ -;; This file is part of GNU Emacs. +;; Forth mode for Emacs +;; This file is part of GForth. ;; Changes by anton ;; This is a variant of forth.el that came with TILE. ;; I left most of this stuff untouched and made just a few changes for ;; the things I use (mainly indentation and syntax tables). ;; So there is still a lot of work to do to adapt this to gforth. -;; GNU Emacs is distributed in the hope that it will be useful, +;; GForth is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY. No author or distributor ;; accepts responsibility to anyone for the consequences of using it ;; or for whether it serves any particular purpose or works at all, @@ -15,13 +16,11 @@ ;; Everyone is granted permission to copy, modify and redistribute ;; GNU Emacs, but only under the conditions described in the ;; GNU Emacs General Public License. A copy of this license is -;; supposed to have been given to you along with GNU Emacs so you +;; supposed to have been given to you along with Gforth so you ;; can know your rights and responsibilities. It should be in a ;; file named COPYING. Among other things, the copyright notice ;; and this notice must be preserved on all copies. -;;; $Header: /nfs/unsafe/cvs-repository/src-master/gforth/gforth.el,v 1.12 1995/08/27 19:56:30 pazsan Exp $ - ;;------------------------------------------------------------------- ;; A Forth indentation, documentation search and interaction library ;;------------------------------------------------------------------- @@ -37,21 +36,31 @@ (defvar forth-positives - " : :noname begin do ?do while if ?dup-if ?dup-not-if else case create does> exception> struct [if] [else] " + " : :noname code interpretation: ;code does> begin do ?do +do -do u+do u-do while if ?dup-if ?dup-0=-if else case of struct [if] [ifdef] [ifundef] [else] with public: private: class " "Contains all words which will cause the indent-level to be incremented on the next line. OBS! All words in forth-positives must be surrounded by spaces.") (defvar forth-negatives - " ; until repeat while +loop loop s+loop else then endif again endcase does> end-struct [then] [else] [endif]" + " ; end-code ;code does> until repeat while +loop loop -loop s+loop else then endif again endcase endof end-struct [then] [else] [endif] endwith class; how: " "Contains all words which will cause the indent-level to be decremented on the current line. OBS! All words in forth-negatives must be surrounded by spaces.") (defvar forth-zeroes - " : :noname " + " : :noname code interpretation: public: private: how: class class; " "Contains all words which causes the indent to go to zero") +(setq forth-zero 0) + +(defvar forth-zup + " how: " + "Contains all words which causes zero indent level to change") + +(defvar forth-zdown + " class; how: class public: private: " + "Contains all words which causes zero indent level to change") + (defvar forth-prefixes " postpone [compile] ['] [char] " "words that prefix and escape other words") @@ -67,10 +76,6 @@ OBS! All words in forth-negatives must b (if (not forth-mode-map) (setq forth-mode-map (make-sparse-keymap))) -(global-set-key "\e\C-m" 'forth-send-paragraph) -(global-set-key "\C-x\C-m" 'forth-split) -(global-set-key "\e " 'forth-reload) - ;(define-key forth-mode-map "\M-\C-x" 'compile) (define-key forth-mode-map "\C-x\\" 'comment-region) (define-key forth-mode-map "\C-x~" 'forth-remove-tracers) @@ -81,6 +86,14 @@ OBS! All words in forth-negatives must b (define-key forth-mode-map "\t" 'forth-indent-command) (define-key forth-mode-map "\C-m" 'reindent-then-newline-and-indent) (define-key forth-mode-map "\M-q" 'forth-fill-paragraph) +(define-key forth-mode-map "\e." 'forth-find-tag) + +(load "etags") + +(defun forth-find-tag (tagname &optional next-p regexp-p) + (interactive (find-tag-interactive "Find tag: ")) + (switch-to-buffer + (find-tag-noselect (concat " " tagname " ") next-p regexp-p))) (defvar forth-mode-syntax-table nil "Syntax table in use in Forth-mode buffers.") @@ -103,7 +116,7 @@ OBS! All words in forth-negatives must b ;only supports one comment syntax (and a hack to accomodate C++); I ;use '\' for natural language comments and '(' for formal comments ;like stack comments, so for me it's better to have emacs treat '\' -;comments as comments. I you want it different, make the appropriate +;comments as comments. If you want it different, make the appropriate ;changes (best in your .emacs file). ; ;Hmm, the C++ hack could be used to support both comment syntaxes: we @@ -143,7 +156,7 @@ OBS! All words in forth-negatives must b " Major mode for editing Forth code. Tab indents for Forth code. Comments are delimited with \\ and newline. Paragraphs are separated by blank lines -only. Delete converts tabs to spaces as it moves back. +only. \\{forth-mode-map} Forth-split Positions the current buffer on top and a forth-interaction window @@ -232,12 +245,12 @@ programmers who tend to fill code won't (beginning-of-line) (while (and (= (forward-line -1) 0) - (looking-at "[ \t]*\\\\[ \t]+"))) - (if (not (looking-at "[ \t]*\\\\[ \t]+")) + (looking-at "[ \t]*\\\\g?[ \t]+"))) + (if (not (looking-at "[ \t]*\\\\g?[ \t]+")) (forward-line 1)) (let ((from (point)) (to (save-excursion (forward-paragraph) (point)))) - (if (looking-at "[ \t]*\\\\[ \t]+") + (if (looking-at "[ \t]*\\\\g?[ \t]+") (progn (goto-char (match-end 0)) (set-fill-prefix) (fill-region from to nil)))))) @@ -311,8 +324,12 @@ programmers who tend to fill code won't (regexp-quote (concat " " w1 " ")) forth-negatives) forth-indent-level 0))) + (if (string-match (regexp-quote (concat " " w1 " ")) forth-zdown) + (setq forth-zero 0)) (if (string-match (regexp-quote (concat " " w1 " ")) forth-zeroes) - (setq indent 0)) + (setq indent forth-zero)) + (if (string-match (regexp-quote (concat " " w1 " ")) forth-zup) + (setq forth-zero 4)) indent)) (defun forth-sum-line-indentation () @@ -370,7 +387,7 @@ the input stream (comments, arguments, e (defun forth-remove-tracers () "Remove tracers of the form `~~ '. Queries the user for each occurrence." (interactive) - (query-replace "~~ " "")) + (query-replace-regexp "\\(~~ \\| ~~$\\)" "" nil)) (defvar forth-program-name "gforth" "*Program invoked by the `run-forth' command.") @@ -413,12 +430,9 @@ part of the screen." (message "Resetting Forth process...done"))))) (defun forth-default-command-line () - (concat forth-program-name " -emacs" + (concat forth-program-name (if forth-program-arguments (concat " " forth-program-arguments) - "") - (if forth-band-name - (concat " -band " forth-band-name) ""))) ;;;; Internal Variables