Diff for /gforth/gforth.el between versions 1.48 and 1.49

version 1.48, 2001/04/08 13:48:11 version 1.49, 2001/05/06 13:42:56
Line 58 Line 58
   "List of words for hilighting and recognition of parsed text areas.     "List of words for hilighting and recognition of parsed text areas. 
 You can enable hilighting of object-oriented Forth code, by appending either  You can enable hilighting of object-oriented Forth code, by appending either
 `forth-objects-words' or `forth-oof-words' to the list, depending on which  `forth-objects-words' or `forth-oof-words' to the list, depending on which
 OOP package you're using.  OOP package you're using. After `forth-words' changed, `forth-compile-words' 
   must be called to make the changes take effect.
   
 Each item of `forth-words' has the form   Each item of `forth-words' has the form 
    (MATCHER TYPE HILIGHT . &optional PARSED-TEXT ...)     (MATCHER TYPE HILIGHT . &optional PARSED-TEXT ...)
Line 224  PARSED-TYPE specifies what kind of text Line 225  PARSED-TYPE specifies what kind of text
         (("object") non-immediate (font-lock-type-face . 2))))          (("object") non-immediate (font-lock-type-face . 2))))
 ; (nconc forth-words forth-oof-words)  ; (nconc forth-words forth-oof-words)
   
   (defvar forth-local-words nil 
     "List of Forth words to prepend to `forth-words'. Should be set by a 
   forth source, using a local variables list at the end of the file 
   (\"Local Variables: ... forth-local-words: ... End:\" construct).")
   
 (defvar forth-hilight-level 3 "*Level of hilighting of Forth code.")  (defvar forth-hilight-level 3 "*Level of hilighting of Forth code.")
 (defvar forth-compiled-words nil "Compiled representation of `forth-words'.")  (defvar forth-compiled-words nil "Compiled representation of `forth-words'.")
   
Line 231  PARSED-TYPE specifies what kind of text Line 237  PARSED-TYPE specifies what kind of text
 ;  ;
   
 ; Wörter ordentlich hilighten, die nicht auf whitespace beginning ( ..)IF  ; Wörter ordentlich hilighten, die nicht auf whitespace beginning ( ..)IF
 ;  ; Additional `forth-use-objects' or
 ; Buffer-local variables can be set via "Local Variables:" or -*-  
 ; Setting hilighting/indentation specifications requires multi-line variables,  
 ; can only be done in 0 [IF] ... [ENDIF] blocks.  
 ; Additional variable `forth-local-words'/`forth-local-indent-words' required.  
 ; Should be appended to `forth-words'. Additional `forth-use-objects' or  
 ; `forth-use-oof' could be set to non-nil for automatical adding of those  ; `forth-use-oof' could be set to non-nil for automatical adding of those
 ; word-lists.  ; word-lists. Using local variable list?
 ;  ;
 ; How to use block files with conversion? Use an additional mode? File-ending  ; Anzeige von Screen-Nummern in Status-Zeile (S???)
 ; cannot be used for specifying encoding.  
 ; -- Introduce a second mode `forth-blocked-mode', that decodes the buffer  
 ; `decode-coding-region' ands set `buffer-coding-system'. *Warning* block  
 ; conversion might not work well with regions, since it's a linewise   
 ; conversion  
 ;  ;
 ; Konfiguration über customization groups  ; Konfiguration über customization groups
 ;  ;
Line 296  PARSED-TYPE specifies what kind of text Line 292  PARSED-TYPE specifies what kind of text
 ;; parsing of the form    ;; parsing of the form  
 ;; (regexp (subexp-count word-description) (subexp-count2 word-description2)  ;; (regexp (subexp-count word-description) (subexp-count2 word-description2)
 ;;  ...)  ;;  ...)
 (defun forth-compile-words (words)  (defun forth-compile-wordlist (words)
   (let* ((mapped (mapcar 'forth-compile-words-mapper words))    (let* ((mapped (mapcar 'forth-compile-words-mapper words))
          (regexp (concat "\\<\\("            (regexp (concat "\\<\\(" 
                          (mapconcat 'car mapped "\\|")                           (mapconcat 'car mapped "\\|")
Line 313  PARSED-TYPE specifies what kind of text Line 309  PARSED-TYPE specifies what kind of text
       (byte-compile 'result)        (byte-compile 'result)
       result)))        result)))
   
   (defun forth-compile-words ()
     "Compile the the words from `forth-words' and `forth-indent-words' into
    the format that's later used for doing the actual hilighting/indentation.
   Store the resulting compiled wordlists in `forth-compiled-words' and 
   `forth-compiled-indent-words', respective"
     (setq forth-compiled-words 
           (forth-compile-wordlist 
            (forth-filter 'forth-words-filter forth-words)))
     (setq forth-compiled-indent-words 
           (forth-compile-wordlist forth-indent-words)))
   
   (defun forth-hack-local-variables ()
     "Parse and bind local variables, set in the contens of the current 
   forth-mode buffer. Prepend `forth-local-words' to `forth-words' and 
   `forth-local-indent-words' to `forth-local-words'."
     (hack-local-variables)
     (setq forth-words (append forth-local-words forth-words))
     (setq forth-indent-words (append forth-local-indent-words 
                                      forth-indent-words)))
   
 ;; get location of first character of previous forth word that's got   ;; get location of first character of previous forth word that's got 
 ;; properties  ;; properties
 (defun forth-previous-start (pos)  (defun forth-previous-start (pos)
Line 525  INDENT1 and INDENT2 are indentation spec Line 541  INDENT1 and INDENT2 are indentation spec
           "[if]" "[ifdef]" "[ifundef]" "[begin]" "[for]" "[do]" "[?do]"            "[if]" "[ifdef]" "[ifundef]" "[begin]" "[for]" "[do]" "[?do]"
           "class" "interface" "m:" ":m")            "class" "interface" "m:" ":m")
          (0 . 2) (0 . 2))           (0 . 2) (0 . 2))
         ((";" ";m") (0 . -2) (0 . -2))          ((";" ";m") (-2 . 0) (0 . -2))
         (("end-code" "again" "repeat" "then" "endtry" "endcase" "endof"           (("end-code" "again" "repeat" "then" "endtry" "endcase" "endof" 
           "end-struct" "[then]" "[endif]" "[loop]" "[+loop]" "[next]"             "end-struct" "[then]" "[endif]" "[loop]" "[+loop]" "[next]" 
           "[until]" "[repeat]" "[again]" "end-class" "end-interface"            "[until]" "[repeat]" "[again]" "end-class" "end-interface"
Line 538  INDENT1 and INDENT2 are indentation spec Line 554  INDENT1 and INDENT2 are indentation spec
         (("while" "does>" "[while]") (-1 . 1) (0 . 0))          (("while" "does>" "[while]") (-1 . 1) (0 . 0))
         (("\\g") (-2 . 2) (0 . 0))))          (("\\g") (-2 . 2) (0 . 0))))
   
   (defvar forth-local-indent-words nil 
     "List of Forth words to prepend to `forth-indent-words', when a forth-mode
   buffer is created. Should be set by a Forth source, using a local variables 
   list at the end of the file (\"Local Variables: ... forth-local-words: ... 
   End:\" construct).")
   
 (defvar forth-indent-level 4  (defvar forth-indent-level 4
   "Indentation of Forth statements.")    "Indentation of Forth statements.")
 (defvar forth-minor-indent-level 2  (defvar forth-minor-indent-level 2
Line 627  INDENT1 and INDENT2 are indentation spec Line 649  INDENT1 and INDENT2 are indentation spec
          (column-incr (forth-get-column-incr 0)))           (column-incr (forth-get-column-incr 0)))
     (forth-indent-to (if column-incr (+ anchor column-incr) anchor))))      (forth-indent-to (if column-incr (+ anchor column-incr) anchor))))
   
   (defun forth-current-column ()
     (- (point) (save-excursion (beginning-of-line) (point))))
   (defun forth-current-indentation ()
     (- (save-excursion (beginning-of-line) (forward-to-indentation 0) (point))
        (save-excursion (beginning-of-line) (point))))
   
 (defun forth-indent-to (x)  (defun forth-indent-to (x)
   (let ((p nil))    (let ((p nil))
     (setq p (- (current-column) (current-indentation)))      (setq p (- (forth-current-column) (forth-current-indentation)))
     (forth-delete-indentation)      (forth-delete-indentation)
     (beginning-of-line)      (beginning-of-line)
     (indent-to x)      (indent-to x)
Line 653  INDENT1 and INDENT2 are indentation spec Line 681  INDENT1 and INDENT2 are indentation spec
   
 ;; insert newline, removing any trailing whitespaces in the current line  ;; insert newline, removing any trailing whitespaces in the current line
 (defun forth-newline-remove-trailing ()  (defun forth-newline-remove-trailing ()
   (newline)  
   (save-excursion    (save-excursion
     (forward-line -1)      (delete-region (point) (progn (skip-chars-backward " \t") (point))))
     (forth-remove-trailing)))    (newline))
   ;  (let ((was-point (point-marker)))
   ;    (unwind-protect 
   ;       (progn (forward-line -1) (forth-remove-trailing))
   ;      (goto-char (was-point)))))
   
 ;; workaround for bug in `reindent-then-newline-and-indent'  ;; workaround for bug in `reindent-then-newline-and-indent'
 (defun forth-reindent-then-newline-and-indent ()  (defun forth-reindent-then-newline-and-indent ()
Line 944  exceeds 64 characters." Line 975  exceeds 64 characters."
   (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)
   
   (setq case-fold-search t)    (setq case-fold-search t)
   (make-local-variable 'forth-words)    (make-local-variable 'forth-words)
   (make-local-variable 'forth-compiled-words)    (make-local-variable 'forth-compiled-words)
Line 955  exceeds 64 characters." Line 985  exceeds 64 characters."
   (make-local-variable 'forth-screen-marker)    (make-local-variable 'forth-screen-marker)
   (make-local-variable 'forth-warn-long-lines)    (make-local-variable 'forth-warn-long-lines)
   (setq forth-screen-marker (copy-marker 0))    (setq forth-screen-marker (copy-marker 0))
 )    (add-hook 'after-change-functions 'forth-change-function))
   
 (defun forth-mode-hook-dependent-variables ()  
   (setq forth-compiled-words   
         (forth-compile-words (forth-filter 'forth-words-filter forth-words)))  
   (setq forth-compiled-indent-words   
         (forth-compile-words forth-indent-words)))  
     
 ;;;###autoload  ;;;###autoload
 (defun forth-mode ()  (defun forth-mode ()
   "    "
 Major mode for editing Forth code. Tab indents for Forth code. Comments  Major mode for editing Forth code. Tab indents for Forth code. Comments
 are delimited with \\ and newline. Paragraphs are separated by blank lines  are delimited with \\ and newline. Paragraphs are separated by blank lines
 only. Block files are autodetected, when read, and converted to normal stream  only. Block files are autodetected, when read, and converted to normal 
 source format. See also `forth-block-mode'.  stream source format. See also `forth-block-mode'.
 \\{forth-mode-map}  \\{forth-mode-map}
  Forth-split   Forth-split
     Positions the current buffer on top and a forth-interaction window      Positions the current buffer on top and a forth-interaction window
Line 1001  Variables controlling syntax hilighting/ Line 1025  Variables controlling syntax hilighting/
  `forth-words'   `forth-words'
     List of words that have a special parsing behaviour and/or should be      List of words that have a special parsing behaviour and/or should be
     hilighted.      hilighted.
    forth-local-words
       List of words to prepend to `forth-words', whenever a forth-mode
       buffer is created. That variable should be set by Forth sources, using
       a local variables list at the end of file, to get file-specific
       hilighting.
       0 [IF]
          Local Variables: ... 
          forth-local-words: ...
          End:
       [THEN]
  forth-objects-words   forth-objects-words
     Hilighting information for the words of the \"Objects\" package for       Hilighting information for the words of the \"Objects\" package for 
     object-oriented programming. Append it to `forth-words', if required.      object-oriented programming. Append it to `forth-words', if you need 
       it.
  forth-oof-words   forth-oof-words
     Hilighting information for the words of the \"OOF\" package.      Hilighting information for the words of the \"OOF\" package.
  forth-hilight-level   forth-hilight-level
     Controls how much syntax hilighting is done. Should be in the range       Controls how much syntax hilighting is done. Should be in the range 
     0 (no hilighting) up to 3.  
   
 Variables controlling indentation style:  Variables controlling indentation style:
  `forth-indent-words'   `forth-indent-words'
     List of words that influence indentation.      List of words that influence indentation.
    `forth-local-indent-words'
       List of words to prepend to `forth-indent-words', similar to 
       `forth-local-words'. Should be used for specifying file-specific 
       indentation, using a local variables list.
  forth-indent-level   forth-indent-level
     Indentation increment/decrement of Forth statements.      Indentation increment/decrement of Forth statements.
  forth-minor-indent-level   forth-minor-indent-level
Line 1064  Variables controling documentation searc Line 1102  Variables controling documentation searc
   (forth-mode-variables)    (forth-mode-variables)
 ;  (if (not (forth-process-running-p))  ;  (if (not (forth-process-running-p))
 ;      (run-forth forth-program-name))  ;      (run-forth forth-program-name))
   (run-hooks 'forth-mode-hook)    (run-hooks 'forth-mode-hook))
   (forth-mode-hook-dependent-variables)  
   (forth-change-function (point-min) (point-max) nil)  
   (add-hook 'after-change-functions 'forth-change-function))  
   
 (define-derived-mode forth-block-mode forth-mode "Forth Block Source"   (define-derived-mode forth-block-mode forth-mode "Forth Block Source" 
   "Major mode for editing Forth block source files, derived from     "Major mode for editing Forth block source files, derived from 
Line 1095  bell during block file read/write operat Line 1130  bell during block file read/write operat
 (add-hook '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 ")
            (forth-hack-local-variables)
            (forth-compile-words)
            (forth-change-function (point-min) (point-max) nil)))
   
 (defun forth-fill-paragraph ()   (defun forth-fill-paragraph () 
   "Fill comments (starting with '\'; do not fill code (block style    "Fill comments (starting with '\'; do not fill code (block style

Removed from v.1.48  
changed lines
  Added in v.1.49


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