--- gforth/gforth.el 1995/01/12 18:37:53 1.9 +++ gforth/gforth.el 1995/10/07 17:38:15 1.14 @@ -20,7 +20,7 @@ ;; 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.9 1995/01/12 18:37:53 anton Exp $ +;;; $Header: /nfs/unsafe/cvs-repository/src-master/gforth/gforth.el,v 1.14 1995/10/07 17:38:15 anton Exp $ ;;------------------------------------------------------------------- ;; A Forth indentation, documentation search and interaction library @@ -37,19 +37,19 @@ (defvar forth-positives - " : :noname begin do ?do while if ?dup-if ?dup-not-if else case create does> exception> struct [if] [else] " + " : :noname code does> begin do ?do while if ?dup-if ?dup-not-if else case struct [if] [else] " "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] " + " ; end-code does> until repeat while +loop loop s+loop else then endif again endcase end-struct [then] [else] [endif]" "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 " "Contains all words which causes the indent to go to zero") (defvar forth-prefixes @@ -73,7 +73,6 @@ OBS! All words in forth-negatives must b ;(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|" 'uncomment-region) (define-key forth-mode-map "\C-x~" 'forth-remove-tracers) (define-key forth-mode-map "\e\C-m" 'forth-send-paragraph) (define-key forth-mode-map "\eo" 'forth-send-buffer) @@ -82,6 +81,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.el") + +(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.") @@ -104,7 +111,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 @@ -233,12 +240,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)))))) @@ -414,12 +421,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 @@ -866,3 +870,69 @@ The region is sent terminated by a newli (compile1 ctools-compile-command "No more errors")) +;;; Forth menu +;;; Mikael Karlsson + +(cond ((string-match "XEmacs\\|Lucid" emacs-version) + (require 'func-menu) + + (defconst fume-function-name-regexp-forth + "^\\(:\\)[ \t]+\\([^ \t]*\\)" + "Expression to get word definitions in Forth.") + + (setq fume-function-name-regexp-alist + (append '((forth-mode . fume-function-name-regexp-forth) + ) fume-function-name-regexp-alist)) + + ;; Find next forth word in the buffer + (defun fume-find-next-forth-function-name (buffer) + "Searches for the next forth word in BUFFER." + (set-buffer buffer) + (if (re-search-forward fume-function-name-regexp nil t) + (let ((beg (match-beginning 2)) + (end (match-end 2))) + (cons (buffer-substring beg end) beg)))) + + (setq fume-find-function-name-method-alist + (append '((forth-mode . fume-find-next-forth-function-name)))) + + )) +;;; End Forth menu + +;;; File folding of forth-files +;;; uses outline +;;; Toggle activation with M-x fold-f (when editing a forth-file) +;;; Use f9 to expand, f10 to hide, Or the menubar in xemacs +;;; +;;; Works most of the times but loses sync with the cursor occasionally +;;; Could be improved by also folding on comments + +(require 'outline) + +;;(define-key outline-minor-mode-map 'f9 'show-entry) +;;(define-key outline-minor-mode-map 'f10 'hide-entry) + +(defun fold-f () + (interactive) + (add-hook 'outline-minor-mode-hook 'hide-body) + + ; outline mode header start, i.e. find word definitions + (setq outline-regexp "^\\(:\\)[ \t]+\\([^ \t]*\\)") + + (outline-minor-mode) +) +;;; end file folding + +;;; func-menu is a package that scans your source file for function definitions +;;; and makes a menubar entry that lets you jump to any particular function +;;; definition by selecting it from the menu. The following code turns this on +;;; for all of the recognized languages. Scanning the buffer takes some time, +;;; but not much. +;;; +(cond ((string-match "XEmacs\\|Lucid" emacs-version) + (require 'func-menu) +;; (define-key global-map 'f8 'function-menu) + (add-hook 'find-fible-hooks 'fume-add-menubar-entry) + (define-key global-map "\C-cg" 'fume-prompt-function-goto) + (define-key global-map '(shift button3) 'mouse-function-menu) + ))