branch: elpa/forth-mode
commit 67a9d94c18a9fa3e1d732653fa1d40cfe584d579
Author: Lars Brinkhoff <[email protected]>
Commit: Lars Brinkhoff <[email protected]>

    Minor mode to display stack comments.
---
 parse.el | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/parse.el b/parse.el
new file mode 100644
index 0000000000..2082df6fd6
--- /dev/null
+++ b/parse.el
@@ -0,0 +1,56 @@
+(defvar forth-stack-comments (make-hash-table :test 'equal))
+
+(defun forth-parse-colon-definition ()
+  (forward-char)
+  (re-search-forward "[[:graph:]]")
+  (backward-char)
+  (let ((start (point)))
+    (re-search-forward "[^[:graph:]]")
+    (let ((name (buffer-substring start (1- (point)))))
+      (when (looking-at "(")
+       (forward-char 2)
+       (let ((start (point)))
+         (search-forward ")")
+         (setf (gethash name forth-stack-comments)
+               (buffer-substring start (1- (point)))))))))
+
+(defun forth-parse-definition ()
+  (cond ((looking-at ":") (forth-parse-colon-definition))
+       ((looking-at "create") t)
+       ((looking-at "variable") t)
+       ((looking-at "2variable") t)
+       ((looking-at "defer") t)
+       ((looking-at "code") t)))
+
+(defun forth-parse-buffer (&optional buffer)
+  (setq buffer (or buffer (current-buffer)))
+  (save-excursion
+    (beginning-of-buffer)
+    (end-of-defun)
+    (beginning-of-defun)
+    (while t
+      (forth-parse-definition)
+      (end-of-defun)
+      (end-of-defun)
+      (beginning-of-defun))))
+
+(defun forth-word-at-point ()
+  (if (looking-at "[^[:graph:]]")
+      nil
+      (save-excursion
+       (re-search-backward "[^[:graph:]]")
+       (forward-char)
+       (let ((start (point)))
+         (re-search-forward "[^[:graph:]]")
+         (buffer-substring start (1- (point)))))))
+
+(defun forth-stack-comment ()
+  (let ((word (forth-word-at-point)))
+    (when word
+      (let ((stack-comment (gethash word forth-stack-comments)))
+       (when stack-comment
+         (message "%s" stack-comment))))))
+
+(defun forth-stack-comments-mode ()
+  (interactive)
+  (add-hook 'post-command-hook 'forth-stack-comment nil t))

Reply via email to