version 1.71, 2004/12/31 13:23:57
|
version 1.76, 2008/07/15 16:11:49
|
Line 1
|
Line 1
|
;;; gforth.el --- major mode for editing (G)Forth sources |
;;; gforth.el --- major mode for editing (G)Forth sources |
|
|
;; Copyright (C) 1995,1996,1997,1998,2000,2001,2003,2004 Free Software Foundation, Inc. |
;; Copyright (C) 1995,1996,1997,1998,2000,2001,2003,2004,2007,2008 Free Software Foundation, Inc. |
|
|
;; This file is part of Gforth. |
;; This file is part of Gforth. |
|
|
Line 59
|
Line 59
|
(if (not (boundp 'emacs-major-version)) |
(if (not (boundp 'emacs-major-version)) |
(defconst emacs-major-version |
(defconst emacs-major-version |
(progn (string-match "^[0-9]+" emacs-version) |
(progn (string-match "^[0-9]+" emacs-version) |
(string-to-int (match-string 0 emacs-version))))) |
(string-to-number (match-string 0 emacs-version))))) |
|
|
|
;; Code ripped from `subr.el' for compatability with Emacs versions |
|
;; prior to 20.1 |
|
(eval-when-compile |
(defun forth-emacs-older (major minor) |
(defun forth-emacs-older (major minor) |
(or (< emacs-major-version major) |
(or (< emacs-major-version major) |
(and (= emacs-major-version major) (< emacs-minor-version minor)))) |
(and (= emacs-major-version major) (< emacs-minor-version minor)))) |
|
|
;; Code ripped from `subr.el' for compatability with Emacs versions |
|
;; prior to 20.1 |
|
(eval-when-compile |
|
(if (forth-emacs-older 20 1) |
(if (forth-emacs-older 20 1) |
(progn |
(progn |
(defmacro when (cond &rest body) |
(defmacro when (cond &rest body) |
Line 79
|
Line 79
|
|
|
;; `no-error' argument of require not supported in Emacs versions |
;; `no-error' argument of require not supported in Emacs versions |
;; prior to 20.4 :-( |
;; prior to 20.4 :-( |
|
(eval-and-compile |
(defun forth-require (feature) |
(defun forth-require (feature) |
(condition-case err (require feature) (error nil))) |
(condition-case err (require feature) (error nil)))) |
|
|
(require 'font-lock) |
(require 'font-lock) |
|
|
Line 273 PARSED-TYPE specifies what kind of text
|
Line 274 PARSED-TYPE specifies what kind of text
|
"case" "of" "?dup-if" "?dup-0=-if" "then" "endif" "until" |
"case" "of" "?dup-if" "?dup-0=-if" "then" "endif" "until" |
"repeat" "again" "leave" "?leave" |
"repeat" "again" "leave" "?leave" |
"loop" "+loop" "-loop" "next" "endcase" "endof" "else" "while" "try" |
"loop" "+loop" "-loop" "next" "endcase" "endof" "else" "while" "try" |
"recover" "endtry" "assert(" "assert0(" "assert1(" "assert2(" |
"recover" "endtry" "iferror" "restore" "endtry-iferror" |
|
"assert(" "assert0(" "assert1(" "assert2(" |
"assert3(" ")" "<interpretation" "<compilation" "interpretation>" |
"assert3(" ")" "<interpretation" "<compilation" "interpretation>" |
"compilation>") |
"compilation>") |
compile-only (font-lock-keyword-face . 2)) |
compile-only (font-lock-keyword-face . 2)) |
Line 415 INDENT1 and INDENT2 are indentation spec
|
Line 417 INDENT1 and INDENT2 are indentation spec
|
|
|
(setq forth-indent-words |
(setq forth-indent-words |
'((("if" "begin" "do" "?do" "+do" "-do" "u+do" |
'((("if" "begin" "do" "?do" "+do" "-do" "u+do" |
"u-do" "?dup-if" "?dup-0=-if" "case" "of" "try" |
"u-do" "?dup-if" "?dup-0=-if" "case" "of" "try" "iferror" |
"[if]" "[ifdef]" "[ifundef]" "[begin]" "[for]" "[do]" "[?do]") |
"[if]" "[ifdef]" "[ifundef]" "[begin]" "[for]" "[do]" "[?do]") |
(0 . 2) (0 . 2)) |
(0 . 2) (0 . 2)) |
((":" ":noname" "code" "struct" "m:" ":m" "class" "interface") |
((":" ":noname" "code" "struct" "m:" ":m" "class" "interface") |
Line 431 INDENT1 and INDENT2 are indentation spec
|
Line 433 INDENT1 and INDENT2 are indentation spec
|
(-2 . 0) (0 . -2) non-immediate) |
(-2 . 0) (0 . -2) non-immediate) |
(("protected" "public" "how:") (-1 . 1) (0 . 0) non-immediate) |
(("protected" "public" "how:") (-1 . 1) (0 . 0) non-immediate) |
(("+loop" "-loop" "until") (-2 . 0) (-2 . 0)) |
(("+loop" "-loop" "until") (-2 . 0) (-2 . 0)) |
(("else" "recover" "[else]") (-2 . 2) (0 . 0)) |
(("else" "recover" "restore" "endtry-iferror" "[else]") |
|
(-2 . 2) (0 . 0)) |
(("does>") (-1 . 1) (0 . 0)) |
(("does>") (-1 . 1) (0 . 0)) |
(("while" "[while]") (-2 . 4) (0 . 2)) |
(("while" "[while]") (-2 . 4) (0 . 2)) |
(("repeat" "[repeat]") (-4 . 0) (0 . -4)))) |
(("repeat" "[repeat]") (-4 . 0) (0 . -4)))) |
Line 459 End:\" construct).")
|
Line 462 End:\" construct).")
|
;; in Lisp?? |
;; in Lisp?? |
(defun forth-filter (predicate list) |
(defun forth-filter (predicate list) |
(let ((filtered nil)) |
(let ((filtered nil)) |
(mapcar (lambda (item) |
(dolist (item list) |
(when (funcall predicate item) |
(when (funcall predicate item) |
(if filtered |
(if filtered |
(nconc filtered (list item)) |
(nconc filtered (list item)) |
(setq filtered (cons item nil)))) |
(setq filtered (cons item nil))))) |
nil) list) |
|
filtered)) |
filtered)) |
|
|
;; Helper function for `forth-compile-word': return whether word has to be |
;; Helper function for `forth-compile-word': return whether word has to be |
Line 485 End:\" construct).")
|
Line 487 End:\" construct).")
|
(regexp |
(regexp |
(concat "\\(" (cond ((stringp matcher) matcher) |
(concat "\\(" (cond ((stringp matcher) matcher) |
((listp matcher) (regexp-opt matcher)) |
((listp matcher) (regexp-opt matcher)) |
(t (error "Invalid matcher `%s'"))) |
(t (error "Invalid matcher"))) |
"\\)")) |
"\\)")) |
(depth (regexp-opt-depth regexp)) |
(depth (regexp-opt-depth regexp)) |
(description (cdr word))) |
(description (cdr word))) |
Line 696 End:\" construct).")
|
Line 698 End:\" construct).")
|
(eval-when-compile |
(eval-when-compile |
(defmacro forth-save-buffer-state (varlist &rest body) |
(defmacro forth-save-buffer-state (varlist &rest body) |
"Bind variables according to VARLIST and eval BODY restoring buffer state." |
"Bind variables according to VARLIST and eval BODY restoring buffer state." |
(` (let* ((,@ (append varlist |
`(let* (,@(append varlist |
'((modified (buffer-modified-p)) (buffer-undo-list t) |
'((modified (buffer-modified-p)) (buffer-undo-list t) |
(inhibit-read-only t) (inhibit-point-motion-hooks t) |
(inhibit-read-only t) (inhibit-point-motion-hooks t) |
before-change-functions after-change-functions |
before-change-functions after-change-functions |
deactivate-mark buffer-file-name buffer-file-truename)))) |
deactivate-mark buffer-file-name buffer-file-truename))) |
(,@ body) |
,@body |
(when (and (not modified) (buffer-modified-p)) |
(when (and (not modified) (buffer-modified-p)) |
(set-buffer-modified-p nil)))))) |
(set-buffer-modified-p nil))))) |
|
|
;; Function that is added to the `change-functions' hook. Calls |
;; Function that is added to the `change-functions' hook. Calls |
;; `forth-update-properties' and keeps care of disabling undo information |
;; `forth-update-properties' and keeps care of disabling undo information |
Line 1382 programmers who tend to fill code won't
|
Line 1384 programmers who tend to fill code won't
|
(progn |
(progn |
(delete-other-windows) |
(delete-other-windows) |
(split-window-vertically |
(split-window-vertically |
(/ (* (screen-height) forth-percent-height) 100)) |
(/ (frame-height) 2)) |
(other-window 1) |
(other-window 1) |
(switch-to-buffer buffer) |
(switch-to-buffer buffer) |
(goto-char (point-max)) |
(goto-char (point-max)) |
(other-window 1)))) |
(other-window 1)))) |
|
|
(defun forth-compile (command) |
|
(interactive (list (setq forth-compile-command (read-string "Compile command: " forth-compile-command)))) |
|
(forth-split-1 "*compilation*") |
|
(setq ctools-compile-command command) |
|
(compile1 ctools-compile-command "No more errors")) |
|
|
|
;;; Forth menu |
;;; Forth menu |
;;; Mikael Karlsson <qramika@eras70.ericsson.se> |
;;; Mikael Karlsson <qramika@eras70.ericsson.se> |
|
|
Line 1613 of `forth-program-name'). Runs the hook
|
Line 1609 of `forth-program-name'). Runs the hook
|
(forth-end-of-paragraph) |
(forth-end-of-paragraph) |
(skip-chars-backward "\t\n ") |
(skip-chars-backward "\t\n ") |
(setq end (point)) |
(setq end (point)) |
(if (re-search-backward "\n[ \t]*\n" nil t) |
(if (null (re-search-backward "\n[ \t]*\n" nil t)) |
(setq start (point)) |
|
(goto-char (point-min))) |
(goto-char (point-min))) |
(skip-chars-forward "\t\n ") |
(skip-chars-forward "\t\n ") |
(forth-send-region (point) end)))) |
(forth-send-region (point) end)))) |
Line 1652 With argument, position cursor at end of
|
Line 1647 With argument, position cursor at end of
|
(push-mark) |
(push-mark) |
(goto-char (point-max))))) |
(goto-char (point-max))))) |
|
|
(defun forth-send-region-and-go (start end) |
(defun forth-send-region-and-go (my-start end) |
"Send the current region to the inferior Forth process. |
"Send the current region to the inferior Forth process. |
Then switch to the process buffer." |
Then switch to the process buffer." |
(interactive "r") |
(interactive "r") |
(forth-send-region start end) |
(forth-send-region my-start end) |
(forth-switch-to-interactive t)) |
(forth-switch-to-interactive t)) |
|
|
(defcustom forth-source-modes '(forth-mode forth-block-mode) |
(defcustom forth-source-modes '(forth-mode forth-block-mode) |