--- gforth/gforth.el 1998/05/08 12:11:53 1.28 +++ gforth/gforth.el 2000/10/01 11:20:05 1.44 @@ -1,10 +1,8 @@ ;; 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. + +;; Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc. + +;; This file is part of Gforth. ;; GForth is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY. No author or distributor @@ -21,6 +19,12 @@ ;; file named COPYING. Among other things, the copyright notice ;; and this notice must be preserved on all copies. +;; 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. + ;;------------------------------------------------------------------- ;; A Forth indentation, documentation search and interaction library ;;------------------------------------------------------------------- @@ -36,20 +40,20 @@ (defvar forth-positives - " : :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 + " : :noname m: :m 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 try recover " + "*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 - " ; 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 + " ; ;m end-code ;code does> until repeat while +loop loop -loop s+loop else then endif again endcase endof end-struct [then] [else] [endif] endwith end-class class; how: recover endtry " + "*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 code interpretation: public: private: how: class class; " - "Contains all words which causes the indent to go to zero") + " : :noname code interpretation: public: private: how: implements class class; " + "*Contains all words which causes the indent to go to zero") (setq forth-zero 0) @@ -88,6 +92,16 @@ OBS! All words in forth-negatives must b (define-key forth-mode-map "\M-q" 'forth-fill-paragraph) (define-key forth-mode-map "\e." 'forth-find-tag) +;setup for C-h C-i to work +(if (fboundp 'info-lookup-add-help) + (info-lookup-add-help + :topic 'symbol + :mode 'forth-mode + :regexp "[^ +]+" + :ignore-case t + :doc-spec '(("(gforth)Name Index" nil "`" "' ")))) + (load "etags") (defun forth-find-tag (tagname &optional next-p regexp-p) @@ -146,8 +160,8 @@ OBS! All words in forth-negatives must b (setq comment-column 40) (make-local-variable 'comment-start-skip) (setq comment-start-skip "\\ ") - (make-local-variable 'comment-indent-hook) - (setq comment-indent-hook 'forth-comment-indent) + (make-local-hook 'comment-indent-hook) + (add-hook comment-indent-hook 'forth-comment-indent) (make-local-variable 'parse-sexp-ignore-comments) (setq parse-sexp-ignore-comments t)) @@ -227,7 +241,7 @@ Variables controling documentation searc ; (run-forth forth-program-name)) (run-hooks 'forth-mode-hook)) -(setq forth-mode-hook +(add-hook 'forth-mode-hook '(lambda () (make-local-variable 'compile-command) (setq compile-command "gforth "))) @@ -922,18 +936,44 @@ The region is sent terminated by a newli (require 'outline) -;;(define-key outline-minor-mode-map 'f9 'show-entry) -;;(define-key outline-minor-mode-map 'f10 'hide-entry) +(defun f-outline-level () + (cond ((looking-at "\\`\\\\") + 0) + ((looking-at "\\\\ SEC") + 0) + ((looking-at "\\\\ \\\\ .*") + 0) + ((looking-at "\\\\ DEFS") + 1) + ((looking-at "\\/\\* ") + 1) + ((looking-at ": .*") + 1) + ((looking-at "\\\\G") + 2) + ((looking-at "[ \t]+\\\\") + 3)) +) (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]*\\)") +;;; (setq outline-regexp "^\\(:\\)[ \t]+\\([^ \t]*\\)") + (setq outline-regexp "\\`\\\\\\|:\\|\\\\ SEC\\|\\\\G\\|[ \t]+\\\\\\|\\\\ DEFS\\|\\/\\*\\|\\\\ \\\\ .*") + (setq outline-level 'f-outline-level) (outline-minor-mode) + (define-key outline-minor-mode-map '(shift up) 'hide-sublevels) + (define-key outline-minor-mode-map '(shift right) 'show-children) + (define-key outline-minor-mode-map '(shift left) 'hide-subtree) + (define-key outline-minor-mode-map '(shift down) 'show-subtree) + ) + +;;(define-key global-map '(shift up) 'fold-f) + ;;; end file folding ;;; func-menu is a package that scans your source file for function definitions @@ -946,6 +986,32 @@ The region is sent terminated by a newli (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) - )) +; (define-key global-map "\C-cg" 'fume-prompt-function-goto) +; (define-key global-map '(shift button3) 'mouse-function-menu) +)) + +;;; Highlighting + +(if (not (file-exists-p "/usr/share/emacs/site-lisp/hl319.el")) + (require 'hilit19) + (require 'hl319)) + +(hilit-set-mode-patterns + '(forth-mode) + (append + '(("\\\\ \\(.*\\)$" nil comment)) ; comments + '(("\\\\[gG] \\(.*\\)$" nil comment)) ; comments + '(("(\\( [^)\n]* \\| \\)--\\( [^)\n]* \\| \\))" nil decl)) + '(("( " ")" comment)) + '(("\" [^\"\n]*\"" nil string)) + '(("\\(\\[IF]\\|\\[IFDEF]\\|\\[IFUNDEF]\\|\\[ELSE]\\|\\[THEN]\\|IF\\|ELSE\\|THEN\\|CASE\\|ENDCASE\\|OF\\|ENDOF\\|BEGIN\\|WHILE\\|REPEAT\\|UNTIL\\|AGAIN\\|DOES>\\|?DO\\|DO\\|\+LOOP\\|UNLOOP\\|LOOP\\|EXIT\\)" nil keyword)) + '(("\\(\\[if]\\|\\[ifdef]\\|\\[ifundef]\\|\\[else]\\|\\[then]\\|if\\|else\\|then\\|case\\|endcase\\|of\\|endof\\|begin\\|while\\|repeat\\|until\\|again\\|does>\\|?do\\|do\\|\+loop\\|unloop\\|loop\\|exit\\)" nil keyword)) + '((": *[^ \n]*" nil defun)) + '(("Defer *[^ \n]*" nil defun)) + '(("\\(Variable\\|Constant\\|Value\\|Create\\) *[^ \n]*" nil define)) + '(("\\(include\\|require\\) *[^ \n]*" nil include)) + '(("[\n ]\\(\\$[0-9A-Fa-f]+[\n ]\\|&[0-9]+[\n ]\\|[0-9]+[\n ]\\|%[01]+[\n ]\\|'[^ \n]+\\)+" nil formula)) + '((":noname" nil defun)))) + +;; end +