| "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 ...) |
| (("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'.") |
| |
|
| ; |
; |
| |
|
| ; 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 |
| ; |
; |
| ;; 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 "\\|") |
| (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) |
| "[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" |
| (("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 |
| (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) |
| |
|
| ;; 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 () |
| (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) |
| (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 |
| `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 |
| (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 |
| (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 |