Diff for /gforth/gforth.el between versions 1.37 and 1.47

version 1.37, 2000/03/18 21:27:38 version 1.47, 2001/03/11 22:50:49
Line 1 Line 1
 ;; Forth mode for Emacs  ;; Forth mode for Emacs
 ;; Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc.  ;; Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc.
 ;; This file is part of Gforth.  ;; This file is part of Gforth.
Line 112  OBS! All words in forth-negatives must b Line 112  OBS! All words in forth-negatives must b
 (defvar forth-mode-syntax-table nil  (defvar forth-mode-syntax-table nil
   "Syntax table in use in Forth-mode buffers.")    "Syntax table in use in Forth-mode buffers.")
 (if (not forth-mode-syntax-table)  (if t;; (not forth-mode-syntax-table)
     (progn      (progn
       (setq forth-mode-syntax-table (make-syntax-table))        (setq forth-mode-syntax-table (make-syntax-table))
       (let ((char 0))        (let ((char 0))
Line 123  OBS! All words in forth-negatives must b Line 123  OBS! All words in forth-negatives must b
           (modify-syntax-entry char "w" forth-mode-syntax-table)            (modify-syntax-entry char "w" forth-mode-syntax-table)
           (setq char (1+ char))))            (setq char (1+ char))))
       (modify-syntax-entry ?\" "\"" forth-mode-syntax-table)        (modify-syntax-entry ?\" "\"" forth-mode-syntax-table)
       (modify-syntax-entry ?\\ "<" forth-mode-syntax-table)  
       (modify-syntax-entry ?\n ">" forth-mode-syntax-table)  
       ))        ))
 ;I do not define '(' and ')' as comment delimiters, because emacs  ;I do not define '(' and ')' as comment delimiters, because emacs
 ;only supports one comment syntax (and a hack to accomodate C++); I  ;only supports one comment syntax (and a hack to accomodate C++); I
Line 138  OBS! All words in forth-negatives must b Line 136  OBS! All words in forth-negatives must b
 ;same character. we could use ' ' as first and '(' and '\' as second  ;same character. we could use ' ' as first and '(' and '\' as second
 ;character. However this would fail for G\ comments.  ;character. However this would fail for G\ comments.
   ;comment handling has been moved to syntactic font lock (david)
 (defconst forth-indent-level 4  (defconst forth-indent-level 4
   "Indentation of Forth statements.")    "Indentation of Forth statements.")
Line 163  OBS! All words in forth-negatives must b Line 163  OBS! All words in forth-negatives must b
   (make-local-variable 'comment-indent-hook)    (make-local-variable 'comment-indent-hook)
   (setq comment-indent-hook 'forth-comment-indent)    (setq comment-indent-hook 'forth-comment-indent)
   (make-local-variable 'parse-sexp-ignore-comments)    (make-local-variable 'parse-sexp-ignore-comments)
   (setq parse-sexp-ignore-comments t))    (setq parse-sexp-ignore-comments t)
     (make-local-variable 'font-lock-defaults)
     (setq font-lock-defaults '(forth-font-lock-keywords nil t nil nil
         (font-lock-syntactic-keywords . forth-font-lock-syntactic-keywords)))
   ;  (make-local-variable 'font-lock-syntactic-keywords)
   ;  (setq font-lock-syntactic-keywords 'forth-font-lock-syntactic-keywords)
 ;;;###autoload  ;;;###autoload
 (defun forth-mode ()  (defun forth-mode ()
Line 241  Variables controling documentation searc Line 248  Variables controling documentation searc
 ;      (run-forth forth-program-name))  ;      (run-forth forth-program-name))
   (run-hooks 'forth-mode-hook))    (run-hooks 'forth-mode-hook))
 (setq forth-mode-hook  (add-hook 'forth-mode-hook
       '(lambda ()         '(lambda () 
          (make-local-variable 'compile-command)           (make-local-variable 'compile-command)
          (setq compile-command "gforth ")))           (setq compile-command "gforth ")))
Line 990  The region is sent terminated by a newli Line 997  The region is sent terminated by a newli
 ;       (define-key global-map '(shift button3) 'mouse-function-menu)  ;       (define-key global-map '(shift button3) 'mouse-function-menu)
 ))  ))
 ;;; Highlighting  ;;; Font lock code                              (david <dvdkhlng@gmx.de>)
 (if (not (file-exists-p "/usr/share/emacs/site-lisp/hl319.el"))  ;;; note that words which contain a closing paren, which have the comment-ender
     (require 'hilit19)  ;;; syntactic class, won't be matched by `\w+' and `\<' and `\>' won't work
   (require 'hl319))  ;;; either; solution: use of `\S-' and `\s-' where necessary
 (hilit-set-mode-patterns  (defvar forth-bracket-keyword nil)
  '(forth-mode)  (defvar forth-syntactic-keywords nil)
  (append  (defvar forth-variable-defining-words nil)
   '(("\\\\ \\(.*\\)$" nil comment)) ; comments  (defvar forth-function-defining-words nil)
   '(("( [^)]* -- [^)]* )" nil decl))  (defvar forth-function-parsing-words nil)
   '(("( -- [^)]* )" nil decl))  (defvar forth-variable-parsing-words nil)
   '(("( [^)]* -- )" nil decl))  (defvar forth-word-string-parsing-words nil)
   '(("( -- )" nil decl))  (defvar forth-type-defining-words nil)
   '(("( " ")" comment))  (defvar forth-font-lock-keywords nil)
   '(("\" [^\"]*\"" nil string))  
   '(("\\(IF\\|ELSE\\|THEN\\|BEGIN\\|WHILE\\|REPEAT\\|UNTIL\\)" nil keyword))  (setq forth-bracket-keywords 
   '((": *[^ ]*" nil defun))        '("[if]" "[ifdef]" "[ifundef]" "[else]" "[then]" "[?do]" "[do]" "[for]" 
   '(("Defer *[^ ]*" nil defun))          "[loop]" "[+loop]" "[next]" "[begin]" "[until]" "[again]" "[while]" 
   '(("Variable *[^ ]*" nil define))          "[repeat]"))
   '(("Constant *[^ ]*" nil define))  (setq forth-syntactic-keywords
   '(("include *[^ ]*" nil include))        '("if" "else" "then" "case" "endcase" "of" "endof" "begin" "while"
   '(("require *[^ ]*" nil include))          "repeat" "until" "again" "does>" "?do" "do" "+loop" "unloop" "loop"
   '(("[         ]\\$[0-9A-Fa-f]+" nil formula))          "exit" "u+do" "-do" "u-do" "-loop" "u+do" "for" "next" "cs-roll"
   '(("[         ]&[0-9]+" nil formula))          "cs-pick" "recurse" "?dup-if" "?dup-0=-if" "leave" "?leave" "done"
   '(("[         ][0-9]+" nil formula))          ";" ":noname" "immediate" "restrict" "compile-only" "interpretation>"
   '(("[         ]%[01]+" nil formula))          "<interpretation" "compilation>" "<compilation" ";code" "end-code"
   '(("[         ]'[^ ]+" nil formula))          "ahead" "struct"))
   '((":noname" nil defun))))  (setq forth-variable-defining-words
         '("variable" "constant" "value" "2variable" "2constant" "2value"
           "fvariable" "fconstant" "field" "w:" "d:" "c:" "f:"))
   (setq forth-function-defining-words
         '(":" "defer" "alias" "interpret/compile" "code"))
   (setq forth-function-parsing-words
         '("postpone" "'" "[']" "[IS]" "IS" "<IS>"))
   (setq forth-variable-parsing-words
         '("[TO]" "TO" "<TO>"))
   (setq forth-word-string-parsing-words
         '("[CHAR]" "CHAR" "include" "require" "needs"))
   (setq forth-type-defining-words
   (defun forth-make-words-regexp (word-list)
     (concat "\\<" (regexp-opt word-list t) "\\>"))
   (defun forth-make-parsing-words-regexp (word-list)
     (concat "\\<" (regexp-opt word-list t) "\\s-+\\(\\S-+\\)"))
   (defun forth-make-parsing-words-matcher (word-list word-face parsed-face)
     (let ((regexp (forth-make-parsing-words-regexp word-list)))
       (list regexp (list 1 word-face)
             (list (regexp-opt-depth regexp) parsed-face))
   (setq forth-font-lock-keywords 
          (forth-make-parsing-words-matcher forth-function-defining-words
                font-lock-keyword-face font-lock-function-name-face)
          (forth-make-parsing-words-matcher forth-variable-defining-words
                font-lock-type-face font-lock-variable-name-face)
          (forth-make-parsing-words-matcher forth-type-defining-words
                font-lock-keyword-face font-lock-type-face)
          (forth-make-parsing-words-matcher forth-function-parsing-words
                font-lock-keyword-face font-lock-function-name-face)
          (forth-make-parsing-words-matcher forth-variable-parsing-words
                font-lock-keyword-face font-lock-variable-name-face)
          (forth-make-parsing-words-matcher forth-word-string-parsing-words
                font-lock-keyword-face font-lock-string-face)
          (list (forth-make-words-regexp forth-bracket-keywords)
                0 font-lock-keyword-face)
          (list (forth-make-words-regexp forth-syntactic-keywords)
                0 font-lock-keyword-face)
   ;       '("\\<\\({\\)\\(\\([ \t]+-?[^- \t}\n]*\\>\\)*\\)\\([^}\n]*\\)\\(}\\)?"
   ;        (1 font-lock-keyword-face) (2 font-lock-variable-name-face)
   ;        (4 font-lock-comment-face) (5 font-lock-keyword-face nil t))
          '("\\<-?[0-9][0-9a-f]*\\>" . font-lock-constant-face)
          '("\\<[^ \t\n%]+%" . font-lock-type-face)
   ;; Syntactic highlighting is used for getting Forth comments highlighted
   ;; properly: `\' and `\g' comments are handled with a single regular 
   ;; expression that parses from `\' to end of line and assigns the 
   ;; "comment-fence" generic comment delimiter to the backslash and end-of-line 
   ;; characters.
   ;; `( ... )' comments are handled by the usual comment-starter/comment-ender
   ;; syntax classes, with the extension that `(' must be a single word.
   (defvar forth-font-lock-syntactic-keywords nil)
   (setq forth-font-lock-syntactic-keywords
     '(("\\<\\(\\(\\\\\\)g?\\)\\>.*\\(\n\\)" (2 (14 . nil)) (3 (14 . nil)))
       ("\\<(\\>" 0 (11 . nil))
       (")" 0 (12 . nil))))
 ;; end  ;;; End font lock code

Removed from v.1.37  
changed lines
  Added in v.1.47

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>